我设法让 wpa_supplicant C API 工作。但是每次我重新启动程序时,它的行为都会完全不同。
连接每次都成功。但麻烦就开始了:
有时会SCAN
回复一个空字符串但返回 0(Ok)。在另一次运行中,它回复"OK\n"
并返回 0。当我循环并等待返回 0 和"OK\n"
-reply 时,它会以空回复和 0 返回永远运行。
在极少数情况下,当SCAN
返回 0 并回复时,"OK\n"
我继续等待SCAN_RESULTS
返回 0。此时它的行为完全随机。有时它会回复整个扫描结果。有时它只回复 0 并且扫描结果在我的事件管道中。或者像大多数情况下一样:它返回 0 但什么也不做。没有回复,没有事件。没有什么。
为了调试,我将我的代码简化为这个片段并尝试找出问题所在。我完成了,尝试了所有方法,但我对 ctrl 接口的文档感到有些沮丧,它没有定义任何工作流程或提示。我厌倦了对 wpa_cli.c 进行逆向工程以找出它们的流程。
我必须附上大部分第一个 PING 效果很好。每隔一个 PING 都会产生空字符串。
/* some includes */
wpa_ctrl* _wpac;
static void callback(char* rply, size_t rplylen){
std::cout << std::string(rply,rplylen) << std::endl;
}
bool ScanResults() {
if(_wpac)
{
char rply[4096]; //same as in wpa_cli.c
size_t rplylen;
int retval = wpa_ctrl_request(_wpac,"SCAN_RESULTS",12,rply,&rplylen,callback);
if(retval == 0) {
std::string rplystring = std::string(rply,rplylen);
std::string message = std::string("wpa_ctrl(SCAN_RESULTS) replied: '").append(rplystring).append("' (").append(std::to_string(retval)).append(")");
std::cout << message << std::cout;
std::cout << std::string("wpa_ctrl(SCAN_RESULTS): Available (").append(std::to_string(retval)).append(")") << std::endl;
return true;
}
else
std::cout << std::string("wpa_ctrl(SCAN_RESULTS): Unavailable (").append(std::to_string(retval)).append(")") << std::endl;
return false;
}
return false;
}
bool InitScan() {
if(_wpac)
{
char rply[4096]; //same as in wpa_cli.c
size_t rplylen;
int retval = wpa_ctrl_request(_wpac,"SCAN",4,rply,&rplylen,callback);
if(retval == 0) {
std::string rplystring = std::string(rply,rplylen);
std::string message = std::string("wpa_ctrl(SCAN) replied: '").append(rplystring).append("' (").append(std::to_string(retval)).append(")");
std::cout << message << std::endl;
if(rplystring == "OK\n") {
std::string message = std::string("wpa_ctrl(SCAN): Scan initiated (").append(std::to_string(retval)).append(")");
std::cout << message << std::endl;
return true;
}
}
std::string message = std::string("wpa_ctrl(SCAN) failed: (").append(std::to_string(retval)).append(")");
std::cout << message << std::endl;
}
return false;
}
int main(){
std::string connection_string = std::string("/var/run/wpa_supplicant/").append(_interface);
wpa_ctrl* _wpac = wpa_ctrl_open(connection_string.c_str());
if(!_wpac)
return 1;
/* Well Working Attach to as Eventlistener omitted */
while(!InitScan())
sleep(1);
while(!ScanResults())
sleep(1)
return 0;
}