由于项目需要呼叫中心回拨功能,要搭建一套回拨测试系统,实现系统回拨功能现记录如下:
一、系统搭建
系统选择主流的asterisk freepbx系统,为图方便,使用万能的freepbx。选用的镜像地址为:
https://hub.docker.com/r/jmar71n/freepbx/
Dockerfile如下:
FROM phusion/baseimage
MAINTAINER Jason Martin
# Set environment variables
ENV DEBIAN_FRONTEND noninteractive
ENV ASTERISKUSER asterisk
CMD ["/sbin/my_init"]
# Setup services
COPY start-apache2.sh /etc/service/apache2/run
RUN chmod +x /etc/service/apache2/run
COPY start-mysqld.sh /etc/service/mysqld/run
RUN chmod +x /etc/service/mysqld/run
COPY start-asterisk.sh /etc/service/asterisk/run
RUN chmod +x /etc/service/asterisk/run
COPY start-amportal.sh /etc/my_init.d/start-amportal.sh
# *Loosely* Following steps on FreePBX wiki
# http://wiki.freepbx.org/display/FOP/Installing+FreePBX+13+on+Ubuntu+Server+14.04.2+LTS
# Install Required Dependencies
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
apache2 \
autoconf \
automake \
bison \
build-essential \
curl \
flex \
git \
libasound2-dev \
libcurl4-openssl-dev \
libical-dev \
libmyodbc \
libmysqlclient-dev \
libncurses5-dev \
libneon27-dev \
libnewt-dev \
libodbc1 \
libogg-dev \
libspandsp-dev \
libsqlite3-dev \
libsrtp0-dev \
libssl-dev \
libtool \
libvorbis-dev \
libxml2-dev \
mpg123 \
mysql-client \
mysql-server \
openssh-server \
php-pear \
php5 \
php5-cli \
php5-curl \
php5-gd \
php5-mysql \
pkg-config \
sox \
subversion \
sqlite3 \
unixodbc-dev \
uuid \
uuid-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Replace default conf files to reduce memory usage
COPY conf/my-small.cnf /etc/mysql/my.cnf
COPY conf/mpm_prefork.conf /etc/apache2/mods-available/mpm_prefork.conf
# Install Legacy pear requirements
RUN pear install Console_Getopt
# Compile and install pjproject
WORKDIR /usr/src
RUN curl -sf -o pjproject.tar.bz2 -L http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2 \
&& tar -xjvf pjproject.tar.bz2 \
&& rm -f pjproject.tar.bz2 \
&& cd pjproject-2.4 \
&& CFLAGS='-DPJ_HAS_IPV6=1' ./configure --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr \
&& make dep \
&& make \
&& make install \
&& rm -r /usr/src/pjproject-2.4
# Compile and Install jansson
WORKDIR /usr/src
RUN curl -sf -o jansson.tar.gz -L http://www.digip.org/jansson/releases/jansson-2.7.tar.gz \
&& mkdir jansson \
&& tar -xzf jansson.tar.gz -C jansson --strip-components=1 \
&& rm jansson.tar.gz \
&& cd jansson \
&& autoreconf -i \
&& ./configure \
&& make \
&& make install \
&& rm -r /usr/src/jansson
# Compile and Install Asterisk
WORKDIR /usr/src
RUN curl -sf -o asterisk.tar.gz -L http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz \
&& mkdir asterisk \
&& tar -xzf /usr/src/asterisk.tar.gz -C /usr/src/asterisk --strip-components=1 \
&& rm asterisk.tar.gz \
&& cd asterisk \
&& ./configure \
&& contrib/scripts/get_mp3_source.sh \
&& make menuselect.makeopts \
&& sed -i "s/format_mp3//" menuselect.makeopts \
&& sed -i "s/BUILD_NATIVE//" menuselect.makeopts \
&& make \
&& make install \
&& make config \
&& ldconfig \
&& update-rc.d -f asterisk remove \
&& rm -r /usr/src/asterisk
COPY conf/asterisk.conf /etc/asterisk/asterisk.conf
# Download extra sounds
WORKDIR /var/lib/asterisk/sounds
RUN curl -sf -o asterisk-core-sounds-en-wav-current.tar.gz -L http://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-en-wav-current.tar.gz \
&& tar -xzf asterisk-core-sounds-en-wav-current.tar.gz \
&& rm -f asterisk-core-sounds-en-wav-current.tar.gz \
&& curl -sf -o asterisk-extra-sounds-en-wav-current.tar.gz -L http://downloads.asterisk.org/pub/telephony/sounds/asterisk-extra-sounds-en-wav-current.tar.gz \
&& tar -xzf asterisk-extra-sounds-en-wav-current.tar.gz \
&& rm -f asterisk-extra-sounds-en-wav-current.tar.gz \
&& curl -sf -o asterisk-core-sounds-en-g722-current.tar.gz -L http://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-en-g722-current.tar.gz \
&& tar -xzf asterisk-core-sounds-en-g722-current.tar.gz \
&& rm -f asterisk-core-sounds-en-g722-current.tar.gz \
&& curl -sf -o asterisk-extra-sounds-en-g722-current.tar.gz -L http://downloads.asterisk.org/pub/telephony/sounds/asterisk-extra-sounds-en-g722-current.tar.gz \
&& tar -xzf asterisk-extra-sounds-en-g722-current.tar.gz \
&& rm -f asterisk-extra-sounds-en-g722-current.tar.gz
# Add Asterisk user
RUN useradd -m $ASTERISKUSER \
&& chown $ASTERISKUSER. /var/run/asterisk \
&& chown -R $ASTERISKUSER. /etc/asterisk \
&& chown -R $ASTERISKUSER. /var/lib/asterisk \
&& chown -R $ASTERISKUSER. /var/log/asterisk \
&& chown -R $ASTERISKUSER. /var/spool/asterisk \
&& chown -R $ASTERISKUSER. /usr/lib/asterisk \
&& chown -R $ASTERISKUSER. /var/www/ \
&& chown -R $ASTERISKUSER. /var/www/* \
&& rm -rf /var/www/html
# Configure apache
RUN sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php5/apache2/php.ini \
&& cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig \
&& sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/apache2/apache2.conf \
&& sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
# Configure Asterisk database in MYSQL
RUN /etc/init.d/mysql start \
&& mysqladmin -u root create asterisk \
&& mysqladmin -u root create asteriskcdrdb \
&& mysql -u root -e "GRANT ALL PRIVILEGES ON asterisk.* TO $ASTERISKUSER@localhost IDENTIFIED BY '';" \
&& mysql -u root -e "GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO $ASTERISKUSER@localhost IDENTIFIED BY '';" \
&& mysql -u root -e "flush privileges;"
#Make CDRs work
COPY conf/cdr/odbc.ini /etc/odbc.ini
COPY conf/cdr/odbcinst.ini /etc/odbcinst.ini
COPY conf/cdr/cdr_adaptive_odbc.conf /etc/asterisk/cdr_adaptive_odbc.conf
RUN chown asterisk:asterisk /etc/asterisk/cdr_adaptive_odbc.conf \
&& chmod 775 /etc/asterisk/cdr_adaptive_odbc.conf
# Download and install FreePBX
WORKDIR /usr/src
RUN curl -sf -o freepbx.tgz -L http://mirror.freepbx.org/modules/packages/freepbx/freepbx-13.0-latest.tgz \
&& tar xfz freepbx.tgz \
&& rm freepbx.tgz
RUN cd /usr/src/freepbx \
&& /etc/init.d/mysql start \
&& mkdir /var/www/html \
&& /etc/init.d/apache2 start \
&& /usr/sbin/asterisk \
&& sleep 5 \
&& ./install -n \
&& fwconsole restart \
&& rm -r /usr/src/freepbx
WORKDIR /
文件多,但是方便,一键集成,运行命令为:
docker run --net=host -d -t jmar71n/freepbx
最简单的命令,使用的host模式,虽然有点偷懒的嫌疑但是最稳定的模式。
运行成功后直接浏览器输入物理机ip即可出现登录页面,设置好administrator的密码即可正常登录。
登录成功后就是配置了
1、配置号码
点击Application----->Extensions------>Add Extension
选择Chan_sip类型,填写注册用户名和密码以及关联用户即可。
2、设置trunk出口
依次点击Connectivity----->trunk-----add trunk trunk类型选择chan_sip
填写相关参数,主要为sip settings里面的内容。
3、设置路由
依次点击connectivity ---->outbound Routes
点击Add outbound route.
填写前缀以及trunk接口,若参数正确,注册分机应该可以正常呼出。
三、回拨配置
回拨可以通过asterisk ami接口实现,但是测试工作量较紧,查资料发现通过命令直接可实现,由于在docker容器中直接加入docker命令实现。
参考资料如下:
asterisk回拨脚本
originate SIP/1001 application AGI test.php|1|b
originate SIP/1001 extension XXXXXX@dialout
originate Local/159XXXXXXXX@from-internal extension XXXXXXX@dialout
shell 脚本如下:
#!/bin/bash
docker exec -it determined_minsky asterisk -x "channel originate Local/$1@from-internal extension $2@outbound-allroutes"
然后把此脚本用python封装,可以通过http调用:
# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from flask import Flask,request
import flask_restful
import os
app = Flask(__name__)
api = flask_restful.Api(app)
class HelloWorld(flask_restful.Resource):
@app.route('/api/callback/')
def callback():
phone1=request.args.get('phone1')
phone2=request.args.get('phone2')
result=os.system("sh call.sh"+" "+str(phone1)+" "+str(phone2))
return str(result)
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(port=9123,host='0.0.0.0')
测试:
http://192.168.32.251:9123/api/callback/?phone1=1800*****79&phone2=15*******3
完美!
参考链接:https://blog.csdn.net/ManagerUser/article/details/53837637