2.5 可视对讲SIP服务器接入协议
1. 概述
1.1 编写目的
本文是可视对讲设备云对讲功能SIP服务接入协议说明。
1.2 名词解释
名词 | 解释 |
IoT | 物联网 |
2. 介绍
本文档旨在描述SIP对讲服务接入规范,云对讲采⽤标准SIP协议,其主要分为注册、会话建⽴、通话、会话结束、注销等几个阶段。涉及SIP、SDP、RTP、RTCP、PCMA、PCMU、Speex、Opus、H264、DTMF等协议。
3. 协议规范
3.1 SIP
SIP(Session Initiation Protocol)是⼀个应⽤层的信令控制协议。⽤于创建、修改和释放⼀个或多个参与者的会话。这些会话可以是Internet多媒体会议、IP电话或多媒体分发。会话的参与者可以通过组播(multicast)、⽹状单播(unicast)或两者的混合体进⾏通信。SIP协议详⻅《RFC 3261 SIP:Session Initiation Protocol》。SIP有很多开源库,如PJSIP、osip2、opensipstack等,可以根据⾃身平台特性选择。
如下是注册阶段的示例报⽂:
09:57:14.634407 IP 192.168.1.233.62039 > 47.112.101.107.6050: UDP, length 605
E..y#...@..<..../pek.W...e..REGISTER sip:47.112.101.107 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.233:62039;branch=z9hG4bK.7jiHBl8Sm;rport
From: <sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107>;tag=nPfvQ6pKa
To: sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107
CSeq: 20 REGISTER
Call-ID: 7ay7mqUOym
Max-Forwards: 70
Supported: replaces, outbound
Accept: application/sdp
Accept: text/plain
Accept: application/vnd.gsma.rcs-ft-http+xml
Contact: <sip:TU9e8mJvLJLcSsy9dmDKuc@192.168.1.233:62039;transport=udp>;+sip.instance="<urn:uuid:418ee786-4cf0-435a-b42c-5ab6d06f8b88>"
Expires: 600
User-Agent: Linphone Desktop/4.1.1 (belle-sip/1.6.3)
09:57:14.658069 IP 47.112.101.107.6050 > 192.168.1.233.62039: UDP, length 525
E..).&..2..2/pek.......W..._SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.233:62039;branch=z9hG4bK.7jiHBl8Sm;received=121.204.13.62;rport=62039
From: <sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107>;tag=nPfvQ6pKa
To: sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107;tag=as4fef1d8e
Call-ID: 7ay7mqUOym
CSeq: 20 REGISTER
Server: JustPBX
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH,MESSAGE
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="59320d53"
Content-Length: 0
09:57:14.670190 IP 192.168.1.233.62039 > 47.112.101.107.6050: UDP, length 786
E....k..@.>...../pek.W......REGISTER sip:47.112.101.107 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.233:62039;branch=z9hG4bK.awvGndk3C;rport
From: <sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107>;tag=nPfvQ6pKa
To: sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107
CSeq: 21 REGISTER
Call-ID: 7ay7mqUOym
Max-Forwards: 70
Supported: replaces, outbound
Accept: application/sdp
Accept: text/plain
Accept: application/vnd.gsma.rcs-ft-http+xml
Contact: <sip:TU9e8mJvLJLcSsy9dmDKuc@121.204.13.62:62039;transport=udp>;+sip.instance="<urn:uuid:418ee786-4cf0-435a-b42c-5ab6d06f8b88>"
Expires: 600
User-Agent: Linphone Desktop/4.1.1 (belle-sip/1.6.3)
Authorization: Digest realm="asterisk", nonce="59320d53", algorithm=MD5, username="TU9e8mJvLJLcSsy9dmDKuc", uri="sip:47.112.101.107", response="414132ffca95be7131b756d4890b1fc4"
09:57:14.691681 IP 47.112.101.107.6050 > 192.168.1.233.62039: UDP, length 575
E..[./..2.../pek.......W.G.gSIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.233:62039;branch=z9hG4bK.awvGndk3C;received=121.204.13.62;rport=62039
From: <sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107>;tag=nPfvQ6pKa
To: sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107;tag=as4fef1d8e
Call-ID: 7ay7mqUOym
CSeq: 21 REGISTER
Server: JustPBX
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH,
MESSAGE
Supported: replaces, timer
Expires: 600
Contact: <sip:TU9e8mJvLJLcSsy9dmDKuc@121.204.13.62:62039;transport=udp>;expires=600
Date: Thu, 16 Jan 2020 01:57:14 GMT
Content-Length: 0
3.2 SDP
SDP(Session Description Protocol)是⼀种会话描述格式 ― 它不属于传输协议 ― 它只使⽤不同的适当
的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP)、MIME 扩
展协议的电⼦邮件以及超⽂本传输协议(HTTP)。SDP协议是基于⽂本的协议,这样就能保证协议的
可扩展性⽐较强,这样就使其具有⼴泛的应⽤范围。SDP不⽀持会话内容或媒体编码的协商,所以在
流媒体中只⽤来描述媒体信息。SDP协议详⻅《RFC 4566 - SDP: Session Description Protocol》
如下是INVITE携带SDP报⽂示例:
10:04:41.223197 IP 192.168.1.233.62039 > 47.112.101.107.6050: UDP, bad length 2114 > 1472
E..... .@.T...../pek.W...J,.INVITE sip:M28PLP9MSvu6w0Vc13HPnC6@47.112.101.107 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.233:62039;branch=z9hG4bK.8aOxITrEA;rport
From: <sip:TU9e8mJvLJLcSsy9dmDKuc@47.112.101.107>;tag=7B13LTdJn
To: sip:M28PLP9MSvu6w0Vc13HPnC6@47.112.101.107
CSeq: 20 INVITE
Call-ID: hpgH62gK2G
Max-Forwards: 70
Supported: replaces, outbound
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO,UPDATE
Content-Type: application/sdp
Content-Length: 1449
Contact: <sip:TU9e8mJvLJLcSsy9dmDKuc@121.204.13.62:62039;transport=udp>;+sip.instance="<urn:uuid:418ee786-4cf0-435a-b42c-5ab6d06f8b88>"
User-Agent: Linphone Desktop/4.1.1 (belle-sip/1.6.3)
v=0
o=TU9e8mJvLJLcSsy9dmDKuc 2846 1117 IN IP4 192.168.1.233
s=Talk
c=IN IP4 192.168.1.233
t=0 0
a=ice-pwd:305b42a8561a2b3f06a158d7
a=ice-ufrag:a60560d1
a=rtcp-xr:rcvr-rtt=all:10000 stat-summary=loss,dup,jitt,TTL voip-metrics
m=audio 54480 RTP/AVPF 96 97 98 0 8 101 99 100
c=IN IP4 121.204.13.62
a=rtpmap:96 opus/48000/2
a=fmtp:96 useinbandfec=1
a=rtpmap:97 speex/16000
a=fmtp:97 vbr=on
a=rtpmap:98 speex/8000
a=fmtp:98 vbr=on
a=rtpmap:101 telephone-event/48000
a=rtpmap:99 telephone-event/16000
a=rtpmap:100 telephone-event/8000
a=rtcp:51670
a=candidate:1 1 UDP 2130706431 192.168.1.233 54480 typ host
a=candidate:1 2 UDP 2130706430 192.168.1.233 51670 typ host
a=candidate:2 1 UDP 1694498815 121.204.13.62 54480 typ srflx raddr 192.168.1.233 rport 54480
a=candidate:2 2 UDP 169449881
3.3 RTP/RTCP
RTP(Real-time Transport Protocol)即实时传输协议,是⼀个⽹络传输协议,它是由IETF的多媒体传输⼯作⼩组1996年在RFC 1889中公布的。RTP协议详细说明了在互联⽹上传递⾳频和视频的标准数据包格式。它⼀开始被设计为⼀个多播协议,但后来被⽤在很多单播应⽤中。RTP协议常⽤于流媒体系统(配合RTSP协议),视频会议和⼀键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础。RTP协议和RTP控制协议RTCP⼀起使⽤,⽽且它是创建在UDP协议上的。
RTP标准定义了两个⼦协议,RTP和RTCP。数据传输协议RTP,⽤于实时传输数据。该协议提供的信息包括:时间戳(⽤于同步)、序列号(⽤于丢包和重排序检测)、以及负载格式(⽤于说明数据的编码格式)。控制协议RTCP,⽤于QoS反馈和同步媒体流。相对于RTP来说,RTCP所占的带宽⾮常⼩,通常只有5%。RTP/RTCP协议详⻅《RFC 3550 - RTP: A Transport Protocol for Real-Time Applications》
3.4 音频
⽬前⽀持PCMA、PCMU、Speex 8kHz/16kHz、Opus⾳频格式
PCMA/PCMU
PCMA/PCMU协议接入详见《RFC 3551 - RTP Profile for Audio and Video Conferences with Minimal Control》
Speex
Speex是⼀个声⾳编码格式,⽬标是⽤于网络电话、线上⼴播使⽤的语⾳编码,基于CELP开发,Speex宣称可以免费使⽤,以BSD授权条款开放原始码。 Speex的开发者将这个格式视为Vorbis的补充。 Speex是⼀种有损格式,这意味著使⽤此格式的⾳讯,品质将会永久性地降低以减少档案的⼤⼩。接入详见《RFC 5574 - RTP Payload Format for the Speex Codec》Speex⽀持8kHz和16kHz
Opus
Opus是⼀个有损声⾳编码的格式,由Xiph.Org基⾦会开发,之后由⽹际网络⼯程任务组进⾏标准化,⽬标是希望⽤单⼀格式包含声⾳和语⾳,取代Speex和Vorbis,且适⽤于网络上低延迟的即时声⾳传输,标准格式定义于RFC 6716档案。Opus格式是⼀个开放格式,使⽤上没有任何专利或限制。接入详见《RFC 7587 - RTP Payload Format for the Opus Speech and Audio Codec》
3.5 视频
目前⽀持H264视频格式
H264
H264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新⼀代数字视频压缩格式。主要⽬标是:与其它现有的视频编码标准相⽐,在相同的带宽下提供更加优秀的图象质量。通过该标准,在同等图象质量下的压缩效率⽐以前的标准(MPEG2)提⾼了2倍左右。接入详见《RFC 3984 - RTP Payload Format for H.264 Video》
3.6 DTMF
DTMF(Dual Tone Multi Frequency)即双⾳多频,由⾼频群和低频群组成,⾼低频群各包含4个频率。⼀个⾼频信号和⼀个低频信号叠加组成⼀个组合信号,代表⼀个数字。DTMF信号有16个编码。利⽤DTMF信令可选择呼叫相应的对讲机。DTMF在对讲中⽤于发送开⻔指令(*键)。接入详见《RFC2833 - RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals》
4. 扩展协议
4.1 开锁协议
为了扩展功能,现在SIP基础上,通过SIP INFO⽅法(详见RFC 6086 - Session Initiation Protocol (SIP) INFO Method and Package Framework)来发送、接收⾃定义请求,由于⽬前SIP采⽤udp,可能会存在丢包,为了保证成功率,这⾥采⽤双包策略,即发送端同时发送2个请求(响应)包,接收端判断3秒内如果是同⼀个包(根据reqsn),则第⼆个包不做处理。请求⽅发送命令后,在3秒内未收到响应包,则认为请求失败,并返回给上层。为了尽量减少数据包⼤⼩,采⽤x-www-form-urlencoded格式。
公共头
需设置如下header
Content-Type:application/json
请求
参数 | 类型 | 必填 | 描述 |
req | string | 是 | 请求命令,值为unlock |
reqsn | int | 是 | 请求序列号,1-999范围内循环⾃增,每次请求加1,双包策略中第⼆个包reqsn不⾃增 |
示例:
{
"req":"unlock",
"reqsn":100
}
响应
参数 | 类型 | 必填 | 描述 |
res | string | 是 | 返回请求的命令,值为unlock |
reqsn | int | 是 | 返回请求的reqsn |
status | Int | 是 | 状态码,200成功,400以上失败 |
示例:
{
"res":"unlock",
"reqsn":100,
"status":200
}
5. 附录
《RFC 3261 - SIP: Session Initiation Protocol》 - https://tools.ietf.org/html/rfc3261
《RFC 4566 - SDP: Session Description Protocol》 - https://tools.ietf.org/html/rfc4566
《RFC 3550 - RTP: A Transport Protocol for Real-Time Applications》-https://tools.ietf.org/html/rfc3550
《RFC 3551 - RTP Profile for Audio and Video Conferences with Minimal Control》-https://tools.ietf.org/html/rfc3551
《RFC 5574 - RTP Payload Format for the Speex Codec》 - https://tools.ietf.org/html/rfc5574
《RFC 7587 - RTP Payload Format for the Opus Speech and Audio Codec》 -https://tools.ietf.org/html/rfc7587
《RFC 3984 - RTP Payload Format for H.264 Video》 - https://tools.ietf.org/html/rfc3984
《RFC 2833 - RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals》-https://tools.ietf.org/html/rfc2833
《RFC 6086 - Session Initiation Protocol (SIP) INFO Method and Package Framework》-https://tools.ietf.org/html/rfc6086