This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

zigbee cc530关于链路质量的问题

Other Parts Discussed in Thread: CC2530

在zigbee网络中,基于cc2530,mesh组网,能否可以使终端节点和路由节点的lcd屏上显示出本节点和所连接的父节点之间的rssi值?

该怎样做?

  • RSSI的值只能通过和对方进行直接通信时获取,但终端节点只能和其父节点(协调器或路由器)进行直接通信,
    其他设备只能获取终端节点父节点的RSSI值
  • afIncomingMSGPacket_t这个结构体里面有rssi

    static void zclSampleSw_processAfIncomingMsgInd(zstack_afIncomingMsgInd_t *pInMsg)
    {
    afIncomingMSGPacket_t afMsg;

    /*
    * All incoming messages are passed to the ZCL message processor,
    * first convert to a structure that ZCL can process.
    */
    afMsg.groupId = pInMsg->groupID;
    afMsg.clusterId = pInMsg->clusterId;
    afMsg.srcAddr.endPoint = pInMsg->srcAddr.endpoint;
    afMsg.srcAddr.panId = pInMsg->srcAddr.panID;
    afMsg.srcAddr.addrMode = (afAddrMode_t)pInMsg->srcAddr.addrMode;
    if( (afMsg.srcAddr.addrMode == afAddr16Bit)
    || (afMsg.srcAddr.addrMode == afAddrGroup)
    || (afMsg.srcAddr.addrMode == afAddrBroadcast) )
    {
    afMsg.srcAddr.addr.shortAddr = pInMsg->srcAddr.addr.shortAddr;
    }
    else if(afMsg.srcAddr.addrMode == afAddr64Bit)
    {
    OsalPort_memcpy(afMsg.srcAddr.addr.extAddr, &(pInMsg->srcAddr.addr.extAddr), 8);
    }
    afMsg.macDestAddr = pInMsg->macDestAddr;
    afMsg.endPoint = pInMsg->endpoint;
    afMsg.wasBroadcast = pInMsg->wasBroadcast;
    afMsg.LinkQuality = pInMsg->linkQuality;
    afMsg.correlation = pInMsg->correlation;
    afMsg.rssi = pInMsg->rssi;
    afMsg.SecurityUse = pInMsg->securityUse;
    afMsg.timestamp = pInMsg->timestamp;
    afMsg.nwkSeqNum = pInMsg->nwkSeqNum;
    afMsg.macSrcAddr = pInMsg->macSrcAddr;
    afMsg.radius = pInMsg->radius;
    afMsg.cmd.DataLength = pInMsg->n_payload;
    afMsg.cmd.Data = pInMsg->pPayload;

    zcl_ProcessMessageMSG(&afMsg);
    }
  • 万分感谢!!! 那么终端节点怎样获取其父节点(协调器或路由器)的rssi值呢?有没有相关教程?
  • 可以在afBuildMSGIncoming內取用MSGpkt->LinkQuality去轉換成RSSI
  • 可以加在这里面吗?

    void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
    {
    uint16 flashTime;

    // uint8 rssi_buf[4];


    switch ( pkt->clusterId ) /*判断输入/输出簇ID*/
    {
    uint8 pFrame[ZB_RECV_LENGTH];
    case SAMPLEAPP_PERIODIC_CLUSTERID:
    // Start of Frame Delimiter
    pFrame[FRAME_SOF_OFFSET] = CPT_SOP; // Start of Frame Delimiter

    // Length
    pFrame[FRAME_LENGTH_OFFSET] = 10;

    // Command type
    pFrame[FRAME_CMD0_OFFSET] = LO_UINT16(ZB_RECEIVE_DATA_INDICATION);
    pFrame[FRAME_CMD1_OFFSET] = HI_UINT16(ZB_RECEIVE_DATA_INDICATION);

    // Source address
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_SRC_OFFSET] = (pkt->cmd.Data[4]);
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_SRC_OFFSET+ 1] = (pkt->cmd.Data[5]);

    // Command ID
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_CMD_OFFSET] = LO_UINT16(SENSOR_REPORT_CMD_ID);
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_CMD_OFFSET+ 1] = HI_UINT16(SENSOR_REPORT_CMD_ID);

    // Length
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_LEN_OFFSET] = LO_UINT16(4);
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_LEN_OFFSET+ 1] = HI_UINT16(4);

    // Data
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET] = (pkt->cmd.Data[0]);
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET+ 1] =(pkt->cmd.Data[1]);
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET+ 2] = (pkt->cmd.Data[2]);
    pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET+ 3] = (pkt->cmd.Data[3]);

    // Frame Check Sequence
    pFrame[ZB_RECV_LENGTH - 1] = calcFCS(&pFrame[FRAME_LENGTH_OFFSET], (ZB_RECV_LENGTH - 2) );


    uint8 T[8];
    DHT11_TEST();
    T[0]=wendu_shi+48;
    T[1]=wendu_ge+48;
    // T[2]='0';
    // T[3]='0';
    // T[4]='0';
    // T[5]='0';
    // T[6]='0';
    // T[7]='0';
    //
    HalUARTWrite(0,"temp=",5);
    HalUARTWrite(0,T,2);
    HalUARTWrite(0,"℃",2);
    HalUARTWrite(0,"\n",1);


    // Gui_DrawFont_GBK16(94,48,BLACK,YELLOW,Display_Buf);
    HalUARTWrite(HAL_UART_PORT_0,pFrame, ZB_RECV_LENGTH);
    // HalUARTWrite(HAL_UART_PORT_0,T,16);
    break;

    case SAMPLEAPP_FLASH_CLUSTERID: /*如果输入/输出簇ID为SAMPLEAPP_FLASH_CLUSTERID*/
    flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
    HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); /*接收到数据,并将收到的数据设定为LED闪烁时间*/
    break;
    }
    }