使用iwinfo库

时间:2017-04-21 09:12:17

标签: c wifi openwrt 802.11

我是OpenWrt的新手。我正在使用iwinfo lib来扫描wifi。它工作正常,直到我在我的代码中扫描多次。起初我认为这是因为我使用这个库做错了所以我试图从iwinfo库修改cli程序并使其扫描两次。这是cli代码的主要功能,它只能运行一次。 print_scanlist函数实现与cli程序中的相同。

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

起初我认为这是因为硬件不允许在短时间内扫描。但是,如果我第二次运行该程序,它仍然适用于第一个功能。现在我不知道为什么会发生这种情况,有谁知道为什么?

2 个答案:

答案 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不是某种句柄是很重要的,它只是指向存储在后端库中的函数列表的指针。该列表是硬编码的,不能在运行时修改。

答案 1 :(得分:0)

由于我使用nl80211作为后端,我挖掘了iwinfo的源代码。我发现它正在使用WPA请求者。在扫描功能中,它调用了一个函数名@keyframes drawfill { 0% { stroke-dashoffset: 1300; } 35% { fill-opacity: 0; } 50% { stroke-dashoffset: 0; } 100% { stroke-dashoffset: 0; fill-opacity: 1; } } .preload-container__svg-wrap svg{ animation: drawfill 10s ease forwards; } ,它的目的是连接到WPA请求者并要求它扫描并获得其结果。

iwinfo中的步骤是

nl80211_get_scanlist_wpactl

问题是iwinfo忘记拨打DETACH,因此下次你无法做任何事情。所以在我添加send(sock, "ATTACH", 6, 0); send(sock, "SCAN", 4, 0); send(sock, "SCAN_RESULTS", 12, 0); 之后,我就开始工作了。谢谢大家