当手机和设备连接上后,设备端可以通过获取RSSI来 在一定程度上判断手机离设备的相对距离的远近。比如蓝牙防丢器就是通过RSSI来实现防丢的。
第一步:启动rssi功能
* @param[in] conn_handle Connection handle.
* @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID.
* @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event.
uint32_t sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)
传入连接句柄、改变阈值和忽略次数。
阈值:
为BLE_GAP_RSSI_THRESHOLD_INVALID ,忽略次数参数设置为0,那么每次直接调用sd_ble_gap_rssi_get 函数获取最近一次连接事件中的RSSI值就行了。
为0时,??????
为5时,rssi变化值大于阈值5才产生BLE_GAP_EVT_RSSI_CHANGED事件。
忽略次数:
可以当做消抖使用。如忽略次数为3,那么只有rssi差值大于等于5超过 三次,第四次才会产生BLE_GAP_EVT_RSSI_CHANGED 事件。
第二步:获取函数:
* @param[in] conn_handle Connection handle.
* @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored.
uint32_t sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)
传入连接句柄和buff就能获取到最近一次连接事件中的接收信号强度。
代码来实现两种方式:1、直接启动,然后调用函数主动获取。2、使用阈值和事件方式
1、直接启动,然后调用函数主动获取。
设置一个定时器,在设备连接上后,启动定时器开始周期获取RSSI.
void rssi_timeout_handler(void *p_context){
int8_t rssi;
sd_ble_gap_rssi_get(m_conn_handle, &rssi);
printf("rssi: %d\r\n",rssi);
}
2、使用阈值和事件方式
在on_ble_evt 事件处理函数中,添加当收到连接事件后rssi 测量启动代码,和BLE_GAP_EVT_RSSI_CHANGED事件处理代码
代码中我们定义rssi变化值大于5时才产生BLE_GAP_EVT_RSSI_CHANGED事件,然后在事件处理中打印rssi值
如下图所示:
运行程序查看输出打印可以发现 RSSI的差值都是大于等于5的