모바일

WiFi Enable process 분석 - Wifi Scanning (3)

손가든 2024. 11. 9. 15:46

블챌 3일차!

 

오늘은 어제 분석해보았던 WifiScan 요청의 시작의 흐름을 이어서 Wifi 탐색 요청을 어떻게 수행하는지

그리고 주변 Wifi AP를 탐색한 결과를 Android Framework가 어떻게 받아오는지를 알아보자.

 

 


 

 

 

WifiManager.startScan() - Scan 요청의 시작

 

 

지난 포스팅에서 마지막으로 WifiManager의 startScan()으로 Wifi의 스캔 요청을 수행한다고 설명했다.

 

그리고 Android Framework에서는 사용자 측면에서 기기의 설정을 제어하기 위해 Manager를 사용하는데

이는 권한문제때문에 Service 클래스와 격리되어있다.

 

그래서 Manager는 사용자 측면에서 요청을 대리로 수행하고, 권한이 필요한 내부 동작은 Manager가 Service 클래스와 통신하여 결과를 수행하곤 한다.

 

그래서 WifiManager.startScan() 메소드는 곧바로 WifiServiceImpl.startScan()을 요청한다.

 

그 안에서 동작을 살펴보면 다음과 같은데 지난 시간 넘어간 것 중 하나인

WifiScanningServiceImpl이라는 클래스에는 SingleScanStateMachine 이라는 상태머신이 또 존재하는데,

 

와이파이를 켜는중인 현재는 Idle 상태이다.

 

이때 idle 상태에서 위의 그림의 흐름에 따라 tryToStartNewScan을 실행하고 startSingleScan을 호출하여 Hal 드라이버 내부로 Single scan 요청을 수행한다.

 

수행을 마치면 곧바로 SingleScan 상태머신은 Scanning 상태로 전환한다.

 

startSingleScan의 흐름 끝에는 Framework 제일 마지막 단인 WifiNl80211Manager 클래스가 있었다.

이곳에서는 startScan 메소드를 통해 Hal 인터페이스로 바인드 되어있는 Hal 구현체에 스캔 요청을 전달하며 return된다.

 

그럼 이 내부에선 Supplicant라는 Wifi 관리 소프트웨어가 Wifi Scanning을 수행하고 Scanning을 마치면 CMD_NEW_SCAN_RESULT라는 이벤트를 호출한다.

 

요청과 결과이벤트 그 사이의 시간을 측정하니 5초가량이 소요됬다.

Supplicant는 5초동안 스캐닝을 수행하고 있었다.

 

 

스캔 결과가 완료되었다는 이벤트를 Supplicant에서 WifiNl80211Manager 클래스로 전달받는다.

이는 요청할때와 동일하게 바인덜르 통해 결과를 전달받는다.

 

그러면 최종적으로 WifiMonitor에서 sendMessage를 통해 흐름을 타고가면 WifiCondScannerImpl 객체에 스캔 결과 이벤트 메시지를 전달한다.

 

 

그러면 WificondScannerImpl 클래스는 pollLatestScanData라는 메소드를 통해 Scan 결과를 Supplicant로 받아와 파싱하고 SingleScan 상태 머신이 있는 WifiScanningServiceImpl 클래스에 스캔 결과를 가져가라는 신호를 전달한다.

 

 

스캔 결과를 가져가라는 신호를 받은 SingleScan 상태머신은 Scanning 상태에서 Msg를 받아 CMD_SCAN_RESULT_IS_AVAILABLE 케이스를 처리한다.

 

이때 WifiCondScannerImpl에서 스캔 결과를 가져온 걸 전달 받은 뒤에

 

 

해당 결과를 reportEvent 메소드를 통해 GlobalScanListener로 스캔 결과를 받아왔다는 것을 전달한다.

 

그러면 GlobalScanListener는 Broadcast를 통해 BroadcastReceiver로 스캔 결과를 받아왔다는 것을 전달하면, 

그곳에서 UI/APcontroller가 데이터를 가져가 사용자에게 Wifi 목록을 전시한다.

 

SingleScan 상태머신은 마지막으로 다시 Idle 상태로 전환되고,

지난포스팅에서 말했듯이 반복되는 스캐닝이 10초뒤에 시작되면 이 포스팅의 흐름이 반복된다.

 

하지만 Lifecycle이라는 생명주기가 WifiSettingsActivity와 연결되어있는데,

이 때문에 사용자가 Wifi연결 설정창에서 나가면 해당 Activity가 On_Stop 으로 전환하여 반복 스캐닝 동작은 꺼진다.

 

따라서 이 10초마다 반복되는 Wifi Scanning 동작은 사용자가 Wifi 탐색하는 화면으로 진입했을 때만 동작하도록 설계되어있는 것이다.

 

 

마지막으로 지금까지 해당 Scanning 과정의 순환을 그림으로 만들어보았는데,

이게 지금까지의 흐름을 나타낸다.