1

我设法让 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;
}
4

1 回答 1

2

尝试在代码中的适当位置做这样的事情

    char rply[4096];
    size_t rplylen = sizeof(rply);
    static char cmd[] = "SCAN";   //maybe a bit easier to deal with since you need a command length

    int retval = wpa_ctrl_request(_wpac, cmd, sizeof(cmd)-1, rply, &rplylen, NULL);

NULL,因为我怀疑你真的不需要回调例程。但如果你愿意,可以放一个。

于 2016-10-27T14:42:46.687 回答