运行中修改协调器PAN ID和Channel,协调器广播至所有的设备重启加入新建后的网络

从飞比论坛那边看到一个问题,记录下:

一个ZigBee网络运行中,协调器通过串口与上位机连接,上位机设置协调器的PAN ID和Channel,协调器收到配置信息后,

首先将PAN ID和Channel广播发送至网络中的所有节点,然后协调器自身重启,加入新网络。部分代码如下:

//PAN ID

uint16 panId = BUILD_UINT16(msg[LOCDONGLE_CONFIG_PANID_LO_IDX],

msg[LOCDONGLE_CONFIG_PANID_HI_IDX]);

//Channel

uint8 channelId = msg[LOCDONGLE_CONFIG_CHANNELID_IDX];

//更改pan id和channel

_NIB.nwkLogicalChannel = channelId;

_NIB.nwkPanId = panId;

NLME_UpdateNV(0x01);

//广播至所有节点

if(UpdateAllNetwork(panId, channelId) == afStatus_SUCCESS)

{

//这里可以加入非阻塞的延时,一定不要加阻塞延时,否则无法执行其他的程序

SystemResetSoft();

}

static afStatus_t UpdateAllNetwork(uint16 panId, uint8 channelId)

{

afAddrType_t dstAddr;

uint8 dataLength = MSG_PANID_LENGTH + MSG_CHANNELID_LENGTH;

uint8 *msg = osal_mem_alloc(dataLength);

dstAddr.addrMode = (afAddrMode_t)afAddrBroadcast;

dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL;

dstAddr.endPoint = AF_BROADCAST_ENDPOINT;

msg[0] = LO_UINT16(panId);

msg[1] = HI_UINT16(panId);

msg[2] = channelId;

return AF_DataRequest(&dstAddr,

(endPointDesc_t*)&epDesc,

UPDATE_ALL_NETWORK,

dataLength,

msg,

&LocDongle_TransID,

0,

AF_DEFAULT_RADIUS);

}

测试结果:当注释掉SystemResetSoft(),网络中的其他节点能够接受到广播,否则协调器重启组建新的网络,节点无法收到广播。

可能原因:协调器还没有将数据广播出去,协调器就重启了。

于是,我加了延迟函数,延迟几秒,但是问题依旧,DEBUG也是这个结果。无奈来询问各位,什么原因。此外,看看各位还有没有更好的实现方式,我觉得自己的方式不太自然。

解决方法:

我恰好也需要实现这个功能,已经实现了。

楼主问题分析的很对,确实是由于广播帧没有发送出去,协调器已经重启了,其他设备收不到重启命令。

但是解决的办法有点欠妥,Z-STACK发送数据是异步的,也就是AF_SENDDATA函数调用完成后并没有发送出去而是交给了下一层继续打包后最终才能发送出去,所以应该延时,但不能使用阻塞式的延时,停留在当前状态,会导致数据包没有发送出去。

我的解决办法是在AF_SENDDATA后,使用osal_start_timerEx定时器,定时器会在你设定的时间后,产生一个你设定的事件,然后去对应的事件中,重启协调器。我设定的事件是500ms!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 12:54:39

运行中修改协调器PAN ID和Channel,协调器广播至所有的设备重启加入新建后的网络的相关文章

VMWare中CentOS6.8克隆后的网络设置

1.在克隆后,发现网络不能使用 2.修改eth0修改,vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改后信息如下: 3.清空70-persistent-net.rules 中信息 > /etc/udev/rules.d/70-persistent-net.rules 4.重启 Reboot 重新启动后系统网络正常

Android中如何修改编译的资源ID值(默认值是0x7F...可以随意改成0x02~0x7E)

一.技术准备 今天我们来看一下如何修改Android中编译时的资源Id的值,在讲解这内容之前,我们需要先了解一下Android中的资源编译之后的结构和编译过程,这里就不多说了,具体可以查看这篇文章: http://blog.csdn.net/jiangwei0910410003/article/details/50628894 这篇文章中,介绍了如何解析Android中编译之后的resource.arsc文件,这里就介绍了Android中资源文件编译之后的类型和格式,其实Android中资源编译

