1、opensips安装
推荐使用make menuconfig图形化方式安装,不易出错,使用此方式先需要:
apt install gdb gcc automake autoconf libtool make bison bison-dev flex libncurses5-dev libmysqlclient-dev
再执行:
make menuconfig
勾选db_mysql,其他保持默认
vi /usr/etc/opensips/opensipsctlrc,把与mysql有关的注释去掉(USERCOL保留注释,USERCOL以上去掉注释,注意路径是否正确,SIP_DOMAIN也需要改为sipgw SIP ID的域)
在到opensips安装路径的sbin下执行:
./osipsconfig,选择ENABLE_TCP,USE_AUTH,USE_DBACC,USE_DBUSERLOC,USE_DIALOG,NAT
用生成的opensips_residential_xxx.cfg替换原先的opensips.cfg
vi /usr/etc/opensips/opensips.cfg (改listen地址和mpath,后者一般是/usr/lib/opensips/modules)
后到opensips安装目录sbin下执行:
./opensipsctl start
参考:https://www.cnblogs.com/bjzhanghao/archive/2013/02/13/2910903.html
2、opensips回复403问题
假设将opensips放到docker后,opensips本身IP为172.17.0.5,docker所在ubuntu的IP为192.168.31.47,外部的摄像头IP为192.168.31.183
外部摄像头若想向docker内的opensips发送register,则需要在ubuntu为docker建立端口映射,将docker内的opensips 5060端口映射到ubuntu的5060端口
那么摄像头在向opensips注册时,必定是向192.168.31.47的5060端口发送注册消息,注册消息通过端口映射到172.17.0.5的5060端口,此时opensips给摄像头回复的SIP消息会出现403 XXXXXdenied这种错误,经过查询有如下解释:
The SIP response '403 Not relaying' is sent because none of the domains in From URI and request URI is local IP (or hostname). For security reasons, either sender or destination must be a local user or service (using server's IP or hostnames), otherwise the instance can be used as open relay to target other hosts.
就是sip消息中From和to没有一个是本地IP,出于安全原因,发送方或目的地必须是本地用户或服务(使用服务器的IP或主机名)。否则kamailio就会作为其他主机的开放中继
参考:https://blog.csdn.net/qq_36069590/article/details/80927802
解决方式:
在opensips.cfg中加入:
advertised_address="public_ip"
alias="public_ip"
或者
listen=udp:private_ip:5060 as public_ip:5060 (这种方式可解决36秒问题和主叫方挂断被叫方不挂现象)
解决方式参考文章:https://blog.csdn.net/commander_officer/article/details/16946781
3、invite问题
说明:sipgw也是放在ubuntu内的docker中,假设其IP是172.17.0.6
上边注册通过后,sipgw会给opensips发送invite,opensips将invite转发给摄像头,此时摄像头可能会回复100 trying、101 dialog establishement、486 busy here,后边可能会有一些ack消息,但是数据都是空的,在之后sipgw又会再次去想opensips发送invite,摄像头又会恢复这些100 101 486这些消息
可能存在的问题:可能是由于invite时sdp消息内的ip是172.17.0.6,如果是这个IP的话,摄像头是无法通过172.17.0.6这个IP来找到sipgw的,所以需要两步:
1,更改sdp中传的IP为ubuntu的IP
2,将ubuntu中6000端口与sipgw的docker的6000端口做映射(摄像头与sipgw是用6000端口来传输视频数据)