4.6zigbeeLQI、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(ReceivedSignalStrengthIndicator)是接收信号的强度指示,它的实现是在反向通道基带接收滤波器之后进行的。同时可以利用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结构体类型:typedefstruct{osal_event_hdr_thdr;/*OSALMessageheader*/uint16groupId;/*Message'sgroupID-0ifnotset*/uint16clusterId;/*Message'sclusterID*/afAddrType_tsrcAddr;/*SourceAddress,ifendpointisSTUBAPS_INTER_PAN_EP,it'sanInterPANmessage*/uint16macDestAddr;/*MACheaderdestinationshortaddress*/uint8endPoint;/*destinationendpoint*/uint8wasBroadcast;/*TRUEifnetworkdestinationwasabroadcastaddress*/uint8LinkQuality;/*Thelinkqualityofthereceiveddataframe*/uint8correlation;/*Therawcorrelationvalueofthereceiveddataframe*/int8rssi;/*ThereceivedRFpowerinunitsdBm*/uint8SecurityUse;/*deprecated*/uint32timestamp;/*receipttimestampfromMAC*/afMSGCommandFormat_tcmd;/*ApplicationData*/}afIncomingMSGPacket_t;因此在SampleApp_MessageMSGCB()函数中,通过调用传入的参数afIncomingMSGPacket_t*pkt即接收到的数据包,调用即可获得。为了方便的将RSSI、LQI数据获取并统计丢包率,将数据信息重新组织在从串口输出的包中,从协调器串口输出的数据格式为5个字节,其形式如表4.6.1所示:表4.6.1协调器串口输出的数据格式RSSILQI序列号功率分隔符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正常测试终端节点staticuint8sendDataIndex=1;staticuint8sendDataNumber=10;//发送序号staticinttxIndex=3;//最大发射功率3(1)在按键中添加自定义事件:if(keys&HAL_KEY_SW_1){/*ThiskeysendstheFlashCommandissenttoGroup1.*ThisdevicewillnotreceivetheFlashCommandfromthis*device(evenifitbelongstogroup1).*///设置周期发送事件osal_set_event(SampleApp_TaskID,MY_DATA_SEND);}(2)设置发送功率if(keys&HAL_KEY_SW_3){//发射功率从3~~-22,这里只测试30-1-22switch(txIndex){case3:txIndex=0;break;case0:txIndex=-1;break;case-1:txIndex=-22;break;case-22:txIndex=3;break;}macPhyTxPower=txIndex;macRadioSetTxPower(macPhyTxPower);#ifdefined(LCD_SUPPORTED)HalLcdWriteScreen(ChangeRFPoewr,Test);HalLcdWriteValue(macPhyTxPower,16,HAL_LCD_LINE_2);#endif}(3)//更改发送数量if(keys&HAL_KEY_SW_4){switch(sendDataNumber){case10:sendDataNumber=100;break;case100:sendDataNumber=250;break;case250:sendDataNumber=10;break;}#ifdefined(LCD_SUPPORTED)HalLcdWriteScreen(ChangeDataNumbers,Test);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(sendDataIndexsendDataNumber){osal_stop_timerEx(SampleApp_TaskID,MY_DATA_SEND);sendDataIndex=1;}elseosal_start_timerEx(SampleApp_TaskID,MY_DATA_SEND,MY_SEND_DATA_DELAY);}调用的自定义函数sendReport:voidsendReport(void){uint8buffer[5];//senddatabuffer[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所示。图4-6-1丢包率随功率变化趋势结果说明:(1)在无干扰情况下,终端发送间隔400ms时,在不同的发射功率下,基本无丢包;(2)在干扰节点的发射功率为3dBm时,终端的发射功率越小,丢包越严重;如图,即使终端的发射功率为3dBm时,也有丢包的情况;(3)在干扰节点的发射功率为-22dBm时,终端的发射功率越小,丢包越严重;如图,但是在终端的发射功率为3和0dBm时,基本没有丢包。2.在无干扰的情况下,不同发送功率下LQI比较,如图4-6-2所示。图4-6-2无干扰情形下,LQI随功率变化趋势结果说明:(1)LQI的计算:LQI值越大,一般表明接收包的信号品质越好;(2)在终端采用3dBm这样大的发射功率时,能获得大的LQI值,而功率为-1dBm时,部分LQI值为0;(3)发射功率为0dBm时,LQI值波动