我是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;
}
起初我认为这是因为硬件不允许在短时间内扫描。但是,如果我第二次运行该程序,它仍然适用于第一个功能。现在我不知道为什么会发生这种情况,有谁知道为什么?
答案 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);
之后,我就开始工作了。谢谢大家