Wi-Fi Direct:在 Android 上构建基于 P2P 技术的局域网通信

news/2024/10/18 8:32:13/

在 Android 应用中实现局域网内设备通信,可以使用 P2P(Peer-to-Peer)技术来实现。P2P 技术使得设备之间可以直接相互通信,而不必通过服务器或者其他中介设备。在 Android 中,你可以使用 Wi-Fi Direct 技术来实现 P2P 通信。

下面是一个简单的示例,演示如何在 Android 应用程序中使用 P2P 技术进行设备间通信:

  1. 添加 Wi-Fi Direct 权限

    首先,在 AndroidManifest.xml 文件中添加 Wi-Fi Direct 相关的权限:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-feature android:name="android.hardware.wifi.direct" />
    
  2. 初始化 Wi-Fi Direct

    接下来,在你的 Activity 中初始化 Wi-Fi Direct:

    WifiP2pManager manager;
    Channel channel;manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    channel = manager.initialize(this, getMainLooper(), null);
    
  3. 搜索设备

    为了查找附近的设备,可以执行以下操作:

    manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {// 搜索成功}@Overridepublic void onFailure(int reason) {// 搜索失败}
    });
    
  4. 获取设备列表

    执行上述操作后,你可以获取设备列表:

    manager.requestPeers(channel, new WifiP2pManager.PeerListListener() {@Overridepublic void onPeersAvailable(WifiP2pDeviceList peers) {List<WifiP2pDevice> deviceList = new ArrayList<>(peers.getDeviceList());// 获取设备列表}
    });
    

    在这个回调函数中,你需要将设备列表保存在一个 List 中。

  5. 建立连接

    如果你想建立与另一个设备的连接,可以执行以下操作:

    WifiP2pConfig config = new WifiP2pConfig();
    config.deviceAddress = device.deviceAddress;
    config.wps.setup = WpsInfo.PBC;manager.connect(channel, config, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {// 连接成功}@Overridepublic void onFailure(int reason) {// 连接失败}
    });
    

    在这个代码片段中,你需要创建一个 WifiP2pConfig 对象来指定要连接的设备,然后使用 connect() 方法来建立连接。

  6. 传输数据

    如果连接成功,你可以使用 WifiP2pManager 实例来传输数据。例如,你可以使用 WifiP2pManager.send() 方法来发送数据:

    String data = "Hello, world!";
    byte[] bytes = data.getBytes();manager.requestConnectionInfo(channel, new WifiP2pManager.ConnectionInfoListener() {@Overridepublic void onConnectionInfoAvailable(WifiP2pInfo info) {if (info.groupFormed && info.isGroupOwner) {// 如果当前设备是组长WifiP2pGroup group = info.group;InetAddress address = group.getOwner().deviceAddress;// 将数据发送给客户端manager.send(channel, address, 8888, bytes, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {// 发送成功}@Overridepublic void onFailure(int reason) {// 发送失败}});}}
    });
    

    需要注意的是,传输数据之前需要确保两台设备已经成功建立连接。

当然,上述示例只是一个简单的演示,实际应用中需要处理很多细节以保证


http://www.ppmy.cn/news/277049.html

相关文章

python基础学习2【numpy生成数组+random随机数生成+索引+拼接+切割【jupyter学习】】

接上一期jupyter结尾的一小部分&#xff1a; 这四个用好了&#xff0c;排版得好你的代码看起来就像一篇文章一样~ 导出功能&#xff1a; NumPy数值计算基础 NumPy数组对象ndarray&#xff08;存储单一数据类型的多维数组&#xff09;: 属性 说明ndim返回int&#xff0c;表示数…

hadoop搭建、mysql、hive部署

写在前面&#xff1a; 本篇文章基于linux系统Centos7环境下进行搭建、操作 仅作为学习参考借鉴&#xff0c;欢迎大家交流学习&#xff01;一、 HDFS安装搭建 1.1 关闭虚拟机防火墙 在之后的学习、操作中&#xff0c;经常会遇到在宿主机中通过程序去访问虚拟机中的相关软件&am…

CDGA 认证-第四章 数据架构(重点章节)习题集解析

1. 企业架构不包括哪项?( ) A 业务架构 B 数据架构 C 系统架构 D 技术架构 【答案解析】DAMA-DMBOK2 P72 2. 关于架构设计生命周期描述错误的是?( ) A 可以是针对当前的 B 可以是面向未来的 C 可以是已实施完成的 D 可以是已经退役 10 年的 【答案解析】DAMA-DMBOK2 P…

IO 的分类

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 Java IO 按数…

利用彩虹线课程中的知识来制作精美的渐变色块和彩虹字

彩虹字 像这样的效果,同样我们可以使用“渐变色”的技巧。来看下面如何操作 选中字体,然后鼠标右键选”设置型状格式“ 选择“渐变” 有两处决定了彩虹字的样式。 拖动的箭头,这个箭头代表“每一个段”显示的色彩,如我DEMO中的字体是“两段颜色”-蓝+黄组合出来的;角度,…

202206

vue build命令导致??和?.语法无法解析 npm install --save-dev babel/plugin-proposal-nullish-coalescing-operator npm install babel/plugin-proposal-optional-chaining --save-dev同时babel.config.js文件添加 module.exports {// 其他代码plugins: [babel/plugin-p…

20211207

领导说不做OFFICE。吾急了&#xff1a;你做别的有什么前途&#xff1f;OFFICE也好要钱啊。在一纸上&#xff0c;说只有一个顶级水平&#xff08;我&#xff09;。做视频&#xff1f; 我站在一个假山石头上&#xff1f;头顶天花板了。 想起倪光南&#xff1f;在某个软件中能给他…

20230119

年前单位最后一天&#xff0c;上午焦头烂额&#xff0c;十几个事情要处理。下午处理完没事了&#xff0c;简单看了下javaweb的基础&#xff0c;http访问&#xff0c;tomcat简单介绍等等。 计划回去的话&#xff0c;mybatis基本也会用&#xff0c;还是继续了解一些平台层的东西。…