私はwpa_supplicant C APIを動作させることができました。しかし、私はプログラムを再起動するたびに完全に異なる動作をします。wpa_supplicant C APIの定義されていない動作
接続は毎回成功します。しかし、問題が始まる:
ときどきSCAN
は空の文字列を返しますが、0(OK)を返します。 別の実行では、"OK\n"
と応答し、0を返します。返り値が0で、返り値が"OK\n"
のとき、それは空の応答と0の戻り値で永久に実行されます。
まれに、SCAN
が0を返し、"OK\n"
と返信すると、私は移動し、SCAN_RESULTS
が0を返すのを待ちます。この時点で、それは完全にランダムに動作します。場合によってはスキャン結果全体に返答することもあります。場合によっては返信が0になり、スキャン結果がイベントパイプラインに含まれます。 ほとんどの場合と同様に、0を返しますが何もしません。返信なし、イベントなし。何もない。
私はコードをこのスニペットに縮小し、何が間違っているのか調べようとしました。私は、すべてを試してみました。私は、ワークフローやヒントを定義していないctrl-interfaceのドキュメンテーションにいくらか不満を持っています。 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;
}
私は 'rply'が初期化されていないことに注意してください。あなたは 'malloc'(または' new char [ENOUGHSPACE] ')が必要か、' char rply [ENOUGHSPACE] 'を明示的に宣言する必要があると思います。 – infixed
@infixedはい。私はwpa_ctrl_requestがmallocを実行すると思った。私はこれを修正した。何も変わっていません。 –
C++を使用している間、C APIのように見えます。明らかに、バッファに答えを入れることと、バッファサイズを取得し、実際の出力サイズを戻す変数が必要です。私の答えのようなコードを試してください – infixed