Android WiFi P2P数据传输

这篇具有很好参考价值的文章主要介绍了Android WiFi P2P数据传输。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WiFi P2P是指通过WiFi直接连接两台设备之间的无线点对点通信,不需要通过路由器或者互联网。这种技术被广泛应用于移动设备之间的文件共享、游戏联机、音乐播放等应用场景中。

WiFi P2P的优点在于可以在没有网络的情况下建立设备之间的连接,同时具有高速和低延迟的特点。它还支持多种语言编程接口,并且使用起来非常简单。

在Android中,WiFi P2P可以通过WifiP2pManager类进行实现,它提供了许多方法来扫描可用设备、建立P2P连接并传输数据等功能。开发者可以通过这些方法来实现设备之间的文件传输等操作。

WiFi和蓝牙是两种不同类型的无线通信技术,在许多方面都有不同的特点和用途。
以下是一些常见的WiFi和蓝牙的比较:

  1. 传输速率:WiFi传输速度更快,可以达到几百兆比特每秒,而蓝牙通常只能达到几兆比特每秒。
  2. 距离限制:WiFi的覆盖范围通常更大,可以在较长的距离内进行通信,而蓝牙的覆盖范围通常比较小,仅能在短距离内通信。
  3. 电池寿命:由于WiFi的功率更大,因此它通常消耗更多的电池生命,而蓝牙通常需要更少的功率,因此它通常耗电更少。

下面是使用Wifi P2P传输文件的基本代码示例,您可以根据需要进行调整:

1. 添加权限和依赖项

在AndroidManifest.xml中添加以下权限:

<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_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

在build.gradle文件中添加以下依赖项:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'

2. 设置布局文件

在布局文件中添加以下代码:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#000000" />

    <Button
        android:id="@+id/button_search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="搜索可用设备" />

    <ListView
        android:id="@+id/list_devices"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button_search"
        android:layout_marginTop="20dp"
        android:visibility="gone" />

</RelativeLayout>

3. 创建WifiP2pManager和WifiP2pManager.Channel对象

在Activity中定义以下变量:

private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private BroadcastReceiver mReceiver;
private IntentFilter mIntentFilter;
private List<WifiP2pDevice> peers = new ArrayList<>();
private WifiP2pDeviceListAdapter mAdapter;

在Activity的onCreate()方法中,创建WifiP2pManager和WifiP2pManager.Channel对象:

mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);

4. 注册广播接收器

在Activity中创建以下BroadcastReceiver对象:

mReceiver = new WifiDirectBroadcastReceiver(mManager, mChannel, this);

WifiDirectBroadcastReceiver是一个自定义广播接收器类,它负责处理与Wifi P2P相关的广播事件。

在Activity的onResume()方法中,注册广播接收器:

registerReceiver(mReceiver, mIntentFilter);

在Activity的onPause()方法中,注销广播接收器:

unregisterReceiver(mReceiver);

5. 开始搜索可用设备

通过调用startDiscovery()方法开始搜索可用设备:

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
    @Override
    public void onSuccess() {
        //搜索成功
    }

    @Override
    public void onFailure(int reasonCode) {
        //搜索失败
    }
});

6. 显示可用设备列表

创建一个自定义适配器类WifiP2pDeviceListAdapter,用于显示可用设备列表中的每个设备:

public class WifiP2pDeviceListAdapter extends ArrayAdapter<WifiP2pDevice> {
    private List<WifiP2pDevice> items;
    private Context ctx;

    public WifiP2pDeviceListAdapter(Context context, int textViewResourceId,
                                     List<WifiP2pDevice> objects) {
        super(context, textViewResourceId, objects);
        items = objects;
        ctx = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row_devices, null);
        }
        WifiP2pDevice device = items.get(position);
        if (device != null) {
            TextView top = (TextView) v.findViewById(R.id.device_name);
            TextView bottom = (TextView) v.findViewById(R.id.device_details);
            if (top != null) {
                top.setText(device.deviceName);
            }
            if (bottom != null) {
                bottom.setText(getDeviceStatus(device.status));
            }
        }
        return v;
    }

    private String getDeviceStatus(int deviceStatus) {
        switch (deviceStatus) {
            case WifiP2pDevice.AVAILABLE:
                return "可用";
            case WifiP2pDevice.INVITED:
                return "已邀请";
            case WifiP2pDevice.CONNECTED:
                return "已连接";
            case WifiP2pDevice.FAILED:
                return "失败";
            case WifiP2pDevice.UNAVAILABLE:
                return "不可用";
            default:
                return "未知状态";
        }
    }
}

在Activity中,设置ListView的适配器:

mAdapter = new WifiP2pDeviceListAdapter(this, R.layout.row_devices, peers);
ListView listView = (ListView) findViewById(R.id.list_devices);
listView.setAdapter(mAdapter);

在BroadcaseReceiver接收到搜索结果后,在Activity中更新设备列表:

@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
    peers.clear();
    peers.addAll(peerList.getDeviceList());
    mAdapter.notifyDataSetChanged();
    if (peers.size() == 0) {
        //没有可用设备
    }
}

7. 连接到另一个设备

在设备列表中选择一个设备,并调用connect()方法:

mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {
    @Override
    public void onSuccess() {
        //连接成功
    }

    @Override
    public void onFailure(int reason) {
        //连接失败
    }
});

8. 传输文件

在连接成功后,使用WifiP2pGroup.getClientList()方法获取已连接设备的列表,将文件传输到列表中的第一个设备:

