P2P(Point-to-Point)音视频传输技术,是为节省服务器带宽而设计的。我设计和开发的接口使用如下,供参考。最近几天我会整理一下P2P 开发常见问题。该技术目前主要在监控安防,宠物机,扫地机,楼宇对讲,等物联网相关行业中应用。以下接口目前支持安凯AK,海思HI,君正,安霸,瑞芯微,安卓,IOS等平台。有免费示例代码提供参考。
版本 |
日期 |
说明 |
2.01.04 |
2018.01.04 |
新增接口 |
1.09.22 |
2017.09.22 |
支持音视频文件加密传输 |
1.06.19 |
2017.6.28 |
修改订阅成功说明 |
1.05.20 |
2017.5.20 |
新增订阅返回值 |
1.04.21 |
2017.4.21 |
新增串口透传 |
1.405 |
2017.4.5 |
新增局域网广播接口 |
1.320.13 |
2017.3.20 |
新增2个透传接口 |
1.14.11 |
2017.1.14 |
新增文件读取 |
1.07.05 |
20160705 |
新增订阅成功失败 |
接口概要 |
||
XCloudLink API 支持 PC,Android,IOS,以及各种嵌入式设备连接XCloud云服务。 为用户透传信令和P2P多媒体数据服务。本协议一共 10 个接口,2个回调消息。提供4大功能。以动态库的方式提供服务支持。 一、系统初始化:对应 [1] CDK_InitXCloudLink 和 [2]CDK_UNInitXCloudLink。 二、XCloud云登录:[3]CDK_LogIn 和 [4]CDK_LogOut 。 三、指令透传:[5]CDK_Subscribe 和[6]CDK_PostXMessage。 四、P2P多媒体数据传输:[5]CDK_Subscribe,[7]CDK_HelloXMan,[8]CDK_OpenSession [9]CDK_SendMediaData ,[10]CDK_CloseSession。 五、局域网广播接口 六、使用 G1视频会话流程图,G2串口数据透传流程图 见文档最后。 |
1、CDK XCloudLink 加载初始化 |
||
接口原型 |
int CDK_InitXCloudLink(unsigned short nOpt, XCLOUDMSGCALLBACK xMsgCallBack, XCLOUDMEDIACALLBACK xMediaCallBack); |
|
参数 |
nOpt |
备用 |
xMsgCallBack |
接收命令消息,参考下面文档 |
|
xMediaCallBack |
接收多媒体数据,参考下面文档 |
|
返回值 |
-1 初始化失败 |
|
2、CDK_UNInitXCloudLink 卸载 |
|
接口原型 |
void CDK_UNInitXCloudLink(); |
参数 |
无 |
返回值 |
无 |
3、系统用户登录 |
||
接口原型 |
int CDK_LogIn(const char srtID[],const char strPsw[], XHOSTInfo hostInfo[], unsigned short nhostCount);// APP int CDK_LogIn(const char srtID[],const char strPsw[], XHOSTInfo hostInfo[], unsigned short nhostCount,unsigned short nReset,const char *pCompanyKey);//设备端
|
|
参数 |
srtID |
设备ID |
strPsw |
密码 |
|
hostInfo[] |
服务器地址数组 |
|
nhostCount |
服务器地址个数 |
|
nReset |
密码复位。此参数只有设备库才有 |
|
pCompanyKey |
公司秘钥默认为NULL 。此参数只有设备库才有 |
|
返回值 |
|
4、系统用户注销 |
|
接口原型 |
int CDK_LogOut(); |
参数 |
|
5、设备订阅 |
||
接口原型 |
int CDK_Subscribe(const char * strDstID, const char * strAuth, unsigned int nOption);
|
|
参数 |
strDstID |
目标设备ID |
strAuth |
设备认证密码,用MD加密后的数据 |
|
nOption |
A、默认 0 B、100 代表取消订阅 |
|
返回值 |
-1 err 系统未初始化,或者登陆失败 //注意:设备的当前状态通过此接口回调返回。 //订阅成功回调消息 XCLOUDMSG_SUBSCRIBESUCCESS //订阅失败回调消息 XCLOUDMSG_SUBSCRIBEFAIL |
6.1、主动发送消息(字符串)仅客户端使用 |
||
接口原型 |
int CDK_PostXMessage(const char strDstID[], unsigned short nMessage, const char pString[] );
|
|
参数 |
strDstID |
目标地址 |
nMessage |
消息类型,默认0 |
|
pString |
透传数据 |
|
返回值 |
-1 err 发送失败。 ret > 0 |
|
|
|
|
6.2、主动发送消息(字符串) |
||
接口原型 |
int CDK_PostXMessageEX(unsigned int nDstID,unsigned short nMessage, const char pString[] );
|
|
参数 |
nDstID |
目标地址 |
nMessage |
消息类型,默认0 |
|
pString |
透传数据 |
|
返回值 |
-1 err 发送失败。 ret > 0 设备主动发起呼叫调用: CDK_PostXMessage(0, XCLOUDMSG_TRANSALT,"Calling:hba0001#201");
|
6.3、主动发送消息(二进制数据) |
||
接口原型 |
int CDK_PostBMessage(unsigned int nDstID, unsigned short nMessage, const char *pBinBuffer, unsigned short nBinSize);
|
|
参数 |
nDstID |
目标地址 |
nMessage |
消息类型,默认0 |
|
pBinBuffer |
透传数据 |
|
nBinSize |
数据格式大小 |
|
返回值 |
-1 err 发送失败。 ret > 0 |
6.4、主动发送消息(二进制数据) |
||
接口原型 |
int CDK_PostBMessageEX(const char strDstID[], unsigned short nMessage, const char *pBinBuffer, unsigned short nBinSize); |
|
参数 |
strDstID |
目标地址 |
nMessage |
消息类型,默认0 |
|
pBinBuffer |
透传数据 |
|
nBinSize |
数据格式大小 |
|
返回值 |
-1 err 发送失败。 ret > 0 |
7、设备连接 |
||
接口原型 |
int CDK_HelloXMan(const char strDstID[]); |
|
参数 |
strDstID |
目标设备ID |
返回值 |
-1 err 系统未初始化,或者登陆失败 // 无回调消息 |
8、打开会话 |
||
接口原型 |
unsigned int CDK_OpenSession(const char strDstID[], unsigned short nResType,unsigned short nRW);
|
|
参数 |
strDstID |
目标设备ID |
nResType |
参考 _XCLOUDSIDRES_TYPE |
|
nRW |
enum _XCLOUDRES_OPT { _XCLOUDRES_OPT_READ = 0, _XCLOUDRES_OPT_WRITE, }; |
|
返回值 |
Err:0 目标设备不支持 OK: 返回 SessionID |
9、发送媒体数据 |
||
接口原型 |
int CDK_SendMediaData(unsigned int nSID, unsigned short nResType, unsigned char iFreamType, unsigned short lparam, const char *pMediaBuffer, unsigned int nMediaBufferSize);
|
|
参数 |
nSID |
SESSION ID , CDK_OpenSession 返回值 |
nResType |
参考 _XCLOUDSIDRES_TYPE |
|
iFreamType |
参考 |
|
lparam |
帧间隔 |
|
pMediaBuffer |
媒体数据 |
|
nMediaBufferSize |
媒体数据长度 |
|
返回值 |
-1 err 发送失败。 ret > 0 |
10、关闭会话 |
||
接口原型 |
int CDK_CloseSession(unsigned int nSID, unsigned short nResType); |
|
参数 |
nSID |
CDK_OpenSessin 返回值 |
nResType |
参考 _XCLOUDSIDRES_TYPE |
|
返回值 |
-1 err 已经关闭 |
11、文件传输 |
||
接口原型 |
unsigned int CDK_OpenXCloudFile(const char strDstID[], const char strFilename[], unsigned short nResType, unsigned short nRW); |
|
参数 |
strDstID |
目标ID |
strFilename |
文件名, |
|
nResType |
资源类型 _XCLOUDRES_FILE_1 .. _XCLOUDRES_FILE_VOD 为点播 |
|
nRW |
接收文件,发送文件{ _XCLOUDRES_OPT_READ = 0, //接收文件 _XCLOUDRES_OPT_WRITE, //发送文件 }; |
|
返回值 |
成功返回 会话ID ,关闭时使用。 -1 err 已经关闭 |
12、关闭文件传输 |
||
接口原型 |
int CDK_CloseXCloudFile(unsigned int nSID, unsigned short nResType); |
|
参数 |
nSID |
CDK_OpenSessin 返回值 |
nResType |
参考 _XCLOUDSIDRES_TYPE |
|
返回值 |
-1 err 已经关闭 |
13、打开局域网广播 |
||
接口原型 |
int CDK_XBroadcastOpen(unsigned short nRecePort, unsigned short nSndPort); |
|
参数 |
nRecePort |
APP 侧默认使用 3252 设备侧默认使用 3251 |
nSndPort |
APP 侧默认使用 3251 设备侧默认使用 3252 |
|
返回值 |
-1 err 初始化失败,检查端口是否已被占用 |
|
14、关闭局域网广播 |
||
接口原型 |
int CDK_XBroadcastClose(); |
|
返回值 |
-1 关闭失败 |
|
15、发送局域网广播 |
||
接口原型 |
int CDK_XBroadcast(char *pBcastAddr, char *pBData,unsigned short nDataLen); |
|
参数 |
pBcastAddr |
广播地址,比如192.168.1.255 等有发送端网段的 |
pBData |
广播数据 |
|
nDataLen |
广播数据长度 |
|
返回值 |
-1 广播失败 |
消息回调 |
|||
typedef int (*XCLOUDMSGCALLBACK)( unsigned short nMsg,unsigned int hParam,unsigned int lParam,char pString[],unsigned int nSize );
|
|||
nMsg 参数说明 |
其他参数说明 |
||
XCLOUDMSG_XBROADCAST 110 收到局域网广播数据 *需要打开局域网广播接口* |
hParam |
0 //未使用 |
|
lParam |
0 //未使用 |
||
pString |
广播内容 |
||
nSize |
广播长度 |
||
|
|||
XCLOUDMSG_LOGINFAIL 111 登录认证失败/连接掉线
|
hParam |
LOGINSTATUS_CONERR = 0 //登录连接网络超时 LOGINSTATUS_UNKNOWERR=1, LOGINSTATUS_DBERR=2, // DB 错误 LOGINSTATUS_PSSWDERR=3, // 密码错误 |
|
lParam |
0 //未使用 |
||
pString |
NULL //未使用 |
||
nSize |
0 //未使用 |
||
|
|||
XCLOUDMSG_LOGINSUCCESS 112 登录成功 |
hParam |
设备自身能力 |
|
lParam |
0:未使用 |
||
pString |
NULL //未使用 |
||
nSize |
0 //未使用 |
||
|
|||
XCLOUDMSG_MANOFFLINE 113 设备下线【状态改变】 |
hParam |
0 //未使用 |
|
lParam |
0 //未使用 |
||
pString |
设备ID |
||
nSize |
ID长度 |
||
|
|||
XCLOUDMSG_MANONLINE 114 设备上线【状态改变】 |
hParam |
0 //未使用 |
|
lParam |
0 //未使用 |
||
pString |
设备ID |
||
nSize |
ID长度 |
||
|
|||
XCLOUDMSG_SESSIONFAIL 115 会话失败 |
hParam |
sessionid |
|
lParam |
mediatype |
||
pString |
enum SESSION_ERR |
||
nSize |
长度 |
||
XCLOUDMSG_SESSIONSUCCESS 116 会话成功 |
hParam |
sessionid |
|
lParam |
mediatype |
||
pString |
{ "p2p_mode":1 }//会话数 |
||
nSize |
pString 长度。 |
||
|
|||
XCLOUDMSG_TRANSALT 119 透传 |
hParam |
fromID |
|
lParam |
0 //未使用 |
||
pString |
Transalt buf |
||
nSize |
Transalt buflen |
||
|
|||
XCLOUDMSG_ALARM 120 报警消息 |
hParam |
fromID |
|
lParam |
Alarmtype |
||
pString |
Data,time... |
||
nSize |
Size |
||
|
|||
XCLOUDMSG_CONTROL 121 控制指令 |
hParam |
fromID |
|
lParam |
0 //未使用 |
||
pString |
NULL //未使用 |
||
nSize |
0 //未使用 |
||
|
|||
XCLOUDMSG_SESSION_WRITE_START 122 开始打开媒体资源,并可以CDK_SendMediaData |
hParam |
sessionid |
|
lParam |
mediatype |
||
pString |
NULL //未使用 |
||
nSize |
0 //未使用 |
||
|
|||
XCLOUDMSG_SESSION_WRITE_STOP 123 关闭写资源 |
hParam |
sessionid |
|
lParam |
mediatype |
||
pString |
NULL //未使用 |
||
nSize |
0 //未使用 |
||
|
|||
XCLOUDMSG_SESSION_READ_START 124 开始接收对应的媒体数据 |
hParam |
sessionid |
|
lParam |
mediatype |
||
pString |
NULL //未使用 |
||
nSize |
0 //未使用 |
||
|
|||
XCLOUDMSG_SESSION_READ_STOP 125 停止接收对应的媒体数据 |
hParam |
sessionid |
|
lParam |
mediatype |
||
pString |
NULL //未使用 |
||
nSize |
0//未使用 |
||
|
|||
XCLOUDMSG_SUBSCRIBEFAIL 126 设备订阅失败 |
hParam |
0 //未使用 |
|
lParam |
0 //未使用 |
||
pString |
{ 错误码对应 enum SUBSCRIBE_ERR
|
||
nSize |
ID长度 |
||
|
|||
|
|||
XCLOUDMSG_SUBSCRIBESUCCESS 127 设备订阅成功 |
hParam |
设备能力描述 |
|
lParam |
formID // |
||
pString |
设备ID,设备能力,设备状态 json格式 { |
||
nSize |
ID长度 |
||
|
|||
XCLOUDMSG_TRANSALT_BIN 128 收到透传二进制格式内容 |
hParam |
fromID |
|
hParam |
0//未使用 |
||
lParam |
0 //未使用 |
||
pString |
二进制内容 |
||
nSize |
长度 |
||
|
|||
XCLOUDMSG_TRANSALT_A 129 收到透文本数据 |
hParam |
fromID |
|
hParam |
0//未使用 |
||
lParam |
0 //未使用 |
||
pString |
文本内容 |
||
nSize |
长度 |
||
|
|
|
|
|
|||
XCLOUDMSG_TRANSALT_COMA 130 串口透传文本数据 |
hParam |
fromID |
|
hParam |
0//未使用 |
||
lParam |
0 //未使用 |
||
pString |
文本内容 |
||
nSize |
长度 |
||
|
|||
XCLOUDMSG_TRANSALT_COMB 131 串口透传二进制数据 |
hParam |
fromID |
|
hParam |
0//未使用 |
||
lParam |
0 //未使用 |
||
pString |
二进制数据 |
||
nSize |
长度 |
||
多媒体数据回调 |
||
typedef void(*XCLOUDMEDIACALLBACK)( unsigned int nSID,unsigned short MediaType,unsigned short hParam,unsigned short lParam,char pBuf[],unsigned int nBuflen ); |
||
参数说明 |
||
nSID |
|
|
MediaType |
|
|
hParam |
|
|
lParam |
|
|
pBuf |
|
|
nBuflen |
|
|
|
|
|
结构体 |
|
typedef struct _XHOSTInfo { unsigned short nPort; unsigned short hProto; char aryIP[255]; } XHOSTInfo; |
NETTCPIP_UDP=11, NETTCPIP_TCPCLI = 12, |
enum _XCLOUDRES_TYPE { _XCLOUDRES_IM = 0, _XCLOUDRES_PCMa = 10, _XCLOUDRES_PCMu, _XCLOUDRES_G711a, _XCLOUDRES_G711u, _XCLOUDRES_G726, _XCLOUDRES_XAUDIO, _XCLOUDRES_AAC, _XCLOUDRES_H264_1 = 20, _XCLOUDRES_H264_2, _XCLOUDRES_H264_XVIDEO1, _XCLOUDRES_H264_XVIDEO2, _XCLOUDRES_H264_5, _XCLOUDRES_H264_6, _XCLOUDRES_H264_7, _XCLOUDRES_H264_8, _XCLOUDRES_H265_1, _XCLOUDRES_H265_2, _XCLOUDRES_H265_3, _XCLOUDRES_MPEG4, _XCLOUDRES_MJPEG, _XCLOUDRES_FILE_1 = 50, _XCLOUDRES_FILE_2, _XCLOUDRES_FILE_3, _XCLOUDRES_FILE_4, _XCLOUDRES_FILE_5, _XCLOUDRES_FILE_6, _XCLOUDRES_FILE_7, _XCLOUDRES_FILE_JPEG, _XCLOUDRES_FILE_VODAUDIO, _XCLOUDRES_FILE_VODVIDEO, _XCLOUDRES_FILE_XDATA1, _XCLOUDRES_FILE_XDATA2, _XCLOUDRES_FILE_XDATA3, _XCLOUDRES_FILE_XDATA4,
_XCLOUDRES_END, }; |
多媒体类型
_XCLOUDRES_XAUDIO _XCLOUDRES_H264_XVIDEO1 _XCLOUDRES_H264_XVIDEO2 _XCLOUDRES_FILE_XDATA1 _XCLOUDRES_FILE_XDATA2 _XCLOUDRES_FILE_XDATA3 _XCLOUDRES_FILE_XDATA4 加密通道 |
enum _XCLOUDMSG { XCLOUDMSG_LOGINFAIL=111, XCLOUDMSG_LOGINSUCCESS=112, XCLOUDMSG_MANOFFLINE=113, XCLOUDMSG_MANONLINE=114, XCLOUDMSG_SESSIONFAIL=115, XCLOUDMSG_SESSIONSUCCESS=116, XCLOUDMSG_OPENSESSION=117, XCLOUDMSG_CLOSESESSION=118, XCLOUDMSG_TRANSALT=119, //透传 XCLOUDMSG_ALARM=120, XCLOUDMSG_CONTROL=121, XCLOUDMSG_SESSION_WRITE_START=122, XCLOUDMSG_SESSION_WRITE_STOP=123, XCLOUDMSG_SESSION_READ_START=124, XCLOUDMSG_SESSION_READ_STOP=125, XCLOUDMSG_SUBSCRIBEFAIL=126, XCLOUDMSG_SUBSCRIBESUCCESS=127, XCLOUDMSG_TRANSALT_BIN=128, XCLOUDMSG_TRANSALT_A=129, XCLOUDMSG_TRANSALT_COMA = 130, XCLOUDMSG_TRANSALT_COMB = 131, XCLOUDMSG_MESSAGE_PUSH = 132, XCLOUDMSG_MESSAGE_SYSTEM = 133, }; |
|
enum _XCLOUDEFRM_TYPE { XCLOUDEFRM_FRAMEI = 1, XCLOUDEFRM_FRAMEP = 2, XCLOUDEFRM_NORMAL = 3, };
|
针对视频 I 帧和 P 帧 |
六、
G1、视频会话流程图
G2、串口透传流程图: