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;
......
}