我们在应用Z-stack时,发现里面有些不足的地方,于是就做了以下改进。
1,协调器和路由器中,增加了MAC地址过滤功能。协调器和路由器中,有一个MAC地址过滤表,当有新设备入网时,会向协调器或者路由器发起Assoc Request,协调器或者路由器会根据MAC地址过滤表来判断这个节点是否应该入网。如果申请入网的节点不在MAC地址表中,协调器或者路由器返回一个Assoc Denied命令给节点(协议分析软件能看到这个命令)。同时,拒绝节点入网的协调器或者路由器,会通过zdoCBFunc注册的回调函数,告诉应用层当前有设备试图加入网络,并且还会将这个拦截信息广播给网络内所有带路由功能的设备,其它路由收到拦截广播后,也会通过zdoCBFunc注册的回调函数,告诉应用层。因此,在应用层可以看到某个设备正在通过某个路由加入网络但是被拒绝。
2,通过应用层,可以向MAC过滤表中输入合法设备的MAC地址,即MAC白名单。MAC白名单可以广播给路由,也可以单播给某个路由。MAC白名单采用新增的ZDO层命令来实现,即ZDO_REQ和ZDO_RSP。当向路由广播或者单播白名单的REQ,会收到返回的白名单RSP,白名单RSP中包含了MAC白名单记录条数。如果白名单REQ携带的白名单MAC值为{0,0,0,0,0,0,0,0}或者{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},MAC记录条数不会增加,但是会返回白名单的RSP。在实际网络中,如果怀疑一个路由器没有MAC地址过滤,可以向其发送一个全0或者全0xFF的MAC地址,如果白名单RSP的状态不为ZSuccess,则说明这个路由器不支持MAC地址过滤,可以通过Mgmt_Permit_Join_req命令,将其入网功能关闭。
MAC白名单是一个动态的数据库,通过osal_mem_alloc分配空间,每个MAC地址记录时间只有1分钟,1分钟后自动清空。另外,当新设备成功入网后,MAC白名单就会清除掉。
3,对于节点来说,则采用滚动入网的方式。节点入网前先扫描网络,会记录多个PANID。然后节点会加入第一个PANID,当第一个PANID拒绝节点加入,节点会依次加入第二个,第三个……直到已经扫描到的PANID都试完,节点才会重新扫描PANID。
4,对于zigbee网络来说,有种协调器叫“恶意协调器”,恶意协调器通常是一直允许加入网络,而且信号非常好,会干扰节点不能加入指定网络。对于这种协调器,我做了以下处理:在密钥使能时,一个节点被协调器“拉”进网络后,是Nuauth状态,当Unauth状态超时,会复位,复位前,把这个PANID记录在NV_RAM中,下次扫描网络时,就跳过这个PANID。
附件 已经去除,需要的请与我私下联系,仅限测试使用。
Aries Lord:
这个库的使用方法:
用zdo文件夹,替换掉原工程的文件夹,同时工程中zdo子目录下的.c文件全部删除,替换成协调器,路由器和节点对应的lib,文件名all的lib是给znp用的。
在OSLA中,添加任务ZDE_event_loop和初始化函数ZDE_Init,就跟任务一样,最好是优先级仅次于ZDNwkMgr。
函数ZDO_RegisterForZdoCB新增了一个ZDO_JOIN_DENIED_CBID事件,用一个函数void* func(void* p)注册这个事件。函数func中,就能在void*p指针获得MAC过滤掉的MAC地址。
typedef struct{ uint16 parentAddr; uint8 extAddr[8]; uint8 capability;} zdoJoinDeniedInd_t;
这个结构体是指针p的结构,parentAddr是拦截过滤的父节点。如果这个地址和当前设备是一致的,比如协调器上看到是0x0000,说明是本机拦截的。如果不一致,则是其它路由拦截的。
函数uint8 ZDE_AcceptListInput(ZDE_JoinAcceptReq_t* permit)向本机添加MAC白名单记录,返回值是当前白名单记录数量。如果MAC地址是0或者0xFF,则不会增长。
函数afStatus_t ZDE_JoinAcceptReq(zAddrType_t* dstAddr,ZDE_JoinAcceptReq_t* accept,byte SecurityEnable)这是向路由器添加白名单记录,建议目标地址用0xFFFC,即只针对路由器广播,同时用ZDE_AcceptListInput向自己添加相同的记录。
MAC白名单结构体ZDE_JoinAcceptReq_t如下
typedef struct{ uint8 count; sAddrExt_t extAddrs[0];}ZDE_JoinAcceptReq_t;
这就意味着可以一次添加多条白名单记录,count是白名单数量,extAddrs是MAC地址,可以录入多条。
Aries Lord:
另外,我们这个库的源码因为涉及到我们公司智能家居的核心技术,现在暂时不公布源码。等我们的HA产品通过zigbee联盟认证后,会开放源代码。
我们的源码可以给TI测试,但是希望TI能够为我们公司保密,希望TI的相关负责工程师留下邮箱或与我取得联系。
VV:
回复 Aries Lord:
Aries Lord,
你好,很感谢你对TI Zigbee协议栈的研究和支持。
看到你的改进,确实是在实际应用中会遇到的问题,等仔细看了你的代码后,会及时回复你。
另外由于你们协议栈并没有通过ZigBee测试认证,能否先把你们的Lib或者源代码不要贴出来,会有一定的风险,引起其他不明真相的客户产生一些不必要的问题。
另外请告诉我你们公司和你的联系方式,我会联系你。
谢谢!
Aries Lord:
回复 VV:
我们公司是四川金网通科技,正在做HA相关产品。我全权负责zigbee相关产品开发,我的邮箱是zigbee_luo@qq.com,电话13699409747,你们的销售工程师已经和我们有接触了。
论坛上现在也只提供库的形式,欢迎其它客户下载试用。源码部分我通过邮箱的方式,发给TI的工程师评测。
ming xia2:
回复 Aries Lord:
我也是这么觉得的
___________
重庆科晓仪器代理液相色谱仪
zedong li:
您好,可以要一份您的附件吗?我想学习一下。