本帖最后由 tangqmxf 于 2020-1-29 19:46 编辑
被小米网关劝退后在论坛大神的怂恿下决定入坑zigbee2mqtt,论坛里面几个大神有介绍,但是还是不够全面。自己到官网去扒啦了一些东西来,给各位入坑的提供下参考。
注:以下内容均从官网扒啦下来的,只是自己翻译了以下罢了。系列文章目录如下:
一、Zigbee网络技术知识。
设备类型
在Zigbee中,有三种不同类型的设备:终端设备、中继器和网关。
Zigbee网络仅有一个网关,可以有多个中继器和终端设备。
使用zigbee2mqtt的话,网关就是您的CC2531 USB stick。
终端设备
终端设备中转数据。它们也可以睡眠,这使得终端设备成为电池驱动设备的合适选择。
终端设备只有一个父设备,要么是网关,要么是中继器,通常是配对时最近的设备。
与终端设备之间的所有通信都是通过它们的父设备进行的。
如果一个父中继器离线,所有与它相连的子设备的数据将中段,直到这些终端设备超时并试图找到一个新的父中继器。
一些终端设备,尤其是小米,不会尝试寻找新的父设备,所以在与网络重新配对之前,它们将保持离线状态。
例如:WXKG01LM, RTCGQ01LM, MCCGQ11LM
中继器
中继器负责在不同的节点之间中转数据。
中继器可能无法休眠。因此,路由器不是电池驱动设备的合适选择。
路由器还负责接收和存储为其子设备准备的消息。
除此之外,中继器可负责允许新节点加入网络。
例如:LED1545G12, 7146060PH, ZNCZ02LM, CC2531 USB sniffer 刷中继器固件 。
注意:在Zigbee网络中,小米墙壁开关(单火版本- QBKG03LM和QBKG04LM)不能作为中继器工作。
网关
网关是一个特殊的中继器。除了所有的中继器的功能外,网关还负责形成网络。
为此,它必须选择适当的通道、PAN ID和扩展网络地址。它还负责选择网络的安全模式。
例如:CC2531 USB sniffer 刷网关固件。
找出你的设备类型
Zigbee2mqtt日志可记录设备在启动时的设备类型,例如:
2018-5-28 20:39:46 INFO 0x00158d00018255df (0x00158d00018255df): ZNCZ02LM - Xiaomi Mi power plug ZigBee (Router)
2018-5-28 20:39:46 INFO 0x00158d0001b79111 (0x00158d0001b79111): WSDCGQ01LM - Xiaomi MiJia temperature & humidity sensor (EndDevice)
二、如何嗅探Zigbee数据
有时,嗅探Zigbee数据可能会很有效。例如,当您要分析设备使用的命令时。
使用CC2531
需要设备
电脑
Ubuntu系统(在18.10上已测试)
Windows系统(在Windows 10上已测试)
CC2531 stick
1、将CC2531 stick刷机
CC2531需要使用嗅探器固件进行刷机。按照“CC2531刷机”中的方法刷新固件。
Linux
固件包含在
PACKET-SNIFFER (不是PACKET-SNIFFER-2)中。下载PACKET-SNIFFER。由于嗅探器固件仅在Windows安装程序中可用,因此我们需要扩展十六进制文件。这将需要7zip(发布的p7zip-full或p7zip-plugins安装包)
unzip swrc045z.zip -d PACKET-SNIFFER
7z e PACKET-SNIFFER/Setup_SmartRF_Packet_Sniffer_2.18.0.exe bin/general/firmware/sniffer_fw_cc2531.hex
sudo /cc-tool -e -w /sniffer_fw_cc2531.hex
复制代码
Windows(或者Ubuntu)
对于Windows,此固件包含在
ZBOSS 中。注册帐户并下载Windows 64位的ZBOSS Sniffer。固件在ZIP文件中子文件夹hw\CC2531 USB dongle\zboss_sniffer.hex里。请注意,ZBOSS也可用于Ubuntu。
2、安装所需工具
Ubuntu
cd /opt
sudo apt-get install -y libusb-1.0-0-dev wireshark
curl -L https://github.com/homewsn/whsniff/archive/v1.1.tar.gz | tar zx
cd whsniff-1.1
make
sudo make install
复制代码
Windows
下载并安装最新版本的
Wireshark 。ZBOSS本身是便携式的,不需要安装。
3、嗅探数据
在Ubuntu上,通过sudo whsniff -c ZIGBEE_CHANNEL_NUMBER | wireshark -k -i - 启动。
对于Windows,请在中运行ZBOSS可执行文件gui\zboss_sniffer.exe,输入Wireshark可执行文件的路径,然后单击Start按钮。
Wireshark将启动并记录Zigbee消息。由于这些消息已加密,因此我们需要添加2个加密密钥。第一个是Trust Center链接密钥,几乎每个Zigbee网络都相同。第二个是网络加密密钥(传输密钥)。
设置Trust Center链接密钥方法:
Edit(编辑)->
references(首选项)->
rotocols(协议)-> ZigBee,将“Security Level (安全级别)”设置为AES-128 Encryption(AES-128加密),32-bit Integrity Protection (32位完整性保护),然后单击“ 编辑”。单击 + 并按字节顺序添加
5A:69:67:42:65:65:41:6C:6C:69:61:6E:63:65:30:39
复制代码
注意:Hue bridge 使用不同的
Trust Center链接密钥
接下来,我们需要找出网络加密密钥(传输密钥)。有两种方法可以做到这一点:
1)默认情况下,如果你有没有在configuration.yaml中改变network_key的话,它将是01:03:05:07:09:0B:0D:0F:00:02:04:06:08:0A:0C:0D。如果更改了network_key,则将每个数字转换为2位数的十六进制值,并将它们全部组合在一起:。例如
[1, 3, 5, 7, 9, 11, 13, 15, 0, 2, 4, 6, 8, 10, 12, 13]->01:03:05:07:09:0B:0D:0F:00:02:04:06:08:0A:0C:0D
2)如果您不想手动转换数字,则当设备加入网络时,网络加密密钥也会公开。将新设备与网络配对(或重新配对现有设备),并在设备通知消息中获取该信息。。打开消息并展开ZigBee Network Layer Data(ZigBee网络层数据) -> ZigBee Security Header(ZigBee安全标题)。
复制密钥值,如上所示,然后转到Edit(编辑) -> Preferences(首选项) -> Protocols(协议) -> ZigBee -> Edit(编辑),然后按正常字节顺序添加密钥。
现在,Wireshark能够解密消息。例如,当打开灯时,您会看到类似以下消息:
故障排除
如果您在运行whisniff时收到“couldn’t run /usr/bin/dumpcap in child process: permission denied(无法在子进程中运行/ usr / bin / dumpcap:权限被拒绝)”。检查/ usr / bin / dumpcap是否对所有人都可执行。或者chmod 755 /usr/bin/dumpcap。
三、如何保护您的Zigbee网络
默认情况下,您的Zigbee网络没有尽可能安全。建议将以下设置应用于您的配置。
禁用加入
要禁用加入,请务必在configuration.yaml设置permit_join: false。否则,流氓设备将能够加入并允许它们发送和接收Zigbee数据。
更改Zigbee网络加密密钥
更改网络密钥需要重新连接所有设备!
Zigbee2mqtt使用已知的默认加密密钥(Zigbee传输密钥)。因此,建议使用另一种。要使用其他加密密钥,请将以下内容添加到您的configuration.yaml:
不要使用这个密钥。
advanced:
network_key: [7, 3, 5, 7, 9, 11, 13, 15, 0, 2, 4, 6, 8, 11, 12, 13]
复制代码
网络的加密密钥大小是128-bit。它实质上是16个0到255之间的十进制数或0x00到0xFF之间的16进制值。
如果您需要将数值转换为十六进制(反之亦然),请使用转换器 。比如:92(十进制)将变为5C(十六进制)。
在大多数linux系统中,可以使用以下命令生成有效的十进制键:
dd if=/dev/urandom bs=1 count=16 2>/dev/null | od -A n -t u1 | awk '{printf "["} {for(i = 1; i< NF; i++) {printf "%s, ", $i}} {printf "%s]\n", $NF}'
复制代码
请注意,如果在Hass.io add-on中运行zigbee2mqtt,则仅支持十进制键。
在大多数linux系统中,可以使用以下命令生成有效的十六进制密钥:
dd if=/dev/urandom bs=1 count=16 2>/dev/null | od -A n -t x1 | awk '{printf "["} {for(i = 1; i< NF; i++) {printf "0x%s, ", $i}} {printf "0x%s]\n", $NF}'
复制代码