P2P 能力

更新时间:2024-03-04 08:53:16

在传统的方案中,App 和设备的数据传输都是经过服务器进行转发,当传输数据较大时需要占用服务器大量的空间和流量,运营成本较高。涂鸦 P2P 连接方案可以有效地解决这个问题,降低运营成本。

集成组件

  • 开发项目目录下的 build.gradle 配置如下:

    allprojects {
        repositories {
            ...
            maven {
                url "https://maven-other.tuya.com/repository/maven-releases/"
            }
        ...
        }
    }
    
  • app 目录下的 build.gradle 配置:

    dependencies {
        ...
        implementation 'com.thingclips.smart:thingsmart-p2p-channel-sdk:3.4.62'
        ...
    }
    

    IPC SDK 已包含 P2P 能力,您无需再额外集成。

获取 P2P

获取 P2P 对象,该对象是单例。

接口说明

IThingP2P p2pSDK = ThingIPCSdk.getP2P();

初始化 SDK

初始化 P2P 内部资源,需要和用户 UID 绑定,

接口说明

int init(String localId);

参数说明

参数 说明
localId 用户 UID,登录账号可以从 用户数据模型 User 中查询

示例代码

IThingP2P p2p = ThingIPCSdk.getP2P();
if (p2p != null) {
    p2p.init("xxx");
}

反初始化 SDK

销毁 P2P 内部资源。销毁后,再使用 P2P 能力则需要重新初始化资源。

接口说明

int deInit();

示例代码

IThingP2P p2p = ThingIPCSdk.getP2P();
if (p2p != null) {
    p2p.deInit();
}

建立 P2P 连接

接口说明

与指定设备建立 P2P 连接,方法调用返回 traceId 为连接的唯一标识符,可用于取消正在尝试的连接。通过 callback 返回成功建立连接的句柄。

支持 3.4.8 及以上版本 SDK。

 String connect(String remoteId, int lanMode, int timeout, IThingP2PCallback callback);

参数说明

参数 说明
remoteId 设备 ID
lanMode 优先连接方式
timeout 连接超时时间
callback 连接结果:
  • >= 0:连接成功,返回 P2P 本次连接的会话句柄
  • < 0:连接失败,返回具体失败错误码
lanMode 说明
0 自动选择
1 外网连接优先
2 局域网连接优先

返回值

返回值 说明
traceId 连接的唯一标识符,用于取消正在尝试的连接

取消正在尝试的连接

已经建立成功的连接不受影响。

接口说明

int connectBreak(String traceId);

参数说明

参数 说明
traceId 连接的唯一标识符

关闭连接

接口说明

int disConnect(int handle);

参数说明

参数 说明
handle 连接句柄

接收数据

接口说明

int recvData(int handle, int channel, byte[] data, int dataLen, int timeout);

参数说明

参数 说明
handle 连接句柄
channel 通道号
data 接收数据的缓冲区
dataLen 接收数据的长度
timeout 超时时间,单位毫秒

返回值说明

返回值 说明
< 0 接收数据出错,-3 表示超时,其他错误表示连接已断开
>= 0 实际接收到的数据长度

向对方发送数据

接口说明

int sendData(int handle, int channel, byte[] data, int dataLen, int timeout);

参数说明

参数 说明
handle 连接句柄
channel 通道号
data 需要发送的内容
dataLen 需要发送的数据长度
timeout 超时时间,单位毫秒

返回值

返回值 说明
< 0 发送数据出错,-3 表示超时,其他错误表示连接已断开
>= 0 发送成功的数据长度

检查连接是否正常

接口说明

int activeCheck(int handle);

参数说明

参数 说明
handle 连接句柄

返回值

返回值 说明
< 0 连接已断开
>= 0 连接正常

查询 P2P SDK 版本号

接口说明

String getVersion();

通道号

目前在涂鸦智能设备的数据协议中,每一个 P2P 会话中初始化 8 个数据通道,已经定义和使用的通道有 6 个。

通道号 说明
0 控制命令收发通道
1 视频数据传输通道
2 音频数据传输通道
3 存储卡回放视频传输通道
4 数据透传通道
5 文件下载传输通道

非涂鸦登录体系

如果您使用非涂鸦登录体系来接入的话,P2P SDK 将监听不到用户的登录状态。此时,您需自行在账号登录成功和退出登录时,对 P2P SDK 进行初始化 initP2P(String localId) 和反初始化 deInitP2P()

初始化 P2P 模块

P2P SDK 模块初始化。需要和用户 UID 绑定,建议在登录后调用。

接口说明

int initP2P(String localId);

参数说明

参数 说明
localId 用户 UID,登录账号可以从 用户数据模型 User 中查询

示例代码

IThingP2P p2p = ThingIPCSdk.getP2P();
if (p2p != null) {
    p2p.initP2P("xxx");
}

反初始化 P2P 模块

P2P 模块反初始化,建议退出登录的时候调用,否则可能导致 P2P 消息错乱。

接口说明

int deInitP2P();

错误码

状态码 说明 可能原因
0 无错误 -
-1 未初始化 SDK -
-3 连接超时,建议重新连接一次 -
-5 无效的参数 -
-11 无效的会话 -
-12 连接被设备关闭 -
-13 会话已关闭 -
-14 会话被本地关闭 -
-16 监听被中断 -
-19 连接被中断 调用了 break() 方法
-23 会话数达到上限 -
-24 无效的预连接 -
-25 预连接已断开 -
-26 预连接已激活 -
-29 内存不足 -
-30 接口调用失败 -
-31 不支持预连接 -
-100 P2P 对端已关闭 -
-102 设备处于隐私模式,关闭会话 -
-103 发送数据线程创建失败,关闭会话 -
-104 会话已满,因此关闭会话 -
-105 鉴权失败,关闭会话,建议重新连接一次 -
-106 会话正常关闭,recv() 到 -13 -
-108 因故障或死锁而无法正常结束或回滚的会话(僵尸会话),强制关闭 超过 20 分钟无数据交互
-109 开放 API,您主动关闭会话 -
-110 开放 API,您退出 P2P 模块 -
-111 开放 API,设备进入隐私模式 -
-113 设备正在通话 -
-114 应用层资源申请失败 -
-1000 接口请求参数无效 -
-1001 接口调用失败 -
-1002 接口返回无效数据 -
-1010 方法参数无效 -
-1011 方法调用失败 -
-1020 设备信息异常,为空 请检查是否已经获取家庭设备列表
-1021 不支持的 P2pType 设备问题或配置问题