2017-04-21 257 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是不是某种类型的手柄,它只是一个指向存储在后端库中的函数列表的指针。该列表是硬编码的,不能在运行时修改。