关于GB/T 28181的一点点总结

一、建立工程
1、osip和eXosip库编译参考http://blog.csdn.net/candy1232009/article/details/38944461
2、工程属性C/C++->附加包含目录,添加osip和eXosip下include
3、工程属性连接器->附加库目录,添加osip下DebugDLL和eXosip下Debug
4、附加依赖项,Dnsapi.lib; Iphlpapi.lib; Ws2_32.lib; osip2.lib; osipparser2.lib; exosip.lib
5、主程序# include <eXosip2/eXosip.h>  即可使用库函数
二、平台端和设备端
设备端借助eXosip库搭建,平台端借助PartySip搭建。
osip开发参考 http://www.gnu.org/software/osip/doc/html/modules.html
eXoisp开发参考 http://www.antisip.com/doc/exosip2/modules.html
partysip开发参考 http://www.nongnu.org/partysip/
三、学习参考
SIP探索之路 http://blog.sina.com.cn/s/articlelist_1937432403_6_1.html
SIP组件开发 https://my.oschina.net/qq1269122125/blog
SIP协议 RFC3261、RFC2543(重点),服务器地址格式参考RFC2219,鉴权参考RFC2617(HTTP Authentication),Subscribe和Notify参考RFC3265(sip.event),SDP参考RFC3264
四、鉴权
1、设备端鉴权
①调用eXosip_register_build_initial_register(),向平台注册,不携带鉴权信息;
②收到 401 Unauthorized,response携带WWW-Authenticate:Digest realm="",nonce="",此时调用eXosip_add_authentication_info(),嵌套调用ADD_ELEMENT()将WWW-Authenticate信息加入到全局变量eXosip.authinfos;
③调用eXosip_register_build_register(),嵌套调用eXosip_add_authentication_information(),操作全局变量eXosip.authinfos,嵌套调用__eXosip_create_authorization_header(),嵌套调用DigestCalcResponse()计算Response(MD5)值,创建了鉴权头域;
④eXosip_register_send_register();
2、平台端鉴权
①MD5函数DigestCalcHA1()和DigestCalcResponse()作为osip库的PrivateFuncs,所以需要提取出来————将osip_md5.h和osip_md5.cpp拷至工程,依照jauth.c新建algorithm.h和algorithm.cpp
②质疑信令 401 Unauthorized :  sprintf(WWW_Authenticate, "Digest realm=\"\",algorithm=MD5,nonce=\"\"");
eXosip_lock ();
eXosip_message_build_answer (je->tid, 401, &answer);
osip_message_set_header(answer,"WWW-Authenticate",WWW_Authenticate);
eXosip_message_send_answer (je->tid, 401, answer);
eXosip_unlock ();
③鉴权验证: osip_authorization_t *auth;
osip_message_get_authorization(je->request,0,&auth);
从auth结构体取值,参考sprintf(WWW_Authenticate, "Digest realm=\"\",algorithm=MD5,nonce=\"\""),所以注意去掉首位双引号
memset(HA1,0,sizeof(HA1)*sizeof(HA1[0]));
memset(HA2,0,sizeof(HA2)*sizeof(HA2[0]));
DigestCalcHA1(pszAlg, pszUser, pszRealm, pszPass, pszNonce,pszCNonce, HA1);
DigestCalcResponse(HA1, pszNonce,NULL, NULL, NULL, 0, pszMethod,pszUri, HA2, Response);
if (!strcmp(Response, response_h))
{
printf("认证成功!!!");
eXosip_lock ();
eXosip_message_build_answer (je->tid, 200, &answer);
eXosip_message_send_answer (je->tid, 200, answer);
eXosip_unlock ();
}
五、心跳
①网上搜到的心跳方法并不正确,在于安全工程中,Nonce是一个在加密通信只能使用一次的数字。在认证协议中,它往往是一个随机或伪随机数,以避免重放攻击。所以尽管保存了认证str,却并无作为。
认证成功后,保存认证字符串
   osip_authorization_t * auth;
   char *strAuth=NULL;
   osip_message_get_authorization(reg,0,&auth);
   osip_authorization_to_str(auth,&strAuth);
