基于局域网的视频聊天系统--蛙酷
(5)Wi-Fi Settings应用程序部分
本文引用地址:https://www.eepw.com.cn/article/267433.htm 这是Android自带的一个应用程序,在手机的Settings中,它可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的形式显示,供用户选择,默认会连接用户上一次成功连接的无线网络。这部分代码位于./packages/apps/Settings/src/com/android/settings/wifi中。
3.2 Wi-Fi执行过程
3.2.1 从Settings中启动Wi-Fi
当用户按下Wi-Fi按钮后,Android调用WifiEnabler的onPreferenceChange,再由WifiEnabler调用WifiManager的setWifiEnabled接口函数,通过AIDL,调用WifiService的setWifiEnabled函数,WifiService接着向自身发送一条MESSAGE_ENABLE_WIFI消息,在处理该消息的代码中做真正的使能工作:首先装载WIFI内核模块(该模块的位置硬编码为"/system/lib/modules/wlan.ko"), 然后启动wpa_supplicant(配置文件硬编码为"/data/misc/wifi/wpa_supplicant.conf"),再通过WifiStateTracker启动WifiMonitor中的监视线程。
当成功使能后,广播发送WIFI_STATE_CHANGED_ACTION这个Intent通知外界Wi-Fi已经成功使能。WifiEnabler创建的时候就会向Android注册接收
WIFI_STATE_CHANGED_ACTION,因此它会收到该Intent,从而开始扫描。
3.2.2 查找AccessPoint (AP)
扫描的入口函数是WifiService的startScan,它往wpa_supplicant发送SCAN命令。当wpa_supplicant处理完SCAN命令后,它会向控制通道发送事件通知扫描完成, wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行处理这个事件,WifiStateTracker接着广播SCAN_RESULTS_AVAILABLE_ACTION这个Intent,WifiLayer注册了接收SCAN_RESULTS_AVAILABLE_ACTION这个Intent,所以它的相关处理函数handleScanResultsAvailable会被调用,在该函数中拿到SCAN的结果(最终是往wpa_supplicant发送SCAN_RESULT命令并读取返回值来实现的)。
对每一个扫描返回的AP,WifiLayer会调用WifiSettings的onAccessPointSetChanged函数,从而最终把该AP加到GUI显示列表中。
3.2.3 连接AP
当用户在AcessPointDialog中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个AP。
WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK命令并且比较返回值来实现的,如果wpa_supplicant没有这个AP的配置信息,则向wpa_supplicant发送ADD_NETWORK命令来添加该AP,ADD_NETWORK命令返回一个ID,WifiLayer再用这个返回的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去连接该AP。
c++相关文章:c++教程
评论