Android Wi-Fi State Machine

아래 내용은 안드로이드 버전 4.3 이상 4.4 이하와 맞는 내용이다. 5.0은 또 다른 내용이 들어있다. 절망
연구실 주제로 필요에 의해서 안드로이드가 기기의 와이파이를 어떻게 제어하는지를 알아야 했다. 그걸 확인하기 위해서 android Git respositories를 확인했다. 소스는 platform/framework/base/wifi/java/android/net/wifi/ 에서 확인이 가능하다.
와이파이 시스템 개요도
안드로이드는 자체적인 wpa_supplicant 를 이용해 와이파이 드라이버와 통신한다. WifiNative 로 wpa_supplicant 를 제어하고 WifiMonitor 로 wpa_supplicant 의 동작을 모니터링하고 안드로이드 프레임워크에 알려준다. 소스는 platform/external/wpa_supplicant 에 있다.
wpa_supplicant 는 CFG80211/NL80211  인터페이스로 드라이버를 제어한다.
와이파이 프레임워크 내부는 위와 같은 구조로 되어 있다.
계층형 상태 머신 (Hierarchical State Machine)
안드로이드는 와이파이 연결을 제어하기 위해서 계층형 상태머신을 쓴다. 각 상태들은 트리형태로 되어 있고 각 상태는 3개의 인터페이스로 되어있다.
enter(): 상태에 들어갈 때
exit(): 상태를 나갈 때
processMessage(): 메시지가 도착했을 때
![계층형 상태 머신 개요도](/assets/images/hsm.png)
소스는 platform/frameworks/base/core/java/com/android/internal/util/StateMachine.java 에 있다.
와이파이 상태 머신 (Wi-Fi State Machine)
1.
 Initial 상태에 들어서면 드라이버를 초기화하고 wpa_supplicant 를 실행시키고 상태를 Supplicant Starting 으로 넘긴다.
2.
Supplicant Starting 상태에 들어서고 WifiMonitor가 SUP_CONNECTED_EVENT 이벤트를 넘겨주면 시스템에 와이파이 관련 정보를 설정하고 (예: MAC주소를 지정) 상태를 Driver Started로 넘긴다.
3.
Driver Started상태에 들어서면 그 전에 Supplicant Started에서 스캔 간격을 설정하는데 그 값은 frameworks/base/core/res/res/values/config.xml파일에 config_wifi_supplicant_scan_interval로 지정되어있고 값은 15000로 실제로 15초로 동작한다.
4.
이후 동작은 Scan Mode와 Connect Mode 상태로 나뉘며 실동작은 3가지로 구분된다.
CONNECT_MODE
SCAN_ONLY_MODE
SCAN_ONLY_WITH_WIFI_OFF_MODE
5.
Scan Mode가 아니면 상태를 Disconnecting로 넘긴다. Scan Mode는 와이파이는 활성화되어 있지만 동작이 스캔과 관련된 동작만 가능하다.
6.
Disconnecting에 들어서면 칩셋이 백그라운드 스캔기능을 제공하지 않으면 프레임워크가 주기적으로 스캔한다. 스캔 간격은 frameworks/base/core/res/res/values/config.xml파일에 config_wifi_framework_scan_interval로 지정되어 있고 값은 300000으로 실제로 5분으로 동작한다.
7.
Connect Mode에선 WifiMonitor가 NETWORK_CONNECTION_EVENT를 주면 Obtaining IP로 상태를 바꾸고 DHCP면 DHCP관련 처리를 진행하고 Verifying Link로 상태를 넘긴다
8.
Veryfying Link에선 WifiWatchdogStateMachine가 넘겨주는 POOR_LINK_DETECTED 또는 GOOD_LINK_DETECTED이벤트로 연결과 패킷로스를 확인하고 최종적으로 Connected로 넘긴다.
와이파이 컨트롤러 (Wi-Fi Controller)
와이파이 컨트롤러는 와이파이 상태 머신을 제어하기위한 컨트롤러로 와이파이 상태 머신을 제어한다.
안드로이드 4.3부터 생긴 '네트워크 항상 검색' 설정에 따라 초기상태가 다르다. 와이파이가 꺼져 있을 때에도 앱에서 네트워크를 검색하게 묻는 설정이 생겼다. 이에 따라 와이파이 초기상태가 달라진다.
실제로 제어하는 부분은 와이파이 상태 머신을 참조하면 된다.

Archives