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;

......

}

澳洲队凌晨击败沙特 成功晋级2026年世界杯 - 澳洲财经新闻
手机电池4000mah可以续航多久?