Wi-Fi NAN:鄰近感知網路
有幸在 2014 年五月份時候,代表瑞昱參加 Wi-Fi NAN 協定的開發,規格書與相關與 API 如今也已公開於世,藉由這次 Android O 發佈 Wi-Fi NAN 的這次機會,來複習整理我的陳舊記憶。
時隔三年多,Wi-Fi NAN 在 Android 8.0 初登場
2017/08/21 Google 發佈 Android 8.0(Oreo),除了對使用者比較有感的改動(如: picture-in-picture)之外,底層的新功能也不少,無線鄰近感知網路就是其中之一。
無線鄰近感知網路,規格中的全稱是 Wi-Fi Neighborhood Aware Networking(NAN),後來 Wi-Fi Alliance 或許是為了簡單好記,將其對外的名稱更改為 Wi-Fi Aware™。在這篇文章中為了閱讀方便,我統一使用我比較習慣的 NAN 簡稱。
在傳統手機,我們可以簡單的藍牙進行通訊,不過到了智慧型手機的時代,因為安全顧慮以及作業系統之間的不相容,iOS 也沒有對外曝露檔案系統,所以我們無法再利用藍牙傳送/接受檔案了,沒有可用的點對點通訊方式,必須通過 AP 連線至相同的 Wi-Fi 網路才能進行點對點傳輸(如:Wi-Fi Direct),即使操作起來很簡單的 AirDrop,也需要行動網路。
這限制對於處在網路不穩定的環境下的使用者非常不友善,特別是經常需要在設備之間共享數據的人。Wi-Fi NAN 的出現解決這問題,兩台 NAN 裝置發現彼此後可以不需要使用 GPS、行動網路、不需要透過 APP、也不需要任何配置或者網際網路就能建立點對點連線,NAN 可以探索鄰近位置的其他設備、應用程式與相關資訊,並被允許以最高速度進行資料分享。其中的低功耗連接模式,可以分享很小的數據,例如:感測器的資料、位置等等。
與 Wi-Fi P2P 相比,Wi-Fi NAN 提供了更可靠的連接;與藍牙相比,有著更高的吞吐率。 NAN 連接的可靠性和資料的傳輸速度相較以往都大幅提高。
Wi-Fi 版的 iBeacon
如果要以比較廣為人知的技術來類比的話,Wi-Fi NAN 就像使用 Wi-Fi 技術而非藍牙技術的 iBeacon 機制。iBeacon 在 Wikipedia 上的描述:
iBeacon是蘋果公司提出的「一種可以讓附近手持電子設備檢測到的一種新的低功耗、低成本信號傳送器」的一套可用於室內定位系統的協議。
Demo 影片:
Wi-Fi NAN 是系統層級的功能,一旦裝置是運行在 Android O 之上,不需要額外的服務,功能或形式的連接來找到對方,它就會自動連接其他裝置,不需要應用程式介入。但若第三方應用調用 Wi-Fi Aware API,將能更好地利用 Wi-Fi Aware功能 - 允許應用程式利用發現功能以及創建網路的能力互相連接,以便在需要時可以定位,連接和共享數據。
Android Wi-Fi Aware API
因為絕大多數的機制實作於驅動程式與 Wi-Fi 晶片上,應用程式只需要:
- 廣播自己與發現周邊的裝置
- 發佈服務
- 訂閱服務
- 決定與其他裝置間的通訊方式
- 建立網路連線
- 發送訊息
1. Discover other devices
透過 API發現臨近的機制,如果周圍的裝置發佈了一個可被發現的服務,那麼這個動作就會被啟動。當訂閱的一個或多個服務進入了發佈者的 Wi-Fi 範圍內,訂閱者就會收到通知,在訂閱者發現了發佈者之後,訂閱者可以發送訊息或是與其建立網路連線。
- Publish a service:讓服務可被發現,我們可以調用
publish()
方法,包括以下參數:- PublishConfig - 指定服務名稱以及其他配置屬性,例如匹配條件。
- DiscoverySessionCallback - 指定當事件發生之後要進行的動作,例如當訂閱者收到訊息之後的事件。
- Subscribe to a service:訂閱一個服務可以調用
subscribe()
方法,包括以下參數:- SubscribeConfig - 指定服務名稱以及其他配置屬性,例如匹配條件。
- DiscoverySessionCallback - 指定當事件發生之後要進行的動作,例如發佈者被發現了。
2. DiscoverySessionCallback
不論是發佈或訂閱服務,在事件發生之後會回調 DiscoverySessionCallback
,我們可以選擇建立連線或是發送訊息。
Create a network connection
有兩種建立 Wi-Fi Aware 連接的方式:
- 使用 Wi-Fi Aware 來發現其他裝置並且你有其他裝置的 PeerHandle
- 透過其他像是 BT or BLE 機制得知其他裝置的 MAC 地址,也被稱作帶外發現(OOB, out-of-band discovery)
不管選擇何種方式,Wi-Fi Aware 連接中總有兩種角色: Initiator (Master) 與 Responder (Non-Master)。如果你正使用 Wi-Fi Aware discovery,那麼這些角色就是固定而且不需要明確指明的。如果你正使用的是帶外發現的話,那麼裝置就需要自己互相協調他們的角色。
Send a message
如果只是要發送訊息的話,可以調用 sendMessage()
這個方法,若希望使用更高速度的方式雙向通訊,你的應用程式應該選擇建立連接而不是透過發送訊息的方式。
運作原理
NAN 裝置可通過獨特的探索與同步過程建立共同「感應」,多部設備可組成資訊集群(Cluster)。
藉由不斷廣播自己的裝置訊息,周圍的裝置如果收到廣播,會回傳集群的訊息回來,如果有多個集群可以加入,優先加入距離近、訊號強的集群;如果附近沒有可以加入的集群,那麼以自己為首成立一個。範圍內的 NAN 裝置間透過這種機制會自然地形成集群。這機制是在 Wi-Fi NAN 協定上規範的,無法透過應用控制,應用程式只需要調用 API 決定訂閱、發佈、還有溝通的內容。
加入集群之後,集群間的裝置可以交換周邊可用服務的資訊,讓用戶即時發現所需服務。而一旦發現感興趣的服務,應用程式即可輕鬆建立 Wi-Fi 連接以支援如分享照片或多人遊戲等後續活動。
NAN 資訊集群示意圖如下:
硬體需求與限制
要實作 NAN 協定最重要的就是對距離與周邊 Wi-Fi 訊號的感知能力,在硬體上主要有四個重要需求。
首先是 Beacon 發送,所有 NAN 裝置都需要具備短時間內能頻繁發送 Beacon 的能力,傳統的 Wi-Fi Beacon 發送機制無法滿足 NAN 的需求。第二個是 TSF(Time Synchronization Function),NAN 裝置有 TSF的功能,裝置間的時間才得以同步,定義出共同的時間窗口(Time Window),TSF 不準會讓自己永遠無法加入其它集群。第三個是 Hash Table 與 Bloom Filter,為的是更快速地匹配訂閱的服務。最後是 RSSI 的精準度, NAN 中的鄰近距離是透過 RSSI 的強弱來做出相對的判斷,RSSI 的精準度決定了鄰近距離的準確性,也決定了用戶體驗。
應用場景
Wi-Fi Aware的出現得益於高度個人行動體驗需求的迅速成長。Wi-Fi Aware 創造了更直接、更實用的情境感知功能,為個人化應用程式提供持續掃描周圍資訊、預測行動、發送服務通知與選擇喜好通知的功能。Wi-Fi 在移動設備領域的廣泛應用為供應商、作業系統與應用程式開發者在鄰近服務的創新研發上創造無限潛在機會。
通過 NAN 技術,用戶可以控制個人隱私設定選擇性地獲得所需訊息資料,亦可以安裝應用程式來提供並/或搜索周邊設備所提供的服務,並在無需建立連接的情況下,進行資訊的交換。
藉由 NAN 的鄰近感知能力、點對點通訊能力,裝置間可以通過訂閱/發佈服務進行資訊的交換與數據的傳遞,來滿足不同的使用場景:
- 中繼路由:橋接 NAN 裝置作為中繼路由,延伸 AP 訊號
- 網路共享:利用鄰近感知能力發現附近 AP 上網
- 檔案共享:在演唱會場內與朋友共享照片
- 室內定位:在百貨商場中推送廣告或是使用路線指引導覽
- 遊戲對戰:在高速行駛的列車上,發現附近的玩家進行區網對戰
總結
Wi-Fi NAN 技術依賴在硬體本身提供的能力,效能的好壞與用戶體驗很大程度取決於硬體(如:能否在不中斷現有 Wi-Fi 連線的條件下同時開啟 NAN)。目前多數的裝置的硬體都不支援 Wi-Fi NAN,iOS 也尚未支援 Wi-Fi NAN,要在我們的生活中看到普及的應用還需要給它一些時間,等待軟硬體更加成熟。
Reference: