무선 지능형 카메라 개발을 위해 구현한 Wi-Fi 기능 목록을 정리했다.
AP 스캔 결과 얻어오는 함수
Soft AP 로 동작했을 때는 iwlist 명령어로 Station 모드로 동작할 때는 wps_supplicant 로 각각 동작하기 때문에 각기 다른 포맷 스캔 결과값을 파싱해서 사용해야 한다.
iwlist
스캔 결과 값중 필요한 것은 'SSID/RSSI/암호화방식' 이다. 이들 중 가장 까다로운 것이 암호화 방식이다.
SSID | ESSID:“itx” |
RSSI | Signal level=-33 dBm |
공유기설정 | iwlist 목록에 출력 결과 |
암호없음 | Encryption key:off |
WEP | Encryption key:on |
WPAPSK-TKIP | Encryption key:on, IE: WPA Version 1, Group Cipher : TKIP |
WPAPSK-AES | Encryption key:on, IE: WPA Version 1, Group Cipher : CCMP |
WPA2PSK-TKIP | Encryption key:on, IE: IEEE 802.11i/WPA2 Version 1, Group Cipher : TKIP |
WPA2PSK-AES | Encryption key:on, IE: IEEE 802.11i/WPA2 Version 1, Group Cipher : CCMP |
# ./iwlist wlan0 scan Completed -51 on jimook -63 on jusin WPA2 CCMP -30 on IP-CAM WPA2 CCMP -23 on itx WPA2 TKIP -52 on jykim WPA2 CCMP -51 on SS1 WPA2 TKIP WPA TKIP -61 on ITX[SQE] WPA TKIP -47 on term WPA TKIP WPA2 TKIP -31 on mmyy WPA2 CCMP -76 on WPA2 CCMP -52 on ss3 WPA TKIP WPA2 TKIP -59 on theweak WPA2 CCMP -41 on term-test WPA TKIP WPA2 TKIP -78 on ollehEgg_417 WPA TKIP WPA2 TKIP -62 on iptime_c3f9 WPA2 CCMP -52 on WPA2 TKIP WPA TKIP -61 on TEST 1234 WPA CCMP WPA2 CCMP -76 on Team01 WPA TKIP WPA2 TKIP -81 off wifi_test -82 on U+NetCEA3 WPA2 CCMP -66 on SQE_KIM WPA2 CCMP
출력 포맷의 형식은 이렇다.
RSSI | 암호화 여부(Y/N) | SSID | WPA1 또는 WPA2 | TKIP 또는 AES(CCMP) |
암호 인증 구분 알고리즘은 다음과 같다.
- off 가 검색되면, 암호없음
- on 이 검색되고, WPA 또는 WPA2 가 검색되면, WEP
- WPA 가 검색되면, WPA1
- WPA2 가 검색되면, WPA2
- TKIP 가 검색되면, TKIP 이고, CCMP 가 검색되면, AES
wpa_supplicant
wpa_supplicant 는 좀더 직관적이다.
공유기설정 | iwlist 목록에 출력 결과 |
암호없음 | [ESS] |
WEP | [WEP][ESS] |
WPAPSK-TKIP | [WPA-PSK-TKIP][ESS] |
WPAPSK-AES | [WPA-PSK-CCMP][ESS] |
WPA2PSK-TKIP | [WPA2-PSK-TKIP][ESS] |
WPA2PSK-AES | [WPA2-PSK-CCMP][ESS] |
wpa_supplicant 상의 ap 목록 리스트 포맷을 변경하기 위해 ctrl_iface.c 파일을 아래와 같이 수정했다.
# ./wpa_cli -p /var/run/wpa_supplicant/ scan_results Selected interface 'wlan0' itx -29 [WPA2-PSK-TKIP+CCMP][ESS] mmyy -39 [WPA2-PSK-CCMP][ESS] term-test -49 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] term -51 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] SS1 -54 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] theweak -56 [WPA2-PSK-CCMP][ESS] iptime_c3f9 -56 [WPA2-PSK-CCMP][ESS] jykim -57 [WPA2-PSK-CCMP][ESS] ss3 -57 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] IP-CAM -59 [WPA2-PSK-CCMP][ESS] kkm -60 [WPA-PSK-TKIP][WPA2-PSK-TKIP][ESS] -60 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] TEST 1234 -61 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] jusin -64 [WPA2-PSK-CCMP][ESS] ITX[SQE] -68 [WPA-PSK-TKIP][ESS] ollehEgg_087 -70 [WPA2-PSK-TKIP+CCMP][ESS] -72 [WPA2-PSK-CCMP][ESS] ollehEgg_417 -83 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] U+NetCEA3 -83 [WPA2-PSK-CCMP][ESS] U+zone -84 [WPA2-EAP-CCMP][ESS] jimook -61 [WEP][ESS] wifi_test -81 [ESS]
출력 포맷의 형식은 이렇다.
SSID | RSSI | 암호화 |
암호 인증 구분 알고리즘은 다음과 같다.
- 가장 처음 ESS 가 나오는 경우, 암호 없음
- 가장 처음 WEP 가 나오는 경우, WEP
- WPA 가 나오면,
- ESS 출력 삭제할 것
파싱 함수
#awk '{print $3"\t"$1"\t"$2$4}' scan
파일 첫줄 삭제 스크립트
#tail -n +2 파일명
접속 상태 얻어오는 함수
#wpa_cli -p /var/run/wpa_supplicant -i wlan0 status
위와 같이 명령어를 실행하면, 현재의 접속 상태를 알 수 있다. 이들 정보 중에 wpa_state 값만 읽어보면, 상태를 알 수 있다.
wpa_state | INACTIVE / DISCONNECTED / SCANNING / ASSOCIATED / COMPLETED |
접속 정보 저장 포맷(wpa_supplicant)
wpa_supplicant 에서 save_config 명령시 저장되는 포맷은 다음과 같다.
#open network={ ssid="itx" key_mgmt=NONE } #wep40-open network={ ssid="itx" key_mgmt=NONE wep_key0="aaaaa" } #wep40-shared network={ ssid="itx" key_mgmt=NONE auth_alg=SHARED wep_key0=1234567890 } #wep104-open network={ ssid="itx" key_mgmt=NONE wep_key0="ccccccccccccc" } #wep104-shared network={ ssid="itx" key_mgmt=NONE auth_alg=SHARED wep_key0=12345678901234567890123456 } #wpa network={ ssid="itx" psk="77777777" }
위 4가지 상태 중 하나로 존재한다.
동작 시나리오
암호없음 | 해당 SSID 를 클릭했을 때, SSID 창에 자동 입력 |
WEP | 해당 SSID 를 클릭했을 때, SSID 창에 자동 입력되고, 보안 인증모드 WEP 로 변경되고, 64/128bit, 문자/HEX 선택할 수 있는 박스 출력 |
WPA | 해당 SSID 를 클릭했을 때, SSID 창에 자동 입력되고, 보안 인증모드 WPA 로 변경되고, 암호 입력창 출력 |
수정되어야할 사항
WiFi_GetScanResult
자동으로 스캔한 값을 읽어오는 것 외에, 직접 스캔 명령을 내려서 얻은 스캔 결과값을 읽어오는 루틴이 필요함. 이 경우, 기존의 함수에서 추가 인자값을 통해 이를 구분하여 처리함.
WiFi_GetStatus
WEP 로 접속되었을 때의 접속여부 판단안되는 문제. 결국 실제 할당 받은 IP 를 가지고 외부와의 통신이 가능한지 여부를 통해 판단해야 한다.
WiFi_SetConnection
Factory 또는 Normal 모드인지를 구분하여, Factory 모드에서는 입력받은 정보들을 DB 에 저장만 하고, Normal 모드에서는 저장 및 접속 시도를 한다.