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.

[参考译文] CC2340R5:如何获取器件与协调器之间的 RSSI

Guru**** 2676675 points

Other Parts Discussed in Thread: CC2340R5

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1597142/cc2340r5-how-to-obtain-the-rssi-between-the-device-and-the-coordinator

器件型号: CC2340R5

连接到协调器后、我使用函数 ZB_zdo_get_diag_data (0、&LQI、&RSSI);1s 获得一个 RSSI 值、但每次获得 RSSI 值时、它都不会改变。 它与获得的第一个 RSSI 值保持相同。

SDK:9_10
CC2340R5

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您是否使用 ZED 或 ZR、以及它与 ZC 进行通信(数据轮询之外)的频率如何?  您能否提供一个代码片段来说明它在您的应用中的使用方式?

    static void handle_diag_data_resp(zb_bufid_t buf)
    {
      zb_zdo_get_diag_data_resp_params_t *resp_params;
    
      resp_params = ZB_BUF_GET_PARAM(buf, zb_zdo_get_diag_data_resp_params_t);
    
      ZVUNUSED(resp_params);
    
      Log_printf(LogModule_Zigbee_App, Log_INFO, "handle_diag_data_resp, status: %d, addr: 0x%x, lqi: %d, rssi: %d",
                 resp_params->status, resp_params->short_address,
                 resp_params->lqi, resp_params->rssi);
    
      zb_buf_free(buf);
    }
    
    static void send_diag_data_req(zb_uint16_t short_address)
    {
      zb_zdo_get_diag_data_req_params_t *req;
      zb_bufid_t buf;
    
      buf = zb_buf_get_out();
      if (buf != ZB_BUF_INVALID)
      {
        req = ZB_BUF_GET_PARAM(buf, zb_zdo_get_diag_data_req_params_t);
        ZB_BZERO(req, sizeof(*req));
    
        req->short_address = short_address;
        zb_zdo_get_diag_data_async(buf, handle_diag_data_resp);
      }
      else
      {
        Log_printf(LogModule_Zigbee_App, Log_ERROR, "Failed to get a buffer");
      }
    }
    
    zb_uint8_t zcl_specific_cluster_cmd_handler(zb_uint8_t param)
    {
    //...
      send_diag_data_req(g_dst_addr);
    //...
    }

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void GetRSSI_TimeoutCb(zb_uint8_t 参数)
     uint8_t rsp[6]={0};
     INT8_t RSSI = 0
     zB_time_t 时间;
     RSSI = zstackGetRssi ();
     RSP[0]= RSSI;
     data_send_process (CMD_USER_GET_RSSI_start、rsp、sizeof (rsp));
     if (ZB_SCHEDULE_GET_ALARM_TIME (GetRSSI_TimeoutCb、0、&TIME)!= RET_OK)
     {
      ZB_SCHEDULE_APP_ALARM (GetRSSI_TimeoutCb、01 * ZB_TIME_ONE_second);
     }
     
    }

    int8_t zstackGetRssi (void)
     zb_uint8_t LQI
     ZB_INT8_t RSSI
     zb_zdo_get_diag_data (0、&LQI、&RSSI);
     //ZB_MAC_diag_data_get (0、&appLastLqi、&appLastRssi);
     返回 RSSI
    }

    我使用 ZED、ZC 的通信频率为 3 秒。 我也尝试了 3 秒钟一次、但 RSSI 值保持不变。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您提供的代码、我之前已经尝试过、但它不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在休眠 Zed 和非休眠 ZR 节点遇到类似的问题、下面是解决方法、我可以使用以下解决方法:

      #include "zb_nwk_neighbor.h"
      
      //...
      
      volatile zb_uint8_t lqi = ZB_MAC_LQI_UNDEFINED;
      volatile zb_int8_t rssi = ZB_MAC_RSSI_UNDEFINED;
    
      zb_ret_t ret;
      zb_neighbor_tbl_ent_t *nbt;
    
      ret = zb_nwk_neighbor_get_by_idx(0, &nbt);
      if (ret == RET_OK)
      {
        lqi = nbt->lqi;
        rssi = nbt->rssi;
      }

    注意:“Volatile “分配仅用于防止编译器优化 LQI/RSSI。  将 ZB_Nwk_neighber_get_by_idx 替换为 ZB_Nwk_neighber_get_by_short 也是完全可以接受的。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ryan、您好。我使用了您提供的代码、发现 RSSI 值的变化速度仍然非常缓慢。 因为我在我的项目中注意到、RSSI 值仅在发送 ZCL 命令(例如 report 属性、time:write 属性等)时才会发生变化、如果只有数据请求数据包、RSSI 值不会改变。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的观察结果是正确的、我之前提到的是:

    与 ZC
    的通信频率(在数据轮询之外)

    将仅针对 Zigbee 应用数据包(而不是数据轮询)观察 RSSI/LQI。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我看到了。 谢谢你。