目前只是实现了6个下行及上行命令
链路质量探测模块
PC->协调器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| static void SerialApp_CallBack(uint8 port,uint8 event) { uint8 sBuf[50]; uint16 nLen=0; if(event!=HAL_UART_TX_EMPTY) { nLen=HalUARTRead(SERIAL_APP_PORT,sBuf,50); if(nLen>0) { uint8 messageType = sBuf[0]; uint8 msgSubtype = sBuf[1]; uint8 *rcvBuf=sBuf; if(msgSubtype ==NetID) { switch(messageType) { case COLLECT_SETTING_CMD: cmdCollectSet(rcvBuf); osal_stop_timerEx(Coord_TaskID,COLLECT_SETTING_CMD_OUTTIME_EVT);
osal_start_timerEx(Coord_TaskID,COLLECT_SETTING_CMD_OUTTIME_EVT,MAX_CLK_TIME); HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK); break; case NEIGHBOR_DETECT_CMD: break; case LINK_TEST_CMD: cmdLinkTest(rcvBuf); osal_stop_timerEx(Coord_TaskID,LINK_TEST_CMD_OUTTIME_EVT); osal_start_timerEx(Coord_TaskID,LINK_TEST_CMD_OUTTIME_EVT,MAX_CLK_TIME); HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK); break;
|
协调器串口从PC机接收到字符命令,判断是否为链路质量探测命令?是进入相应模块 cmdLinkTest进行处理
协调器->路由/终端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
void cmdLinkTest(byte *Msg) { byte LinkTest[4]; byte DestAddr[2]; byte DestNodeId; byte Send_Source_NodeId; int i; for(i=0;i<4;i++) { LinkTest[i]=Msg[i]; } Send_Source_NodeId=LinkTest[2]; DestNodeId=LinkTest[3]; DestAddr[0]=(byte)((g_AddrTable[DestNodeId]>>8) & 0x00FF); DestAddr[1]=(byte)(g_AddrTable[DestNodeId]&0x00FF); Coord_DstAddr.addrMode=(afAddrMode_t)afAddr16Bit; Coord_DstAddr.endPoint=ENDPOINT; Coord_DstAddr.addr.shortAddr=g_AddrTable[Send_Source_NodeId]; AF_DataRequest( &Coord_DstAddr, &Coord_epDesc, LINK_TEST_CLUSTERID, 2, DestAddr, &Coord_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); }
|
此模块功能:
(20-21):将要发送的源节点ID通过网络地址与节点号表 (g_AddrTable)转换Zigbee网络地址发送到源节点;
26Line: 当然目的节点号也要转换成网络地址。
源节点收到无线数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
void LinkTest_To_Dest(afIncomingMSGPacket_t *msg) { HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK); uint16 shortAddr; byte DestAddr[2]; byte SourceNodeInf[3]; uint8 sendNumber=0; byte send_PacketComplect=0; osal_memcpy(DestAddr,msg->cmd.Data,2); shortAddr=DestAddr[0]; shortAddr=(shortAddr<<8)|(DestAddr[1]); RouterEnd_DstAddr.addrMode=(afAddrMode_t)afAddr16Bit; RouterEnd_DstAddr.endPoint=ENDPOINT; RouterEnd_DstAddr.addr.shortAddr=shortAddr; osal_nv_read(NODEID_NV,0,1,&NodeID); SourceNodeInf[0]=NodeID; for(;send_PacketComplect<PacketNumber_LinkTest;send_PacketComplect++) { Onboard_wait(50000); SourceNodeInf[1]=sendNumber; SourceNodeInf[2]=send_PacketComplect; if( AF_DataRequest( &RouterEnd_DstAddr, &RouterEnd_epDesc, LINK_NODE_CLUSTERID, 3, SourceNodeInf, &RouterEnd_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS)==afStatus_SUCCESS) { sendNumber++; }
} return; }
|
功能:
将协调器发来的目的节点ID号的网络地址取出,以此为地址发送数据到目的节点。后面加了测试PRR的,所以统计了发送包成功数及接收包个数。
目的节点无线接收数据后反馈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
void LinkTest_Rsp(afIncomingMSGPacket_t *msg) { HalLedSet(HAL_LED_2,HAL_LED_MODE_BLINK); byte SourceNodeId,DestNodeId; byte send_LinkTestPacket[6]; osal_nv_read(NODEID_NV,0,1,&NodeID); DestNodeId=NodeID; SourceNodeId=(byte)msg->cmd.Data[0];
send_LinkTestPacket[0]=SourceNodeId; send_LinkTestPacket[1]=DestNodeId; send_LinkTestPacket[2]=msg->rssi; send_LinkTestPacket[3]=msg->LinkQuality; send_LinkTestPacket[4]=g_ReceiveNumber; send_LinkTestPacket[5]=msg->cmd.Data[1]+1;
RouterEnd_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; RouterEnd_DstAddr.endPoint = ENDPOINT; RouterEnd_DstAddr.addr.shortAddr= 0x0000; AF_DataRequest( &RouterEnd_DstAddr, &RouterEnd_epDesc, RELINK_TEST_CLUSTERID, 6, send_LinkTestPacket, &RouterEnd_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); g_ReceiveNumber=0; return; }
|
功能:将LQI 、RSSI等数据组包发送至协调器。
协调器接收到反馈数据包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| void ReLinkTest_Rsp(afIncomingMSGPacket_t *msg) { byte recev[6]; halIntState_t intState; osal_memcpy(recev,msg->cmd.Data,6); byte reLinkTest_Msg[10]; osal_nv_read(NETID_NV,0,1,&NetID); reLinkTest_Msg[0]=RELINK_TEST_MSG; reLinkTest_Msg[1]=Coord_TransID; reLinkTest_Msg[2]=NetID; reLinkTest_Msg[3]=recev[0]; reLinkTest_Msg[4]=recev[1]; reLinkTest_Msg[5]=recev[2]; reLinkTest_Msg[6]=recev[3]; reLinkTest_Msg[7]=recev[4]/recev[5]; reLinkTest_Msg[8]=(recev[4]%recev[5])*10/recev[5]; reLinkTest_Msg[9]=(recev[4]%recev[5])*10%recev[5]; HAL_ENTER_CRITICAL_SECTION(intState); HalUARTWrite(SERIAL_APP_PORT,reLinkTest_Msg,10); HAL_EXIT_CRITICAL_SECTION(intState); }
|
功能:将数据重新组包发送至PC机