WifiP2p點對點連線的詳解
一.WifiP2p的描述
wifiP2p是不需要聯網的,只需要手機開啟wlan就可以連線通訊的;底部的通訊原理是Binder通訊
二.WifiP2p的操作流程
1.許可權申請
2.設定廣播,用來獲取WIfiP2p各種變化時候的資訊
3.獲取WifiP2pManager和WifiP2pManager.channel
4.開啟掃描,兩臺手機都需要開啟掃描
5.通過廣播的回撥獲取到搜尋的手機列表
6.連線;因為當兩臺手機連線的時候,會生成一個組,我們可以通過廣播回撥獲取組的owner資訊
7.socket通訊,將組的owner做完服務端,其它做完客戶端
三.許可權申請
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>
四.設定廣播用來獲取WifiP2p的各種變化時候的資訊
public static IntentFilter initIntentFilter(){ IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); //當WifiP2p連線狀態改變的時候回撥,注意需要分清是關閉連線還是開啟連線 intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); //當Wifi狀態發生改變的時候呼叫, 也可能是Wifi開啟和關閉 intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); //當wifi搜尋列表發生改變的時候呼叫,可以獲取Wifi搜尋到的列表資料 intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); //當Wifi本身資訊發生改變的時候呼叫,可以獲取到自身Device的資訊 return intentFilter; }
@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)){ NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); if(networkInfo.isConnected()){ WifiP2pInfo wifiP2pInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO); deviceActionListener.connect(wifiP2pInfo); deviceActionListener.updateStatus("連線狀態中"); } }else if(action.equals(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)){ WifiP2pDeviceList wifiP2pDeviceList = intent.getParcelableExtra(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); List<WifiP2pDevice> p2pDeviceList = new ArrayList<>(); p2pDeviceList.addAll(wifiP2pDeviceList.getDeviceList()); deviceActionListener.updateDeviceList(p2pDeviceList); }else if(action.equals(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)){ int status = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,-1); if (status == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { deviceActionListener.updateStatus("可用的。。。"); }else{ deviceActionListener.updateStatus("不可用。。。"); } }else if(action.equals(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)){ WifiP2pDevice wifiP2pDevice = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE); deviceActionListener.updateDeviceInformation(wifiP2pDevice); } }
上面獲取資料的時候還可以使用WifiP2pManager.requestXXX某方法回撥,
這裡的DeviceActionListener是一個介面,這裡採用的是介面回撥與Activity進行通訊
interface DeviceActionListener{ void connect(WifiP2pInfo wifiP2pInfo); void updateDeviceList(List<WifiP2pDevice> p2pDeviceList); void updateStatus(String text); void updateDeviceInformation(WifiP2pDevice wifiP2pDevice); }
五.獲取WifiP2pManager和WifiP2pManager.channel
wifiP2pManager = (WifiP2pManager) this.getSystemService(WIFI_P2P_SERVICE); channel = wifiP2pManager.initialize(this,getMainLooper(),null);
六.開啟掃描,兩臺手機都需要開啟掃描
wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Log.d("MainActivity","掃描成功了............."); } @Override public void onFailure(int i) { Log.d("MainActivity","掃描失敗......"); } });
七. 通過廣播的回撥獲取到搜尋的手機列表
當獲取到搜尋列表的時候,就會觸發 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION 的事件,在廣播中,我們可以通過 WifiP2pDeviceList wifiP2pDeviceList = intent.getParcelableExtra(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 獲取到手機列表的資料。我們可以使用一個ListView來顯示這些
手機資料。
八.連線
我們可以通過ListView的點選事件來設定連線,下面的wifiP2pDevice是你點選(ListView)某項的WifiP2pDevice
WifiP2pConfig wifiP2pConfig = new WifiP2pConfig(); wifiP2pConfig.deviceAddress = wifiP2pDevice.deviceAddress; wifiP2pConfig.wps.setup = WpsInfo.PBC; wifiP2pManager.connect(channel,wifiP2pConfig,null);
九.socket通訊,將組的owner做完服務端,其它做完客戶端
當連線成功的時候會呼叫廣播的Wifi連線狀態發生改變的事件,我們可以在裡面獲取到WifiP2pInfo資訊,通過該物件我們可以獲取組owner的interAddress;這個描述的程式碼都在上面的Receiver中。
然後就是將Owner做為ServerSocket,其他的作為Socket。