中文简体    English

IvyIoT P2P SDK编程指南

1. 概述

  P2P SDK是由IvyIoT为第三方厂商的智能硬件设备和手机APP提供的软件开发包,用户通过在设备固件和手机APP中嵌入P2P SDK,可以方便的将硬件设备和手机APP接入IvyIoT云服务,支持APP和硬件设备之间快速建立P2P连接,最终实现APP和硬件设备之间的实时音视频数据传输。

P2P SDK以库文件的形式对外提供,整个SDK文件夹结构如下:
doc文件夹:存放和P2P SDK相关的文档,如接口说明文档、demo程序使用文档。
include文件夹:存放P2P SDK对外提供的头文件。
lib文件夹:存放P2P SDK对外提供的库文件。(基于不同硬件平台和系统环境)
sample文件夹:存放demo程序。(基于不同硬件平台和系统环境)

2. P2P SDK整体应用架构

  为了将P2P SDK嵌入到APP和设备固件,首先需要了解P2P SDK的整体应用架构。如下图所示,P2P SDK在运行的时候,内部存在两种工作模式:被动模式主动模式。对于硬件设备的固件端,应该以被动模式运行P2P SDK;对于APP端,应该以主动模式运行P2P SDK。

  两端正常工作时,通过APP触发,两端P2P SDK之间会建立一条P2P传输通道。此时APP端的P2P SDK将工作在本地server模式,设备端P2P SDK将工作在本地client模式 如下图所示。

  为了实现APP和硬件设备之间的数据传输,设备固件必须以server方式工作。P2P连接建立成功后,设备端P2P_SDK以client方式通过socket连接到固件server。同理,APP必须以client方式工作,P2P连接建立成功后,APP以client方式通过socket连接本端P2P SDK内部的本地server。最终,P2P SDK是以一种传输代理的方式实现了APP和硬件设备之间的P2P数据传输。

3. P2P SDK接口调用的整体流程


  如上图所示,P2P SDK的很多调用接口都涉及到网络通信,为了保证执行效率,简化应用层软件设计的复杂度,这些接口函数都被设计为非阻塞模式,函数的执行结果总是以回调函数的形式异步通知到上层应用程序,这些回调函数的类型在P2P SDK的头文件中定义,具体的实现需要由用户应用程序完成并通过相关接口注册到P2P SDK内部。
  下面将以P2P SDK的C函数接口为例说明SDK接口的调用逻辑。对于Andriod平台,以JNI形式封装SDK接口,具体的接口说明可参考IvyP2PDemo程序中的P2PClient.class文件,以及本文的最后部分。

4. P2P SDK关键数据类型

数据类型 说明
p2p_transport P2P服务器连接对象。APP或设备端与P2P服务器之间建立的每一条连接都有一个p2p_transport连接对象与之对应。
p2p_transport_cfg typedef struct _p2p_transport_cfg
{
 char* server;// P2P服务器地址
 unsigned short port;// P2P服务器端口
 unsigned char terminal_type; // 0:设备端,1:APP端
 char* user;// 设备的UID,APP端忽略此参数
 char* password;// 设备的Key,APP端忽略此参数
 void* user_data; // 用户注册的私有数据,将通过p2p_transport_cb回调函数原样返回
 const p2p_transport_cb* cb; // P2P连接状态回调函数集
}p2p_transport_cfg;
p2p_transport_cb typedef struct _p2p_transport_cb
{
 //P2P服务器连接结果回调函数。
 //APP或设备端向P2P服务器发起连接请求,P2PSDK调用此回调函数将连接结果通知到应用程序。
 void (*on_create_complete)(p2p_transport* transport,int status,void* user_data);

 //P2P服务器连接中断回调函数
//APP或设备端连接P2P服务器成功后,会一直保持长连接,如果后续因为网络中断或者服务器崩溃,P2PSDK将调用此回调函数将中断事件通知到应用程序。
 void (*on_disconnect_server)(p2p_transport* transport, int status, void* user_data);

 //P2P连接结果回调函数。
 //APP向设备端发起P2P连接请求后,P2PSDK将调用此回调函数将P2P连接结果通知到应用程序。
 void (*on_connect_complete)(p2p_transport* transport, int connection_id, int status, void* transport_user_data, void* connect_user_data);

 //APP端检测到P2P连接中断回调函数。(此回调函数仅APP端需要实现)
 //APP与设备端P2P连接成功后,两端保持P2P连接,后续因为网络或对端原因导致P2P连接中断时,P2PSDK将调用此回调函数。
 void (*on_connection_disconnect)(p2p_transport* transport, int connection_id,void* transport_user_data, void* connect_user_data);

 //设备端收到远端P2P连接请求的回调函数(此回调函数仅设备端需要实现)
 //设备端收到APP端的P2P连接请求时,P2PSDK将调用此回调函数。
 void (*on_accept_remote_connection)(p2p_transport* transport, int connection_id, void* transport_user_data);

 void (*on_connection_recv)(…); // 此接口已废弃;

 //设备端P2PSDK连接设备端固件代理server的结果回调函数
 //设备端固件必须以server方式工作,设备端P2PSDK以异步非阻塞方式连接固件server,P2PSDK通过此回调函数将连接结果通知到应用程序。
 void (*on_tcp_proxy_connected)(p2p_transport* transport, unsigned short port, char* addr);
}p2p_transport_cb;

