获取RSSI

当手机和设备连接上后,设备端可以通过获取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);

}


运行程序,当手机连接上设备后,就能看到串口周期打印RSSI值了,手机变动距离可以看到RSSI值的变化。



2、使用阈值和事件方式

在on_ble_evt 事件处理函数中,添加当收到连接事件后rssi 测量启动代码,和BLE_GAP_EVT_RSSI_CHANGED事件处理代码

代码中我们定义rssi变化值大于5时才产生BLE_GAP_EVT_RSSI_CHANGED事件,然后在事件处理中打印rssi值

如下图所示:


运行程序查看输出打印可以发现 RSSI的差值都是大于等于5


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章