请教:CC2530-2.5.1a协调器发出广播信号,如何确认所有终端都接收到信号?
目前协调器要广播给终端修改panid,然后协调器自己重启,目前已经得到的结论:终端设备越多,广播所需时间也就越多,具体是怎么一个线性关系还没有研究。。
所以现在准备通过确认所有终端都收到广播信息后协调器才重启。
请教大神有没有好的方法?(协议栈里面有啥可以用的吗?)
先谢谢了!
目前实现的方案,由于终端改完panid重启后,无法与未重启的协调器通讯,所以协调器加判断一分钟没有收到任何数据后重启。
建议节点在收到PANID修改的数据以后,通过应用层数据告知协调器。
如果协调器没有收到没几个设备的回复,也可以单独控制,不需要再广播控制。
感谢VV的建议!
我新人尝试着用协调器对终端进行单播代码如下:
if(events & SmartPv_Send_EVT)
{
Y++;
if( device_info[Y].device_add )
{
afAddrType_t my_DstAddr;
my_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
my_DstAddr.addr.shortAddr = device_info[Y].device_add;//存短地址的表
my_DstAddr.endPoint = SmartPvApp_ENDPOINT; //#define SmartPvApp_ENDPOINT 10
AF_DataRequest( &my_DstAddr, //控制广播单播组播
&SmartPvApp_epDesc,//端口号
SmartPvApp_CLUSTERID, //#define SmartPvApp_CLUSTERID 1
6,//数据长度
(byte *)&uartbuf,//发送的数据
&SmartPvApp_TransID,//发送数据的次数
AF_SKIP_ROUTING,
AF_DEFAULT_RADIUS
);
}
if(Y == (NWK_MAX_DEVICES-1))Y=0;
osal_start_timerEx(SmartPvApp_TaskID, SmartPv_Send_EVT, 500);
return (events ^ SmartPv_Send_EVT);
}
在AF_DataRequest打了断点是可以进来的,短地址是对的,但是终端就是接收不到数据。
请教VV大神 指点一下协调器单播的上面哪些地方有问题?
了解下终端设备接收数据的原理,如果终端设备不是rx always on的设备话,需要主动发送data request去向父设备拿数据的。
感谢@VV 解答 !
抓包看终端是一直有 data request的。今天发现如果设备过多的话,太多的 data request把信道阻塞了,导致协调器发的数据终端接收不到。
查了一些资料后,让已经接收到协调器广播的终端 NLME_SetPollRate(65535);//DataRequest轮询时间增大,减少信道的压力,并且 现在协调器采取一边单播 一边多次广播,这种暴力的方式~
目前测试了多次,26个终端 十几秒就能完成所有终端的panid配置。
后续准备看CC2538一次配置200+个终端panid的效果如何。到时可能还需要VV大神的帮助啊!
