立即注册
查看: 466|回复: 0

[鸿蒙OS技术分享] HarmonyOS网络连接开发:WLAN P2P功能

已绑定手机
发表于 2021-12-17 14:20:37 | 显示全部楼层 |阅读模式 来自 广东省深圳市
1、场景介绍
WLAN P2P功能用于设备与设备之间的点对点数据传输,应用可以通过接口完成以下功能:
-发现对端设备。
-建立与移除群组。
-向对端设备发起连接。
-获取P2P相关信息。

2、接口说明
WifiP2pController提供WLAN P2P功能,接口说明如下。
表1 WifiP2pController的主要接口
接口名描述所需权限
init(EventRunner eventRunner, WifiP2pCallback callback)初始化P2P的信使,当且仅当信使被成功初始化,P2P的其他功能才可以正常使用。ohos.permission.GET_WIFI_INFO
ohos.permission.SET_WIFI_INFO
discoverDevices(WifiP2pCallback callback)搜索附近可用的P2P设备。ohos.permission.GET_WIFI_INFO
stopDeviceDiscovery(WifiP2pCallback callback)停止搜索附近的P2P设备。ohos.permission.GET_WIFI_INFO
createGroup(WifiP2pConfig wifiP2pConfig, WifiP2pCallback callback)建立P2P群组。ohos.permission.GET_WIFI_INFO
reMOVeGroup(WifiP2pCallback callback)移除P2P群组。ohos.permission.GET_WIFI_INFO
requestP2pInfo(int requestType, WifiP2pCallback callback)请求P2P相关信息,如群组信息、连接信息、设备信息等。ohos.permission.GET_WIFI_INFO
connect(WifiP2pConfig wifiP2pConfig, WifiP2pCallback callback)向指定设备发起连接。ohos.permission.GET_WIFI_INFO
cancelConnect​(WifiP2pCallback callback)取消向指定设备发起的连接。ohos.permission.GET_WIFI_INFO


3、启动与停止P2P搜索的开发步骤
-调用WifiP2pController的getInstance​(Context context)接口,获取P2P控制器实例,用于管理P2P操作。
-调用init(EventRunner eventRunner, WifiP2pCallback callback)初始化P2P控制器实例。
-发起P2P搜索。
-获取P2P搜索回调信息。
-停止P2P搜索。
try {
    // 获取P2P管理对象
    WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);
    // 初始化P2P管理对象,用于建立P2P信使等行为
    wifiP2pController.init(EventRunner.create(true), null);
    // 创建P2P回调对象
    P2pDiscoverCallBack p2pDiscoverCallBack = new P2pDiscoverCallBack();
    // 发起P2P搜索
    wifiP2pController.discoverDevices(p2pDiscoverCallBack);
    // 停止P2P搜索
    wifiP2pController.stopDeviceDiscovery(p2pDiscoverCallBack);
} catch (RemoteException re) {
    HiLog.error(LABEL, "exception happened.");
}

// 获取P2P启动与停止搜索的回调信息(失败或者成功)
private class P2pDiscoverCallBack extends WifiP2pCallback {
    @Override
    public void eventExecFail(int reason) {
        HiLog.warn(LABEL, "discoverDevices eventExecFail reason : %{public}d", reason);
    }

    @Override
    public void eventExecOk() {
        HiLog.info(LABEL, "discoverDevices eventExecOk");
    }
}

4、创建与移除群组的开发步骤
调用WifiP2pController的getInstance​(Context context)接口,获取P2P控制器实例,用于管理P2P操作。
调用init(EventRunner eventRunner, WifiP2pCallback callback)初始化P2P控制器实例。
创建P2P群组。
移除P2P群组。
try {
    // 获取P2P管理对象
    WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);
    // 初始化P2P管理对象,用于建立P2P信使等行为
    wifiP2pController.init(EventRunner.create(true), null);
    // 创建用于P2P建组需要的配置
    WifiP2pConfig wifiP2pConfig = new WifiP2pConfig("DEFAULT_GROUP_NAME", "DEFAULT_PASSPHRASE");
    wifiP2pConfig.setDeviceAddress("02:02:02:02:03:04");
    wifiP2pConfig.setGroupOwnerBand(0);
    // 创建P2P回调对象
    P2pCreateGroupCallBack p2pCreateGroupCallBack = new P2pCreateGroupCallBack();
    // 创建P2P群组
    wifiP2pController.createGroup(wifiP2pConfig, p2pCreateGroupCallBack);
    // 移除P2P群组
    wifiP2pController.removeGroup(p2pCreateGroupCallBack);
} catch (RemoteException re) {
    HiLog.error(LABEL, "exception happened.");
}

private class P2pCreateGroupCallBack extends WifiP2pCallback {
    @Override
    public void eventExecFail(int reason) {
        HiLog.warn(LABEL, "CreateGroup eventExecFail reason : %{public}d", reason);
    }

    @Override
    public void eventExecOk() {
        HiLog.info(LABEL, "CreateGroup eventExecOk");
    }
}

