Speaker: 陳柏伸
Source code:
https://android.googlesource.com/platform/de
velopment/+/master/samples/WiFiDirectDemo
WiFi Direct
Outline
• 背景知識
• Demo WiFi Direct照片分享app
• 實作WiFi Direct照片分享app
Introduction
• Wi-Fi直連(英語:Wi-Fi Direct),之前曾
被稱為Wi-Fi 點對點(Wi-Fi Peer-to-Peer),
是一套軟體協定,讓 wifi 裝置可以不必透過
無線網路基地台(Access Point),以點對
點的方式,直接與另一個 wifi 裝置連線,進
行高速資料傳輸。這個協定由Wi-Fi聯盟發
展、支援與授與認證,通過認證的產品將
可獲得Wi-Fi 認證 Wi-Fi Direct標誌。
優點
• 點對點傳輸
• 傳輸速度快
• 安全性高
• 區域廣播功能
• 向下相容性
缺點
• 耗電
相關技術比較
• Bluetooth4.0
Enabled Wi-Fi Direct
Demo –
WiFi Direct Photo Sharing app
WifiP2pManager
• The WifiP2pManager class provides methods to allow
you to interact with the Wi-Fi hardware on your device
to do things like discover and connect to peers.
• WifiP2pManager methods:
• initialize()
• connect()
• discoverPeers()
• requestPeers()
• …
Asynchronous methods
WifiP2pManager methods let you pass in a listener, so that
the Wi-Fi P2P framework can notify your activity of the
status of a call.
不同的WifiP2pManager methods需要帶入不同的listener當參數, 像
manager.discoverPeers 就需要帶入 WifiP2pManager.ActionListListener.
Wifip2p events are intents
• WIFI_P2P_CONNECTION_CHANGED_ACTION
• WIFI_P2P_PEERS_CHANGED_ACTION
• WIFI_P2P_STATE_CHANGED_ACTION
• WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
The Wi-Fi P2P APIs define intents that are broadcast when certain
Wi-Fi P2P events happen, such as when a new peer is discovered
or when a device's Wi-Fi state changes. You can register to
receive these intents in your application by creating a broadcast
receiver that handles these intents.
Broadcast Receiver for Wi-Fi P2P
Intents
A broadcast receiver allows you to receive intents
broadcast by the Android system, so that your application
can respond to events that you are interested in.
Workflow - Broadcast Receiver
discoverPeers()
discoverPeers() & ActionListener
1. 帶入ActionListener,
2. onSuccess是指 “開始尋找裝置” 這件事有成功
requestPeers()
requestPeers() & PeerListListener
Connect()
Connect()
Socket stream
成功進行資料連
階層(mac addr)
連線之後. 如果
要使用串流進行
多媒體傳輸的話,
就要建立socket
物件了。
2. 接著 server, client會分別
建立 server Socket, client
Socket
1. 在兩個device進行p2p連
線後,會形成一個group,
系統會指派一個group
owner,或可以在程式中指
定誰要當group owner,在這
個範例中,我們指定"發起
連線端"為client, 另一端則
為 server(group owner)
3. client side就需要用到
WifiP2pInfo 來得到 server的ip,
建立 streaming.
Server socket
Client socket
References
http://chris959.blogspot.tw/2012/04/wifi-
direct.html

WiFi direct

Editor's Notes

  • #12 這四種intent下一頁會介紹是什麼
  • #13 範例中把 broadcast receiver 註冊在 main activity中的 onResume 如果收到 CONNECTION_CHANGED 的 intent action, 有可能的情況是, 成功建立p2p連線 (data link layer by mac addr)後丟出此intent, broadcast receiver接到後, 接著可能會做建立socket連線的動作。 收到THIS_DEVICE_CHANGED 的話,有可能是本機的一些資訊有改變,像是裝置名稱改變。 STATE_CHANGED, 則是wifi enable是否有被你打開 PEERS_CHANGED, 則是當偵測到有新的peer list時,會丟出這個intent, 這時可以去requestPeers()把實際的list拿到
  • #15 discoverPeers() 要帶入一個 ActionListener為參數, 然後可以再成功與失敗的callback裡做對應的動作。 onSuccess(){} 指的是 “開始尋找device” 這件事情有成功,所以在function裡加上“開始尋找”的文字提示。 假設有搜尋到 p2p的wifi device, 系統會丟出一個含有 "WIFI_P2P_PEERS_CHANGED_ACTION" 的intent, 此時之前寫好的BroadCast Receiver就會接住這個intent, 並做處理。 注意!! 這個intent並沒有附加p2p device的list, 這個intent只是告訴你有搜尋到新的p2p device.
  • #16 discoverPeers() 要帶入一個 ActionListener為參數, 然後可以再成功與失敗的callback裡做對應的動作。 onSuccess(){} 指的是 “開始尋找device” 這件事情有成功,所以在function裡加上“開始尋找”的文字提示。 假設有搜尋到 p2p的wifi device, 系統會丟出一個含有 "WIFI_P2P_PEERS_CHANGED_ACTION" 的intent, 此時之前寫好的BroadCast Receiver就會接住這個intent, 並做處理。 注意!! 這個intent並沒有附加p2p device的list, 這個intent只是告訴你有搜尋到新的p2p device.
  • #18 1.在收到 "WIFI_P2P_PEERS_CHANGED_ACTION"後,通常會去呼叫 requestPeers(), 因為這個方法才能真正讓你得到一組可以進行p2p link的 list 2. requestPeers() 也是個非同步的方法,需要帶入PeerListListener為參數,onPeersAvailable則是它的callback function,在onPeersAvailable裡面可以得到新的 peersList (如果有的話) 3.這個peerList裡有說明: 搜尋到幾個device, device分別的detail又是什麼? (這裡的detaild可能像是 mac address...等等)
  • #20 我們由 requestPeers得到了peerlist,和每個peer的資訊,現在可以用connet()來進行連線 這個階段是用mac address來連線, 要在connect傳入一個 Wifip2pCinfug物件, 這個物件包含了另一個device的mac addr. 這裡的 onSuccess() 是指 “成功發送一個request” 這件事, 並不是真的成功建立雙方間的連線 真正的建立連線是指對方按下同意,接著系統會丟出WIFI_P2P_CONNECTION_CHANGED_ACTION 的intent, 再由broadcast receiver做處理。