5. 设备端函数接口详细说明

5.1 SDK初始化

接口定义 int p2p_init(LOG_FUNC log_func)
接口说明 设备端或APP端调用此接口加载P2P SDK模块,完成SDK初始化
参数说明 LOG_FUNC log_func:由用户实现并注册一个记录日志的回调函数。
此回调函数的类型定义为:typedef void (*LOG_FUNC)(const char *data, int len)
如果用户不实现此回调函数,则此参数可以为NULL,SDK内部将通过printf输出日志信息
返回值 0:执行成功; 其它:执行失败
备注 设备端和APP端都需要调用此函数

5.2 查询空闲的P2P服务器

接口定义 int p2p_request_dispatch_server(char* user, char* password, char* ds_addr, void* user_data,DISPATCH_CALLBACK cb, void** dispatcher)
接口说明 设备端向IvyIoT云请求一个空闲的P2P服务器,请求结果以回调函数的方式通知应用程序。
参数说明 char* user:设备的UID,不同设备的UID不能重复(由IvyIoT产品经理提供)
char* password:设备的Key(由IvyIoT产品经理提供)。
char* ds_addr:IvyIoT 云服务器地址或域名(由IvyIoT产品经理提供)。
void* user_data:用户私有数据,最终通过回调函数原样返回。默认为NULL
DISPATCH_CALLBACK cb:注册回调函数,处理服务器返回的信息。
void** dispatcher:函数执行成功后,返回本次查询的dispatcher对象。(查询完成后,此对象必须由应用程序释放)
应用程序注册的回调函数DISPATCH_CALLBACK在处理服务器返回的消息时,可以通过比较,判断当前回调的消息是针对哪个dispatcher对象的。
同时,在回调函数处理完成后,应用程序应该释放此dispatcher对象。
返回值 0:执行成功; 其它:执行失败
备注 仅设备端调用

5.3 >P2P服务器查询结果回调函数

接口定义 typedef void (*DISPATCH_CALLBACK)(void* dispatcher, int status, void* user_data, char* server, unsigned short port,unsigned int server_id)
接口说明 本回调函数由用户实现,用户在调用p2p_request_dispatch_server()或p2p_query_dispatch_server()时向P2PSDK注册此回调函数。
当P2PSDK内部得到查询结果后,通过此回调函数通知应用程序。
参数说明 void*dispatcher:用户在调用p2p_request_dispatch_server()或p2p_query_dispatch_server()接口时返回的dispatcher对象,
用户应该在此回调函数中释放以完成查询的dispatcher对象。
int status:本次查询的结果,0:表示成功,其它:表示查询失败。
void* user_data:用户调用查询接口时输入的私有数据对象,默认为NULL。
char* server:云端返回的P2P服务器域名或地址。
unsigned short port:云端返回的P2P服务器端口
unsigned int server_id:云端返回的P2P服务器ID。
返回值
备注 设备端和APP端都需要实现此回调函数

5.4 释放dispatcher对象

接口定义 void destroy_p2p_dispatch_requester(void* dispatcher)
接口说明 用户调用p2p_request_dispatch_server()或p2p_query_dispatch_server()接口时,内部会生成并输出一个dispatcher对象。
查询结束后(收到DISPATCH_CALLBACK回调函数或应用程序等待超时),应用程序需要通过本接口释放dispatcher对象。
参数说明 void* dispatcher:用户在调用p2p_request_dispatch_server()或 p2p_query_dispatch_server()时返回的dispatcher对象。
返回值
备注 设备端和APP端都需要调用此函数