5、发起P2P连接的开发步骤
调用WifiP2pController的getInstance​(Context context)接口,获取P2P控制器实例,用于管理P2P操作。
调用init(EventRunner eventRunner, WifiP2pCallback callback)初始化P2P控制器实例。
调用requestP2pInfo()查询P2P可用设备信息。
根据场景不同,从可用设备信息中选择目标设备。
调用connect接口发起连接。
try {
    // 获取P2P管理对象
    WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);
    // 初始化P2P管理对象,用于建立P2P信使等行为
    wifiP2pController.init(EventRunner.create(true), null);
    // 查询可用P2P设备信息,通过回调获取P2P设备信息
    P2pRequestPeersCallBack p2pRequestPeersCallBack = new P2pRequestPeersCallBack();
    wifiP2pController.requestP2pInfo(WifiP2pController.DEVICE_LIST_REQUEST, p2pRequestPeersCallBack);
} catch (RemoteException re) {
    HiLog.error(LABEL, "exception happened.");
}

private class P2pRequestPeersCallBack extends WifiP2pCallback {
    @Override
    public void eventP2pDevicesList(List<WifiP2pDevice> devices) {
        HiLog.info(LABEL, "eventP2pDevicesList when start connect group");
        // 根据场景不同,选择不同的设备进行连接,通过MAC地址搜索到指定设备
        WifiP2pConfig wifiP2pConfig = getSameP2pConfigFromDevices(devices);
        try {
            if (wifiP2pConfig != null) {
                // 向指定的设备发起连接
                wifiP2pController.connect(wifiP2pConfig, null);
            }
        } catch (RemoteException re) {
            HiLog.error(LABEL, "exception happened in connect.");
        }
    }
}

private WifiP2pConfig getSameP2pConfigFromDevices(List<WifiP2pDevice> devices) {
    if (devices == null || devices.isEmpty()) {
        return null;
    }
    for (int i = 0; i < devices.size(); i++) {
        WifiP2pDevice p2pDevice = devices.get(i);
        HiLog.info(LABEL, "p2pDevice.getDeviceAddress() : %{private}s", p2pDevice.getDeviceAddress());
        if (p2pDevice.getDeviceAddress() != null
                && p2pDevice.getDeviceAddress().equals(TARGET_P2P_MAC_ADDRESS)) {
            HiLog.info(LABEL, "received same mac address");
            WifiP2pConfig wifiP2pConfig = new WifiP2pConfig("DEFAULT_GROUP_NAME", "DEFAULT_PASSPHRASE"); // 根据实际情况配置名字和密码
            wifiP2pConfig.setDeviceAddress(p2pDevice.getDeviceAddress());
            return wifiP2pConfig;
        }
    }
    return null;
}

6、请求P2P相关信息的开发步骤
调用WifiP2pController的getInstance​()接口,获取P2P控制器实例,用于管理P2P操作。
调用init()初始化P2P控制器实例。
调用requestP2pInfo()查询P2P群组信息。
调用requestP2pInfo()查询P2P设备信息。
根据场景不同,可以调用requestP2pInfo获取需要的信息。
try {
    // 获取P2P管理对象
    WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);
    // 初始化P2P管理对象,用于建立P2P信使等行为
    wifiP2pController.init(EventRunner.create(true), null);
    // 查询可用P2P群组信息,通过回调获取P2P群组信息
    P2pRequestGroupInfoCallBack p2pRequestGroupInfoCallBack = new P2pRequestGroupInfoCallBack();
    wifiP2pController.requestP2pInfo(WifiP2pController.GROUP_INFO_REQUEST, p2pRequestGroupInfoCallBack);
    // 查询可用P2P设备信息,通过回调获取P2P设备信息
    P2pRequestDeviceInfoCallBack p2pRequestDeviceInfoCallBack = new P2pRequestDeviceInfoCallBack();
    wifiP2pController.requestP2pInfo(WifiP2pController.DEVICE_INFO_REQUEST, p2pRequestDeviceInfoCallBack);
    // 通过调用requestP2pInfo接口,可以查询以下关键信息
    wifiP2pController.requestP2pInfo(WifiP2pController.NETWORK_INFO_REQUEST, callback); // 网络信息
    wifiP2pController.requestP2pInfo(WifiP2pController.DEVICE_LIST_REQUEST, callback); // 设备列表信息
} catch (RemoteException re) {
    HiLog.error(LABEL, "exception happened.");
}

// 群组信息回调
private class P2pRequestGroupInfoCallBack extends WifiP2pCallback {
    @Override
    public void eventP2pGroup(WifiP2pGroup group) {
        HiLog.info(LABEL, "P2pRequestGroupInfoCallBack eventP2pGroup");
        doSthFor(group);
    }
}
// 设备信息回调
private class P2pRequestDeviceInfoCallBack extends WifiP2pCallback {
    @Override
    public void eventP2pDevice(WifiP2pDevice p2pDevice) {
        HiLog.info(LABEL, "P2pRequestDeviceInfoCallBack eventP2pDevice");
        doSthFor(p2pDevice);
    }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表