cc2530 ZStack广播问题
我在用zstack开发时碰到这样一个问题,想请教下这是什么原因?
测试环境::一个协调器,一个路由器,一个终端设备,zstack版本是ZStack-CC2530-2.5.1a。
组网的方式是:协调器下挂路由器,路由器下挂终端设备,测试每个设备的广播消息是否发送到其他两个设备。
测试发现协调器和路由器发广播消息终端设备都收不到广播消息,但是终端设备发广播消息路由器和协调器都能收到。如果改下组网方式,把路由器和终端设备都挂在协调器下,测试每个设备发广播消息另外两个设备都能收到广播消息。
请问这是为什么呢?
广播消息发送的代码如下:
afAddrType_t dstAddr;
char msgData[16];
dstAddr.addr.shortAddr = 0xffff;
dstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
dstAddr.endPoint = DEVICE_ENDPOINT;
AF_DataRequest(&dstAddr, &CModule_epDesc,
CMODULE_CLUSTERID,
(byte)osal_strlen(msgData) + 1,
(byte *)&msgData,
&CModule_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS);
你在终端设备的POLL_RATE设置了多少?
有抓包的数据吗?
W好,很高兴看到您的回复。
我的POLL_RATE设置如下。后来我把-DRFD_RCVC_ALWAYS_ON设置为TRUE,把-DRFD_RCVC_ALWAYS_ON设置为TRUE之后没有加POWER_SAVING NWK_AUTO_POLL这两个宏定义。终端设备可以收到广播消息,但是很奇怪的是协调器发一次广播消息,终端设备会收到两次或者三次相同的广播消息。请问是不是哪里设置的有问题呢?
还想请教下用sniffer packet抓包的时候cc2530 flash的程序被仿真器下载的抓包程序覆盖了,这样其他设备还能通过网络地址发数据到抓包设备吗?
/* The number of milliseconds to wait between data request polls to the coordinator. */
-DPOLL_RATE=1000
/* This is used after receiving a data indication to poll immediately
* for queued messages...in milliseconds.
*/
-DQUEUED_POLL_RATE=100
/* This is used after receiving a data confirmation to poll immediately
* for response messages...in milliseconds
*/
-DRESPONSE_POLL_RATE=100
/* This is used as an alternate response poll rate only for rejoin request.
* This rate is determined by the response time of the parent that the device
* is trying to join.
*/
-DREJOIN_POLL_RATE=440
因为当路由器收到广播数据以后,也会转发,所以在终端设备上,你会看到收到2条广播数据!
W,非常感谢您的回复,还有一个现象想麻烦您帮我确认下是否正常?
网路中有一个协调器,一个路由器挂在协调器下,一个终端设备也是挂在协调器下。
先通过协调器发送广播消息,内容为123456,我通过串口打印的数据如下,终端设备收到了两条相同的从协调器发来的广播消息,但是从rssi值可以看出-25dbm是协调器的,-61dbm是路由器转发的,因为我是把协调器和终端设备放在一起的,路由器隔的比较远。这和您说的路由器会转发一致。
bcast by:0000 data:123456 rssi: -25dbm
bcast by:0000 data:123456 rssi: -61dbm
再用路由器发送广播消息,内容为AAAAA,终端设备也收到了两条相同的从路由器发来的广播消息,如下所示,这也和您说的一致。
bcast by:9471 data:AAAAA rssi: -63dbm
bcast by:9471 data:AAAAA rssi: -23dbm
现在我把路由器断电,再从协调器发广播消息123456,终端设备收到了3条一样的广播消息,如下所示,这是为什么呢?是不是有问题呢?
bcast by:0000 data:123456 rssi: -23dbm
bcast by:0000 data:123456 rssi: -23dbm
bcast by:0000 data:123456 rssi: -24dbm
另外一个问题,如果我从终端设备发广播消息BBBBBB,协调器和路由器都只会收到一次广播消息,为什么终端设备发的广播路由器不会再转发给协调器呢?
bcast by:C45C data:BBBBBB rssi: -23dbm
你把具体的抓包数据发下来可以吗?
最后一种情况,终端设备自己没有发送广播数据的能力,所以当终端设备需要发广播数据的时候,先把数据发给父设备,然后父设备在广播,所以协调器和路由各收到一条!
W您好,
我用packet sniffer抓包看了广播数据,附件是抓包保存文件。我看了应该是重复收到了广播消息。第一次收到了两次广播数据,按您的分析是路由器广播了一次,所以是两次。第二次收到3次相同数据时我已经把路由器关闭了。麻烦您帮忙确认下问题,谢谢。
我用packet sniffer的时候有两个疑惑:
1、我用的电脑的系统是win7,安装packet sniffer之后开始抓包,发现抓不到任何数据包。后来换到同事的xp系统上,测试能正常抓包。我是在ti官网上下载的packet sniffer安装包。版本是Setup_SmartRF_Packet_Sniffer_2.18.1,不知道你们碰到这种问题?
2、抓包的时候连接debugger之后会下载程序到cc2530,我之前的程序应该是被擦除了。那这样抓包除了抓广播数据包,单播的数据能抓到吗?此时抓包的设备在网络中的网络地址在哪里可以看到?
你好,
当把路由器关闭以后,协调器广播出来的数据包是同一个数据包,你可以看到抓包文件里面Broadcast seq.num=0xFD, 三条广播数据的这个值都是一样的。
在协议栈里面如果广播数据的广播半径不等于1,也就是说其他设备收到以后必定会转发的,那么在协议栈里面有一个zgBcastDeliveryTime,当一个设备发送出去广播数据以后,在这个时间内应该会收到其他设备转播过来的这条广播数据,如果这个时间timeout以后还没有其他设备转播数据,此时认为这条广播数据没有发送成功,需要重新发送 zgMaxBcastRetires,这个值就是重新发送的次数,协议栈里面默认值是2,uint8 zgMaxBcastRetires = MAX_BCAST_RETRIES;
所以你会看到发了三条广播数据。
1, 应该没这个问题,我在用的也是win7的,相关的配置,驱动都对的吧
2,广播和单播都是在软件上做的配置,硬件只要符合同样的调制解调的,在对应的频率下都会收进来的!
明白了,非常感谢您的帮助。