东莞网页制作免费网站制作,摄影师招聘网站,郑州模板网站,宁波网站推广平台效果好Wi-Fi直连分享#xff1a;Android设备间的高速连接
引言
随着无线局域网#xff08;Wi-Fi#xff09;的普及和发展#xff0c;使用Wi-Fi直连技术#xff08;P2P#xff09;在没有中间接入点的情况下实现设备间直接互联成为可能。通过Wi-Fi直连#xff0c;具备相应硬件…
Wi-Fi直连分享Android设备间的高速连接
引言
随着无线局域网Wi-Fi的普及和发展使用Wi-Fi直连技术P2P在没有中间接入点的情况下实现设备间直接互联成为可能。通过Wi-Fi直连具备相应硬件的Android 4.0及更高版本设备可以实现高速连接通信比传统蓝牙连接具有更远的传输距离。这项技术对于多人游戏、照片共享等需要设备间数据共享的应用非常有用。
Wi-Fi直连的核心API是WifiP2pManager类。
普通连接代码实现
初始化
private WifiP2pManager.Channel mChannel; // app与framework联系的纽带
private WifiP2pManager mManager;
...
mManager (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel mManager.initialize(this, getMainLooper(), null);创建群组
只有服务端设备需要执行此步骤客户端设备可以跳过。即使不创建群组设备仍然可以进行后续的设备发现和连接操作。一旦连接成功这两台设备将自动形成一个群组并在其中选择一台设备作为群主。创建群组后会在Wi-Fi列表中出现一个名为DIRECT_**_DeviceName的网络这个网络是为没有Wi-Fi直连功能的设备准备的它们可以通过连接此网络来加入群组。但是使用此方式加入的设备不会收到WIFI_P2P_CONNECTION_CHANGED_ACTION广播不过在调用mManager.requestGroupInfo时可以获取到这些设备的信息。
mManager.createGroup(mChannel, new WifiP2pManager.ActionListener() {Overridepublic void onSuccess() {appendLog(创建群组成功);// 在这里可以创建ServerSocket并等待客户端接入...}Overridepublic void onFailure(int reason) {appendLog(创建群组失败);...}
});很多地方都会使用到WifiP2pManager.ActionListener回调下面列出了一些可能的错误原因
/*** Wi-Fi直连操作失败*/
public static final int ERROR 0;/*** 设备不支持Wi-Fi直连功能*/
public static final int P2P_UNSUPPORTED 1;/*** 操作失败框架忙于处理其他请求*/
public static final int BUSY 2;/*** 操作失败未添加任何服务请求*/
public static final int NO_SERVICE_REQUESTS 3;发现设备
mManager.discoverPeers(mChannel, mActionListener);客户端设备直接执行此操作不需要创建群组。两台设备必须同时执行设备发现操作才能相互发现对方的存在。
停止发现设备
mManager.stopPeerDiscovery(mChannel, mActionListener);连接设备
连接设备的操作可以由服务端或客户端发起。device是通过设备发现获得的对方设备信息后续会介绍广播的相关内容。
WifiP2pConfig config new WifiP2pConfig();
config.deviceAddress device.deviceAddress;
mManager.connect(mChannel, config, mActionListener);取消连接
连接后也可以取消连接。注意取消操作将取消所有正在发起连接邀请的设备不能针对单个设备进行操作。
mManager.cancelConnect(mChannel, mActionListener);解散群组
当需要取消某个单一连接时只能从客户端取消对服务端的连接。如果需要取消所有连接只能通过解散群组来实现。
mManager.removeGroup(mChannel, mActionListener);获取群组相关信息
可以通过以下代码获取群组中的所有设备信息
mManager.requestGroupInfo(mChannel, new WifiP2pManager.GroupInfoListener() {Overridepublic void onGroupInfoAvailable(WifiP2pGroup group) {appendLog(已连接的设备);CollectionWifiP2pDevice devices group.getClientList();int i1;for(WifiP2pDevice d: devices) {appendLog((i) : ip: d.deviceAddress, name: d.deviceName , isGroupOwner: d.isGroupOwner() );}}
});广播实现
使用广播来通知应用层自身设备、发现设备和连接设备的状态变化。
Intent说明WIFI_P2P_CONNECTION_CHANGED_ACTION当设备的 WLAN 连接状态更改时广播。WIFI_P2P_PEERS_CHANGED_ACTION当您调用 discoverPeers() 时广播。如果您在应用中处理此 Intent则通常需要调用 requestPeers() 以获取对等设备的更新列表。WIFI_P2P_STATE_CHANGED_ACTION当 WLAN P2P 在设备上启用或停用时广播。WIFI_P2P_THIS_DEVICE_CHANGED_ACTION当设备的详细信息例如设备名称更改时广播。WIFI_P2P_DISCOVERY_CHANGED_ACTION当设备开始或停止发现设备时广播
下面是一个实现广播接收器的示例
public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {public WiFiDirectBroadcastReceiver() {super();}Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {// 检查 Wi-Fi 是否启用并通知相应的活动int state intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, WifiP2pManager.WIFI_P2P_STATE_DISABLED);// wifi p2p 能否使用取决于你的 Wi-Fi 是否已打开。if (state WifiP2pManager.WIFI_P2P_STATE_ENABLED) {// wifi p2p 可用} else if (state WifiP2pManager.WIFI_P2P_STATE_DISABLED) {// wifi p2p 不可用}} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {// 调用 WifiP2pManager.requestPeers() 获取当前对等设备列表// 获取所有扫描到的设备。WifiP2pDeviceList mPeers intent.getParcelableExtra(WifiP2pManager.EXTRA_P2P_DEVICE_LIST);} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {// 处理新连接或断开连接的情况// wifi p2p 连接状态发生变化在创建组成功时也会触发该广播。// 获取 Wi-Fi P2P 网络状态NetworkInfo networkInfo intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);// 关于该群组的连接信息。有三个属性// 1. groupFormed群组是否已形成作为群主创建群组后获得的该属性值为 true// 2. isGroupOwner本设备是否为群主// 3. groupOwnerAddress群主的 IP 地址WifiP2pInfo p2pInfo intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);// 群组的相关信息如网络名称、密码和所有已连接设备等。WifiP2pGroup p2pGroup intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);if (networkInfo ! null networkInfo.isConnected()) {// 表明已连接上创建组成功也会进入该判断if (p2pInfo.groupFormed p2pInfo.isGroupOwner) {// 群组已形成且本设备为群主} else if (p2pInfo.groupFormed) {// 群组已形成但本设备非群主// 获取群主 IPString groupOwnerAddress p2pInfo.groupOwnerAddress.getHostAddress();// 建立 Socket 连接}}} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {// 处理本设备的 Wi-Fi 状态变化// 本设备信息发生变化WifiP2pDevice wifiP2pDevice intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);} else if (WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION.equals(action)) {// 处理发现设备操作状态变化// WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED停止状态// WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED开始状态int discoveryState intent.getIntExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE,WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED);}}
}获取连接信息
上述代码片段展示了如何使用WifiP2pManager来获取连接信息。通过调用requestConnectionInfo()方法并传入一个ConnectionInfoListener我们可以在连接信息可用时得到回调。
如果连接信息为null或群主地址为空直接返回。如果群已建立且设备是群主可以通过requestGroupInfo()方法获取群组信息其中包括WiFi热点密码。
对于客户端设备可以根据需要执行相应的操作。
针对性WiFi P2P连接
除了普通的搜索和连接方式外还可以使用WifiP2pManager.discoverServices()方法进行针对性的WiFi P2P连接。这种方式会根据服务提供的字段和协议来判断是否符合连接要求。
服务创建 Bonjour 使用Bonjour服务时可以通过创建txt记录来指定相关信息。 示例代码如下 MapString, String txtRecord new HashMapString, String();
txtRecord.put(txtvers, 1);
txtRecord.put(pdl, application/postscript);
mServiceInfo WifiP2pDnsSdServiceInfo.newInstance(instanceName,serviceType, txtRecord);其中serviceType参数指定了应用程序使用的协议和传输层。 UPnP 使用UPnP服务时可以指定服务类型和相关信息。 示例代码如下 ListString services new ArrayListString();
services.add(urn:schemas-upnp-org:service:AVTransport:1);
services.add(urn:schemas-upnp-org:service:ConnectionManager:1);
mServiceInfo WifiP2pUpnpServiceInfo.newInstance(6859dede-8574-59ab-9332-123456789011,urn:schemas-upnp-org:device:MediaRenderer:1,services);添加服务
创建完服务信息后可以使用addLocalService()方法将服务添加到本地。
示例代码如下
mManager.addLocalService(mChannel, mServiceInfo, mActionListener);创建群组
与之前的示例相同可以使用相同的方法来创建WiFi P2P群组。
创建服务监听
针对Bonjour和UPnP服务可以分别创建相应的监听器。当搜索到设备服务时这些监听器会得到回调。
示例代码如下
// Bonjour服务监听器
WifiP2pManager.DnsSdServiceResponseListener ptrListener new WifiP2pManager.DnsSdServiceResponseListener() {Overridepublic void onDnsSdServiceAvailable(String instanceName, String registrationType, WifiP2pDevice srcDevice) {}}WifiP2pManager.DnsSdTxtRecordListener txtListener new WifiP2pManager.DnsSdTxtRecordListener() {Overridepublic void onDnsSdTxtRecordAvailable(String fullDomainName, MapString, String txtRecordMap, WifiP2pDevice srcDevice) {}
}
mManager.setDnsSdResponseListeners(mChannel, ptrListener, txtListener);// UPnP服务监听器
private WifiP2pManager.UpnpServiceResponseListener upnpListener new WifiP2pManager.UpnpServiceResponseListener() {Overridepublic void onUpnpServiceAvailable(ListString uniqueServiceNames, WifiP2pDevice srcDevice) {}
}
mManager.setUpnpServiceResponseListener(mChannel, upnpListener);这些监听器会在搜索到设备服务时得到回调。根据搜索时传入的服务request决定回调哪个监听器。
发现服务
通过创建相应的服务请求可以发现Bonjour和UPnP服务。
示例代码如下
// Bonjour类型的TXT服务对应上面 txtListener
WifiP2pDnsSdServiceRequest txtRequest WifiP2pDnsSdServiceRequest.newInstance(INSTANCE_NAME, SERVICE_TYPE);
// Bonjour类型的PTR服务对应上面 ptrListener
WifiP2pDnsSdServiceRequest ptrRequest WifiP2pDnsSdServiceRequest.newInstance(SERVICE_TYPE);
// UPnP服务对应上面的upnpListener
WifiP2pUpnpServiceRequest upnpRequest WifiP2pUpnpServiceRequest.newInstance(searchTarget);mManager.addServiceRequest(mChannel, txtRequest, mActionListener);
mManager.addServiceRequest(mChannel, ptrRequest, mActionListener);
mManager.addServiceRequest(mChannel, upnpRequest, mActionListener);其余步骤与之前的示例相同。
以上是针对性WiFi P2P连接的示例代码和步骤。你可以根据自己的需求来选择合适的服务类型和设置相应的监听器来处理搜索到的设备服务。
参考
参考文档https://developer.android.google.cn/guide/topics/connectivity/wifip2p?hlzh-cn 文章转载自: http://www.morning.dwyyf.cn.gov.cn.dwyyf.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.cfynn.cn.gov.cn.cfynn.cn http://www.morning.wmfh.cn.gov.cn.wmfh.cn http://www.morning.rqfkh.cn.gov.cn.rqfkh.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.wdply.cn.gov.cn.wdply.cn http://www.morning.bmssj.cn.gov.cn.bmssj.cn http://www.morning.bdypl.cn.gov.cn.bdypl.cn http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn http://www.morning.rnds.cn.gov.cn.rnds.cn http://www.morning.hblkq.cn.gov.cn.hblkq.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.lngyd.cn.gov.cn.lngyd.cn http://www.morning.alwpc.cn.gov.cn.alwpc.cn http://www.morning.sdktr.com.gov.cn.sdktr.com http://www.morning.hwbf.cn.gov.cn.hwbf.cn http://www.morning.qtzwh.cn.gov.cn.qtzwh.cn http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn http://www.morning.wphfl.cn.gov.cn.wphfl.cn http://www.morning.lyhrg.cn.gov.cn.lyhrg.cn http://www.morning.ldzss.cn.gov.cn.ldzss.cn http://www.morning.fddfn.cn.gov.cn.fddfn.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.mxhys.cn.gov.cn.mxhys.cn http://www.morning.yubkwd.cn.gov.cn.yubkwd.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.nbmyg.cn.gov.cn.nbmyg.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.gywfp.cn.gov.cn.gywfp.cn http://www.morning.txgjx.cn.gov.cn.txgjx.cn http://www.morning.lzzqz.cn.gov.cn.lzzqz.cn http://www.morning.fktlr.cn.gov.cn.fktlr.cn http://www.morning.jntcr.cn.gov.cn.jntcr.cn http://www.morning.ghfrb.cn.gov.cn.ghfrb.cn http://www.morning.kyflr.cn.gov.cn.kyflr.cn http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn http://www.morning.knlyl.cn.gov.cn.knlyl.cn http://www.morning.nggbf.cn.gov.cn.nggbf.cn http://www.morning.kcrw.cn.gov.cn.kcrw.cn http://www.morning.jhtrb.cn.gov.cn.jhtrb.cn http://www.morning.cwgn.cn.gov.cn.cwgn.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.qlxgc.cn.gov.cn.qlxgc.cn http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.bzkgn.cn.gov.cn.bzkgn.cn http://www.morning.hkpyp.cn.gov.cn.hkpyp.cn http://www.morning.ymbqr.cn.gov.cn.ymbqr.cn http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.ntdzjx.com.gov.cn.ntdzjx.com http://www.morning.fmrrr.cn.gov.cn.fmrrr.cn http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn http://www.morning.jhfkr.cn.gov.cn.jhfkr.cn http://www.morning.khtyz.cn.gov.cn.khtyz.cn http://www.morning.rhkmn.cn.gov.cn.rhkmn.cn http://www.morning.qsmch.cn.gov.cn.qsmch.cn http://www.morning.bnylg.cn.gov.cn.bnylg.cn http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.pxrfm.cn.gov.cn.pxrfm.cn http://www.morning.kfbth.cn.gov.cn.kfbth.cn http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn http://www.morning.kdxzy.cn.gov.cn.kdxzy.cn http://www.morning.cgthq.cn.gov.cn.cgthq.cn http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.jwtwf.cn.gov.cn.jwtwf.cn http://www.morning.jbctp.cn.gov.cn.jbctp.cn http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn http://www.morning.wpxfk.cn.gov.cn.wpxfk.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.nynyj.cn.gov.cn.nynyj.cn http://www.morning.jpwkn.cn.gov.cn.jpwkn.cn http://www.morning.rgrz.cn.gov.cn.rgrz.cn