2017-04-21 24 views
0

OpenWrt를 처음 사용했습니다. wifi를 검사하기 위해 iwinfo lib를 사용하고 있습니다. 그것은 내 코드에서 여러 번 스캔 할 때까지 잘 작동했다. 처음에는이 라이브러리를 사용하여 잘못하고 있다고 생각하기 때문에 iwinfo 라이브러리에서 cli 프로그램을 수정하고 두 번 스캔하도록했습니다. 한 번만 작동 할 cli 코드의 주요 기능은 다음과 같습니다. print_scanlist 함수 구현은 cli 프로그램에서와 동일합니다.iwinfo 라이브러리를 사용한 스캔 결과가 없습니다.

int main() { 
    const struct iwinfo_ops *iw = iwinfo_backend("wlan0"); 
    print_scanlist(iw, "wlan0"); 
    print_scanlist(iw, "wlan0"); 
    iwinfo_finish(); 
    return 0; 
} 

처음에는 하드웨어가 짧은 시간 내에 스캔 할 수 없기 때문이라고 생각합니다. 하지만 프로그램을 두 번째 실행하면 첫 번째 기능을 계속 사용할 수 있습니다. 지금 나는 왜 이것이 행복하고, 왜 그 이유를 알 수 있을지 전혀 모른다.

+0

어떤 오류가 인쇄되며 어떤 백엔드입니까? 다른 백엔드에서 카드를 사용해 보셨습니까? – lossleader

답변

0

백엔드로 nl80211을 사용하고 있으므로 iwinfo의 소스 코드를 파헤 쳤습니다. WPA 요청자를 사용하고있는 것으로 나타났습니다. 스캔 기능에서 함수 이름은 nl80211_get_scanlist_wpactl이며 WPA 요청자에 연결하여 스캔하고 결과를 얻도록 요청하는 것이 그 목적입니다. iwinfo에서

단계는 문제가 iwinfo 당신은 아무것도 할 수 못해 다음에 따라서 DETACH 전화 깜빡입니다

send(sock, "ATTACH", 6, 0); 
send(sock, "SCAN", 4, 0); 
send(sock, "SCAN_RESULTS", 12, 0); 

있습니다. 그래서 send(sock, "DETACH", 6, 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이 어떤 종류의 핸들 아니라는 것을 이해하는 것이, 백엔드 라이브러리에 저장된 함수 목록에 대한 포인터 일뿐입니다. 목록은 하드 코딩되어 있으며 런타임에 수정할 수 없습니다.