無線接收訊號強度(RSSI)那些事兒
本文所述的原理適用於所有無線傳輸技術,只是用藍芽來舉例。應該說,嵌入式企鵝圈更加偏重於嵌入式和物聯網、安卓技術原理方面的知識分享和傳播,其次才是實踐,儘管很多開發者都很浮躁地希望能夠立刻獲得例程原始碼。本人一直都認為,只有通曉理論,才能把實踐做得更好,才能成為真正的專家級工程師,否則就永遠都是碼農一枚。
一、應用
無線接收訊號強度(RSSI)在距離測算方面的應用中需要用到。咱們不說室內定位了,換個例子:學生考勤,由於獲取的RSSI只有絕對值,沒有方向性,所以需要在校門口的外面和裡面各裝一個AP接入點。假如是隻有一個接入點,那就不知道這個學生到底是進入學校還是離開學校。
現在有兩個接入點,那它們可能同時檢測到一個學生手環,但明顯,如果是進入學校,那當學生在校外時,校外的AP獲得的RSSI肯定會高過校內的RSSI。當學生進入校內時,校內的AP獲得的RSSI肯定會高過校外的RSSI。換一種說法,校內和校外AP獲得RSSI峰值的時間點是有先有後的。比較峰值時間即可判定是進入學校或者離開學校。
二、單位
RSSI的單位是DBm,而不是DB。DB是輸出和輸入功率的比例值,而DBm確是一個絕對值。
dbm是一個表示功率絕對值的單位,他的計算公式為10lg(功率值/1mw)。例如如果接收到的功率為1mw,按照dbm單位進行折算後的值應該為10lg 1mw/1mw=0dbm。當然在實際傳輸過程中接收方是很難達到接收功率1mw的。因為還有接收端的天線增益,所以即使接收功率是0.00001mw(即-50db)時,RF射頻的接收端也能很好地進行碼元解碼。
但是,對於某種無線介面(就是802.xx定義的規格,對於藍芽來說就是IEEE 802.15.1)來說,也是要保障接收功率在一定範圍,才能正常工作。對於無線感測器網路來說,低於-95db時訊號是不可靠的。
從這裡,我們也可以看出,在安卓上利用BLE介面獲得的RSSI值都是負數的,是因為它獲取的就是以dbm為單位的。
但是,為什麼我們從藍芽單晶片(如NRF52832,DA14580,或者TI 2541)平臺來說,我們獲得的RSSI數值確實正數的呢?
三、訊號等級
獲得正數是因為各個藍芽廠商自己根據自身的通道和訊號經驗值來給出訊號等級。好比,我們手機使用者只需要知道電池電量是多個格就好了,無需知道電池電壓值。
從這裡也可以看出,真正的RSSI訊號dbm值和訊號等級是廠家的自行進行對映的,而且是跟自家產品相關的,不是標準。就是說NRF52832的訊號等級A和DA14580的訊號等級A儘管數值一樣,但是對應的真正的dbm是可能不一樣的。
四、如何獲得RSSI
1).一般藍芽主機在掃描到藍芽裝置時,底層協議棧會給上層一個報告事件,其攜帶的引數就有一個RSSI值。例如,DA14580平臺會返回一個GAPM_ADV_REPORT_IND報告事件,其攜帶的引數是:
2)當連線上裝置之後,如何還想獲得RSSI的話(記住,RSSI在每次連線事件時都會發生變化的),就必須想資料鏈路層(LLC)傳送查詢RSSI請求,LLC就會啟動接收功率積分電路(物理層的事),當電路工作完成並準備好資料後再給上層一個完成事件,通過攜帶的引數即可獲得RSSI。例如,DA14580平臺的請求命令是:LLC_RD_RSSI_CMD,而返回的事件是LLC_RD_RSSI_CMP_EVT,攜帶的引數是:
structllc_rd_rssi_cmd_complete
{
///Status for command reception
uint8_t status;
///Connection handle
uint16_t conhdl;
///RSSI value
uint8_t rssi;
};
RSSI對於上層的開發知識就這麼多,如果你想繼續研究發篇高水平的論文也是可以的,那就進入MAC(媒體接入控制)和資料鏈路層去研究吧,例如根據RSSI的變化來調整發射功率,來達到節省功耗的目的。
嗯,其實嵌入式企鵝圈一位博士成員就研究過這個的,哈哈。沒說錯,是博士!
關注微信公眾號:嵌入式企鵝圈,獲得上百篇物聯網原創技術分享!