深圳市好游科技有限公司开发的p2p sdk(HYP2P),支持linux、安卓、IOS和windows等常见平台,支持c语言,c++,c#,java,unity等环境下使用,仅提供了几个简单接口,您只要掌握了这几个简单接口便可以通过这个p2p中间件完成业务通信功能。http、rtmp或rtsp等由tcp或udp开发的应用均能接入。
HYP2P SDK支持以下特性:
1、支持双对称型nat打洞,成功率极高。
2、支持app与设备之间一对一、多对一的p2p连接。
3、中转模式支持一路上传,多个客户端查看,节省宽带。
先熟悉两个基本概念,后续的接口几乎都是用它们作为参数:
session(会话) :一个由p2p双方建立起来的会话,如一个app连接一个设备称作一个session
如果一个app同时连接多个设备,就同时存在多个session,当一个session建立后,支持多通道,双向收发数据
channel(通道) :当一个p2p连接建立起来后,这个session就存在多个channel,用户可自行定义每个channel的作用,也可以只使用其中的一个通道。
下面是详细的接口说明
1、p2p_engine_init
函数声明: | int p2p_engine_init (const char* login_domain,int login_port, const char* logfile) |
函数作用 | 初始化p2p sdk |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
login_domain | p2p服务器域名或ip,不能为NULL |
login_port | p2p服务器端口号 |
logfile | 日志文件,可以为NULL或“” |
2、p2p_engine_destroy
函数声明: | void p2p_engine_destroy( ) |
函数作用 | 回收p2p sdk初始化时申请的相关资源 |
返回值 | 无 |
参数定义 | 无 |
3、p2p_get_free_session
函数声明: | int p2p_get_free_session() |
函数作用 | 获取一个可用的会话,最多同时支持64个,默认从0开始返回第一个未使用的索引,并创建会话 |
返回值 | 成功则返回会话的索引(0到63),后续接口都需要此值作为参数。失败返回小于0的错误码 |
4、p2p_close_session
函数声明: | int p2p_close_session(int session) |
函数作用 | 通信结束时,关闭指定的会话 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
5、p2p_set_sink
函数声明: | int p2p_set_sink(int session, struct IP2PSessionSink* sink) |
函数作用 | 设置会话的回调接口,当会话的状态发生变化,或者会话收到数据时会调用回调函数 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
sink | 回调的接口结构体指针 |
6、p2p_connect_server
函数声明: | int p2p_connect_server(int session, int64_t myuid,const char *secret); |
函数作用 | 连接p2p服务器,但不发送登入消息到服务器。连接成功后,再调用p2p_login_server发送登入消息。这个函数是异步操作,连接成功后通过IP2PSessionSink.onServerConnected接收到通知。 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
myuid | 由 好游科技有限公司 生成的设备授权id,只有允许被动接收p2p连接的设备才需要传入有效的值。 非被动接收连接的设备,如:手机端的app,传入0既可以。 |
secret | 由 好游科技有限公司 生成的设备授权密钥,只有允许被动接收p2p连接的设备才需要传入有效的值。 非被动接收连接的设备,如:手机端的app,传入NULL或空字符串""都可以。 |
7、p2p_login_server
函数声明: | int p2p_login_server(int session, int64_t uid); |
函数作用 | 发送登入消息到p2p服务器,通常都是在IP2PSessionSink.onServerConnected回调函数中调用。 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
uid | 唯一标识设备的id,比如摄像头的id。此id在p2p_connect_peer时用来匹配设备。 此id由用户应用自己维护,一般使用手机app上从服务器收到的数据库的设备id作为此参数 与上一接口中设备授权id不同。 |
8、p2p_connect_peer
函数声明: | int p2p_connect_peer(int session, int64_t peerid, int nForceReconnect); |
函数作用 | 尝试与设备peerid 建立p2p连接。必须收到IP2PSessionSink.onLoginServer回调函数的通知之后再调用此接口。 要成功与设备建立p2p连接,需要满足两个条件:
|
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
peerid | 唯一标识设备的id,比如摄像头的id。此id在设备调用p2p_login_server时由传入。 此id由用户应用自己维护,一般使用数据库的设备id作为此参数 |
nForceReconnect | 打洞成功后,短时间内又调用p2p_connect_peer,p2p底层会立即返回成功,不会重新去申请打洞,除非检测到打洞状态已经断开了。这个参数设置成1,会使p2p底层重新打洞。 |
9、p2p_start_proxy
函数声明: | int p2p_start_proxy(int session, int port,int isApp) |
函数作用 | 当p2p连接建立后,原本用户的应用访问的所有服务器数据,都将从本机的port端口获得。 比如原来从 haoyou456.com:80 获取数据,现在变成从127.0.0.1:port获得。 此函数是异步的,成功后IP2PSessionSink.onProxyStarted回调函数将被调用 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
port | 本地socket端口号,如果传入0则会自动生成。 |
isApp | 此参数用来标识双向通信中是设备端还是手机app端 比如双向语音对讲或双向视频通话时,标识设备端或手机app端 |
10、p2p_stop_proxy
函数声明: | int p2p_stop_proxy(int session) |
函数作用 | 停止数据传输,通信结束时由用户调用 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
11、p2p_set_device_port
函数声明: | int p2p_set_device_port(int session, int port) |
函数作用 | 由设备端调用,指定视频或语音服务器的端口号,比如:rtsp或rtmp推流服务器的端口号 p2p连接建立后,用户app需要的所有数据,将从此端口获取 |
返回值 | 成功则返回0,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
port | 视频或语音服务器的端口号,比如:rtsp或rtmp推流服务器的端口号 |
12、p2p_send (如果不使用sockcet,可以改成用此函数发送数据)
函数声明: | int p2p_send(int session, int64_t uid, int channel, const void* buff, unsigned int len,unsigned int blockid=0) |
函数作用 | p2p连接建立后,可以调用此函数发送数据 也可以不用此函数,无需对原来使用socket的应用进行修改。 接收端将从IP2PSessionSink.onRecvP2PData回调函数中接收到数据 |
返回值 | 成功则返回发送的字节数,失败返回小于0的错误码 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
uid | onHoleState或onChannelState函数的第二个参数 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此id会不同 |
channel | 用户app自己设置,取值范围从0 — 100 |
buff | 指向要发送的数据的地址 |
len | 要发送的数据的长度 |
blockid | blockid默认填0 |
13、p2p_get_state
函数声明: | int p2p_get_state(int session,int64_t uid) |
函数作用 | 获取p2p会话的连接状态 |
返回值 | 0 p2p连接未建立 1 p2p连接已建立 2 p2p连接已建立,直接内网互连 3 中转模式 |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
uid | onHoleState或onChannelState函数的第二个参数 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此id会不同 |
14、p2p_set_log_level
函数声明: | int p2p_set_log_level(int level) |
函数作用 | 获取p2psdk底层的日志等级 |
返回值 | 无 |
参数定义 | 描述 |
level | 日志等级, 取值0-3,越大日志越详细 |
以下接口用于获取统计信息
1、p2p_get_recv_kbps
函数声明: | int p2p_get_recv_kbps(int session,int64_t clientid) |
函数作用 | 获取p2psdk底层与某个设备的通讯数据接收速率 |
返回值 | 数据接收速率,比如: 100kb/s |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
uid | onHoleState或onChannelState函数的第二个参数 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此id会不同 |
2、p2p_get_send_kbps
函数声明: | int p2p_get_send_kbps(int session,int64_t clientid) |
函数作用 | 获取p2psdk底层与某个设备的通讯数据时的发送速率 |
返回值 | 数据发送速率,比如: 100kb/s |
参数定义 | 描述 |
session | 会话的索引,可以是p2p_get_free_session或p2p_create_session的返回值 |
uid | onHoleState或onChannelState函数的第二个参数 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此id会不同 |
3、p2p_get_frame_rate
函数声明: | int p2p_get_frame_rate() |
函数作用 | 获取p2psdk底层线程的每秒帧率 |
返回值 | p2psdk底层线程的每秒帧率,比如 90帧/秒 |
参数定义 | 无 |
以下接口极少使用,只有特殊需求时才会使用到
1、p2p_get_localip
函数声明: | int p2p_get_localip(char* ip, int buflen) |
函数作用 | 返回p2p底层获取到的本机ip |
返回值 | AF_INET或AF_INET6,不同的平台此值不一样 |
参数定义 | 描述 |
ip | 获取到的ip内存存放地址 |
buflen | ip内存大小 |
2、p2p_set_localip
函数声明: | void p2p_set_localip(char* ip) |
函数作用 | 设置p2p底层使用的本机ip 一般情况下不需要设置,只有获取失败或多ip的情况获取错误时,才需要设置 |
返回值 | 无 |
参数定义 | 描述 |
ip | ip地址字符串,比如“192.168.1.19”,不能是域名 |
3、p2p_set_frame_rate(此函数一般不需要调用)
函数声明: | void p2p_set_frame_rate(int num) |
函数作用 | 设置p2psdk底层线程的每秒帧率。 |
返回值 | 无 |
参数定义 | 描述 |
num | 设置p2psdk底层线程的每秒帧率,建议:90-500之间,如果太低了,可能会出现丢包现象。 |
IP2PSessionSink接口回调函数说明
1、onServerConnected
函数声明: | void onServerConnected(int session, int state) |
函数作用 | 已经连接上p2p服务器: 此时只是检测到p2p服务器可连接,未发送登入包 |
返回值 | 无 |
参数定义 | 描述 |
session | 会话的索引,p2p_connect_server函数传入的第一个函数 |
state | 0表示连接p2p服务器成功 |
2、onLoginServer
函数声明: | void onLoginServer(int session, int state) |
函数作用 | 已经登入上p2p服务器,后续可以根据peerid连接某个设备了 |
返回值 | 无 |
参数定义 | 描述 |
session | 会话的索引,p2p_login_server函数传入的第一个函数 |
state | 0表示登入p2p服务器成功 |
3、onHoleState
函数声明: | void onHoleState(int session,int64_t uid, int state) |
函数作用 | 底层p2p会话的状态发生变化 |
返回值 | 无 |
参数定义 | 描述 |
session | p2p会话的索引号 |
uid | 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此uid会不同 |
state | 0 p2p打洞失败,服务器中转建立失败或中转连接断开 1 p2p打洞成功,使用外网IP,后续可以创建通道或者直接收发udp数据 2 p2p打洞成功,使用内网IP,后续可以创建通道或者直接收发udp数据 3 p2p打洞失败,服务器中转已经建立 |
4、onChannelState
函数声明: | void onChannelState( int session, int64_t uid, int channel, int state ) |
函数作用 | p2p会话的通道状态发生变化 |
返回值 | 无 |
参数定义 | 描述 |
session | p2p会话的索引号 |
uid | 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此uid会不同 |
state | 0:连接成功 1:连接失败 2:断开连接 3:app用户主动关闭通道 4:未连接的通道,udp使用 |
5、onProxyStarted
函数声明: | void onProxyStarted(int session, int port) |
函数作用 | 本地代理已经启动成功,tcp应用可以开始连接了 |
返回值 | 无 |
参数定义 | 描述 |
session | p2p会话的索引,p2p_start_proxy函数传入的第一个函数 |
port | port本地代理的端口号 |
6、onRecvP2PData
函数声明: | void onRecvP2PData(int session,int64_t uid, int channel,const unsigned char * pDataBuffer, int wDataSize) |
函数作用 | 收到p2p对端发送过来的数据包 |
返回值 | 无 |
参数定义 | 描述 |
session | p2p会话的索引 |
uid | 服务器维护的一个双方会话的ID,与不同的设备之间建立的p2p会话, 此uid会不同 |
channel | p2p对端发送数据时指定的通道编号 |
pDataBuffer | 接收到的数据内存地址 |
wDataSize | 接收到的数据长度 |
7、onRecvServerData
函数声明: | void onRecvServerData(int session, int64_t cmd, int subcmd, const unsigned char * pDataBuffer, int wDataSize) |
函数作用 | 由p2p底层使用,用户可忽略。 |
返回值 | 无 |
8、onConnectPeerResult
函数声明: | int onConnectPeerResult(int session, int64_t deviceid, int state) |
函数作用 | 连接对方或目标设备时,返回相应的状态。 |
返回值 | 无 |
参数定义 | 描述 |
session | p2p会话的索引 |
deviceid | 连接对方的id或目标设备的id |
state | 0-成功,1-设备不存在,2-用户未登入,3-设备未连接,4-设备未授权 |