使用 iwinfo 库没有扫描结果

No scan result using iwinfo library

我是 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;
}

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

我几乎可以肯定这些选项之一(甚至可能两个)都有效:

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

由于我使用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) 之后,我让它工作了。谢谢大家