nRF52 BLE RSSI获取

RSSI的全称为接收的信号强度指示(Received Signal Strength Indication),用来判定无线连接质量。

Nordic SDK提供RSSI值获取方法,下面从主机和从机的角度分别介绍操作方法。

1. 主机获取RSSI值

1.1 扫描状态获取rssi

主机扫描到从机广播信号后,会产生一个广播事件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 连接状态获取rssi

Nordic SDK提供一种蓝牙连接状态下,获取连接信号强度的功能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)

应用时,需要先调用sd_ble_gap_rssi_start接口。获取rssi值的方式有两种:事件触发、主动获取。

启动模块后,当rssi发生变化时,会产生BLE_GAP_EVT_RSSI_CHANGED事件。在事件处理代码中,能够获取rssi值。

除此之外,还可以调用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()函数中,添加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;
    ......
}

你可能感兴趣的:(nRF52 BLE RSSI获取)