修改协调器PAN ID和Channel,协调器广播至所有的设备重启加入新建后的网络
理想状态:
协调器连接串口,通过上位机打开协调器的com口,同时终端也入网了。
通过协调器发送广播给所有在同一网络的终端,内容是即将要修改的信道号和panid。(以下只用修改信道号)
终端接收到广播
终端修改信道成功
现在的问题是:
1.2.3都解决了,通过调试能看到终端收到了协调器发的广播。但是信道没修改成功。
问题详细:
_NIB.nwkLogicalChannel =17; //17是新修改的信道号
NLME_UpdateNV(0x01); //0x01的定义是保存网络层NIB
SystemReset(); //重启后,保存的信息生效
这段代码没有问题,因为我用串口直接改协调器是可以的,从没有出错过,重启后很快就能组网。
我烧板子的时候信道=26,代码中更改成12。
当终端把这段代码走完后,信道改了,也确实保存了,但是不能入网,此时协调器也改成和终端同样的信道号,终端不断的发送重启的信息,我打印出log看NV区的信道也确实是我刚才改的。当我一旦把协调器的信道恢复成初始信道26时,终端自动的将自己信道恢复成26并入网。也就是说终端只记得他之前入网的信道,不管自己的信道是多少,只要之前的网络还在,就自适应自我调整去加入,我觉得很神奇!! 我怀疑是因为nv_restore.我查了很久,查到了一句话:
加入这个宏定义好处肯定是有的,但是问题也来了,如果终端想加入别的协调器网络,既是PANID和频道都一样,不管重启多少次都不会加入新的协调器中。
但是nv_restore不能去掉,还有别的功能是依赖于它的。
我又找到一个函数:
applicationwants to delete the stored NV information It just needs to set theZCD_NV_STARTUP_OPTION as explained below and do a reset.
"Ifthe application would like to force a "new" join, the applicationshould set the ZCD_STARTOPT_DEFAULT_NETWORK_STATE bit in theZCD_NV_STARTUP_OPTION NV item before calling this function. "New"join means to not restore the network state of the device. UsezgWriteStartupOptions() to set these options
[zgWriteStartupOptions(ZG_STARTUP_SET,ZCD_STARTOPT_DEFAULT_NETWORK_STATE);]
我把这一句放到了修改信道的前面,但是SystemReset()后又恢复到了初始的信道号。
有没有什么方法可以让nv区清除入网信息,同时也要接受新的参数?
谢谢大家!!鞠躬!鞠躬!鞠躬!
帖子里有一张图,在这补上
求帮忙
这个功能我三年前就实现过,给你提个小建议,协调器需要首先重启,你的终端接收到修改PANID和CHANNEL的信息后,SystemReset(); 最好设置个定时器1s后启动试下。
谢谢,我已经解决了,问题是信道要全部能使才能使用。谢谢你哦。
我想请问一下这个 _NIB.nwkLogicalChannel是从哪里来的?在协议栈里面也找不到啊?求教一下!
楼主怎么解决的,能不能详细说一下呢?
楼主,你好,我十分想知道你调试的方法 ,“打印出log看NV区的信道”,是否需要什么工具。因为我有时想知道节点是否更新了数据,但不知道怎么读出来。谢谢