欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

wifi p2p学习

程序员文章站 2022-07-01 10:50:10
...

wifi p2p学习

  • 概述
  • 查找设备
  • 连接设备
  • 发送文件
  • 接收文件

概述

wifi p2p是安卓设备之间通过局域网连接的一种方式,可以用来在设备间传输文件和通信。WifiP2pManager提供了安卓客户端之间通过wifi连接的api,它可以让应用连接可以发现到的设备,查询设备列表并连接设备。这个类是异步的,可以通过监听的回调接口对不同状态做出响应。应首先需要进行初始化,然后才能进行p2p逻辑的处理。
本demo中,主要使用到的是WifiP2pManager,通过getSystemService(Context.WIFI_P2P_SERVICE)获取到WifiP2pManager对象mWifiP2pManager,然后使用mWifiP2pManager.initialize(Context srcContext, Looper srcLooper, ChannelListener listener)创建mWifiP2pManager.Channel对象mChannel。
1. 初始化

WifiP2pManager mWifiP2pManager = (WifiP2pManager) getApplicationContext().getSystemService(Context.WIFI_P2P_SERVICE);
WifiP2pManager.Channel mChannel = mWifiP2pManager.initialize(this, getMainLooper(), null);

2.创建广播接收器
在广播接收中对意图进行判断,主要有以下几种状态:
WIFI_P2P_STATE_CHANGED_ACTION
wifi-p2p是否开启
WIFI_P2P_CONNECTION_CHANGED_ACTION
对等节点连接状态发生变化
WIFI_P2P_DISCOVERY_CHANGED_ACTION
发现对等节点发生变化
WIFI_P2P_PEERS_CHANGED_ACTION
对等节点列表发生变化
WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
设备信息发生变化

 @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive: " + intent.toString());
        String action = intent.getAction();
        if (action == null || action.isEmpty()) return;
        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            Log.d(TAG, "WIFI_P2P_STATE_CHANGED_ACTION");
            int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
            if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {

            } else {

            }

        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            Log.d(TAG, "WIFI_P2P_CONNECTION_CHANGED_ACTION");
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null && networkInfo.isConnected()) {
                activity.handleNetworkInfo(networkInfo);
            }
        } else if (WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION.equals(action)) {
            Log.d(TAG, "WIFI_P2P_DISCOVERY_CHANGED_ACTION");
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            activity.requestPeer();Log.d(TAG, "WIFI_P2P_PEERS_CHANGED_ACTION");
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            Log.d(TAG, "WIFI_P2P_THIS_DEVICE_CHANGED_ACTION");
        }
    }

查找设备

private void searchPeer() {
        mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Log.d(TAG, "searchPeer onSuccess");
            }

            @Override
            public void onFailure(int reason) {
                Log.e(TAG, "searchPeer onFailure: " + reason);
            }
        });

        mPeerListListener = new WifiP2pManager.PeerListListener() {
            @Override
            public void onPeersAvailable(WifiP2pDeviceList peers) {
                mPeerList.clear();
                mPeerList.addAll(peers.getDeviceList());
                mPeerAdapter.notifyDataSetChanged();
            }
        };
    }

连接设备

 WifiP2pConfig config = new WifiP2pConfig();
        config.deviceAddress = device.deviceAddress;
        config.wps.setup = WpsInfo.PBC;
        mWifiP2pManager.connect(mChannel, config, actionListener);

发送文件

指定主机和端口号,在socket层建立连接后使用输出流发送文件。

接收文件

   ServerSocket serverSocket = new ServerSocket(port);
   Socket socket = serverSocket.accept();
   InputStream inputStream = socket.getInputStream();

demo地址:
https://github.com/qiiyue/AndroidDemo.git