协议版本:2.3.1
工程:sampleApp
功能:显示上一跳信号强度
一、什么是RSSI LQI
摘自葵花宝典3.2.4(OUTMAN):
3.2.4 连接质量指示――LQI
还记得电脑的WIFI指示吧,我也不了解WIFI协议,但我想这应该是相同的东西吧。在802.15.4中,有两种检测连接质量的方法,一个是检测“接收信号强度”――RSS,另外一个是检测“信噪比”――SNR。RSS值是通过检测接收到的信号的全部能量情况来判断的。
又有人举手了?这位同学有什么问题?――什么,这是怎么做到的?
呃、、、这个我真不懂,不过我知道肯定有个寄存器来读的。至于这个值是怎么来的,你还是问下做IC的人,或者你找个不是那么忙的教授,说不定他知道~~~不过这位小同学啊,看你问这个问题,我得多说你几句了。你这么“叫真”不好,倒不是打击你,我知道你说不定能成个人物,不过,学习是要讲“深度”和“广度”并举的,如果什么事情都一头钻进去,你会迷路的。。。
我们继续,那“信噪比”SNR,顾名思义,就是信号除以噪声的比率了。当然,值越大表示信号质量越好。
每一个接收到的数据包都会做一个LQI的测量,它至少有八个等级。这个测量是物理层很重要的一个任务,因为这个值不但他的直属领导-MAC层要用到,他的上几层领导-网络层和应用层都用得到。比如说网络层(NWK)在选择路由的时候,LQI就是一个很重要的指标,LQI值高的路径当然要优先考虑,当然,这也只是一个因素,比如说这个LQI高的路径里的设备都是电池供电的,那么在频繁选择这个路径的同时,必然会导致这些设备电池寿命缩短。所以,一定要多方面权衡――这就体现了“领导”的作用。。。
二、如何实现?
其实很简单,我们收到每个数据包的时候,RSSI和LQI已经打包好,我们只需要读出来就行了!
typedef struct
{
osal_event_hdr_t hdr; /* OSAL Message header */
uint16 groupId; /* Message's group ID - 0 if not set */
uint16 clusterId; /* Message's cluster ID */
afAddrType_t srcAddr; /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
it's an InterPAN message */
uint16 macDestAddr; /* MAC header destination short address */
uint8 endPoint; /* destination endpoint */
uint8 wasBroadcast; /* TRUE if network destination was a broadcast address */
uint8 LinkQuality; /* The link quality of the received data frame */
uint8 correlation; /* The raw correlation value of the received data frame */
int8 rssi; /* The received RF power in units dBm */
uint8 SecurityUse; /* deprecated */
uint32 timestamp; /* receipt timestamp from MAC */
afMSGCommandFormat_t cmd; /* Application Data */
} afIncomingMSGPacket_t;
这里我把程序贴出来,大家可以试验看一下
gEnableRssi是一个全局变量,默认是0,不打印RSSI,我们可以通过串口控制它:
收到RSSI和LQI后,可以用公式算一下,我试验的结果是基本相近:
串口收到:00 01 BC 24
网络地址:0x0001
RSSI: BC转换十进制是188, 188-255= -67dBm
LQI:24转换十进制 是36
RSSI=-(81-(LQI*91)/255) = -68.153dBm
|