一、前言
事情是這樣子的,最近我在做一個跟物聯網路有關的案子。我拿 MTK 的 Linkit Smart 7688 來做周邊機器節點 (7688 跑 station 模式),然後呢,每台周邊機器上都配有一個小螢幕,上面會顯示一些跟機器相關的資訊,其中需要 "連線強度" 那樣子的圖示。因為現場安裝的工程師,需要知道節點會不會離 AP router 太遠。原本我以為要拿到"連線強度"應該是小菜一碟,結果 7688 切到 station 模式之後,iwconfig 竟然拿到的 LQI 竟然是無用的!!! (LQI 跟 Signal level 完全不動啊~~ 哭臉)。反正,後來我花了一點時間在系統裡面翻翻找找的,都沒找到啦!差點要摔東西了~ 靠夭啊,這樣我是要怎麼在機器的 panel 上做出那個 "強度指示 icon" 啊!
(2016/4/13 21:20 註: 感謝北科大電子系李昭賢老師(力趣哥)的指導~~ 原來 iwconfig 在 OpenWrt 即將被拿掉,目前該指令處於廢棄狀態, 請見OpenWrt官網說明,現在改用 iwinfo 指令,我也是用這支啦! 之前 iwconfig 不能用,讓我有點錯怪 MTK,真的很失禮阿~~歹勢歹勢~這點要親自登網誌道歉謝罪一下....)
好啦!最後的結果,就是我寫了一支跑在 node.js 上的模組,給它用掃描的啦!為什麼要寫成 node.js 的模組啊??!! 很簡單啊! 因為節點程式就是用 node 設計的啦~~~ 沒有甚麼特殊理由....
其實我的目標是要拿到 LQI 啦~ 啊不過因為這個模組可以掃出鄰近的 AP,所以就給它取的名字叫 wiscan (wifi scanner) 的意思,如果你的 node.js 應用程式需要掃出附近的 AP,或許這個模組可以幫上點小忙。以下就來簡單說明一下~
二、安裝 mt7688-wiscan
wiscan 程式很小、不需編譯,所以直接 ssh 登入 Linkit Smart 7688 後,在上面安裝就可以啦! 我這裡把它裝在 /app 目錄下,待會在裡面寫一支測試程式。7688 (station mode, 當周邊節點使用)
root@mylinkit:~/app# npm install mt7688-wiscan
三、使用 lqi() 方法獲取連線品質指數 (LQI)
首先,你必須要先知道待測試目標 AP 的 SSID,通常是你的 7688 所連上的 AP router。如果你想測試 7688 對周遭 AP 的 LQI 也可以,只要你知道對方的 SSID 即可。這裡以我們辦公室的 WiFi AP 為例,它的 SSID 是字串 'sivann',所以在呼叫 .lqi() 方法時填入,並且給它一個 callback(err, result) 以接回連線測試後的 LQI 數值。詳細說明請見 API 說明頁。
MT7688 底層拋上來的 LQI 是一個介於 0 ~ 100 的相對數值,數字越大,代表連線品質越好。以下是範例程式 /app/scan.js:
var wiscan = require('mt7688-wiscan'); wiscan.lqi('sivann', function (err, result) { if (err) console.log(err); else console.log('LQI: ' + result); });
每一次測試需要 5 秒鐘,所以如果你的程式要安排 re-scan,最好不要太快重掃(例如 1 秒就掃一次),因為根本沒有用,哈哈~ 在掃描期間的 5 秒內,不管你重掃幾次,都會得到一樣的結果,這應該是底層 driver 跟 hardware 的關係~
四、使用 scan() 方法掃描鄰近 AP 的資訊
這還蠻簡單的,直接呼叫 scan() 方法,然後給它 callback(err, result) 來接回結果即可。var wiscan = require('mt7688-wiscan'); wiscan.scan(function (err, result) { if (err) console.log(err); else console.log(result); });
掃完的結果是一個陣列,每一個元素都是一個資料物件,代表所掃到 AP 的資訊。這些資訊包含 AP 的 MAC 位址、ESSID 等 (以下請自己看)。這裡比較值得注意的是 signal 欄位,它的值一直都是 -256 (單位是 dBm),我猜這應該也是底層 driver 的問題,它就是不給你 signal strength,只給你 LQI,這我就沒法度了 (我嘗試過啦,就是找不到方法拿到 RSSI 嘛!! 如果有人知道的話,拜託一定要偷偷跟我講一下)~
我也是想說iwconfig的signal noise怎都沒在跳動
ReplyDelete不過在這指令有看到相關資訊
$ cat /proc/net/wireless
Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
ra0: 0000 10. -256 -256 0 0 0 0 0 0