TI中文支持网
TI专业的中文技术问题搜集分享网站

如何控制设备入网?

现在我用的是

协调器用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地址来实现入网。

赞(0)
未经允许不得转载:TI中文支持网 » 如何控制设备入网?
分享到: 更多 (0)