需求:为opensips服务器开启或者关闭情况下,不影响手机A和手机B的linphone客户端通话。
1. 在linphone界面上输入B的ip地址进行呼叫。
2. 查看日志,发现INVITE消息的字段错误,
3. 修改linphone 设置(将domain设成B的ip地址而不是服务器的ip地址),模拟一个正确的INVITE消息,发起呼叫
4. 呼叫失败,抓包查看B端没有响应INVITE消息
5. 查看代码,暂时没有头绪。
6. 安装支持点对点通话的sip工具软件SipPhone
7. 通话抓包,分析linphone发出的INVITE消息,得知没有问题
8. 测试发现手机上安装的linphone软件点对点呼叫SipPhone时可以互通,虚拟机上的linphone点对点呼叫SipPhone不能互通。测试发现SipPhone点对点呼叫linphone时都不能互通。
9. 分析发现linphone虚拟机使用私有ip,地址为10.0.0.15,所以虚拟机发起呼叫,SipPhone接收到INVITE后,向10.0.0.15发送100和180响应,虚拟机接收不到,造成无法互通。
10. 放弃虚拟机测试,改用笔记本上usb连接手机进行测试和日志打印。
11. 因为linphone→SipPhone OK,SipPhone→linphone NOK,怀疑linphone呼叫发起处理流程支持点对点,而呼叫响应处理流程有问题。
12. 查看代码,打印日志,发现SipPhone发起呼叫时,linphone没有进入呼叫响应处理函数。
13. 怀疑INVITE包被底层丢掉。
14. 查看代码,追踪在哪里把INVITE包丢掉,没有结论。
15. 经检测确认为linphone没有进行端口侦听。
16. 查看注册代码、UDP通道代码,打印注册日志和非注册日志进行对比,没有发现端口设置代码。
17. 查看UDP的socket处理函数,jevent,jpipe,对比日志,没有发现设置端口的代码。
18. 写udp发包测试程序,发送到手机,抓包提示unreachable。可知udp发送无关。
19. 从udp通道open函数查找到listen_addr函数,查到端口是在linphone初始化时读取sip配置文件处设置。在该处设置udp端口为一个固定端口8309。
20. udp发包测试程序对B端该端口进行发包,可以到达。
21. A端呼叫B端端口,点对点呼叫建立,问题解决。