准备工作
将fs的配置文件从docker内部copy到外部,方便修改
现在我们只需要在容器外部即可通过ide或者更直观的方式修改fs的配置文件了…我不是vm大神
30秒自动挂断问题
上一节我们看到在刚注册的默认的分机中1000打到1001的时候,接通之后30秒就自动挂断了,原因是什么呢,其实是由于sip消息地址不对引起的。
- 我们通过命令查看一下sofia的地址
可以看到是113.248.5.182,
我们再看一下全局变量里的东西,然后搜一下2个全局变量external_rtp_ip和external_sip_ip
接着我们改一下日志级别,执行命令
console loglevel 7
然后我们打开sip追踪日志,执行命令
sofia profile internal siptrace on
接着我们在用1000给10001打一个电话试一下,会看到比刚才更多的信息打印出来了。
我们可以看到在协议中,出现了这个ip地址,这特喵明显是个外网地址啊。
ok,为啥contact和via里的1000的会被替换成这个ip呢,直接上终极大杀器sngrep
apt-get install sngrep
sngrep是一个实时可视化sip抓包工具,具体用法自己搜索。
重新打个电话,用sngrep检测一下。结果:
可以看到在fs给1000发183后contact被替换成了113.248.5.182,导致fs收不到1000返回的ack,于是出现了一个的现象:1000给113.248.5.182发ack,fs收不到就一直发送200 OK,然后就gg了。
解决方案
这个地方,可以看到,ext-rtp-ip和ext-sip-ip使用的是全局的external_rtp_ip和external_sip_ip,怎么改呢,注释掉这两行代码即可。
然后重启即可。
重启之后问题依旧存在,不过那个外网ip已经不存在了。所以怀疑端口问题,修改conf/autoload_configs/switch.conf.xml文件,找到
将这两行注释干掉,同时改成
,在docker-compose文件中将端口映射出去试试,
,重新启动容器再试一下。
最后发现还是不行,用sngrep抓包查看。
发现fs在1000回183的时候带的contact是fs的容器内的地址,1000想回ack也找不到这个地址啊,不过由于我们把internal.xml里面的ext-sip-ip改成我们的容器外的局域网地址。就像这样:
再打个电话看看,ok,30秒不挂断了。然后用sngrep抓个包看看。
contact已经变成了我们的宿主机的局域网地址了。
发现没声音,一样的,只需要把ext-rtp-ip也改成我们的局域网ip就行了。
完结,撒花🎉