2017-04-21 70 views
0

我是OpenWrt的新手。我正在使用iwinfo lib來掃描wifi。它工作正常,直到我在我的代碼中多次掃描。起初我認爲這是因爲我在使用這個庫時做錯了,所以我試圖從iwinfo庫中修改cli程序並使其掃描兩次。這是cli代碼的主要功能,它只能使用一次。 print_scanlist函數的實現與cli程序中的相同。使用iwinfo庫無掃描結果

int main() { 
    const struct iwinfo_ops *iw = iwinfo_backend("wlan0"); 
    print_scanlist(iw, "wlan0"); 
    print_scanlist(iw, "wlan0"); 
    iwinfo_finish(); 
    return 0; 
} 

起初我認爲這是因爲硬件不允許在短時間內掃描。但是如果我第二次運行程序,它仍然適用於第一個功能。現在我不知道爲什麼會發生這種事情,有人知道爲什麼嗎?

+0

哪個錯誤被打印,哪個後端?你有沒有試過其他後端的牌? – lossleader

回答

0

由於我使用nl80211作爲後端,我挖入了iwinfo的源代碼。我發現它使用WPA懇求者。在掃描功能中,它稱爲函數名稱nl80211_get_scanlist_wpactl,它的用途是連接到WPA請求者並要求它掃描並獲取其結果。

在iwinfo的步驟是

send(sock, "ATTACH", 6, 0); 
send(sock, "SCAN", 4, 0); 
send(sock, "SCAN_RESULTS", 12, 0); 

問題是iwinfo忘記接下來你不會能夠做任何事情時調用DETACH因此。所以在我添加一個send(sock, "DETACH", 6, 0)之後,我開始工作了。謝謝大家

0

我真的幾乎可以肯定,這些選項之一(甚至兩者)將工作:

int main() { 
    const struct iwinfo_ops *iw = iwinfo_backend("wlan0"); 
    print_scanlist(iw, "wlan0"); 
    iwinfo_finish(); 
    print_scanlist(iw, "wlan0"); 
    iwinfo_finish(); 
    return 0; 
} 

int main() { 
    print_scanlist(iwinfo_backend("wlan0"), "wlan0"); 
    iwinfo_finish(); 
    print_scanlist(iwinfo_backend("wlan0"), "wlan0"); 
    iwinfo_finish(); 
    return 0; 
} 

它`重要的是要明白,iw是不是某種類型的手柄,它只是一個指向存儲在後端庫中的函數列表的指針。該列表是硬編碼的,不能在運行時修改。