BLE-NRF51822教程-RSSI获取
當手機和設備連接上后,設備端可以通過獲取RSSI來 在一定程度上判斷手機離設備的相對距離的遠近。
?
獲取函數很簡單直接調用sd_ble_gap_rssi_get 接口函數就行了,傳入連接句柄和buff就能獲取到 最近一次連接事件中的 接收信號強度。
?
調用該函數之前需要先調用sd_ble_gap_rssi_start ?函數,該函數有三個參數,第一個為連接句柄,第二個為 改變閾值, 第三個為忽略次數。
?
該函數有兩種用法, 一種就是 將閾值參數設置為BLE_GAP_RSSI_THRESHOLD_INVALID, 忽略次數參數設置為0。那么每次直接調用sd_ble_gap_rssi_get 函數獲取最近一次連接事件中的RSSI值就行了。
如下圖所示
?
另一種使用方式是, 設置第二個參數為一個有效的域值, 當rssi與上一次收到的rssi差值大于等于這個閾值時就會?BLE_GAP_EVT_RSSI_CHANGED 事件,同時也可設置第三個閾值來防抖動,即忽略次數,比如設置 閾值為5,忽略次數為3。如果前一次收到的rssi 為1 ,那么只有rssi差值大于等于5超過 三次,第四次才會產生BLE_GAP_EVT_RSSI_CHANGED 事件
如圖所示
?
?
下面實際用代碼來實現兩種方式。
?
第一種不使用閾值和事件的簡單方式: 即直接啟動,然后調用函數主動獲取。
?
我們設置一個定時器,在設備連接上后,啟動定時器開始周期獲取RSSI.
在main 函數中 創建一個定時器
?????? app_timer_create(&rssi_timer, APP_TIMER_MODE_REPEATED, rssi_timeout_handler);
?
定時處理函數很簡單,就是 獲取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);
}
?
然后在連接事件產生的地方添加 sd_ble_gap_rssi_start 并且啟動 上面創建的定時器。
如下圖所示
?
運行程序,當手機連接上設備后,就能看到串口周期打印RSSI值了,手機變動距離可以看到RSSI值的變化。
?
第二種方式: 使用閾值和事件方式
?
在on_ble_evt 事件處理函數中,添加當收到連接事件后rssi 測量啟動代碼,和BLE_GAP_EVT_RSSI_CHANGED事件處理代碼
代碼中我們定義rssi變化值大于5時才產生BLE_GAP_EVT_RSSI_CHANGED事件,然后在事件處理中打印rssi值
如下圖所示:
?
運行程序查看輸出打印可以發現 RSSI的差值都是大于等于5的
總結
以上是生活随笔為你收集整理的BLE-NRF51822教程-RSSI获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLE-NRF51822教程15-BLE
- 下一篇: BLE-NRF51822-实现简单扫描器