背景
项目上使用的是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。