nRF52 BLE RSSI獲取

RSSI的全稱為接收的信號強度指示(Received Signal Strength Indication),用來判定無線連接質(zhì)量。

Nordic SDK提供RSSI值獲取方法,下面從主機和從機的角度分別介紹操作方法。

1. 主機獲取RSSI值

1.1 掃描狀態(tài)獲取rssi

主機掃描到從機廣播信號后,會產(chǎn)生一個廣播事件BLE_GAP_EVT_ADV_REPORT??稍谑录幚碇蝎@取從機RSSI的值。

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    
        case BLE_GAP_EVT_ADV_REPORT:
            NRF_LOG_INFO("RSSI: %d\n",p_gap_evt->params.adv_report.rssi);
            break;
    
}

1.2 連接狀態(tài)獲取rssi

Nordic SDK提供一種藍牙連接狀態(tài)下,獲取連接信號強度的功能API。該API主要接口如下所示:

sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)
sd_ble_gap_rssi_stop(uint16_t conn_handle)
sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)

應(yīng)用時,需要先調(diào)用sd_ble_gap_rssi_start接口。獲取rssi值的方式有兩種:事件觸發(fā)、主動獲取。

啟動模塊后,當(dāng)rssi發(fā)生變化時,會產(chǎn)生BLE_GAP_EVT_RSSI_CHANGED事件。在事件處理代碼中,能夠獲取rssi值。

除此之外,還可以調(diào)用sd_ble_gap_rssi_get()接口,隨時獲取信號強度。

/**@brief Function for enabling reception of RSSI values when in a connection. 
 */
static void rssi_measurements_start(void)
{
  uint8_t threshold    = 2;
  uint8_t skip_count   = 10;
  ret_code_t err_code = sd_ble_gap_rssi_start(m_conn_handle, threshold, skip_count);
  APP_ERROR_CHECK(err_code);
}


static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    
        case BLE_GAP_EVT_RSSI_CHANGED:
        {
          int8_t rssi_value =  p_gap_evt->params.rssi_changed.rssi;
          uint8_t channel_rssi =  p_gap_evt->params.rssi_changed.ch_index;
          NRF_LOG_INFO("RSSI changed, new: %d, channel: %d",rssi_value, channel_rssi); 
        } break;
    
}

static void rtc_timeout_handler(void * p_context)
{
    int8_t rssi;
    uint8_t channel;
    
    if (conn_handle != BLE_CONN_HANDLE_INVALID)
    {
        sd_ble_gap_rssi_get(conn_handle, &rssi, &channel);
        NRF_LOG_INFO("rssi is %d.\n", rssi);
    }
}

2. 從機獲取掃描RSSI值

從機獲取rssi值,在藍牙事件處理ble_evt_handler()函數(shù)中,添加BLE_GAP_EVT_SCAN_REQ_REPORT事件處理即可。

/**@brief Function for handling scan request report.
 * Print the RSSI and address of the initiator if the RSSI has changed.
 */
static void on_scan_req_report(ble_gap_evt_scan_req_report_t const * p_scan_req_report)
{
  static int8_t         rssi_value = 0;

  if(rssi_value != p_scan_req_report->rssi)
     {
       rssi_value = p_scan_req_report->rssi;
       NRF_LOG_INFO("Received scan request with RSSI %d .",rssi_value);
       NRF_LOG_INFO("addr %02x:%02x:%02x:%02x:%02x:%02x",
               p_scan_req_report->peer_addr.addr[0],
               p_scan_req_report->peer_addr.addr[1],
               p_scan_req_report->peer_addr.addr[2],
               p_scan_req_report->peer_addr.addr[3],
               p_scan_req_report->peer_addr.addr[4],
               p_scan_req_report->peer_addr.addr[5]);
     }
}

/**@brief Function for handling BLE events.
 *
 * @param[in]   p_ble_evt   Bluetooth stack event.
 * @param[in]   p_context   Unused.
 */
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ......
        case BLE_GAP_EVT_SCAN_REQ_REPORT:
            on_scan_req_report(&p_gap_evt->params.scan_req_report);
            break;
    ......
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容