Android逆向之旅---运行时修改内存中的Dalvik指令来改变代码逻辑

一.前言 最近在弄脱壳的时候发现有些加固平台的加固方式是修改了dex文件结构,然后在加载dex到内存的时候,在进行dex格式修复,从而达到了apk保护的效果,那么在dex加载到内存的时候,如何进行dex格式的修复呢?其实原理就是基于运行时修改内存中的Dalvik数据,本文就来用一个简单的例子来介绍一下如何在内存中去修改Dalvik指令代码来改变代码本生的运行逻辑.在讲解本文之前,一定要先看这篇文章:Android中Dex文件格式详解 这篇文章主要介绍了关于Dex文件的格式介绍,这个对于后面修改内

教你如何修改运行中的docker容器的端口映射

在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设置,让你修改指定端口映射规则.那么这种情况我们该怎么处理呢?今天Docker君教你如何修改运行中的docker容器的端口映射? 方法一:删除原有容器,重新建新容器 这个解决方案最为简单,把原来的容器删掉,重新建一个.当然这次不要忘记加上端口映射. 优缺点:优点是简单快捷,在测试环境使用较多.缺点是如

[转帖]教你如何修改运行中的docker容器的端口映射

在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设置,让你修改指定端口映射规则.那么这种情况我们该怎么处理呢?今天Docker君教你如何修改运行中的docker容器的端口映射? 方法一:删除原有容器,重新建新容器 这个解决方案最为简单,把原来的容器删掉,重新建一个.当然这次不要忘记加上端口映射. 优缺点:优点是简单快捷,在测试环境使用较多.缺点是如

如何修改运行中的docker容器的端口映射

在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设置,让你修改指定端口映射规则.那么这种情况我们该怎么处理呢?今天Docker君教你如何修改运行中的docker容器的端口映射? 方法一:删除原有容器,重新建新容器 这个解决方案最为简单,把原来的容器删掉,重新建一个.当然这次不要忘记加上端口映射. 优缺点:优点是简单快捷,在测试环境使用较多.缺点是如

linux修改运行中的脚本

工作中经常会遇到,在执行一个脚本时后,觉得有些地方要补充,而这个脚本又已经运行了一段时间,如果从头再来很浪费时间,这时如果能修改这个运行中的脚本就方便多了. 如: cat test.sh #!/bin/bash echo 1111 sleep 60 echo 2222 当开始运行后,如果想修改第二个echo的输出值,怎么办? 直接打开test.sh修改肯定是不行的,这就好比,一个运行中的脚本,你把文件删除了之前,脚本依然可以运行下去一样.这是因为,此时的脚本已经放在了内存里.所以要想修改脚本只能

MyEclipse中修改项目运行地址栏中项目名称

1.如果出现从SVN上检出的项目名称跟运行地址栏中的项目名称不一致, 可以通过以下步骤进行修改 项目鼠标右键,单击"Properties" 2.找到"MyEclipse-->Web-->Web Content-root",对输入框中的内容进行修改 3.确定后,单击"OK" 比如原来的地址:http://localhost:8080/Flex/index.jsp 将上述输入框中修改成"FusionChart" 新的地

spring拦截器中修改响应消息头

问题描述 前后端分离的项目,前端使用Vue,后端使用Spring MVC. 显然,需要解决浏览器跨域访问数据限制的问题,在此使用CROS协议解决. 由于该项目我在中期加入的,主要负责集成shiro框架到项目中作为权限管理组件,之前别的同事已经写好了部分接口,我负责写一部分新的接口. 之前同事解决跨域问题使用Spring提供的@CrossOrigin注解: @RequestMapping(value = "/list.do", method = RequestMethod.GET) @R