一 協議介紹
wifiAware即Neighbor Awareness Networking(NAN), 爲wifi聯盟基於802.11協議之上定製的相鄰設備發現協議.html
以上爲一個標準的NAN集合, 集合內部包含了若干已經關聯的設備.(這裏的關聯不是指wifi AP-STA的那種關聯, 僅是構建一個基本集合, 並無association request/response).android
爲了以高能效不斷地執行發現功能,Wi-Fi Aware 吸收了與低佔空比「介質訪問控制(Medium Access Control,簡稱MAC)」協議和自適應集羣有關的工做成果。Wi-Fi Aware 經過協議創建公共「時鐘」,以保持全部節點都接受相同的時間調度,所以下降了能耗,同時該技術還有足夠強的應對變化的能力,即便某個設備移動到可及範圍之外,也能保持羣組不受影響。簡而言之, 就好像是將組內的成員按期彙集彙集到一次開會並同步信息, 只不過cluster內同步的信息簡潔, 會議的時間也只不過幾十上百毫秒.安全
Wi-Fi Aware 設備無需經過 Wi-Fi 接入點(AP),就可自主檢測、提醒和鏈接其餘設備。Wi-Fi Aware 應用能夠配置爲,提醒用戶,附近有運行相同應用的設備。發現功能能夠基於距離等各類參數執行,例如,當另外一個運行相同應用的設備距離不到 10 英尺(約 3.048 米)遠時,提醒用戶。應用也能夠配置爲,創建與另外一個設備點對點的安全數據鏈接,以進行應用數據交換。數據結構
Wifiaware不影響設備使用P2P或STA功能.架構
二 設備發現和加入
(1) 發現
根據協議介紹, 設備發現爲被動的接收已經存在的cluster按期發佈的beacon來加入已經存在的cluster. 同時爲了節省信道資源, Beacon discovery僅僅在6ch發送. 5G信道爲wifiaware中的可選操做, 當工做在5G信道時, 低頻掃描信道固定爲44ch, 高頻掃描固定爲149信道, 低頻高頻都支持的設備, 掃描固定在149ch. 此外, 協議規定, 不只Beacon能夠做爲讓NAN device發現cluster的信標幀, 包含NAN信息的probe response也可讓NAN device發現cluster. (Probe response在什麼場景下發送, 協議中沒有明確的規定).oop
這裏有一個問題, 想要加入一個cluster的NAN device能夠經過接收Beacon discovery來加入cluster. 若是當前環境中沒有任何cluster存在, 豈不是存在全部NAN device一直處於被動掃描狀態? 這一點協議中提供了將兩個cluster合併的操做和單個設備建立cluster的實現, 以下加密
協議中隱晦的代表, 當一個NAN設備準備加入一個cluster中時, 會進行被動掃描且可能建立一個cluster. (當時讀協議的時候糾結這個問題,再協議裏找了2天才發現這句話)以下:spa
Upon activating NAN functionality, a NAN Device shall perform passive scanning and may start a NAN Cluster.code
(2) 加入cluster
當一個單獨的device設備收到probe response時, 會根據收到的probe response中的time offset在cluster的DW時間中wake up, 便可在cluster中交換信息. (beacon可能會因爲cluster中的設備數量致使超出設置的閥值致使被丟棄, 具體情景須要再研究).orm
Cluster合併就是當兩個cluster處於互相發現的狀況下, 低cluster grade的將合併入高cluster grade的cluster中. 並在加入新cluster前發送NAN sync beacon告知其它NAN加入新的cluster.
最終獲得的cluster初步構成了一個小型的服務集合, 能夠經過互相發送action幀來獲取詳情的服務內容. 也達成了適合IOT的基本單元(相似局域網, 不過這裏cluster的結構相似數據結構中的圖, 而局域網更像是樹).
一個NAN device能夠加入多個cluster.當NAN device處於兩個cluster的發現範圍內, 那麼加入兩個或多個cluster成爲了可能.
(3) Cluster管理
Cluster中分別有三種角色, master, sync, normal.
這三個角色分別承擔cluster中的各個角色功能:
- Master發送NAN sync beacon和 NAN discovery beacon
- Sync僅僅在DW內傳送NAN sync beacon
- Normal角色什麼beacon也不發送(服務發現幀是會發送的).
三個角色之間能夠互相轉換, 轉換的因素不少. 這裏很少贅述. 能夠參考wifiaware協議3.3. Sync beacon在每一個DW內最多發送一次, 主要用於同步cluster內的時鐘. Discovery beacon同一master角色下的50TUS - 200TUS內被當前master發送一次. Master角色更換後, 會不會沿用以前的時間間隔.
三 服務發現協議
Wi-Fi Aware 設備上的應用利用「發佈型(Publish)」和「訂閱型(Subscribe)」消息交換信息。Wi-Fi Aware 服務經過訂閱(搜索)發現其餘服務,經過發佈(發送)廣播表示其存在的信息和提供的內容。一旦檢測到設備和想要的服務,發出檢測的設備就可向這些檢測到的設備發送提示信息。
DW是cluster後所出的時間週期和信道, 是標識這個cluster的基本屬性. 基本就是在DW期間, cluster內的各個設備會發送一個同步信標, 而後能夠進行服務發現請求. DW結束, 全部設備進入休眠狀態, 只有cluster的master會發送6ch的beacon discovery. (這裏的休眠僅僅是指再也不進行wifi aware服務, 而不是真正的sleep. DW以外的時間是進行數據交互或P2P/wifi數據交換的時間段)
在一個同步的集羣中,全部設備之間都要針對發現窗口進行時間同步(上圖)。同步集羣是同步至同一發現窗口的一組 Wi-Fi Aware 設備。創建與同步集羣的鏈接以後,設備發送訂閱型和發佈型消息,在附近尋找感興趣的設備。
爲一個同步的集羣保持時序的設備稱爲「錨定主設備(Anchor Master)」,設備之間會交替承擔「錨定主設備」的角色。
Publish: 主動廣告或回覆subscribe消息.
Subscribe: 主動探測cluster內的其餘設備可用的serivce, 使其迴應publish, 被動等待符合上層請求的publish消息回覆上層應用.
Follow-up: 傳送/接收服務的特定信息.
主動publish對應被動subscribe:
被動publish對應主動subcribe:
四 數據傳輸
在服務發現階段, 若是掃描到一個或多個能夠配對的服務. 那麼能夠簡歷簡單的NAN data path(NDP)和NAN data link(NDL)來進行數據通訊. 須要代表的是, 若是一個NAN想要和多個符合服務條件的NAN設備通訊, 那麼須要創建多個NAN management interface(也就是多個對應的驅動接口和虛擬的mac地址).
(1)NAN 調度
在一個cluster內必然會存在不少NAN設備, DW以內, 全部的NAN設備啓動. 進行時間同步和服務發現. 在對這些設備完成TSF同步和服務發現的同時, 也要考慮另一件事情 --- 發送數據.
因此, 在服務發現後還須要交換一下FAW( further available window)和ULW(Unaligned Windows). 這兩已經創建起NPL的一個或多個NAN設備能夠在協商的FAW內在對應的信道上wake up並進行數據傳送. 當FAW時間結束, NAN設備從新進入sleep狀態已節省電量(這裏的sleep直wifiaware sleep, 在此休眠時間內. 設備能夠進入P2P或STA模式).
以下圖所示, 須要說明的是, 3個STA構建了4個NDL分別是:
NDL1: STA1 STA2 STA3在6信道
NDL2: STA1 STA2 STA3在149信道
NDL3: STA2 STA3在36信道
NDL4: STA1 STA2在11信道
(2)數據傳送
進行數據傳輸的兩個NAN設備分爲發起者(Initiator.)和迴應者(Responder). 發起者發送Data Path Request NAF給迴應者, 迴應者回復Data Path Response給發起者. 這樣雙方確認了NDP setup的健全模型進而開啓數據傳輸.
下邊是使用非加密方式傳送數據的協議模型:
使用加密方式傳送數據, 對比非加密方式多了4次握手的過程. 具體的加密方式在服務發現階段就要進行說明.
五 android實現架構
(1) android實現結構簡介
與WifiP2pManager同樣, wifiAware功能有獨立的Manager和後臺service實現基本功能.在使用時, 能夠自行discovery的參數或使用默認參數. 基本的callback必須實現.
大致結構以下:
wifiAwareStateManager簡單維護了三個狀態, 採用簡單的消息循環機制在兩個狀態之間來回切換. 具體以下:
接口中的attach所謂發現設備, 可使用默認的configRequest, 也能夠自行定製
public void attach(@NonNull AttachCallback attachCallback, @Nullable Handler handler)
Publish對應協議中的publish方法, 告知底層服務內容以響應subscribe, 相似藍牙的UUID.
public void publish(int clientId, Looper looper, PublishConfig publishConfig, DiscoverySessionCallback callback)
Subscribe 對應協議中的subscribe方法, 意在主動/被動探測cluster內的服務內容
public void subscribe(int clientId, Looper looper, SubscribeConfig subscribeConfig, DiscoverySessionCallback callback)
對應協議中的data request, 用於建立與對端設備的鏈接, 以後能夠收發數據.
須要networkType爲NetworkCapabilities#TRANSPORT_WIFI_AWARE
public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,int timeoutMs, int legacyType, Handler handler)
Publish或subscribe以後, 會獲得對端的handle用於發送數據
DiscoverySession#public void sendMessage(@NonNull PeerHandle peerHandle, int messageId,@Nullable byte[] message, int retryCount)
參考資料:
https://wenku.baidu.com/view/55b070ca6c175f0e7dd1371c.html
NeighborAwarenessNetworking_TechnicalSpecification_v2.0.pdf
Wi-Fi_CERTIFIED_Wi-Fi_Aware_Technology_Overview_Simplified Chinese.pdf