4.6 zigbee LQI、RSSI、丢包率等关系实验
无线传感器网络环境的复杂多变对ZigBee网络的自组织性提出了挑战,在实际的网络部署中,链路质量指示(LQI)、信号强度(RSSI)、丢包率等都对网络的调度分配与优化具有重要意义,LQI、RSSI在ZigBee标准中已经有了良好的定义,而且在ZigBee芯片上都提供了直接的支持,通过Z-Stack协议栈能够方便的获得。
4.6.1 实验目的与器材
1)实验目的
本实验将利用Z-Stack2007协议栈提供的API获取LQI、RSSI等数据信息,通过多组测试进行统计分析。由于无法模拟复杂的网络环境,主要在实验5.6的基础上,通过修改节点的发射功率以及增加干扰节点来影响统计的终端节点与协调器节点之间的通信,并由此分析发射功率对LQI、RSSI、丢包率等的影响,给实际的网络部署提供具有参考意义的数据信息,同时也可以利用现有代码将节点直接部署在需要建网的地方进行测试分析。 2)实验器材
? 3个CC2530开发模块(1个协调器节点,1个终端节点,1个干扰节点);
4.6.2 实验原理与步骤
1)LQI、RSSI介绍
1 链路质量指示(LQI)
LQI即链路质量指示,在ZigBee标准中规定的链路质量指示用于指示接收数据包的质量,为网络层或应用层提供接收数据帧时无线信号的强度和质量信息,它要对信号进行解码,生成的是一个信噪比指标。LQI的取值是0x00~0xff,分别表示接收到的信号最差质量(0x00)到最好质量(0xff)。 2 接收信号强度(RSSI)
RSSI(Received Signal Strength Indicator)是接收信号的强度指示,它的实现是在反向通道基带接收滤波器之后进行的。同时可以利用RSSI来进行统计信息进而实现定位功能。RSSI一般可从芯片直接获取:
RSSI与LQI的关系:RSSI =-(81-(LQI*91)/255) RSSI与d(距离)的关系:
2)程序流程
1协议栈中,RSSI、LQI获取:
在测试代码中主要通过sendReport()函数完成周期性的代码发送SampleApp_MessageMSGCB()完成在接收到数据包后进行的处理,而获得的数据包中本身就包含了RSSI和LQI值,通过osal_msg_receive()函数进行获取解析,并形成afIncomingMSGPacket_t结构
体类型:
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;
因此在SampleApp_MessageMSGCB()函数中,通过调用传入的参数afIncomingMSGPacket_t *pkt即接收到的数据包,调用即可获得。
为了方便的将RSSI、LQI数据获取并统计丢包率,将数据信息重新组织在从串口输出的包中,从协调器串口输出的数据格式为5个字节,其形式如表4.6.1所示:
表4.6.1协调器串口输出的数据格式 RSSI LQI 序列号 功率 分隔符
2丢包率和修改发射功率
在处理按键事件中加入发送数据包数,通过一个统计发送的数据包数的变量即可。而发射功率的修改,同时通过LCD显示,可参照实验5.6。 3干扰节点
在终端节点与协调器节点的通信测试统计中,加入干扰节点进行对比分析,在终端节点不同的发射功率下,调整干扰节点的发射功率,统计在干扰影响下LQI、RSSI、丢包率等值得变化情况。其中干扰节点只需不断发送数据包,而动态的调整发射功率可参照实验5.6来进行修改。 3)实验步骤
第一步,下载cc2530测试代码
① 在实验源码中,使用EnddeviceEB和CoordinatorEB;测试代码在“实验代码”文
件夹下的“正常实验节点”中,覆盖到工程SampleApp的Source目录下。
② 通过仿真器链接ZigBee节点与PC机,根据EnddeviceEB和CoordinatorEB选择下
载代码至ZigBee对应节点。
第二步,启动设备调整发射功率,无干扰发送数据包
① 按下协调器的重启键,在lcd显示网络号,led3(黄灯)长亮时说明网络建立; ② 使用USB转串口线与协调器节点相连,打开串口助手,调整波特率为38400; ③ 按下终端节点的重启键,等到led3(黄灯)长亮时说明已与协调器节点建立连接,
通过按键sw3调整发射功率,通过按键sw4调整发送包数
④ 终端节点选择好功率及发送包数后,按下节点的sw1,从协调器节点连接的串口助
手上可观察到数据 第三步,加入干扰节点测试
⑤ 按照第一步中的步骤下载干扰节点代码,代码在“实验代码”文件夹下的“干扰节
点”中。
⑥ 下载EndDeviceEB到干扰节点,通过按键sw3调整发射功率,通过按键sw4调整发
送包数
⑦ 按下sw1发送数据包给协调器节点 第四步,保存记录数据并分析
① 在无干扰情况下,发送功率为3,0,-1,-22对应0xF5,0xD5,0xC5,0x05情况下,发
送数据包,通过串口助手保存显示文件
有干扰情况下,发送功率为3,0,-1,-22情况下,发送数据包并记录。 4)程序清单
清单1 正常测试终端节点
static uint8 sendDataIndex = 1;
static uint8 sendDataNumber = 10; //发送序号
static int txIndex = 3; //最大发射功率 3
(1)在按键中添加自定义事件: if ( keys & HAL_KEY_SW_1 ) {
/* This key sends the Flash Command is sent to Group 1. * This device will not receive the Flash Command from this * device (even if it belongs to group 1). */
//设置周期发送事件
osal_set_event(SampleApp_TaskID,MY_DATA_SEND); }
(2)设置发送功率
if ( keys & HAL_KEY_SW_3 ) {
//发射功率从3 ~~ -22,这里只测试 3 0 -1 -22 switch(txIndex) {
case 3:
txIndex = 0; break; case 0:
txIndex = -1;
break; case -1:
txIndex = -22; break; case -22:
txIndex = 3; break; }
macPhyTxPower = txIndex;
macRadioSetTxPower(macPhyTxPower); #if defined( LCD_SUPPORTED )
HalLcdWriteScreen( \ HalLcdWriteValue(macPhyTxPower,16,HAL_LCD_LINE_2); #endif }
(3)//更改发送数量
if ( keys & HAL_KEY_SW_4 ) {
switch(sendDataNumber) {
case 10:
sendDataNumber = 100; break; case 100:
sendDataNumber = 250; break; case 250:
sendDataNumber = 10; break; }
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( \ HalLcdWriteValue(sendDataNumber,10,HAL_LCD_LINE_3); #endif }
}清单2 终端节点数据发送
/****************************************************************************** * 事件名 MY_DATA_SEND
* 描述 根据MY_SEND_DATA_DELAY定义的时间间隔,利用osal_start_timerEx函数* 定时的发送数据
*****************************************************************************/
if( events & MY_DATA_SEND ) {
sendReport();
if(sendDataIndex > sendDataNumber) {
osal_stop_timerEx(SampleApp_TaskID,MY_DATA_SEND); sendDataIndex=1; } else
osal_start_timerEx( SampleApp_TaskID, MY_DATA_SEND, MY_SEND_DATA_DELAY ); }
调用的自定义函数sendReport: void sendReport(void) {
uint8 buffer[5]; //send data
buffer[0] = (uint8)(SampleAppFlashCounter++);
buffer[1] = LO_UINT16( SAMPLEAPP_FLASH_DURATION ); buffer[2] = HI_UINT16( SAMPLEAPP_FLASH_DURATION ); buffer[3] = sendDataIndex++; buffer[4] = (uint8)txIndex;
if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc, SAMPLEAPP_FLASH_CLUSTERID, 5,
buffer,
&SampleApp_TransID, AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) { } }
4.6.3 实验结果
测试说明:测试环境为实验室东北角到西南角桌子之间(约5m),终端发送,协调器接收,终端发送时间间隔为400ms,每次发送100个包,有效载荷为20个字节。(功率单位为dBm)
1. 不同发射功率情况下,丢包率的变化,如图4-6-1所示。