5.5 连接P2P服务器

接口定义 int p2p_transport_create(p2p_transport_cfg* cfg, p2p_transport** transport)
接口说明 P2PSDK连接P2P服务器
参数说明 输入参数:
p2p_transport_cfg* cfg:连接配置信息,包括P2PSDK连接P2P服务器所需要的必要信息,例如P2P服务器地址信息等。

输出参数:
p2p_transport** transport:接口调用成功,则生成p2p_transport连接对象。(由用户保存并释放)
返回值 0:执行成功; 其它:执行失败
备注 设备端和APP端都需要调用此函数

5.6 P2P服务器连接结果回调函数

接口定义 typedef void (*on_create_complete)(p2p_transport* transport, int status, void* user_data)
接口说明 本回调函数由用户实现,用户在调用p2p_transport_create()时注册此回调函数。
当P2P SDK内部得到连接P2P服务器的结果时,P2P SDK调用此回调函数将连接结果通知到应用程序。
参数说明 void* transport:P2P服务器连接对象。用户在调用p2p_transport_create()时生成的p2p_transport对象。
int status:连接P2P服务器的结果,0:表示连接成功,其它:表示连接失败。
void* user_data:应用程序在调用p2p_transport_create接口时,通过p2p_transport_cfg参数指定的私有数据对象,默认为NULL
返回值
备注 设备端和APP端都需要调用此函数

5.7 P2P服务器连接中断回调函数

接口定义 typedef void (*on_disconnect_server)(p2p_transport* transport, int status, void* user_data)
接口说明 设备端或APP端调用此接口加载P2P SDK模块,完成SDK初始化
参数说明 void* transport:P2P服务器连接对象。用户在调用p2p_transport_create()时生成的p2p_transport对象。
int status:连接P2P服务器的结果,0:表示连接成功,其它:表示连接失败。
void* user_data:应用程序在调用p2p_transport_create接口时,通过p2p_transport_cfg参数指定的私有数据对象,默认为NULL
返回值
备注 设备端和APP端都需要实现此回调函数

5.8 主动断开与P2P服务器的连接

接口定义 void p2p_transport_destroy(p2p_transport *transport)
接口说明 设备端或APP主动与P2P服务器断开连接,并销毁p2p_transport对象。
当设备端或APP需要和P2P服务器重新建立连接时,需要调用此接口释放之前的连接对象
参数说明 p2p_transport *transport:P2P服务器连接对象,用户在调用p2p_transport_create()时生成的p2p_transport对象。
返回值
备注 设备端和APP端都需要调用此函数

5.9 收到远端P2P连接请求的回调函数

接口定义 typedef void(*on_accept_remote_connection)(p2p_transport *transport, int connection_id, void *transport_user_data)
接口说明 本回调函数由用户实现,用户在调用p2p_transport_create()时注册此回调函数。
当设备端接收到一个来自远端的P2P连接请求后,P2P SDK内部通过此回调函数通知应用程序。
参数说明 p2p_transport* transport:P2P服务器连接对象。用户在调用p2p_transport_create()时生成的p2p_transport对象。
int connection_id:调用p2p_transport_connect()时生成的P2P连接ID。
void* transport_user_data:调用p2p_transport_create()时,通过p2p_transport_cfg参数指定的用户私有数据对象,默认为NULL。
返回值
备注 仅设备端端需要实现此回调函数

5.10 SDK反初始化

接口定义 void p2p_uninit()
接口说明 设备端或APP端调用此接口卸载P2P SDK模块
参数说明
返回值
备注 设备端和APP端都需要调用此函数

6. APP端函数接口详细说明

6.1 SDK初始化与设备端一致

6.2 查询目标设备所属的P2P服务器

