Zigbee 设备的入网流程,大体包括: 发现网关,请求关联,交换密钥,更新链接密钥。
熟悉 zigbee 开发的同学都知道,一个 zigbee 设备要想加入到一个 zigbee 网络中进行数据交互,必须先进行配网操作,也就是设备的Association
过程,本文通过一个门磁设备,详细分析标准 3.0 设备入网过程,以及基于涂鸦 SDK 开发设备入网时的特点和体验优化。
首先来看一张标准 3.0 设备入网时的交互流程图。
基于 TuyaOS 开发框架下的 zigbee 设备完全符合标准 3.0 入网规范,流程分为如下步骤:
1.Permit Join Request
在正式进入入网交互之前,coordinater
发出Permit Joining Request广播,允许设备入网。
报文包含允许时长,是否为信任中心等参数。
2.Beacon Request
触发设备进入配网状态,此时设备会在指定信道依次发送Beacon Request
。考虑效率和与 WiFi 信道干扰问题,一般会先选择优先信道(如 11,15,20,25,26)进行扫网,再选择次选信道进行(12,13,14,16,17,18,19,21.22,23,24)扫网。
3.Beacon
在收到Beacon Request
后,同一信道的不同 PAN 的协调器会发出Beacon
回应,
报文中包含 PAN ID、是否允许入网、节点深度、是否接入当前设备类型等参数。
4.Association Request
待入网设备收到后会筛选出合适的网络,并对其发出Association Request
请求入网。
报文中携带自身设备类型,长地址,设备能力等信息。
5.Association Response
收到Association Request
后,协调器将根据当前资源情况决定是否允许其加入,若允许并返回Association response
。
报文中包含:目标网络 PAN ID、分配给入网设备的短地址等信息。
6.Transport key: NWK key
协调器将 NWK key 通过默认 Link key 进行加密,而此处 Link key 是预配置 Pre-configured 的,可使用 ZigBeeAlliance09(5A:69:67:42:65:65:41:6C:6C:69:61:6E:63:65:30:39
)或是利用 install code 生成。NWK key 用于后期网络层通信的加密。
7.Device Announce
子设备入网成功后会发出Device Announce
广播,声明其已成为该网络新设备。
报文包含器长地址、短地址、设备能力等信息。
8.Read Attributes:涂鸦网关特有
协调器收到入网设备的Device Announce
之后,会读设备 Basic cluster 下的 5 个属性。
9.Read Attributes Response:涂鸦网关特有
设备回复协调器 5 个属性值,通过Manufacturer Name
和Mode ID
,作为协调器的 zigbee 网关可以获取到设备的产品类型和支持的 DP 列表并上报云端,同时涂鸦智能 APP 上能够立即同步设备加网成功画面,此过程一般仅耗时 2s 左右。
10.Node Descriptor Request
如果入网设备是一个符合zigbee3.0
协议的设备,需要向信任中心发起Node Descriptor Request
,查询信任中心是否支持zigbee3.0
。
11.Node Descriptor Response
信任中心回复Node Descriptor Response
报文包含:状态码、节点类型、设备能力等信息。协调器是否支持zigbee3.0
可以通过Server Mask Capabilities
字段的Bit[9-15]:Stack Compliance Revision
获取。具体可以参考联盟最新的Zigbee Specification
。
12.Request key: TC link key
Request key(Link key)
:如果查询到信任中心支持zigbee3.0
,那么子设备向协调器请求新的 Link key 以替换前面Pre-configured Link key
。
13.Transport key: TC link key
协调器返回新的TC Link key
。
14.Verify key
子设备发出Verify Key Resquest
请求校验 Link key
15.Confirm key
协调器返回校验结果Verify Key Confirm
,可以看到此条报文中已使用新的TC Link key
。
2.通过路由节点入网
在实际应用中,设备离网关较远时,往往是通过多跳,通过别的路由设备中继入网的,如下图所示流程
2.1 Update Device
中继节点会发出Update device
通知协调器有一个设备需要入网,这个包是使用APS 加密的,密钥是这个设备的TC link key
2.2 Tunnel:Transport Key
协调器收到中继节点发出的Update device通知后,会发出Tunnel:Transport Key
,通过中继节点传递密钥,这个包是使用APS 加密的,密钥是该网络 nwk key
中继节点收到该包后,会解析该包内容,并通过发送transport key
将nwk key
发送给入网设备
3.分布式网络入网
分布式网络不存在信任中心,入网设备可以通过原网络中任意路由节点直接入网,路由节点通过transport key
将由Distributed security global link key
加密的nwk key
传递给入网设备
入网设备会检查transport key
中APS Payload
里的Source Address
字段,如果是全FF则表示该网络为分布式网络,后续行为需遵循分布式网络流程
2.通过路由节点入网
在实际应用中,设备离网关较远时,往往是通过多跳,通过别的路由设备中继入网的,如下图所示流程
2.1 Update Device
中继节点会发出Update device
通知协调器有一个设备需要入网,这个包是使用APS 加密的,密钥是这个设备的TC link key
2.2 Tunnel:Transport Key
协调器收到中继节点发出的Update device通知后,会发出Tunnel:Transport Key
,通过中继节点传递密钥,这个包是使用APS 加密的,密钥是该网络 nwk key
中继节点收到该包后,会解析该包内容,并通过发送transport key
将nwk key
发送给入网设备
3.分布式网络入网
分布式网络不存在信任中心,入网设备可以通过原网络中任意路由节点直接入网,路由节点通过transport key
将由Distributed security global link key
加密的nwk key
传递给入网设备
入网设备会检查transport key
中APS Payload
里的Source Address
字段,如果是全FF则表示该网络为分布式网络,后续行为需遵循分布式网络流程
Tuya OS 相关函数介绍
1 主动调用类
Code: Select all
BOOL_T tal_zg_join_start(UINT_T timeout_ms);
调用该函数后设备将先进行离网,离网完成后会开始进行扫网
Code: Select all
OPERATE_RET tal_zg_join_config(TAL_ZG_JOIN_CFG_T *config);
该函数可以配置设备配网策略:
Code: Select all
auto_join_power_on_flag 置为TRUE则设备上电时没有网络将主动开启扫网
auto_join_remote_leave_flag 置为TRUE则设备被远程删除后将主动开启扫网
join_timeout 为上述两种主动开启扫网的持续时间,单位是ms
2 回调处理类
Code: Select all
VOID_T tal_zg_nwk_status_changed_callback(TAL_ZG_NWK_STATUS_E status)
该函数是网络状态变化回调函数:
Code: Select all
typedef enum {
TAL_ZG_NWK_IDLE = 0, 初始化状态,底层使用
TAL_ZG_NWK_POWER_ON_LEAVE, 上电不在网
TAL_ZG_NWK_POWER_ON_ONLINE, 上电在网
TAL_ZG_NWK_JOIN_START, 开始扫网
TAL_ZG_NWK_JOIN_TIMEOUT, 扫网超时
TAL_ZG_NWK_JOIN_OK, 入网成功
TAL_ZG_NWK_LOST, 与父节点失联,低功耗设备特有状态
TAL_ZG_NWK_REJOIN_OK, 重入成功,低功耗设备特有状态
TAL_ZG_NWK_REMOTE_LEAVE, 被远程删除
TAL_ZG_NWK_LOCAL_LEAVE, 本地操作离网
TAL_ZG_NWK_MF_TEST_LEAVE, 产测阶段离网
TAL_ZG_NWK_ZLL_JOINED, 加入到一个ZLL网络,底层使用,ZLL状态有相关回调通知
TAL_ZG_NWK_ZLL_LEAVE, 在ZLL网络中被删除,底层使用,ZLL状态有相关回调通知
} TAL_ZG_NWK_STATUS_E;