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.

zstack终端设备丢失父节点问题

Other Parts Discussed in Thread: CC2530

我在测试cc2530组网的时候有个问题想请教下大家:

协调器下面挂了一个终端设备,如果先打开终端设备,协调器处于关闭状态,终端设备会一直处于DEV_NWK_DISC状态,并定时的查找可加入的网络,再打开协调器终端设备能够自己扫描到协调器创建的网络并加入。但是如果再把协调器关闭,终端设备还是一直处于DEV_END_DEVICE状态。是不是目前zstack的协议栈不会判断是否丢失了父节点呢?我在网上的一篇帖子里面看到:如果协调器被关掉了,那么会在LCD上显示Assoc Cnf fail。但是我关了协调器之后LCD上仍然是Assoc Cnf Success,是不是需要配置什么编译选项才可以有这个效果呢?

另外我看到大神VV在回复另外一个问题时说到:

一个ED入网以后,会每隔1s向父设备发送 data request,父节点收到以后会回复MAC ACK,如果连续发送Data request都没有MAC Ack回复的时候,状态会从end device->orphan->discover->rejoin rejoin的时候会选择其他的节点作为父设备。

想请教下VV,ED向父设备发送的data request和父节点回复的mac ack是协议栈实现的还是要自己写代码实现呢?谢谢

  • 你好,

    你是不是把 终端设备处的,POLL_RATE 改成了0

    这个在协议栈里面已经都实现好的!

  • VV您好,

    我的-DPOLL_RATE=1000是默认的没有改,也加了NWK_AUTO_POLL编译选项;只是把-DRFD_RCVC_ALWAYS_ON=TRUE设置为了TRUE。是不是因为RFD_RCVC_ALWAYS_ON=TRUE了POLL就不起作用呢?

    还想顺便请问下是不是NWK_AUTO_POLL必须定义POWER_SAVING才起作用呢?

    谢谢。

  • 你把-DRFD_RCVC_ALWAYS_ON=FALSE就可以了!

  • VV您好,

    我之前试过把-DRFD_RCVC_ALWAYS_ON=FALSE,并增加了NWK_AUTO_POLL编译选项,POLL_RATE这些参数都是默认的没有修改。这样编译出来的程序有问题,终端设备收不到协调器发送的广播消息。所以后面我才把-DRFD_RCVC_ALWAYS_ON=TRUE了。

    后来我发了邮件去问你们的技术支持,他说还需要加入POWER_SAVING选项POLL才能起作用。我又加了POWER_SAVING编译,但是这个程序在终端设备上仍然有问题,终端设备在不停的休眠->启动->休眠->启动,并且切换频率非常高!我的板子上有一个led灯,当设备加入网络之后会点亮,休眠时这个灯会被熄灭,就发现这个灯不停的闪烁,感觉终端设备一加入网络就休眠了。协调器发送消息到终端设备也收不到。其他的相关参数都是默认值,没有修改过。

    想请问下您是不是我的理解哪里有问题?希望您帮忙分析下,这个问题已经纠结了一个月了。我用的协议栈是ZStack-CC2530-2.5.1a。谢谢!

  • 不知道你问的是哪个技术支持?

    有几个基本的概念,稍微需要理一下,

    1)协调器发数据给终端设备,机制是什么?

    当协调器应用需要发送数据给终端子设备的时候,在上层看来是把数据发下去了,但是实际上数据时buffer在协调器底层的,因为协调器认为节点可能处于休眠或者RX是关闭状态的,所以需要终端设备来主动请求父设备的时候,协调器才把数据发过去。

    2)RFD_RCVC_ALWAYS_ON是用来干嘛的

    对于终端设备来说,RX不是一直都打开的,可能会处于休眠状态。那么当RFD_RCVC_ALWAYS_ON=TRUE以后,强制的把终端设备的Rx一直打开,所以终端设备不会一直数据去询问协调器有没有数据了,而且当协调器有数据需要发的时候也就直接发送过去了。

    3)POWER_SAVING是用来干嘛的

    Enable power saving functions for battery-powered devices

    使能Power saving以后,休眠的时间是通过协议栈OS调度获得的,每次都是以最近发生的事件的时间作为休眠时间的,所以你们看到led不停的闪,原因是POLL_RATE=1000,休眠时间只有一秒种

    4)POLL_RATE是用来干嘛的

    For end devices only: number of milliseconds to wait between data request
    polls to its parent. Example POLL_RATE=1000 is a data request every
    second. This is changed in f8wConfig.cfg.

    这个变量就是控制终端设备,多久去请求父节点,询问有没有数据。


  • VV您好,

    非常感谢您的耐心解答,我之前是发到你们公司的技术支持邮箱ti-china@ti.com问的问题。
    我现在把RFD_RCVC_ALWAYS_ON=FALSE,并加入了NWK_AUTO_POLL编译选项,POLLRATE都是默认值;这样终端设备就能用POLL的方式工作了吧?发现协调器发送广播数据,终端设备收不到数据;但是终端设备发送广播数据协调器能收到。请问这是什么原因呢?

    还有就是我前面提到的加入POWER_SAVING选项时看到LED不停的闪,POLL_RATE=1000,感觉LED闪的频率非常高,至少一秒都闪了好几次,我把POLL_RATE改为5000,闪烁的频率也没有变化,似乎POLL_RATE没有起作用。还有串口也不能正常工作了,打印的数据几乎都是乱码。我感觉可能是我的某些配置还是有问题。

    我的这个工程里面加入了一个的编译选项BUILD_ALL_DEVICES,因为我打算在一个编译工程里面实现3种不同的设备功能,通过ZCD_NV_LOGICAL_TYPE设置当前设备类型。我前面的这两个问题是不是跟这个编译选项有关呢?

    谢谢!

  • VV, 你好。

             关于你提到的 “ 协调器应用需要发送数据给终端子设备的时候,在��层看来是把数据发下去了,但是实际上数据时buffer在协调器底层的,因为协调器认为节点可能处于休眠或者RX是关闭状态的,所以需要终端设备来主动请求父设备的时候,协调器才把数据发过去。

            我遇到的情况是,终端子设备休眠结束后,发送了data request给父节点,父节点也确实把缓冲的packet发给了子节点,然而,这个包在底层协议栈被直接处理了,协议栈把收到的packet原样又response给了父节点,根本没有执行到应用层的接收函数。请问这问题该怎么解决?

  • 你有具体抓包看过整个过程吗?

    你发的是什么数据?

    response是因为这个协调器发给节点的Request需要有response,另外这个request是否传到节点的应用层看你的消息类型,和是否在应用层有注册相应的callback函数

  • 你有具体抓包看过整个过程吗”-----------别总问这类问题了,不抓包的话,我怎么描述这个问题?

    这个request是否传到节点的应用层看你的消息类型,和是否在应用层有注册相应的callback函数” ---------如果不休眠,应用层就收的到,你说我有没有callback函数?

  • VV您好,

    非常感谢您的耐心解答,我之前是发到你们公司的技术支持邮箱ti-china@ti.com问的问题。
    我现在把 RFD_RCVC_ALWAYS_ON=FALSE,并加入了NWK_AUTO_POLL编译选项,POLLRATE都是默认值;这样终端设备就能用 POLL的方式工作了吧?发现协调器发送广播数据,终端设备收不到数据;但是终端设备发送广播数据协调器能收到。请问这是什么原因呢?

    还 有就是我前面提到的加入POWER_SAVING选项时看到LED不停的闪,POLL_RATE=1000,感觉LED闪的频率非常高,至少一秒都闪了好 几次,我把POLL_RATE改为5000,闪烁的频率也没有变化,似乎POLL_RATE没有起作用。还有串口也不能正常工作了,打印的数据几乎都是乱 码。我感觉可能是我的某些配置还是有问题。

    我的这个工程里面加入了一个的编译选项BUILD_ALL_DEVICES,因为我打算在一个编译工程里面实现3种不同的设备功能,通过ZCD_NV_LOGICAL_TYPE设置当前设备类型。我前面的这两个问题是不是跟这个编译选项有关呢?

    谢谢!

  • Mark下,受教了

  • 你好,我也遇到一样的问题,请问这个问题解决了?谢谢

  • @Warrior,
    既然你有抓包的数据,为什么不上传呢。

    协议栈把收到的packet原样又response给了父节点”是什么意思?

  • @bx da

    协调器发送单播数据给节点,节点是否可以收到呢?

    另外下协调器的AssociateList里面是否还有这个设备的信息。

    LED灯在闪,可能是因为我们协议栈在默认情况下对按键使用的是poll的方式,poll的周期是100ms。你把对按键的处理改成中断方式就可以了

  • @VV 大神

    在论坛看到您的好多回复,受教颇多。

    关于这个问题,我想我遇到的和 @bx da 是类似的,我把我的解决办法贴出来。

    题主应该和我的想法一样,想在一个工程Configurations里面通过BUILD_ALL_DEVICES编译项来实现对协调器、路由、终端角色的互转。

    然后想法很丰满现实很骨感,因为协调器/路由、终端在协议栈里面option的配置是不一样的,其中如下图的库文件是不一样的。其他的对比一下就知道了。

    所以解决的办法就是终端需要新建工程Configurations来实现,这也是TI官方sensorDEMO 例程的解决办法。

    当然应该也有其他解决办法,欢迎交流。