아래 내용은 안드로이드 버전 4.3 이상 4.4 이하와 맞는 내용이다. 5.0은 또 다른 내용이 들어있다. 절망 *** 연구실 주제로 필요에 의해서 안드로이드가 기기의 와이파이를 어떻게 제어하는지를 알아야 했다. 그걸 확인하기 위해서 android Git respositories를 확인했다. 소스는 platform/framework/base/wifi/java/android/net/wifi/에서 확인이 가능하다.

와이파이 시스템 개요도

와이파이 시스템 개요도

안드로이드는 자체적인 wpa_supplicant를 이용해 와이파이 드라이버와 통신한다. WifiNativewpa_supplicant를 제어하고 WifiMonitorwpa_supplicant의 동작을 모니터링하고 안드로이드 프레임워크에 알려준다. 소스는 platform/external/wpa_supplicant에 있다.

wpa_supplicantCFG80211/NL80211 인터페이스로 드라이버를 제어한다.

와이파이 프레임워크 개요도

와이파이 프레임워크 내부는 위와 같은 구조로 되어 있다.

계층형 상태 머신 Hierarchical State Machine

안드로이드는 와이파이 연결을 제어하기 위해서 계층형 상태머신을 쓴다. 각 상태들은 트리형태로 되어 있고 각 상태는 3개의 인터페이스로 되어있다.

  • enter(): 상태에 들어갈 때
  • exit(): 상태를 나갈 때
  • processMessage(): 메시지가 도착했을 때

계층형 상태 머신 개요도

위의 그림을 예로 하면 초기 상태가 S3인 경우 S0.enter(), S1.enter(), S3.enter()가 호출된다. S3에서 S5로 상태를 넘기면 S3.exit(), S1.exit(), S2.enter(), S5.enter()가 호출된다.

소스는 platform/frameworks/base/core/java/com/android/internal/util/StateMachine.java에 다.

와이파이 상태 머신 Wi-Fi State Machine

와이파이 상태 머신 개요도

  1. Initial상태에 들어서면 드라이버를 초기화하고 wpa_supplicant를 실행시키고 상태를 Supplicant Starting으로 넘긴다.
  2. Supplicant Starting상태에 들어서고 WifiMonitorSUP_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 ModeConnect 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에선 WifiMonitorNETWORK_CONNECTION_EVENT를 주면 Obtaining IP로 상태를 바꾸고 DHCP면 DHCP관련 처리를 진행하고 Verifying Link로 상태를 넘긴다.
  8. Veryfying Link에선 WifiWatchdogStateMachine가 넘겨주는 POOR_LINK_DETECTED 또는 GOOD_LINK_DETECTED이벤트로 연결과 패킷로스를 확인하고 최종적으로 Connected로 넘긴다.

와이파이 컨트롤러 Wi-Fi Controller

와이파이 컨트롤러는 와이파이 상태 머신을 제어하기위한 컨트롤러로 와이파이 상태 머신을 제어한다.

와이파이 컨트롤러 개요도

안드로이드 4.3부터 생긴 ‘네트워크 항상 검색’ 설정에 따라 초기상태가 다르다. 와이파이가 꺼져 있을 때에도 앱에서 네트워크를 검색하게 묻는 설정이 생겼다. 이에 따라 와이파이 초기상태가 달라진다.

와이파이 네트워크 항상 검색

실제로 제어하는 부분은 와이파이 상태 머신을 참조하면 된다.