1# P2P模式开发指导 2 3## 简介 4P2P模式,主要提供了wlan设备的一种点对点连接技术,它可以在两台 STA 之间直接建立 TCP/IP 链接,并不需要AP的参与。 5 6## 场景介绍 7主要场景有: 8 9- 创建/删除P2P群组 10- 建立P2P连接 11 12## 接口说明 13 14完整的 JS API 说明以及实例代码请参考:[P2P 接口](../../reference/apis-connectivity-kit/js-apis-wifiManager.md)。 15 16具体接口说明如下表。 17 18| 接口名 | 功能描述 | 19| -------- | -------- | 20| createGroup() | 创建群组。 | 21| removeGroup() | 删除群组。 | 22| startDiscoverDevices() | 开始发现设备。 | 23| getP2pPeerDevices() | 获取P2P对端设备列表信息。 | 24| p2pConnect() | 执行P2P连接。 | 25| getP2pLinkedInfo() | 获取P2P连接信息。 | 26| on(type: 'p2pPersistentGroupChange') | 注册P2P永久组状态改变事件。 | 27| off(type: 'p2pPersistentGroupChange') | 取消注册P2P永久组状态改变事件。 | 28| on(type: 'p2pPeerDeviceChange') | 注册P2P对端设备状态改变事件。 | 29| off(type: 'p2pPeerDeviceChange') | 取消注册P2P对端设备状态改变事件。 | 30| on(type: 'p2pConnectionChange') | 注册P2P连接状态改变事件。 | 31| off(type: 'p2pConnectionChange') | 取消注册P2P连接状态改变事件。 | 32 33## 主要场景开发步骤 34 35### 创建/删除P2P群组 361. import需要的WI-FI模块。 372. 开启设备的WI-FI。 383. 需要SystemCapability.Communication.WiFi.P2P系统能力。 394. 创建/删除P2P群组。 405. 示例代码: 41 42```ts 43import { wifiManager } from '@kit.ConnectivityKit'; 44 45// 创建群组,将当前设备当做GO使用时,需要该步骤 46// netId:-1表示创建临时组,下次和已连接过的设备连接,需要重新进行GO协商,以及wps秘钥协商; 47// -2表示创建永久组,下次和已连接过的设备连接,不需要重新进行GO和wps秘钥协商; 48 49let recvP2pPersistentGroupChangeFunc = () => { 50 console.info("p2p persistent group change receive event"); 51 52 // 永久组创建好后需要处理的业务 53} 54// 创建永久组,需要注册永久组状态改变事件回调 55wifiManager.on("p2pPersistentGroupChange", recvP2pPersistentGroupChangeFunc); 56try { 57 let config:wifiManager.WifiP2PConfig = { 58 deviceAddress: "00:11:22:33:44:55", 59 deviceAddressType: 1, 60 netId: -2, 61 passphrase: "12345678", 62 groupName: "testGroup", 63 goBand: 0 64 } 65 wifiManager.createGroup(config); 66}catch(error){ 67 console.error("failed:" + JSON.stringify(error)); 68} 69 70// 删除群组 71try { 72 wifiManager.removeGroup(); 73}catch(error){ 74 console.error("failed:" + JSON.stringify(error)); 75} 76``` 77 786. 错误码请参见[WIFI错误码](../../reference/apis-connectivity-kit/errorcode-wifi.md)。 79 80### 建立P2P连接 811. import需要的WI-FI模块。 822. 开启设备的WI-FI。 833. 需要SystemCapability.Communication.WiFi.P2P系统能力。 844. 注册"p2pPeerDeviceChange"事件回调,并在回调实现中执行P2P连接。 855. 开始P2P设备发现。 866. 示例代码: 87 88```ts 89import { wifiManager } from '@kit.ConnectivityKit'; 90 91let recvP2pConnectionChangeFunc = (result:wifiManager.WifiP2pLinkedInfo) => { 92 console.info("p2p connection change receive event: " + JSON.stringify(result)); 93 wifiManager.getP2pLinkedInfo((err, data) => { 94 if (err) { 95 console.error('failed to get getP2pLinkedInfo: ' + JSON.stringify(err)); 96 return; 97 } 98 console.info("get getP2pLinkedInfo: " + JSON.stringify(data)); 99 // 添加P2P连接成功或者失败场景的业务处理 100 }); 101} 102// P2P连接完成,会调用"p2pConnectionChange"事件回调 103wifiManager.on("p2pConnectionChange", recvP2pConnectionChangeFunc); 104 105let recvP2pPeerDeviceChangeFunc = (result:wifiManager.WifiP2pDevice[]) => { 106 console.info("p2p peer device change receive event: " + JSON.stringify(result)); 107 wifiManager.getP2pPeerDevices((err, data) => { 108 if (err) { 109 console.error('failed to get peer devices: ' + JSON.stringify(err)); 110 return; 111 } 112 console.info("get peer devices: " + JSON.stringify(data)); 113 let len = data.length; 114 for (let i = 0; i < len; ++i) { 115 // 选择符合条件的对端P2P设备 116 if (data[i].deviceName === "my_test_device") { 117 console.info("p2p connect to test device: " + data[i].deviceAddress); 118 let config:wifiManager.WifiP2PConfig = { 119 deviceAddress:data[i].deviceAddress, 120 deviceAddressType: 1, 121 netId:-2, 122 passphrase:"", 123 groupName:"", 124 goBand:0, 125 } 126 // 执行P2P连接,作为GO时不能主动发起连接 127 wifiManager.p2pConnect(config); 128 } 129 } 130 }); 131} 132// P2P扫描结果上报时会调用"p2pPeerDeviceChange"事件回调 133wifiManager.on("p2pPeerDeviceChange", recvP2pPeerDeviceChangeFunc); 134 135setTimeout(() => {wifiManager.off("p2pConnectionChange", recvP2pConnectionChangeFunc);}, 125 * 1000); 136setTimeout(() => {wifiManager.off("p2pPeerDeviceChange", recvP2pPeerDeviceChangeFunc);}, 125 * 1000); 137// 开始发现P2P设备,即,开始P2P扫描 138console.info("start discover devices -> " + wifiManager.startDiscoverDevices()); 139``` 140 1417. 错误码请参见[WIFI错误码](../../reference/apis-connectivity-kit/errorcode-wifi.md)。 142