MT 7688抗痛寧:WiFi 掃描小工具 mt7688-wiscan

Author: simen


一、前言

事情是這樣子的,最近我在做一個跟物聯網路有關的案子。我拿 MTK 的 Linkit Smart 7688 來做周邊機器節點(7688 跑 station 模式),然後呢,每台周邊機器上都配有一個小螢幕,上面會顯示一些跟機器相關的資訊,其中需要「連線強度」那樣子的圖示。因為現場安裝的工程師,需要知道節點會不會離 AP router 太遠。
 
原本我以為要拿到「連線強度」應該是小菜一碟,結果 7688 切到 station 模式之後,iwconfig 竟然拿到的 LQI ( Link Quality Indicator)竟然是無用的!!(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(當周邊節點使用),然後直接以 NPM 安裝我們的模組:

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 嘛!! 如果有人知道的話,拜託一定要偷偷跟我講一下)~


後記

最後,如果有人知道不必靠掃描就可以知道 LQI 的方法,拜託請教我一下啊!! 我直覺應該是有阿,通訊封包裡面應該是有類似的資料才是呀!只是我實在不知道要從哪裡去找,我在系統底下的 /dev, /sys, 跟 /proc 翻了一遍,就是沒找到呀! (非常懊惱啊~~~ 超想知道這類資訊會在哪裡~~)