WLAN直连总体结构和相关流程概览(二)
在上一篇?WLAN直連總體結(jié)構(gòu)和相關(guān)流程概覽(一) 中介紹了WLAN直連UI層及StateMachine。這里繼續(xù)介紹framework層及Supplicant層。
在framework層,最主要有三個(gè)類WifiP2pManager,WifiP2pService,WifiMonitor,而最核心的就是WifiP2pService了。
1. WifiP2pManager:個(gè)人理解,可以把它看做是Framework層向UI層提供的一個(gè)接口,對(duì)Framework層的所有操作通過(guò)這個(gè)接口來(lái)進(jìn)行。一般的使用順序?yàn)?#xff1a;
?> 調(diào)用initialize() 進(jìn)行初始化
?> 調(diào)用discoverPeers() 搜索P2P設(shè)備
?> 調(diào)用connect() 連接P2P設(shè)備
?>更多其他操作
2. WifiP2pService: 在這個(gè)類里面,最主要的就是內(nèi)部類P2pStateMachine了。在打開WiFi時(shí),會(huì)啟動(dòng)supplicant,而在這時(shí),WifiStateMachine會(huì)發(fā)消息給P2pStateMachine啟動(dòng)P2P(實(shí)際上,在啟動(dòng)系統(tǒng)的時(shí)候,就已經(jīng)啟動(dòng)WifiP2pService了,這里主要是進(jìn)行了狀態(tài)機(jī)里的狀態(tài)轉(zhuǎn)換和啟動(dòng)了P2P對(duì)底層事件的監(jiān)聽)。
> Enable P2P
在WifiStateMachine進(jìn)入P2pStartedState后,會(huì)發(fā)送消息以啟動(dòng)P2P。
在P2P沒有啟動(dòng)之前,處于P2pDisabledState狀態(tài),根據(jù)前一章的介紹,會(huì)在這個(gè)狀態(tài)里處理這個(gè)消息,并且啟動(dòng)WifiMonitor,狀態(tài)轉(zhuǎn)換到P2pEnablingState。
因?yàn)樵陂_啟WiFi的時(shí)候,就已經(jīng)和supplicant建立連接了,所以在WifiMonitor,直接發(fā)送SUP_CONNECTION_EVENT 信息到P2pStateMachine。
在P2pEnablingState收到這個(gè)消息后,直接轉(zhuǎn)到InactiveState
而InactiveState是P2pEnabledState的子狀態(tài),所以首先會(huì)調(diào)用P2pEnabledState.enter()
在這里,會(huì)進(jìn)行一些初始化的操作,如set device_name, device_type, static_ip 等。
> P2P Scan
首先來(lái)看一下它的調(diào)用順序圖
下面分步詳細(xì)介紹
通過(guò)調(diào)用discoverPeers() 方法,給P2pStateMachine發(fā)一個(gè)DISCOVER_PEERS 消息
通過(guò)JNI調(diào)用,給Supplicant層發(fā)送“P2P_FIND”命令,將會(huì)搜索周圍P2P設(shè)備。在Supplicant啟動(dòng)時(shí),會(huì)建立兩個(gè)socket和底層進(jìn)行通信。一個(gè)用于發(fā)送命令(ctrl_conn),一個(gè)用于接收底層返回的事件(ctrl_recv)。在搜到設(shè)備后,在WifiMonitor里通過(guò)輪詢的方式得到supplicant返回的字符串,字符串格式為 P2P-DEVICE-FOUND 02:12:34:2b:7f:fe p2p_dev_addr=02:12:34:2b:7f:fe pri_dev_type=10-0050F204-5 name= 'Android_82f5' config_methods=0x188 dev_capab=0x25 group_capab=0x0。這個(gè)字符串會(huì)被轉(zhuǎn)化為一個(gè)WifiP2pDevice對(duì)象,然后發(fā)送給P2pStateMachine。
> P2P Connect
搜到設(shè)備之后,就可以進(jìn)行連接了。發(fā)送CONNECT 請(qǐng)求,在InactiveState中處理這個(gè)消息。
注:下面分析的是主動(dòng)發(fā)送連接請(qǐng)求的設(shè)備
GC(Group Client)端,狀態(tài)機(jī)里各狀態(tài)流程如下
同樣是GC端,下面附上接收到連接請(qǐng)求的設(shè)備的順序圖
還有很重要的一個(gè)功能就是多連接了。實(shí)際上多連接和單連接并沒有很大的區(qū)別,在多連接中,發(fā)出請(qǐng)求的設(shè)備首先會(huì)建立一個(gè)Group,此設(shè)備就是GO(Group Owner)。Group成功建立后,就會(huì)按順序邀請(qǐng)其他設(shè)備加入這個(gè)Group。
下面是多連接的流程圖
如果選擇了連接多個(gè)設(shè)備,即便一些設(shè)備拒絕了連接邀請(qǐng)或者連接失敗(超時(shí)),它還是會(huì)邀請(qǐng)其他設(shè)備(通過(guò)索引mSelectedP2pConfigIndex來(lái)獲取需要連接的設(shè)備的信息)。
Supplicant層
其官方網(wǎng)站有很詳細(xì)的文檔 http://hostap.epitest.fi/wpa_supplicant/devel/index.html
總結(jié)
以上是生活随笔為你收集整理的WLAN直连总体结构和相关流程概览(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 易语言小项目实例
- 下一篇: 重建 nextcloud 索引,通过非