前言

不会使用Wireshark和安装的Wireshark的看下面这篇文章。

Zigbee数据抓包解析_ubiqua-CSDN博客

基础名词概念:

PAN ID:局域网标识符

定义:一个16位(2字节)的标识符,取值范围0x0000 -0xFFFF

作用:在同一个物理信道中区分不同的zigbee网络,避免相互干扰。

补充说明:在Zigbee网络中一共有16个信道,在一个信道中可以有多个Zigbee网络,为了区分这些网络就有了这个局域网标识符,也就相当于是在这个信道中这个网络的名字。

特点:类似于WIfi的SSID(网络名称),范围只有65535,可能会出现冲突。

EPID:扩展PAN ID,八字节64位的标识符,常用十六进制标识。

作用:为了避免出现上面的PAN ID冲突而加上的区分唯一标识符,通常使用IEEE(MAC地址)生成。

短地址:一个16位(2字节)的地址,取值范围 0x0000 - 0xFFFF

作用:网络中设备的唯一标识符,用于设备间通信,核心目的为区分设备。

在短地址中有一些是特殊保存的比如:

0x0000:协调器的短地址

0xFFFF:广播地址(作用于当前网络的所有对象)

0xFFFE:未分配地址

源PAN ID

定义:在数据包中进行标识这个数据来自于那个网络,也及时标识数据的来源。

当设备与设备之间想要通信需要经历三个步骤:

  1. 物理层:查看二者是否位于同一个PAN ID网络中

  2. 网络层:确认他们的EPID是否相同,用于保证设备处于同一个网络中。

  3. 传输层:用短地址找到对应的设备进行通信

Zigbee协议栈整体架构

1:设备发现:Beacon Request

Beacon Request 数据包

RSSI:信号质量

LQL:链路质量

Beacon 应答

2:关联请求:Association Request

        当终端设备从接收到的Beacon应答中选一个合适的父节点,紧接着就要发送关联请求,也就是设备正式申请加入到Zigbee网络。

Association Request (0x01)

Association Response :关联请求应答

        当协调器收到了终端设备的关联请求,给与关联应答,并为终端设备分配一个在该网络中唯一的16位短地址,这个过程也是整个设备加入最关键的一步。

3:传输密钥:Transport Key

        在设备成功关联并获得短地址后,协调器现在把网络密钥发送给新设备,这是建立安全通信的基础。

        使用抓包工具可以解析出数据也是需要知道这个网络密钥,不然无法解析出对应的信息。

抓包数据解析

4:设备宣告:Device Announce(Cluster ID:0x0013)

        设备宣告的作用:意味着新设备已经成功加入网络,并向全网宣告自己的存在。这是整个入网流程完成的标志。

设备宣告的核心作用就是通知整个Zigbee网络自己的存在。

5:ACK 和Data Request

ACk:确认帧,接收方用于告诉发送方已经成功接收到数据的确认信号。

Data Request:数据请求,终端设备向协调器或者网关询问有没有我的数据。

Data Request的两种工作模式:

1:非睡眠类终端设备(主电源供电设备)

2:睡眠类(低功耗设备)

作用:

  1. 链路验证:确认与父设备的连接正常

  2. 数据获取:获取父设备缓存的任何数据

  3. 状态更新:让父设备知道终端还活着

  4. 功耗控制:对睡眠设备,这是唤醒后第一时间做的事

  5. 网络稳定:帮助父设备维护邻居表

6:设备端点请求:Active Endpoint Request

Active Endpoint Request (Cluster ID:0x0005)

功能:询问接入的设备终端支持那些应用节点,获取应用节点列表。

在一个Zigbee终端设备中可以有多个节点分别负责多个功能:

比如:设备 0x510d(假设属性)

├── 端点 1: 智能插座(开关集群)

├── 端点 2: 电量监测(电量测量集群)

├── 端点 3: 温度传感器(温度测量集群)

└── 端点 0: ZDO(设备管理,固定存在)

数据包构成

Endpoint Response (Cluster ID:0x8005)

7:简单设备描述符请求 :Simple Descriptor Request

Simple Descriptor Request (Cluster ID:0x0004)

核心功能就是为了获取这个端点具有哪些具体的功能,也就是有哪些Cluster。

补充说明:Cluster 字面翻译过来的意思是集群,也就是说是一个集合,里面包含多个Attribute属性。

simple Descriptor Response (Cluster ID:0x8004)

补充说明:

输入集群:设备本身具备的功能,以及设备可以接收到那些功能的命令。

输出集群:设备可以发送的命令。

8:节点描述符请求: Node Descriptor Request

Node Descriptor Request (Cluster ID :0x0002)

作用:用于查询设备的网络层能力和硬件特性,关注的是设备作为网络节点的基本属性。

Node Descriptor Response (Cluster ID: 0x8002)

能力信息 (0x8F)

服务器标志 (0x2C01)

9 :信任中心链接密钥 Request Key

        看到这里应该会有个疑问,上面明明有了一个Transport Key,为什么还有获取一个密钥。上一个数据包Node Descriptor Request是终端设备向自己的父节点发送询问其自身属性的,当协调器返回属性之后终端设备就知道了自己的父节点为是信任中心。所以获取这个链路密钥(link key)核心功能就是为了安全考虑。

当信任中心收到这个请求之后会给出设备与信任中心私有通信秘钥

这个新密钥存在的意义就是为了:

  • ✅ 安全更新网络密钥(当协调器更换网络密钥时)

  • ✅ 安全退网(离开网络时加密请求)

  • ✅ 私有通信(与信任中心的敏感对话)

  • ✅ 身份认证(证明自己是合法设备)

当链接密钥配置成功之后会有一个确认包:Confirm Key

标志着链接密钥配置成功完成

10:获取设备的配置信息 Basic

获取设备的配置信息采用的是Read Attributes

Read Attributes 和 Read Attributes Response 是 ZigBee 集群库(Cluster Library)中最基础的属性读写操作。

使用这个来获取Basic里面的设备属性。

        想要获取Basic里面的硬件版本、软件版本、协议栈版本、日期、厂家名字、mode ID等数据,都是采用采用Read Attributes 和 Read Attributes Response来获取的,内容毕竟多就不一一列举了。

补充说明一下:在上面的数据包中有一个传输方向:

上面写的是客户端到服务器,而这个请求是协调器发的Read Attributes,目的是为了获取终端设备的Basic数据,这和其他的主流传输协议中的服务器和客户端的角色不一样。

在zigbee官方文档中定义服务器和客户端翻译过来就是:

        集群是一组相关的命令和属性集合,共同定义了特定功能的接口。通常,存储集群属性的实体被称为该集群的服务器,而影响或操作这些属性的实体则被称为该集群的客户端。但若需要,属性也可存在于集群的客户端上。

        在上面的介绍中的输入集群都是保存在设备终端里面的,协调器是来控制这些设备的,也就是说在Zigbee网络中终端设备才是服务器,协调器才是网关。

11:允许加入请求 Permit Join Request (Cluster ID:0x0036)

简单来说,它的作用是打开或关闭网络的“入网许可” 。

        结合我们之前一路分析过来的流程,你现在看到的这个包,意味着网络又回到了可以接受新设备加入的状态,也就是说上面的那个设备已经完全加入到Zigbee网络完毕了。

        在这个运行加入的时间传输使用的是十六进制的一个字节大小,那也决定了运行设备加入最大就只支持0xFF,也就是255秒。

Logo

更多推荐