背景
项目上使用的是opensips(3.3.10)
+rtpengine(13.1.0.0+0~mr13.1.0.0 git-heads/mr13.0.1.2-3ac08574)
用做注册代理。
软电话通过opensips
注册到uas
, 按键进行ivr流程。
问题现象
软电话通过opensips
的外网ip
进行注册, 按键进行ivr流程, 按键无效,但是说话能识别。
uas
没有日志,所以不能通过日志分析问题。
排查分析
-
通过抓包发现按键信息确实发送给了
uas
,uas
也收到了按键消息,但是uas
没有响应。 -
切换到内网测试
opensips
,把opensips
转到同一个uas
上, 按键有效!!! -
通过对比纯内网和带外网的
opensips
的服务器上抓包,发现问题出在opensips
转发invite
信令。
sdp信息中的ip
是外网ip
, opensips
和uas
是纯内网交互,这个的ip
要是内网ip
。
解决方法
- 在
opensips.cfg
的t_on_branch("per_branch_ops")
请求rtpengine
获取sdp
信息时,传递media-address=内网ip
。 强制生成的sdp
信息中的ip
是内网ip
。
|
|
- 修改之后,验证成功,按键有效。
疑问: sip服务器
为何因为sdp
信息中的ip
是外网ip
而没有响应按键不得而知(第三方的,没人能解答)。
延伸
按键dtmf 类型
按键主要有三种类型,在抓包中的表现形式为:
- rfc2833
通过wireshark
抓包的sip
信令上,可以看到rfc2833
和语音RTP
流是分开的,能够很直观的区分.
点击此信令,能够看到的详细信息:
- inbound
inboud
按键和语音RTP
流是一起的, 无法区分。
通过播放该rtp流, 可以听到按键声音,也可以看到按键的波形。
- INFO
INFO
是指按键信息以SIP INFO
的方式发送,直接抓sip信令就能看到。
按键信息:
在INFO
的body
中,可以看到按键信息。
opensips 内外网ip的问题
使用opensips
做网关时, 比较重要的就是内外网ip的转换问题。 这里包括两个部分:
- sip信令中的
Record-Route
, 使用record_route_preset
不要用record_route
- sdp信息中的
c
, 使用media-address
设置。
以下列的sip信令为例:
需要修改的地方:
- 在转发
INVITE
给uas
时,Record-Route
要改成内网ip
,sdp
的c
改成内网ip
。 - 收到
uas
的183
或者200 OK
信令时, 转发给uac
时Record-Route
要改成外网ip
,sdp
的c
改成外网ip
。