设为首页 收藏本站
查看: 1726|回复: 0

[经验分享] WIFI(1)WIFI直连 + socket 可以用来实现类似蓝牙传输数据的功能

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-2 12:41:49 | 显示全部楼层 |阅读模式
WIFI 直连简介
  从Android4.0(API Level=14)开始,允许通过Wi-Fi模块在两个移动设备之间建立直接连接(这种技术称为Wi-Fi Direct),这种连接不需要无线路由作为中介,而只是像蓝牙一样在两个设备之间直接建立的数据传输通道。在Android SDK中提供了一些API,通过这些API可以发现其它支持Wi-Fi Direct的设备,也可以接收其它设备的Wi-Fi Direct请求。在Wi-Fi Direct出现之前,通常使用蓝牙或利用无线路由连接多部Android设备,蓝牙的有效距离比较短,而且传输速率不如Wi-Fi。不过有了Wi-Fi Direct后,两部设备可以直接连接,既方便又快速,非常适合数据分享。

WIFI 直连基本基本过程
  通常WIFI 直连设备即有socket客户端,又有socket服务端.
  1,搜索附近WIFI 直连设备
  2,连接WIFI 直连设备,
  3,用socket通信.

Wi-Fi Direct的核心API

WifiP2pManager类该类中提供了允许用户发现、请求和连接其它支持Wi-Fi Direct设备的API。
Wi-Fi Direct广播接收器类用于监听Wi-Fi Direct请求的广播接收器.
事件接口被Wi-Fi Direct框架检测到的事件通知,例如,终止连接、发现新的Wi-Fi Direct设备等。
  

Wi-Fi Direct广播接收器的广播消息

WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION检测Wi-Fi是否可用,并且将检测结果通知相应的窗口。
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION  调用WifiP2pManager.requestPeers方法获取成功连接的设备列表。

注意它是搜索完所有设备后产生一个广播消息,而蓝牙是搜到一个产生一个广播消息
WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION响应Wi-Fi连接状态(连接或断开)。
WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION响应设备的Wi-Fi状态变化。

搜索Wi-Fi Direct设备

1,开始搜索
  使用Wi-Fi Direct进行通信,首先要搜索周围有没有其它的Wi-Fi Direct设备。完成这项工作需要调用WifiP2pManager.discoverPeers方法.



1 mChannel = mManager.initialize(this, getMainLooper(), null);
2 mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener()
3 {
4     //  成功发现周围有Wi-Fi Direct设备
5     @Override
6     public void onSuccess() {//只通知成功,并没有数据
7         ...
8     }
9     //  未发现周围有Wi-Fi Direct设备
10     @Override
11     public void onFailure(int reasonCode) {//只通知失败,并没有数据
12         ...
13     }
14 });
2,得到设备列表



1 PeerListListener myPeerListListener;
2 ...
3 if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
4
5 if (mManager != null)
6 {
7     //  异步获取可用的Wi-Fi Direct设备
8         mManager.requestPeers(mChannel, myPeerListListener);
9     }
10 }
11
12 public interface PeerListListener
13 {//通过这个接口得到所有direct设备列表
14      public void onPeersAvailable(WifiP2pDeviceList peers);
15 }
连接Wi-Fi 直连设备



1 WifiP2pDevice device;
2 … … //  需要从前面得到的设备列表中获取相应的设备(WifiP2pDevice对象)
3 //  创建WifiP2pConfig对象
4 WifiP2pConfig config = new WifiP2pConfig();
5 //  存储设备的MAC地址
6 config.deviceAddress = device.deviceAddress;
7 //  开始连接设备
8 mManager.connect(mChannel, config, new ActionListener() {
9     //  当成功连接设备后调用该方法
10     @Override
11     public void onSuccess() {
12         //success logic
13     }
14     连接设备失败后调用该方法
15     @Override
16     public void onFailure(int reason) {
17         //failure logic
18     }
19 });
传输数据



1 WifiP2pManager. requestConnectionInfo(...)
2
3 public void requestConnectionInfo(Channel c, ConnectionInfoListener listener);
4
5
6 public interface ConnectionInfoListener
7 {
8     public void onConnectionInfoAvailable(WifiP2pInfo info);
9 }
10
11
12 WifiP2pInfo.groupOwnerAddress.getHostAddress
13
客户端用Socket连接、服务端用ServerSocket.accept等待客户端连接

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121764-1-1.html 上篇帖子: [Legacy Wi-Fi]如何设定WIFI Channel 下篇帖子: iOS获取WiFi的ssid 和 macIp
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表