国标28181对讲实现
一、前言
首先国标28181对讲的实现,是在wvp项目上进行的扩展,推流是借助zlmediakit实现,所以在此感谢两位作者提供的开源项目,下边贴出两个项目的github地址,这是目前对国标28181协议实现最好的开源项目。
我的公网部署地址 https://www.gbslink.top
联系作者要账号密码和源码(不在开源但是价格不贵):
v:17686791164(电话同号)
qq:252657030
- 实现效果如下
二、部署
部署参考wvp-pro对讲版部署
三、关于公网对讲
在最近与一些公司的交流过程中,发现都是在公网对讲的需求,但是国标2016标准中并没有强制规定设备要支持在公网对讲,所以国内的主流厂商,比如海康的大多数设备其实是不支持公网对讲的,因为他的对讲数据传输模式只支持rtp/udp,而rtp/udp数据包没办法跨网段传输,如果在局域网使用是不影响国标对讲功能的,如果在公网中这个功能就不能使用了(如果是最近两年新采购的设备,可以通过海康微信公众号联系厂家,看看有没有对应型号的升级包,可以让其设备支持公网对讲,PS:为什么这样说,因为我自己试过,还真要到了升级包,升级后海康的设备就支持公网对讲了,升级后的语音数据传输模式是,对讲sip信令协商完成后,设备端主动发起tcp链接,平台侧是tcp被动,这样就可以对讲了,因为建立了一个长链接)
大华:关于大华公网设备对讲推荐使用大华TALK模式,这个功能在平台侧是支持的,会根据厂家名称,自动选择对讲信令模式,大华的TALK模式是大华自己扩展的国标协议,invite由平台侧主动发起,还有就是有的大华设备通过配置接入模块识别码,能修改数据传输模式,也是可以支持标准的国标对讲信令,如下:首位改为4
四、标准国标对讲信令
- 流程图
-
具体信令描述
#广播通知 BroadCast #平台侧------->设备侧 MESSAGE sip:34020000001110000001@3402000000 SIP/2.0 From: <sip:34020000002000000001@3402000000>;tag=bccedfd000006 To: <sip:34020000001110000001@3402000000> Content-Length: 176 CSeq: 5 MESSAGE Route: <sip:34020000001110000001> Call-ID: 12345678900006 Via: SIP/2.0/UDP 192.168.1.101:5060;wlsscid=377aa9afcf1b36f;branch=123133532300006 Content-Type: Application/MANSCDP+xml Max-Forwards: 70 <?xml version="1.0"?> <Notify> <CmdType>Broadcast</CmdType> <SN>17298</SN> <!--语音输入设备的设备编码--> <SourceID>34020000002000000001</SourceID> <!--语音输出设备的设备编码--> <TargetID>34020000001370000001</TargetID> </Notify>
#设备测收到广播通知回复200 ok #设备测------>平台侧 SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.101:5060;wlsscid=377aa9afcf1b36f;branch=123133532300006 From: <sip:34020000002000000001@3402000000>;tag=bccedfd000006 To: <sip:34020000001110000001@3402000000>;tag=880670885 Call-ID: 12345678900006 CSeq: 5 MESSAGE User-Agent: IP Camera Content-Length: 0
#设备测主动发起invite #设备测------>平台侧 INVITE sip:34020000002000000001@192.168.1.101:5060 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK1490643408 From: <sip:34020000001110000001@192.168.1.64:5060>;tag=1499847265 // To: <sip:34020000002000000001@192.168.1.101:5060> Call-ID: 1420309512 CSeq: 20 INVITE Contact: <sip:34020000001110000001@192.168.1.64:5060> Content-Type: application/sdp Max-Forwards: 70 User-Agent: IP Camera # 媒体流发送者ID:发送方媒体流序列号,媒体流接收者ID:接收方媒体流序列号 Subject: 34020000002000000001:1,34020000001110000001:2 Content-Length: 214 v=0 o=34020000001110000001 2418 2418 IN IP4 192.168.1.64 s=Play c=IN IP4 192.168.1.64 t=0 0 # 音频 端口 RTP-over-UDP 负载类型( 8-PCMA, 96-PS) # 注意 这一步就是设备侧开的收语音流数据的端口 # RTP/AVP传输模式是udp,这种只能在局域网对讲 # TCP/RTP/AVP 这种才可以在公网对讲 m=audio 15062 RTP/AVP 8 96 a=recvonly # RTP + 音频流: 负载类型 a=rtpmap:8 PCMA/8000 a=rtpmap:96 PS/90000 # SSRC(同步信源标识符): SSRC值由媒体流发送设备所在的SIP监控域产生,作为媒体流的标识使用 y=0200000017 # v/编码格式/分辨率/帧率/码率类型/码率大小 a/编码格式/码率大小/采样率 # G.711 / 64kbps / 8kHz f=v/a/1/8/1
#平台侧回复invite ok
#平台侧------->设备侧
》》》》》》 IPC
SIP/2.0 200 OK
From: <sip:34020000001110000001@192.168.1.64:5060>;tag=1499847265
To: <sip:34020000002000000001@192.168.1.101:5060>;tag=1420309512
Call-ID: 1420309512
CSeq: 20 INVITE
User-Agent: General SIP UAS V1.0
Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK1490643408
Contact: <sip:34020000002000000001@192.168.1.101:5060>
Content-Type: application/SDP
Content-Length: 182
v=0
o=34020000002000000001 0 0 IN IP4 192.168.1.101
s=Play
c=IN IP4 192.168.1.101
t=0 0
# 这是我们平台侧开的端口,使用这个端口发送音频数据到设备
m=audio 8000 RTP/AVP 8 // 端口:8000
a=rtpmap:8 PCMA/8000 //rtpmap:8 PCMA及g711a 采样率:8000HZ
a=sendonly
y=0200000017
#设备测------>平台侧
ACK sip:34020000002000000001@192.168.1.101:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK106578989
From: <sip:34020000001110000001@192.168.1.64:5060>;tag=1499847265
To: <sip:34020000002000000001@192.168.1.101:5060>;tag=1420309512
Call-ID: 1420309512
CSeq: 20 ACK
Contact: <sip:34020000001110000001@192.168.1.64:5060>
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 0
#这一步过后我们就可以发送音频数据了
- 关闭对讲
# 发送BYE信令
BYE sip:34020000001370000001@3402000000 SIP/2.0
From: <sip:34020000002000000001@3402000000>;tag=1420309512
To: <sip:34020000001370000001@3402000000>;tag=1499847265
CSeq: 2 BYE
Call-ID: 1420309512
Via: SIP/2.0/UDP 192.168.1.64:5060;branch=z9hG4bKee5c5d98-00007
Max-Forwards: 70
Content-Length: 0
# BYE ok
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.64:5060;branch=z9hG4bKee5c5d98-00007;received=192.168.1.101
From: <sip:34020000002000000001@3402000000>;tag=1420309512
To: <sip:34020000001370000001@3402000000>;tag=1499847265
Call-ID: 1420309512
CSeq: 2 BYE
User-Agent: IP Camera
Content-Length: 0
五、大华TALK对讲模式
- 流程图
-
具体信令
#主动发送invite到摄像机 #平台侧------->设备侧 INVITE sip:34020000001370000001@3402000000 SIP/2.0 Via: SIP/2.0/UDP 192.168.32.33:14000;rport;branch=z9hG4bK7d0821ae From: <sip:34020000002000000033@3402000000>;tag=1752762308 To: <sip:34020000001370000001@3402000000> Call-ID: 1949196054 CSeq: 5 INVITE Content-Type: APPLICATION/SDP Contact: <sip:34020000002000000033@192.168.32.33:14000> Max-forwards: 70 User-Agent: tiamaes Subject: 34020000001370000001:2,34020000002000000033:2 Content-Length: 183 v=0 o=34020000002000000033 0 0 IN IP4 192.168.32.33 s=Talk c=IN IP4 192.168.32.33 t=0 0 # 此处我们可以控制数据的传输方式 可以使用 TCP/RTP/AVP # 25000 是平台侧发送语音数据的端口 m=audio 25000 TCP/RTP/AVP 8 a=sendrecv a=rtpmap:8 PCMA/8000 f=v/a/1/8/1 y=0200000002
#设备回复invite ok #设备测------>平台侧 SIP/2.0 100 Trying Call-ID: 1949196054 Content-Length: 0 CSeq: 5 INVITE From: <sip:34020000002000000033@3402000000>;tag=1752762308 To: <sip:34020000001370000001@3402000000> User-Agent: SIP UAS V3.0.0.1049939 Via: SIP/2.0/UDP 192.168.32.33:14000;rport=14000;branch=z9hG4bK7d0821ae <!--接收到摄像机响应--> SIP/2.0 101 Dialog Establishment Call-ID: 1949196054 Contact: <sip:34020000001180005001@192.168.32.13:5060> Content-Length: 0 CSeq: 5 INVITE From: <sip:34020000002000000033@3402000000>;tag=1752762308 To: <sip:34020000001370000001@3402000000>;tag=5aaf5dffc1105842785cdf093029bcf8 User-Agent: SIP UAS V3.0.0.1049939 Via: SIP/2.0/UDP 192.168.32.33:14000;rport=14000;branch=z9hG4bK7d0821ae <!--接收到摄像机响应--> SIP/2.0 200 OK Call-ID: 1949196054 Contact: <sip:34020000001180005001@192.168.32.13:5060> Content-Length: 270 Content-Type: application/sdp CSeq: 5 INVITE From: <sip:34020000002000000033@3402000000>;tag=1752762308 To: <sip:34020000001370000001@3402000000>;tag=5aaf5dffc1105842785cdf093029bcf8 User-Agent: SIP UAS V3.0.0.1049939 Via: SIP/2.0/UDP 192.168.32.33:14000;rport=14000;branch=z9hG4bK7d0821ae v=0 o=34020000001310000001 0 0 IN IP4 192.168.32.13 s=Talk i=VCam Talk Session c=IN IP4 192.168.32.13 t=0 0 # 9712是设备测开的接收语音数据流的端口 m=audio 9712 TCP/RTP/AVP 8 a=recvonly a=rtpmap:8 PCMA/8000/1 m=audio 9712 TCP/RTP/AVP 8 a=sendonly a=rtpmap:8 PCMA/8000/1 y=0200000002 f=v/0/0/0/0/0a/0/0/0
#发送ack到摄像机 ACK sip:34020000001370000001@3402000000 SIP/2.0 Via: SIP/2.0/UDP 192.168.32.33:14000;rport;branch=z9hG4bK6e554aa5 From: <sip:34020000002000000033@3402000000>;tag=1752762308 To: <sip:34020000001370000001@3402000000>;tag=5aaf5dffc1105842785cdf093029bcf8 Call-ID: 1949196054 CSeq: 5 ACK Contact: <sip:34020000002000000033@192.168.32.33:14000> Max-forwards: 70 User-Agent: tiamaes Content-Length: 0 # 这一步进行完就可以对讲了
通过对比国标标准信令和大华talk信令我们可以看出,标准的国标对讲sip信令,invite是设备测发起,我们没有办法控制数据的传输模式,而大华的talk模式invite是平台侧发起,我们可以控制数据的传输模式使用udp还是tcp(当然也得设备测支持tcp传输模式才可,要不然还是白扯)
六、写在最后
- 关于sip信令
在和大家的接触过程中,大家大多数都是刚接触国标协议和wvp这个平台,对sip协议和SDP消息体可能很陌生,因为平是大多数平时使用http协议较多,一次请求一次响应,对sip协议这种为了完成一个功能要进行多次请求和多次响应的方式可能有些抵触,我希望大家放下抵触的心理,静下心来好好的看看信令,大家只要肯下功夫,肯深耕,这个sip信令其实并不难,我给出几个入门参考资料,希望大家看一看,要多使用wireshark抓包实战分析。
- 关于wvp
wvp作者在代码中用了大量的设计模式以及异步编程,如果你看代码费劲请学习设计模式以及JUC编程
- 最后
希望多读几遍wvp 和zlmediakit 的wiki,如果解决不了可以联系我,不局限于对讲模块,其他功能我也可以帮助你排查。