接口定义 int p2p_query_dispatch_server(char* dest_user, char* ds_addr, void* user_data, DISPATCH_CALLBACK cb, void** dispatcher)
接口说明 APP向IvyIoT云查询指定的目标设备当前归属于哪一个P2P服务器,查询结果以回调函数的方式通知应用程序。
参数说明 char* user:目标设备的UID,不同设备的UID不能重复
char* ds_addr:IvyIoT 云服务器地址或域名(由IvyIoT产品经理提供)。
void* user_data:用户私有数据,最终通过回调函数原样返回。默认为NULL。
DISPATCH_CALLBACK cb:注册回调函数,处理服务器返回的信息。
void** dispatcher:函数执行成功后,返回本次查询的dispatcher对象。(查询完成后,此对象必须由应用程序释放)
应用程序注册的回调函数DISPATCH_CALLBACK在处理服务器返回的消息时,可以通过比较,判断当前回调的消息是针对哪个dispatcher对象的。
同时,在回调函数处理完成后,必须由应用程序释放此dispatcher对象。
返回值 0:执行成功; 其它:执行失败
备注 仅APP端需要调用此函数

6.3 P2P服务器查询结果回调函数与设备端一致

6.4 释放dispatcher对象与设备端一致

6.5 连接P2P服务器与设备端一致

6.6 P2P服务器连接结果回调函数与设备端一致

6.7 P2P服务器连接中断回调函数与设备端一致

6.8 主动断开与P2P服务器的连接与设备端一致

6.9 向设备端发起P2P连接请求

接口定义 int p2p_transport_connect(p2p_transport transport, char remote_user, void* user_data, int* connection_id)
接口说明 APP端向指定的设备端发起P2P连接请求。
参数说明 输入参数:
p2p_transport* transport:P2P服务器连接对象。调用p2p_transport_create()时生成的p2p_transport对象。
char* remote_user:目标设备的UID
void* user_data:用户的私有数据对象,回调函数被调用时此参数将原样返回。

输出参数:
int* connection_id:如果调用成功,返回一个本地唯一的P2P连接ID。
返回值 0:执行成功; 其它:执行失败
备注 仅APP端需要调用此函数

6.10 P2P连接结果回调函数

接口定义 P2P连接结果回调函数
接口说明 本回调函数由用户实现,用户在调用p2p_transport_create()时注册此回调函数。
用户调用p2p_transport_connect()时,向目标设备发起P2P连接请求后,当P2P SDK内部得到P2P连接结果时,会调用此回调函数。
参数说明 p2p_transport* transport:P2P服务器连接对象。调用p2p_transport_create()时生成的p2p_transport对象。
int connection_id:调用p2p_transport_connect()时生成的P2P连接ID。
int status:连接P2P服务器的结果,0:表示连接成功,其它:表示连接失败。void* transport_user_data:调用p2p_transport_create()时,通过p2p_transport_cfg参数指定的用户私有数据对象,默认为NULL。
void* connect_user_data:调用p2p_transport_connect()时指定的用户私有数据对象,默认为NULL。
返回值
备注 仅APP端需要实现此回调函数

6.11 P2P连接中断回调函数

接口定义 typedef void (*on_connection_disconnect)(p2p_transport *transport, int connection_id, void *transport_user_data, void *connect_user_data)
接口说明 本回调函数由用户实现,用户在调用p2p_transport_create()时注册此回调函数。
当设备端接收到一个来自远端的P2P连接请求后,P2P SDK内部通过此回调函数通知应用程序。
参数说明 p2p_transport* transport:P2P服务器连接对象。调用p2p_transport_create()时生成的p2p_transport对象。
int connection_id:调用p2p_transport_connect()时生成的P2P连接ID。
void* transport_user_data:调用p2p_transport_create()时,通过p2p_transport_cfg参数指定的用户私有数据对象,默认为NULL。
void* connect_user_data:调用p2p_transport_connect()时指定的用户私有数据对象,默认为NULL。
返回值
备注 设备端和APP端都需要实现此回调函数

6.12 主动断开指定的P2P连接

接口定义 void p2p_transport_disconnect(p2p_transport *transport, int connection_id)
接口说明 APP端或设备端调用此接口,主动断开指定的P2P连接
参数说明 p2p_transport *transport:P2P服务器连接对象。调用p2p_transport_create()时生成的p2p_transport对象。
int connection_id:调用p2p_transport_connect()时生成的P2P连接ID
返回值 0:执行成功; 其它:执行失败
备注 一般只有APP端需要调用此函数

6.13 创建本地代理服务