WifiP2pGroup group = (WifiP2pGroup) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
if (group != null) {
    Collection<WifiP2pClient> clients = group.getClientList();
    if (clients.size() > 0) {
        WifiP2pClient client = (WifiP2pClient) clients.toArray()[0];
        File file = new File(filePath);
        if (file.exists()) {
            try {
                FileInputStream inputStream = new FileInputStream(file);
                OutputStream outputStream = client.getOutputStream();
                byte[] buffer = new byte[1024];
                int length;
                while ((length = inputStream.read(buffer)) > 0) {
                    outputStream.write(buffer, 0, length);
                }
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            //文件不存在
        }
    } else {
        //没有连接设备
    }
} else {
    //组不存在
}

注意:以上代码仅用于演示如何使用Wifi P2P传输文件,您需要根据自己的情况进行修改。此外,Wifi P2P传输文件的性能可能会受到网络环境的影响,并不适用于大文件传输。文章来源地址https://www.toymoban.com/news/detail-729087.html

到了这里,关于Android WiFi P2P数据传输的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 P2P 技术的 Android 局域网内设备通信实践

    Android 局域网内的多设备通信方式有多种,其中常见的方式有: 基于 TCP/UDP 的 Socket 通信 基于 Bluetooth 的近场通信 基于 Wifi 的 Wi-Fi Direct 连接 基于第三方框架的通信,如 MQTT、Websocket 等 每种方式都有其适用范围,下面分别介绍一下它们的示例代码、优劣势。 Socket 是 TCP/UDP 套

    2024年02月08日
    浏览(49)
  • 无需服务器:Android 应用中使用 P2P 技术进行局域网内设备通信

    随着局域网内设备数量的不断增加和不断演化的 IoT 技术,设备之间的互联变得越来越重要。对于许多 Android 应用程序而言,这样的互联性是必不可少的,需要使用一些技术来实现跨设备的通信。P2P 技术(点对点技术)已证明是一种非常成功的通信技术,可以实现在局域网内

    2024年02月14日
    浏览(41)
  • P2P 应用

    ·在 P2P 工作方式下,所有的音频/视频文件都是在普通的互联网 用户之间传输 。 ·Napster 最早 使用 P2P 技术,提供免费下载 MP3 音乐。 ·Napster 将所有音乐文件的索引信息都集中存放在 Napster 目录服务器中。 ·使用者只要查找目录服务器,就可知道应从何处下载所要的 MP3 文件

    2024年02月19日
    浏览(43)
  • 什么是P2P?

    P2P (Peer-to-Peer) 是一种分布式的网络架构,其中各个节点(通常被称为“peers”或“节点”)直接进行数据共享和交换,而无需依赖中央服务器。P2P 网络强调平等的参与和共享,每个节点既可以是数据的消费者(下载者),也可以是提供者(上传者)。 以下是 P2P 协议和技术的

    2024年02月13日
    浏览(52)
  • Wi-Fi Direct:在 Android 上构建基于 P2P 技术的局域网通信

    在 Android 应用中实现局域网内设备通信,可以使用 P2P(Peer-to-Peer)技术来实现。P2P 技术使得设备之间可以直接相互通信,而不必通过服务器或者其他中介设备。在 Android 中,你可以使用 Wi-Fi Direct 技术来实现 P2P 通信。 下面是一个简单的示例,演示如何在 Android 应用程序中使

    2024年02月08日
    浏览(51)
  • P2P通信基本原理

    在数字世界的脉络中,点对点(P2P)技术如同一条悄无声息的河流,流经信息的每个角落,连接着世界各地的计算机和设备。这种去中心化的网络模型,不仅打破了传统的客户端-服务器架构的界限,还赋予了数据传输一种前所未有的自由和效率。通过P2P,每个参与者既是消费

    2024年04月16日
    浏览(48)
  • P2P 网络,PING程序。

    没有废话,直接上版本号和代码,以及讲解。 crate 版本号 libp2p 0.52.1 tokio 1.30.0 Peer-to-Peer是一种网络技术。一种点对点的通讯技术。没有client-service概念。 在P2P网络中,节点标识被成为PeerId。

    2024年02月12日
    浏览(46)
  • 区块链——p2p网络模型

            通常情况下,一个区块链系统的P2P网络层主要由以下几部分组成。         覆盖网络可以根据其对应覆盖图的性质分为两类: 无结构化覆盖网络 和 结构化覆盖网络 。无结构化覆盖网络通常基于随机图来建立节点随机从覆盖网络中选取节点作为邻居;而结构化覆盖

    2024年04月27日
    浏览(49)
  • 区块链核心技术-P2P网络

    点对点网络是区块链中核心的技术之一,主要关注的方面是为区块链提供一个稳定的网络结构,用于广播未被打包的交易(交易池中的交易)以及共识过的区块,部分共识算法也需要点对点的网络支撑(如PBFT),另外一个辅助功能,如以太坊的消息网络,也需要点对点网络的

    2023年04月17日
    浏览(58)
  • 区块链入门系列之P2P

    区块链基本概念和名词解释 P2P 共识算法 梅克尔-帕特里夏树 从零开始搭建区块链 为什么前面讲过P2P的概念了这里还要单独起一篇文章来讲解,因为前面只是讲解了P2P的基本概念,即各网络节点间是直接或间接连接起来的。但这里面还涉及到很多网络知识,如果不清楚,是没

    2023年04月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包