现在我用的是
协调器用NLME_PermitJoiningRequest函数是否允许入网;
节点端用的HOLD_AUTO_START宏编译,初始化的时候直接挂起,需要入网时调用ZDOInitDevice。
2种设备都开启了NV_RESTORE。所以只有在第一次入网的时候2设备需要按按键,之后可以直接通信。
有个问题是:节点端我设置了一个事件,不挂起的时候会定时上报消息。但是挂起后,消息就不上报了。我另外再开启该事件的定时器,消息才正常发送。这个该怎么解决呢?或者还有什么别的比较好的控制节点入网的方法?
Hu Jinfeng:
可以在GenericApp_Init()中加入
…
if( NLME_RestoreFromNV() ) //if device had joined a network, auto start { devState = DEV_INIT; ZDOInitDevice(0); }
…
当设备之前入过网并开启NV_RESTORE,那么if里面返回的是true,就避免了设备挂起。
feng wang14:
请问你是怎么实现终端初次入网需要协调器和终端都需要按键,之后终端就会自动入网的?
谢谢了
Hu Jinfeng:
回复 feng wang14:
其实一楼已经把方法都说了。。而且我这个方法设备一旦入网,除非擦除flash,否则没法连别的协调器。
1.设备、协调器开启NV_RESTORE宏编译。
2.协调器:①在GenericApp_Init()中最后面添加NLME_PermitJoiningRequest(0); 表示禁止设备接入
②在按键处理函数HandleKeys里面随便哪个按键,加入NLME_PermitJoiningRequest(15); 表示15s内允许设备接入
3.设备(路由):①开启HOLD_AUTO_START宏编译
②在GenericApp_Init()中最后面添加判断
// If device had joined a network, AUTO START. // Else HOLD_AUTO_START if( NLME_RestoreFromNV() ) { devState = DEV_INIT; ZDOInitDevice(0); }
如果已经入过网,就直接初始化网络继续其他步骤。不然还是挂起。
③也是在按键或者别的处理函数里加入以下,初始化网络。
devState = DEV_INIT; ZDOInitDevice(0);
把设备挂起,不让其进入网络初始化从而控制入网也是没办法的事,因为现在对入网的整个流程还是很糊涂。
协调器端倒是发现ZDApp中有个函数,可以修改然后比较mac地址控制入网。
feng wang14:
回复 Hu Jinfeng:
谢谢你的耐心解答,我现在是用白名单的方式来实现限制连接,交流以一下
A. 协调器实现白名单入网
修改ZDSecMgr.c
1. 修改ZDSecMgrDeviceValidateRM( ZDSecMgrDevice_t* device )打开白名单验证开关 ZDSecMgrStoredDeviceList, 白名单在这个数组,在这个数组中添加终端的MAC地址,这里需要说明一下,因为在协议栈读到的MAC地址是低字节在前,所以在添加MAC地址的时候要注意低字节在前,打开这个数组
2. 修改f8wConfig.cfg文件,打开安全开关 /* Set to 0 for no security, otherwise non-0 */ -DSECURE=0 -DZG_SECURE_DYNAMIC=0 改为 /* Set to 0 for no security, otherwise non-0 */ -DSECURE=1 -DZG_SECURE_DYNAMIC=1 该方法也可以实现协调器黑名单
B.终端实现黑名单的方法
这个要参考一个英文的帖子
http://processors.wiki.ti.com/index.php/Black_list_implementation
这个帖子说的很详细,他是用NV来存储黑名单的
当然可以结合A方法和B方法实现协调器用NV的方法实现白名单入网,这样就可以实现自动入网
Hu Jinfeng:
回复 feng wang14:
学习了!不过我有个问题,若是一个节点通过路由器连协调器。路由在白名单,节点不在,那么节点会连入协调器吗?还是说路由上你也会加白名单,从而使整个网络都拒绝非白名单设备入网。
我的方法是协调器用NV存好白名单,然后在ZDApp.c中ZDO_JoinIndicationCB(uint16 ShortAddress, uint8 *ExtendedAddress,uint8 CapabilityFlags, uint8 type)中判断节点的长地址是否在白名单里,不在直接返回false拒绝设备入网。不过这个方法,能不能控制孙子节点入网我还没有试过。
feng wang14:
回复 Hu Jinfeng:
如果路由器在白名单,而节点不在白名单,节点是不会加入网络的吧,
这个我也没做个实验,你可以试试,
Aries Lord:
回复 feng wang14:
1,ZDSecMgrDeviceValidate里面的白名单验证并不完美,首先这个函数是封闭函数,无法将白名单交给协调器的上位机来进行验证。其次,白名单验证时,节点已经入网了。而理想的白名单验证,应该是一个已经存在的zigbee网络,协调器的上位机可以感知到未入网节点的MAC地址,并主动输入MAC地址来实现入网。