发送心跳包前将认证字符串添加入REGISTER消息中
   osip_header_t *pMsgHeader=NULL;
   osip_message_header_get_byname(req,(const char *)"authorization",0,&pMsgHeader);
   if (pMsgHeader==NULL)
osip_message_set_header(req,(const char *)"authorization",strAuth);
   else
strcpy(pMsgHeader->hvalue,strAuth);  strAuth为保存的挑战字符串
②GB28181下,使用MANSCDP方式,发送Keepalive数据体,平台收到后更新注册时间expires即可。心跳保活如下:
下级平台定期向上级平台发心跳消息;
定期时间可配置,上下级配置一致;
上级平台连续三次未收到下级心跳消息,则认为下级平台离线;
下级平台连续三次未收到心跳响应,则认为上级平台离线;


六、线程
osip2/eXosip2支持线程安全,既可以用于多线程的编程模式,也可以用于单线程的编程模式。
osip2/eXosip2默认是使用多线程模式,也就是默认使能OSIP_MT宏。
当使用多线程模式时,用户需要编写线程处理函数,并在协议栈初始化成功后启动处理线程,线程的头尾是 eXosip_event_t *je 和 eXosip_event_free(je)。
七、SDP
规定见《GBT 28181-2016 公共安全视频监控联网系统信息传输、交换、控制技术要求》附录F
其中y字段,SSRC值由媒体流发送设备所在的SIP监控域产生,作为媒体流的标识使用。即监控系统Invite请求携带y字段,设备回复200OK消息中携带此值,RTP流亦当使用此值作为SSRC,但是,海康IPC没做...,或者说不鉴权,所以,暂时不规定y字段。
八、oSip body
1、选择使用osip body api http://www.gnu.org/software/osip/doc/html/group__howto5__sdp.html
2、snprintf(req_xml_body,4096,  
"v=0\r\n"
"o=34020000001110000001 0 0 IN IP4 10.0.10.4\r\n"
"s=Play\r\n"
"c=IN IP4 10.0.10.4\r\n"
"t=0 0\r\n"
"m=video 8401 RTP/AVP 96 98 97\r\n"
"a=recvonly\r\n"
"a=rtpmap:96 PS/90000\r\n"
"a=rtpmap:98 H264/90000\r\n"
"a=rtpmap:97 MPEG4/90000\r\n"
"y=0100001001\r\n"
"f=\r\n");  
    osip_message_set_content_type(METHOD, "Application/sdp");
    osip_message_set_body(METHOD, req_xml_body, strlen(req_xml_body));  
    这样比较简便,赋值xml_body,content_type选 Application/sdp, Application/MANSCDP+xml,  Application/MANSRTSP+xml
九、TCP/UDP
设置函数为: UDP:  i = eXosip_listen_addr (ctx, IPPROTO_UDP, NULL, 5060, AF_INET, 0);
TCP:   i = eXosip_listen_addr (ctx, IPPROTO_TCP, NULL, 5060, AF_INET, 0);
选用UDP方式是合理的,TCP在有着频繁信令监护的平台会显得捉襟见肘,socket不够用
eXosip3.60只支持UDP初始化
十、Header的Subject字段
subject头域:“媒体发送者ID:发送方媒体流序列号,媒体流接受者ID:接收方媒体流序列号”
设备收到呼叫请求后,判断是否在发送此媒体源标示的码流,如果已在发送,应释放现有媒体流发送链路并按照新的请求建立新的媒体流发送链路
十一、GB28181使用到的SIP信令
Register 平台注册,设备登入登出
Invite 实时取流,携带SDP
Message 设备信息、状态、目录查询,PTZ,回放下载,文件检索等
Subscribe、Notify 订阅通知

参考《GBT 28181-2016 公共安全视频监控联网系统信息传输、交换、控制技术要求》

十二、示例

http://download.csdn.net/detail/upleasure/9890056

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值