pm2模式下,终端始终打开接收,关闭poll,怎么做呢?
2.5.1a
我要实现的效果是:
1.终端电池供电时候正常pm2模式,正常poll发送data request请求接收数据
2.usb供电时候,始终打开接收机,关闭poll。不知道该如何修改呢?
可以来回切换,为了usb供电时候可以不考虑节电,始终打开接收增加性能。
我按如下的修改,好用过(两种情况都能接收数据)。但后来又不好使了(usb供电一直打开接收关闭poll时候,不能接收到数据了)
监测功耗电流时候发现,usb切换到电池后,功耗没有降低,因为电池时候没有执行关闭接收只是打开了poll。
感觉主要问题在ZMacSetReq( ZMacRxOnIdle, &tmp )打开关闭接收好像并没有起作用呢?
pm2模式f8wconfig.cfg文件里面配置 调用右边的函数是否对应动态修改数值呢?
-DRFD_RCVC_ALWAYS_ON=FALSE tmp = true; ZMacSetReq( ZMacRxOnIdle, &tmp );//true始终打开接收?,flase始终关闭?这里好像不怎么好使?
-DPOLL_RATE=1000 NLME_SetPollRate( 0);//关闭poll
-DQUEUED_POLL_RATE=100
-DRESPONSE_POLL_RATE=100
大神求助啊
@VV
也有人问http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/21769.aspx
运行过程中 切换 接收态?
这个确实是个很牛B的想法,但我没试过!
我在E2E上发了个帖,到时有答案,再共享给你!
这里很少有回复
你说 “ 好用过(两种情况都能接收数据)”
意思是 可以了,但是不稳定是吗?
奇怪了,我得到的回复是:
No, you cannot change this dynamically.
poll rate都可以在程序里面修改
这个接收器的开关不能改吗?我在代码在组网和ota的部分都有用到一直打开接收机和调整poll的速度啊?
而我像1楼红字那样修改就没有作用呢
在ZDApp.c中的ZDApp_ProcessOSALMsg函数里面1118行,就有这样的代码和注释
tmp = true;
ZMacSetReq( ZMacRxOnIdle, &tmp ); // Set receiver always on during rejoin
意思不就是始终打开接收机在rejoin期间吗?
这样的代码别的地方也有
Poll rate 可以再运行过程中修改,这一点我知道!
但是接收机开关状态 可不可以在运行 过程中修改,我就不是很清楚。
不过我是这样认为的,不知道你有没有发现,
无论什么设备,在广播信息的时候都会将广播的信息 交给 协调器, 再由协调器分发出去。
而广播的形式 是有做区分的:
NWK_BROADCAST_SHORTADDR_DEVRXON : 一切非休眠的设备
NWK_BROADCAST_SHORTADDR_DEVALL : 所有设备(休眠和非休眠)
即便是可以在应用层中修改 接收机的状态, 那也必须保证 设备入网之前 修改。(但是这种可能性 是比较低)
不然,终端单方面进行 接收机状态的修改, 而又没有 让远端 协调器知道, 那么 广播的机制就乱了。
所以我认为 在运行过程中 修改 接收机状态 应该是不大可能的。
当然以上这是我的分析,具体还是需要TI的 给出一个答复 才行
谢谢你的跟踪
很少发广播,据说那样不好
ti一般都不回复啊
我昨晚又测试了一下cfg里面设置true,则程序中调用函数则可以实现,电池供电关闭rx,此时poll也停止了,终端完全不能接收只能上行,电流很小,
usb供电rx打开,poll设置成0,效果是能接收,并且电流较大,
但当cfg里面吧rx设置成false时候,程序中调用函数修改rx开关实现的效果则不同:
电池供电poll 1000,正常通信,电流很小
usb供电执行打开rx,poll设置0,不能接收,但电流较大,不知道为什么。
其实我要实现的是有些终端电池则只上行数据,不接收数据,关闭poll能节点,usb供电时候增加性能,不需要poll,实时都能接收到数据,这个用cfg=true的能实现
有些终端电池依然要poll,能接收数据。 只是在usb时候rx一直打开,增加性能,实时接收数据,这个其实用cfg=true的应该也可以实现,但问题在于关闭rx后poll设置成多少都没有用了,就不能实现正常通信了,所以测试cfg里面设置false,此时感觉开关rx的函数根本没有起作用,能否通信完全看poll设置是否为0了。
不知道您听懂我上面说的逻辑了吗?
于此得到一个问题:
cfg里面设置rx总是打开或者关闭后,终端的父节点路由或者协调器知道他子节点的接收状况吗?rx关闭时候只有poll父节点的瞬间才打开自己的rx,父节点收到这个poll后才给子节点发送数据的。那么当子节点rx一直打开时候,父节点知道吗?给子节点发送数据还在等待poll吗?
节点在入网的时候,会告诉父设备是一个什么类型的什么,
#define CHILD_RFD 1
#define CHILD_RFD_RX_IDLE 2
这个主要有-DRFD_RCVC_ALWAYS_ON来决定的,如果你是一个-DRFD_RCVC_ALWAYS_ON=FALSE的设备,那么协调器对于所有发送给该子什么的数据都是基于Data Request,没有Data Request就不会把数据发送给子设备,那么子设备Rx一直打开着,这个是机制。
不清楚你这么做的目的为了什么?
cfg 默认设置为 TRUE =====》 后续软件执行 关接收 ,此时poll也停止了 终端不能接收只能发送 电流很小 ? 》》》》情况 1
(软件关了接收,Poll rate 也会自动被停止吗?你是如何 判断Poll 也停止了? 还是 你自己手动把poll 关掉的? )
======》 重新软件执行 开接收, POLL RATE 设置为0 终端能接收 电流较大 》》》》情况 2
( 只要 接收 为TRUE 情况下,接收与否与Poll Rate 大小是没有关系)
cfg 默认设置为 FALSE =====》 后续软件不执行操作 ,POLL RATE 设置为1000 正常通信 电流很小 》》》》情况 3
(正常通信 是指 上下行都可以对吗? 协调器发信息给终端, 应该要1s后才能收到 )
======》 重新软件执行 开接收, POLL RATE 设置为0 终端不能接收 电流较大 》》》》情况 4
( 这里的电流 大 和情况 2 的电流 大 是一样 大吗? )
从以上四个情况来看, 表面上看 接收的状态, 在运行过程中只能是 从开转为关 才有效。
但你实验过程中是否确定:
1. 转换接收状态 , 都是在设备入网后操作 的吗?
2. 所谓电流大,电流小, 有没有个 实际的范围,比如 8mA 左右, 35mA 左右 之类?
cfg里面设置rx总是打开或者关闭后,终端的父节点路由或者协调器知道他子节点的接收状况吗?
====》 设备入网时 广播 Device Announce 这个信息就附带了 RX 的状态。 父节点当然就清楚了。(当然你抬杠说,那父节点要是刚好没收到呢?!)
rx关闭时候只有poll父节点的瞬间才打开自己的rx,父节点收到这个poll后才给子节点发送数据的。
====》 这是zigbee 固有的机制, 父节点会为 休眠的设备(即RX 为FALSE 的设备 ) 保存信息, 设备只有在POLL 父节点的时候 才能获取到这些信息。
这个你可以理解成 门口的邮箱, 发信的人 不可能一直在你家门口等你, 他会把信放在 信息,你回家的时候查看 一下,有就查收。
那么当子节点rx一直打开时候,父节点知道吗?给子节点发送数据还在等待poll吗?
====》 就如我一开和你说的, 设备入网的时候就会告知自己 是否为休眠 的设备(即RX 是否为 TRUE), 父节点一旦知悉了终端的类型,那么在信息分发的时候就做对应的处理。 是放在信箱中 还是 直接发送。
所以,假设你说的 运用那条函数可以改变 接收 的状态, 但实际 它没有广播出来, 那么对于父节点 它该怎么办呢?
但是,你问我那函数 不是明明写着可以改变吗? 我 也不清楚
大神终于出现了!
VV, 从他的描述 猜测:
这是一个终端设备, 有时用电池供电,有时又有USB 供电。
USB 供电时, 实时接收 消息。 (即像 RFD_RCVC_ALWAYS_ON = TRUE 这样设备)
电池供电时, 只在POLL RATE 到达的时候, 才去获取信息 (即像 RFD_RCVC_ALWAYS_ON = FALSE 这样设备)
简单的来说, 就是 一个设备 可以任意的从 实时接收信息的非休眠态 切换到 间隔接收信息的休眠态 。。
那长时间休眠的把poll rate改成0,实时接收信息的时候把poll rate改成500,不就可以了么
这样也不失为一个办法。
但是500的话, 一个网络中要是有几个这样的设备,那么网络中 全都是data request。。。网络应该很拥堵!
召唤@VV大神成功。不执行rx关闭,只是poll0能关闭poll但电流和rx打开时候电流一样,都不如关闭rx poll3000的水平
我的目的大致如楼上所说:为了降低功耗,和提升性能。d
1,电池供电,实验测得降低poll甚至关闭rx,电流的峰值就降低很多。所以想电池供电时一部分终端关闭rx完全不需要接收数据,以部分poll3000能接收数据。
2,usb供电,不考虑功耗,尽量提升性能,让rx一直开启,(终端都打开了power saving,若在切换供电时候能动态改变这个预编译内容,usb供电时候直接进pm2其实是更好的,但也要把rx一直打开,哪个函数应该是能修改rx打开或者关闭吧?ZMacSetReq( ZMacRxOnIdle, &tmp );)
我测试供电方式切换的时候和cfg里面设置rx的true、false,效果好像不能,都不能完全实现我预想的效果。
1,我在网站查找好像是只要-DRFD_RCVC_ALWAYS_ON=TRUE,则不论设置poll多少都不会发出poll,我测试应该是这样的,此时是usb,若切换到电池要关闭rx一直开,执行ZMacSetReq( ZMacRxOnIdle, &tmp );)关闭rx后poll1000已经不起作用了,若如你说的只修改poll1000则电流不会降低,证明rx依然是一直开的,要把rx修改成自动估计就好了。cfg初始化true能实现usb供电tx一直开,电池供电关闭roll,另一部分电池供电正常poll3000不能实现了。
,2,但-DRFD_RCVC_ALWAYS_ON=FALSE时候,调用ZMacSetReq( ZMacRxOnIdle, &tmp );)打开rx完全没有效果,usb供电rx一直开实现不了。电池供电关闭rx好用,电流也降低了,另一部分电池设备修改poll3000能实现。
3,我见ota升级里面的代码,都能提升降低poll,之前却执行了打开关闭rx。我跟我上面对函数的理解完全不同,但是照着做没有效果
static void SAPI_Ota_ProcessOTAMsgs( zclOTA_CallbackMsg_t* pMsg )
switch(pMsg->ota_event)
{
case ZCL_OTA_START_CALLBACK:
// Speed up the poll rate
RxOnIdle = TRUE;
ZMacSetReq( ZMacRxOnIdle, &RxOnIdle );
NLME_SetPollRate( 2000 );
case ZCL_OTA_DL_COMPLETE_CALLBACK:
else
{
// slow the poll rate back down.
RxOnIdle = FALSE;
ZMacSetReq( ZMacRxOnIdle, &RxOnIdle );
NLME_SetPollRate(DEVICE_POLL_RATE);
最后:估计造成2方面都不能完全满足的原因,是对哪个函数理解的错误,要不就是如您前面说的要重新入网通知协调器(测得通信上行都是正常的,有问题的是指下行能否通信)。再请大神分析一下-DRFD_RCVC_ALWAYS_ON=FALSE;ZMacSetReq( ZMacRxOnIdle, &tmp );;poll的修改,这3者的关联吧
的确poll多了影响,抓包也不容易看,很多设备时候啥都看不见了
对的,如楼层时间2016-2-26 16:22 所说的一样的效果。
稍微补充一点,实时接收切换到间隔接收或关闭接收,并且功耗要下降。主要是同一个工程这部分共同的代码为不同类型的终端所使用
就是您楼层2016-2-26 16:17 分析那样的过程,我在整理回复您一下:
cfg 默认设置为 TRUE ,电池供电
》》》》情况 1
我只执行了函数关闭rx并没有修改poll=0,cfg里面默认poll=1000,没有起作用了貌似,抓包看data request,电流大于80-100ua,我就说电流较低,我这不是最小系统,此时不能通信(都只不能接收,可以发出),满足了要求。另外一些类型的设备需要接收,修改p0ll =3000,poll的频率是低了,但电流28-30ma(因为初始cfg里面rx=true,执行关闭后修改poll=3000,已结没有效果了,完全关闭了),不满足要求
切换到usb
》》》》情况 2
执行函数打开rx,并设置poll=0(我都是一起修改的3个poll值,若值修改pollrate=0不修改另外2个,抓包发现data request就变成15s了,很奇怪),电流28-30ma此时电流和入网前一样的,证明rx一直打开。正常通信。满足了要求
cfg 默认设置为 FALSE ,电池供电
》》》》情况 3,POLL RATE 设置为1000,电流很小80-100ua,(正常通信 是指 上下行都可以对吗? 协调器发信息给终端, 应该要1s后才能收到 ),poll=3000,降低了电流峰值的次数,也节电了,满足了要求。另一部分类型设备,执行关闭rx,满足了要求,电流一直保持80-100ua,几乎没有poll那一下的峰值了。
切换到usb
》》》》情况 4
执行打开rx,poll=0,并不能通信,不论之前是关闭了rx,还是只降低了poll=3000.此处只要poll=0(rx完全打开,不需要poll了),就不能通信,rx打开根本没有作用,是否通信在于poll的值是否是0,不满足要求
但你实验过程中是否确定:
1,当然都是入网后切换的。
2,电流小就是我设备pm2的电流,80-100ua,电流大就是找网时候的电流28-30ma
后来我就怀疑到时协调器并不知道终端修改了rx常开还是依靠poll机制,所以下行数据有的时候抓不到包。若是终端入网信息Device Announce 中发给协调器的,这个信息就是cfg的-DRFD_RCVC_ALWAYS_ON的数值的话。那么我可以通过切换供电后执行终端重启来改变吗? 硬件重启好像依然是这个cfg的值,softreset呢?有用吗?还是执行什么函数有用呢?
协议栈的机制不够深入了解,难实现效果啊
突然继续想到一个问题,终端依靠poll跟协调器通信。那么当有很多数据要协调器下发的时候,就要缓存这些数据吧。这部分代码在哪里呢,如何缓存的呢?想了解下,听说最多存9条3个设备的信息。若rx常开不依靠poll,以及路由接收数据的时候,也要一起缓存吗?此处也可能对我那么修改有影响,当子设备很多的时候