接口定义 int p2p_create_tcp_proxy(p2p_transport transport, int connection_id, unsigned short remote_listen_port, unsigned short local_proxy_port)
接口说明 用户调用p2p_transport_connect()连接远端设备,且通过回调函数得到P2P连接成功后,
APP接下来需要调用此接口在P2PSDK内部创建一个代理服务,然后APP再以client方式连接到SDK内部的代理服务。最终APP通过此代理向设备端收发数据。
参数说明 输入参数:
p2p_transport* transport:P2P服务器连接对象。调用p2p_transport_create()时生成的p2p_transport对象。
int connection_id:调用p2p_transport_connect()时生成的P2P连接ID。
unsigned short remote_listen_port:指定SDK内部代理服务的监听端口。
输出参数:
unsigned short* local_proxy_port:内部代理服务实际生效的监听端口。
返回值 0:执行成功; 其它:执行失败
备注 仅APP端需要调用此函数

6.14 销毁本地代理服务

接口定义 int p2p_destory_tcp_proxy(p2p_transport transport, int connection_id, unsigned short local_proxy_port)
接口说明 APP调用此接口销毁P2P SDK内部的代理服务。
参数说明 p2p_transport* transport:P2P服务器连接对象。调用p2p_transport_create()时生成的p2p_transport对象。
int connection_id:调用p2p_transport_connect()时生成的P2P连接ID。
unsigned short* local_proxy_port:内部代理服务当前使用的监听端口。
返回值 0:执行成功; 其它:执行失败
备注 仅APP端需要调用此函数

6.15 SDK反初始化与设备端一致

7 Andriod平台接口详细说明

针对Andriod平台,P2P SDK采用JNI方式封装成java接口类,具体接口如下:

public class P2PClient {
    public P2PClient() {
    }

    public static native int init(); // SDK初始化
    public static native void uninit(); // SDK反初始化

    // 函数功能:连接P2P服务器
    // 返回值:P2PResult.result=0表示函数执行成功,否则表示失败
    //        P2PResult.value返回一个int类型的p2p_transport对象
    private static native P2PResult p2p_transport_create(
                        String server, // P2P服务器地址或域名
                        int port, // P2P服务器端口号
                        String user, // 设备UID,APP侧忽略
                        String password, // 设备KEY,APP侧忽略
                        int terminal_type, // APP侧固定为1
                        // 设备侧固定为0
                        int user_data, // 用户数据,缺省为0
                        int use_tcp_connect_srv, //忽略,缺省为0
                        String proxy_addr, // APP侧忽略,缺省为0
                                            // 设备侧需要指定固件SERVER的地址,例如“127.0.0.1:端口号”
                        Object cb); // 实现了回调函数的类对象

    // 连接P2P服务器,与上面的函数一致,二选一
    public static P2PResult p2p_transport_create(p2p_transport_cfg cfg) {
            return p2p_transport_create(cfg.server, cfg.port, cfg.user,
                            cfg.password, cfg.terminal_type, cfg.user_data,
                            cfg.use_tcp_connect_srv, cfg.proxy_addr, cfg.cb);
    }

    // 主动断开与P2P服务器的连接,释放p2p_transport对象
    public static native void p2p_transport_destroy(int transport);

    // 函数功能:APP调用此接口向设备端发送P2P连接请求
    // 返回值:P2PResult.result=0表示函数执行成功,否则表示失败
    //        P2PResult.value:返回一个P2P连接ID,本地唯一
    public static native P2PResult p2p_transport_connect(
                                    int transport, // p2p_transport对象
                                    String user, // 目标IPC设备的UID
                                    int user_data); // 用户数据,缺省为0

    // APP调用此接口,断开指定的P2P连接
    public static native void p2p_transport_disconnect(int transport, int conn_id);

    // 函数功能:APP侧调用此接口,通知SDK内部创建一个代理服务对象
    // 参数说明:int transport:p2p_transport对象
    //          int conn_id:每个内部代理服务关联一条P2P连接ID
    //          int remote_listen_port:用户可以指定代理服务的工作端口(缺省输入0)
    // 返回值:P2PResult.result=0表示函数执行成功,否则表示失败
    //        P2PResult.value:返回内部代理服务的实际工作端口
    public static native P2PResult p2p_create_tcp_proxy(int transport, 
                                        int conn_id, int remote_listen_port);

    // 释放P2P SDK内部的代理服务对象
    public static native void p2p_destroy_tcp_proxy(int transport, 
                                        int conn_id, int local_proxy_port);

    // 一般不使用此接口
    public static native String p2p_strerror(int error);

