最近在研究一個問題:如何通過AP來獲取station的rssi。
具體可以拆分為以下三種情況:
1、首先station如果已經連接到AP上,這種情況很容易就能夠得到station的RSSI.這里就不討論這種情況。
2、當station並未與設定AP連接,但是這個時候station與另外一個AP連接,並且這兩個AP具有相同的channel,這個時候需要通過一種方式去獲取station相對於
設定AP的RSSI。
3、當station並未與設定AP連接,但是這個時候station與另外一個AP連接,當時這個時候兩個AP具有不同的channel,這個時候需要通過一種方式去獲取station
相對於設定AP的RSSI。
問題分析:
1、第一種情況很簡單,一些ioctl就可以輕松的得到。
2、第二種和第三種情況相似,唯一的區別是channel不相同。在station與AP之間未進行連接的情況下,想要去獲取station相對於AP的RSSI,只有一種方式
那就是通過AP向station發送報文,發送什么報文呢?802.11幀請求幀(proble request/null data/Qos null data/RTS)。通過實驗發現發送proble request/
Qos null data 幀,station並沒有做出回應,(RTS還未進行實驗)。當通過AP向station發送null data幀的時候,station會返回給AP一個ACK報文,通過這
個ACK可以得到RSSI,這是在QCA 一種叫position的功能上得到的,在QCA上發送普通的null data的時候,不能將station幀收到driver上來,這里就簡單通過這種方式,獲取到RSSI。但是在這個測試驗證的過程中發現有些網卡並不能及時的回復ACK報文,導致AP這邊的發送狀態始終是放失敗,最終不能得到station的RSSI,這種情況還在分析原因。
分析原因很有可能是station沒有跟設定AP連接,所以station就不會正面回復ACK,但是有些網卡會回復ACK,測試過程中ralink的網卡會回復,inter和realtek都不會正面回復。下面將把抓包得到的信息以圖片的形式貼出來。
總之通過上面的方式不能獲取所有網卡的RSSI,經過一份思索,回想起QCA里面通過一種欺騙的手段來獲取ACK.
首先看看null data幀:
ACK報文內容非常簡單,只有一個receiver的mac地址,
兩種情況的區別在bssid,正常情況下bssid是填寫的ap1的mac,而在欺騙的情況下是填寫的AP2的mac,當sta收到null data的時候,發現bssid為AP2,AP2剛好是自己連接的,所以sta就會正面回復一個ACK.ACK報文對於同一channel的所有AP來說都是一樣的,大家都會收到這個ACK.