This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cc2530 ZStack广播问题

Other Parts Discussed in Thread: CC2530

我在用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,我之前的程序应该是被擦除了。那这样抓包除了抓广播数据包,单播的数据能抓到吗?此时抓包的设备在网络中的网络地址在哪里可以看到?

    cc2530.psd
  • 你好,

    当把路由器关闭以后,协调器广播出来的数据包是同一个数据包,你可以看到抓包文件里面Broadcast seq.num=0xFD, 三条广播数据的这个值都是一样的。

    在协议栈里面如果广播数据的广播半径不等于1,也就是说其他设备收到以后必定会转发的,那么在协议栈里面有一个zgBcastDeliveryTime,当一个设备发送出去广播数据以后,在这个时间内应该会收到其他设备转播过来的这条广播数据,如果这个时间timeout以后还没有其他设备转播数据,此时认为这条广播数据没有发送成功,需要重新发送 zgMaxBcastRetires,这个值就是重新发送的次数,协议栈里面默认值是2,uint8 zgMaxBcastRetires   = MAX_BCAST_RETRIES;

    所以你会看到发了三条广播数据。

    1, 应该没这个问题,我在用的也是win7的,相关的配置,驱动都对的吧

    2,广播和单播都是在软件上做的配置,硬件只要符合同样的调制解调的,在对应的频率下都会收进来的!

  • 明白了,非常感谢您的帮助。