    // 一般不使用此接口
    public static native int p2p_nat_type_detect(String server, 
                                int port,P2PClient.P2PDetectNatCallBack cb);

    public static native String p2p_get_conn_remote_addr(int transport, int conn_id);

    public static native String p2p_get_conn_local_addr(int transport, int conn_id);

    //  函数功能:设备侧调用此接口,查询一个空闲的P2P服务器
    //            查询得到的服务器信息以回调函数的方式返回。
    //  参数说明:String user:IPC设备的UID
    //            String password:IPC设备的KEY
    //            String ds_addr:IvyIoT云服务器地址或域名字符串
    //            int user_data:用户数据,缺省为0
    //            P2PClient.P2PClientDispatchCallBack cb:处理查询结果的回调函数
    // 返回值:0表示成功,其它表示失败
    public static native int p2p_request_dispatch_server(
                                                    String user,
                                                    String password,
                                                    String ds_addr,
                                                    int user_data,
                            P2PClient.P2PClientDispatchCallBack cb);

    //  函数功能:APP调用此接口,查询一个目标设备当前正在连接的P2P服务器
    //            查询得到的服务器信息以回调函数的方式返回。
    //  参数说明:String dest_user:目标设备的UID
    //            String ds_addr:IvyIoT云服务器地址或域名字符串
    //            int user_data:用户数据,缺省为0
    //            P2PClient.P2PClientDispatchCallBack cb:处理查询结果的回调函数
    // 返回值:0表示成功,其它表示失败 
    public static native int p2p_query_dispatch_server(
                                                String dest_user,
                                                String ds_addr,
                                                int user_data,
                            P2PClient.P2PClientDispatchCallBack cb);

    public static native int p2p_conn_set_buf_size(int transport, int conn_id, int opt, int size);

    // 回调函数接口
    public interface P2PClientCallBack {
        // 函数功能:此回调函数用于处理p2p_transport_create发起的P2P服务器连接结果
        // 参数说明:int transport:调用p2p_transport_create时,生成的p2p_transportd对象
        //           int status:0:表示连接P2P服务器成功,其它表示失败
        //           int user_data:调用p2p_transport_create时输入的用户数据
        void on_create_complete(int transport, int status, int user_data);

        // 函数功能:此回调函数用于处理p2p_transport_connect发起的P2P连接结果
        // 参数说明: int transport:调用p2p_transport_create时,生成的p2p_transportd对象
        //            int connection_id:调用p2p_transport_connect生成的P2P连接ID
        //            int status:0:表示P2P连接成功,其它表示失败
        //            int transport_user_data:调用p2p_transport_create时输入的用户数据
        //            int connect_user_data:调用p2p_transport_connect时输入的用户数据
        void on_connect_complete(int transport,
                                int connection_id,
                                int status,
                                int transport_user_data,
                                int connect_user_data);

        // 函数功能:APP与IPC之间的P2P连接断开时,此回调函数被调用
        // 参数说明:int transport:调用p2p_transport_create生成的p2p_transportd对象
        //           int connection_id:调用p2p_transport_connect生成的P2P连接ID
        //           int transport_user_data:调用p2p_transport_create时输入的用户数据
        //           int connect_user_data:调用p2p_transport_connect时输入的用户数据
        void on_connection_disconnect(int transport,
                                    int connection_id,
                                    int transport_user_data,
                                    int connect_user_data);

        // 函数功能:此回调函数只在IPC侧被调用,表示IPC侧成功建立一条新的P2P连接
        // 参数说明:int transport:调用p2p_transport_create生成的p2p_transportd对象
        //           int connection_id:P2P连接ID,本地唯一,标识一条P2P连接
        //           int transport_user_data:调用p2p_transport_create时输入的用户数据
        void on_accept_remote_connection(int transport,
                                        int connection_id,
                                        int transport_user_data);
    }

    public interface P2PClientDispatchCallBack {
        // 此回调函数作为p2p_request_dispatch_server()和p2p_query_dispatch_server()
        // 的输入参数,当上述函数发送的查询请求得到响应时,P2PSDK调用此回调函数将
        // 查询结果通知到应用层
        void on_dispatch_result(int status,
                                int user_data,
                                String server,
                                int port,
                                int server_id);
    }

    // 此接口已不使用
    public interface P2PDetectNatCallBack {
        void on_detect_nat(int status, int nat_type);
    }
}
文档更新时间: 2020-06-30 17:43   作者:admin