微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 移动式的终端(ED),想要传递消息给信号最好的路由?

移动式的终端(ED),想要传递消息给信号最好的路由?

时间:10-02 整理:3721RD 点击:

移动式的终端(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关闭

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top