移动式的终端(ED),想要传递消息给信号最好的路由?
移动式的终端(ED),部署了多个路由节点,想要在ED触发的时候将消息传递给距离最近,信号最好的路由(不一定会是父设备),请问有什么方法可以实现吗?
终端的数据发送只能通过父节点来转发,包括给其他节点的单播还是广播。
在移动过程中,ED无法知道距离哪个路由信号最好的?
是不是可以这样:
布下的路由节点均为同一网内,该可移动的ED加到某一路由下。
然后ED移动到某一个位置,该位置介于其父设备和另一路由之间,
在与父设备的通讯范围之内,但距离另一路由较近,
怎么让ED成为另一路由的子设备,可以实现吗(此时ED触发,是不移动的)
我的设想:ED触发后,发个广播,查rssi值,根据该rssi值判断成为哪个路由的子设备,再发送消息给父设备
我终于意识到问题所在了,真是惭愧啊!
ED只能通过父设备与网内其他设备通信,能获取到只能是父设备的RSSI值。所以无法从RSSI值判断距离。
有什么方法可以判断距离最近的Router吗?
从理论上来说,距离最近的应该就是父节点,因为节点在重新入网的时候,也会选择信号最好的设备作为新的父节点。
但是因为干扰,阻挡的原因,父节点不一定是距离最近的。
纯粹是为了获得其他节点的信号强度,不一定要使用ZigBee协议栈的,直接用Basic RF点对点的通信,该成有广播的就可以了。
从实际情况来看,该ED需要一开始便已加入网络中,不是等到触发才重新入网,而且需要考虑到功耗问题。
部署的Router算是参考节点,目的是想知道盲节点(ED)触发时在哪个参考节点附近。不算真正意义上的定位。
从目前来看,似乎没有好的方法可以实现。
VV说到重新入网,我也有考虑过,ED被按键触发后,保存该按键欲发送的消息(存入NV),然后擦网络信息,重新入网,加网成功后再将保存的信息发出。
但总感觉如果每次触发都重新入网有点不靠谱!
我说这个重新入网是人为的重新入网。
一个ED入网以后,会每隔1s向父设备发送 data request,父节点收到以后会回复MAC ACK
当你的ED移动的时候,会远离父节点,那么连续发送Data request都没有MAC Ack回复的时候,状态会从end device->orphan->discover->rejoin
rejoin的时候会选择其他的节点作为父设备。所以这个过程是必然发生的,也不是人为去操作的。
当触发该ED时,其跟父节点距离其实是不确定的,可能在其通讯范围内,或者之外。
范围之内便没有rejion发生。
作为ED真的没有办法得知,距离最近的路由节点吗?
ED 跟父节点的距离一定在一跳的通讯范围内的。
一般父节点是信号最强的那个,但是不一定是距离最近的。
我去看了一下TIMAC发现了有实现这样功能的可能!
TIMAC有两种类型设备 Coordinator,End-Device,
一个范围内只能有一个coordinator,其他设备只能与其associate组成网络,作为ED存在。
从里面的例程msa来看,先触发的作为coordinator,后触发的只能作为ED。
这样来看,似乎只能建立星型的网络。
现实需要的情况是:作为coordinator的设备会被固定在某个位置,然后ED,分散在各个点,
可能在与coordinator的通讯范围之外。
现在定义三个设备:R1,R2,R3,
R1为Coordinator,R2、R3均为ED,R2在与R1的通讯范围内,R3在与R1的通讯范围之外,
但R3在与R2的通讯范围之内,那么在TIMAC协议栈下,R2与R1 associate组成网络,
R3能否与R2发生Associate,从而通过R2与R1通讯?
还有就是,网络信息无法保存?
既然已经讲到星型网络了,所以的ED只能于Coordinator组网和通信的!
ED与ED之间通信,必须通过Coordinator中转!
谢谢VV的回答。
我貌似又问错了,刚刚才醒悟过来!
我的问题应该是:TIMAC中msa例程中是有两种设备coordinator(FFD)和EndDevices(RFD),其实就是802.15.4协议中分为FFD,RFD两种类型设备。怎么从例程中修改出可以充当“路由”的FFD能与coordinator关联,并能够让EndDevices(RFD)与之关联。
楼主是在做定位的项目吧
何必呢,你想用TIMAC,又要用路由,那还不如直接ZigBee呢。
或者你自己去实现一个路由协议!
自己实现路由协议,难度挺大的!
如果用Z-stack,我想通过rejoin来实现!每当ED有按键触发,不管在不在父设备范围内,不管有没有脱网,就开始rejoin,rejoin到信号最强的路由上。
直接触发的话,我应该调用哪些函数触发rejoin呢?还有哪些变量值需要改变吗?
不知道rejoin是否可以实现我上面描述的切换父设备的过程呢?
我突然发现了这个参数:AF_SKIP_ROUTING,貌似是可以绕过父设备给其他路由发消息的
这样是不是通过广播,直接给消息到其他路由节点了?那么其ACK是不是也是绕过父设备直接给过来了?
如果你对ZigBee协议很熟悉的话,你可以去尝试!
NLME_ReJoinRequest( uint8 *ExtendedPANID, uint8 channel )
又带着问题来了!
ED广播,AF_DataRequest,option为AF_SKIP_ROUTING,radius为1,Router收到消息后马上回传消息给ED,单播发送,option、radius设置同上。
宏定义POWER_SAVING未开启。在这个过程中,各个Router均有收到消息,并且回传消息成功发出,但是ED无法收到回传消息(通过串口打印查看)
后面我将f8wConfig.cfg中,RFD_RCVC_ALWAYS_ON=FALSE改为TRUE,ED就可以收到Router的回传消息。通过各个Router物理位置及返回消息的RSSI值可以看出,回传的消息确实是从各个Router直接发到ED上的,并未通过其父设备转发给ED。
然后我再把POWER_SAVING开启,ED就无法收到Router回传的消息。
问题是:ED需要睡眠,需要降低睡眠电流,RX肯定不能一直开着,又要能得到与其他Router通讯的距离。
需要实现的是:ED需要开启POWER_SAVING,每当有按键触发,发出消息后要开着接收器以接收Router的回传消息,然后定时将接收器关闭。
当ED按键触发,怎么样强制开启RX,等个几秒钟再关掉?
纠正一下上面有提到的:POWER_SAVING开启,RFD_RCVC_ALWAYS_ON=TRUE,ED是可以收到回传消息的。
纠正一下上面提到的:POWER_SAVING开启,RFD_RCVC_ALWAYS_ON=TRUE,ED是可以收到消息的!
你需要接收数据的时候,把power saving关闭