當手機和裝置連線上後,裝置端可以通過獲取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 函式中 建立乙個定時器
定時處理函式很簡單,就是 獲取rssi
void rssi_timeout_handler(void *p_context)
然後在連線事件產生的地方新增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教程8 動態廣播
本講接收如何實現動態廣播。教程基於 9.0 sdk中的 uart例子。實現動態廣播的方法是 廣播 停止廣播 修改引數 重啟廣播 所以我們通過乙個定時器來週期性的 關閉廣播然後再修改廣播資料之後再開啟廣播。sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。首先 在main...
BLE NRF51822教程8 動態廣播
ble nrf51822教程8 動態廣播 2015 12 29 17 38 35 分類 嵌入式 本講接收如何實現動態廣播。教程基於 9.0 sdk中的 uart例子。實現動態廣播的方法是 廣播 停止廣播 修改引數 重啟廣播 所以我們通過乙個定時器來週期性的 關閉廣播然後再修改廣播資料之後再開啟廣播。...
BLE NRF51822教程9 動態廣播
本講接收如何實現動態廣播。教程基於 9.0 sdk中的 uart例子。實現動態廣播的方法是 廣播 停止廣播 修改引數 重啟廣播 所以我們通過乙個定時器來週期性的 關閉廣播然後再修改廣播資料之後再開啟廣播。sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。首先 在main...