IM音视频通信开发(1)
最近在做的一个项目是从头开始的一个音视频开发,由于以前大家完全没有相关的经验,做出来花了不少功夫,记录一下流程
大体框架:
客户端使用的是开源的pjsip,服务器用的开源的opensips服务器,nat穿越使用的是restund,其中视频群聊还用到了nginx搭建推拉流服务器。
开发环境:
ubutun 14 AS3.0 android-ndk-r14
软件环境:
pjsip2.7.2 retund0.4.12
首先是服务器opensips的搭建:
一、去opensips官网下载最新版的opensips源码,我这边的版本是opensips2.4.1
二、将以上源码解压至/root
三、安装mysql数据库,通过apt-get直接获取,没有联网的兄弟可以下载mysql安装包手动安装
四、解压源码压缩包,cd opensips-2.4.1/
五、
<1> make all
<2> apt-get install libncurses5-dev(这个是一个界面化的库,主要是为了方便后面去界面安装opensips)
<3> make menuconfig
<4>在menuconfig中选择—>Configure Compile Options—> Configure Excluded Modules
按q键返回上一级,选择—> Configure Install Prefix,输入/usr/local/opensips_proxy后按回车表示安装在/usr/local/opensips_proxy目录下。(这个目录自己需要先建立)
选择 —> Save Changes 保存修改。
按q返回,选择 —> Compile And Install OpenSIPS,回车安装。
至此,opensips安装第一步已经完成
三、配置opensips
进入先前设置的Configure Install Prefix目录(默认是/usr/local/opensips)下的sbin目录。如:/usr/local/opensips/sbin/,此处的目录是你自己事先已经指定的目录,(这是以前版本安装完成后不会自动打开界面的处理流程),2.7中opensips安装完成后会直接打开界面,直接选择Generate OpenSIPS Script --> Residential Script --> Configure Residential Script,
按空格键,选择:
[*] ENABLE_TCP
[*] USE_ALIASES
[*] USE_AUTH
[*] USE_DBACC
[*] USE_DBUSRLOC
[*] USE_DIALOG
[*] USE_NAT
按q退出返回上一级界面,选择:Save Residential Script,保存设置。
再选择:Generate Residential Script,生成脚本。
这里一定生成opensips_XX_XX.cfg,文件,如果没有生成说明执行有问题,必须重新开始
2、配置opensips.cfg脚本
进入/usr/local/opensips_proxy/etc/opensips目录,可以看到刚才生成的脚本文件
运行下面命令,把刚生成的脚本文件覆盖原来的脚本文件:opensips.cfg
mv opensips_residential_xxx.cfg opensips.cfg
编辑脚本文件:opensips.cfg
$sudo vi opensips.cfg
修改下面的代码:
- /* uncomment the next line to enable IPv6 lookup after IPv4 dns
- lookup failures (default disabled) */
- #dns_try_ipv6=yes
- /* comment the next line to enable the auto discovery of local aliases
- based on revers DNS on IPs */
- auto_aliases=no
- listen=tcp:127.0.0.1:5060 # CUSTOMIZE ME
- listen=udp:127.0.0.1:5060 # CUSTOMIZE ME
- ####### Modules Section ########
- #set module path
- mpath="/usr/opensips//lib64/opensips/modules/"
修改红p为服务器的IP地址,tcp和udp都要修改,端口号为需要监听的socket端口号,保存退出。
3、配置opensipsctlrc脚本
编辑脚本文件:opensipsctlrc(脚本文件还是在/usr/local/opensips/etc/opensips目录)
$ sudo vi opensipsctlrc
修改SIP_DOMAIN为服务器的ip地址:
- ## your SIP domain
- SIP_DOMAIN=xxx.xxx.xxx.xxx
去除下面代码的注释:
- DBENGINE=MYSQL
- DBHOST=localhost
- DBNAME=opensips
- DB_PATH="/usr/local/etc/opensips/dbtext"
- DBRWUSER=opensips
- DBRWPW="opensipsrw"
- DBROOTUSER="root"
- USERCOL="username"
保存退出
这边的DBRWPW的密码最好不要修改,因为我们在修改的时候发现在opensips创建库并生成表的时候会生成另外一个临时文件,这个文件中的密码是刚开始生成目录的时候去读的,而登陆数据库的密码默认用的是这个文件中的密码,如果修改了数据库的密码然后起服务的时候回去读opensipsctlrc这个文件中的密码,然后会提示失败access denied。
四、新建opensips数据库
进入/usr/opensips/sbin目录
运行命令:
$ ./ opensipsdbctl create
在创建数据库的过程中,会提示需要设置数据库的密码。
五、创建用户
创建opensips的用户,用于拨打电话使用。
$ opensipsctl add 12345 12345
前面的12345为用户名,后面的12345为密码
六.启动服务并检验
修改日志文件配置,是opensips的日志保存在/var/log/opensips.log
touch /var/log/opensips.log sudo chmod 777 /var/log/opensips.log sudo vi /etc/rsyslog.d/opensips.conf
增加如下内容
local0.* /var/log/opensips.log
重启syslog服务,启动opensips
service rsyslog restart
/usr/local/opensips_proxy/sbin/opensipsctl start
至此,opensips服务启动成功。
异常情况:
1、如果启动失败,查看/var/log/opensips.log文件查找错误.
服务启动后,防火墙开启tcp及udp的端口
iptables -I INPUT -p tcp –dport 5060 -j ACCEPT
iptables -I INPUT -p udp –dport 5060 -j ACCEPT
iptables-save
2、
通过日志查看mysql.sock的路径配置错误,所以需要配置mysql.sock的路径;其中opensips中已经固定死路径(就在/var/lib/mysql/mysql.sock下),所以需要修改mysql中mysql.sock的路径。
修改配置my.cnf文件
============================================
[client]
socket =/var/lib/mysql/mysql.sock
[mysqld]
socket = /var/lib/mysql/mysql.sock
============================================
修改/etc/my.cnf
执行 # chown -R mysql:mysql /var/lib/mysql
3、
如果出现 Jun 4 13:34:36 OpenSIPS /sbin/opensips[53232]: ERROR:db_mysql:db_mysql_connect: driver error(1045): Access denied for user 'opensips'@'localhost' (using password: YES)
解决方法:
mysql> grant all privileges on opensips.* to [email protected] identified by 'opensipsrw';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
重新启动OpenSIPS
[[email protected] ~]# opensipsctl start
4、
还有可能遇到:Access denied for user 'root'@'%'问题:
一·解决办法
- 第一步:停服务
- 命令行:
- /etc/init.d/mysql stop
- 如果不行,就执行下一行:
- service mysqld stop
- 报:
- Stopping mysqld: [ OK ]
- 第二步:跳过密码验证
- 执行命令行:
- # /usr/bin/mysqld_safe --skip-grant-tables
- 报:
- 151104 09:07:56 mysqld_safe Logging to '/var/lib/mysql/iZ23dq2wm0jZ.err'.
- 151104 09:07:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
- 第三步:无密码登录
- 执行命令行:
- mysql -u root
- 第四步:授权
- mysql>
- grant all privileges on *.* to 'root'@'localhost' identified by 'root' with grant option;
- 关键词解释:
- root'@'localhost:是用户
- root:是密码
- 问题一:发现无密码条件下,没有授权的写权限
- The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
- 解决方法:
- mysql> set global read_only=0;//(关掉新主库的只读属性)
- mysql>flush privileges;
- grant all privileges on *.* to 'root'@'localhost' identified by 'root' with grant option;#再次重新授权
- mysql>set global read_only=1;//(读写属性)
- mysql>flush privileges;
- mysql>exit;
- (注意刷新是必须项)
- 第五步:重启数据库
- service mysqld stop
- 报:
- Stopping mysqld: [ OK ]
- service mysqld start
- 报:
- Starting mysqld: [ OK ]
- 或者
- service mysqld restart
以上的坑都是我安装的时候遇到的,其中大部分都比较分散,在这边我集中一波