呼叫效果

一、Asterisk20编译和环境搭建

1.1、启动debain容器

docker run --name as --network host -t -d debian:bullseye

1.2.进入到容器

docker exec -it as bash

1.3、设置apt源

echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free" >> /etc/apt/sources.list

echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list

echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free" >> /etc/apt/sources.list

echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list

cat /etc/apt/sources.list

apt update

1.4、安装依赖环境:

apt install vim wget -y

apt-get install build-essential  libssl-dev libncurses5-dev libnewt-dev  libxml2-dev linux-headers-$(uname -r) libsqlite3-dev uuid-dev 

apt-get install gcc g++ make

apt install openssl=1.1.1*

apt-get install libcurl4-gnutls-dev ncurses-dev libssl-dev zlib1g-dev

apt-get install  autotools-dev unixodbc-dev libltdl3-dev

apt-get install  autotools-dev libltdl3-dev

apt-get install tdsodbc

apt-get install unixodbc

apt install python2.7

apt-get install libedit-dev

apt-get install uuid-dev

apt-get install libjansson-dev

apt-get install libxml2-dev

apt-get install libsqlite3-dev

apt-get install libmariadb-dev

apt install procps

apt install libopus-dev

apt install libcurl4

apt install libsrtp2-dev

apt install libmariadb-dev-compat

apt-get install xmlstarlet

apt install sngrep

1.5、下载源码

1.5.1下载asterisk源码

Index of /pub/telephony/asterisk/

网页下面的:

https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20.6.0.tar.gz

1.5.2 *下载pjproject:

手动下载

https://raw.githubusercontent.com/asterisk/third-party/master/pjproject/2.13.1/pjproject-2.13.1.tar.bz2

的pjproject-2.13.1.tar.bz2

放入到 /tmp/下面,不然./configure 会一直失败。

1.5.3 下载res_srtp源代码

下载在/usr/local/src/

wget Download srtp-1.4.4.tgz (libsrtp)

tar -xvf srtp-1.4.4.tgz

进入 srtp目录

执行配置

./configure

make && make install

1.6检查依赖:

./configure --with-opus --with-res_srtp

出现这个就意味着成功了

make menuselect

1.7、编译

make

这样编译成功

1.8 安装

make install

1.9 安装配置

make samples

1.9.1下载opus:

Index of /pub/telephony/codec_opus/

这里选择:

http://downloads.digium.com/pub/telephony/codec_opus/asterisk-20.0/x86-64/codec_opus-20.0_current-x86_64.tar.gz

在/usr/local/src下面下载

Wget http://downloads.digium.com/pub/telephony/codec_opus/asterisk-20.0/x86-64/codec_opus-20.0_current-x86_64.tar.gz

解压:

tar -xvf codec_opus-20.0_current-x86_64.tar.gz

进入目录下,把so库拷贝到lib库里面

cp codec_opus.so /usr/lib/asterisk/modules/

cp codec_opus_config-en_US.xml /var/lib/asterisk/documentation/thirdparty/

1.9.2 添加模块

添加/etc/asterisk/modules.conf 

load => res_srtp.so
load => codec_opus.so

二、启动配置

2.1 启动

asterisk

asterisk -rcvvvvvddddd

进入命令模块

exit 退出命令模式

2.2 重启

在命令模式下,输入core restart now

2.3 查询依赖库

进入命令模式

module show like res_http_websocket.so

module show like res_pjsip_transport_websocket.so

module show like codec_opus.so

module show like res_crypto.so

module show like res_srtp.so

2.4修改时区

输入命令:tzselect

选择Asia->china->beijing 按文字提示输入数字,最后yes

然后copy 下面的文件替换

 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

输入date -R  时间就是这边的时间了。

三、数据库配置

3.1安装odbc的mysql驱动

下载驱动

wget https://downloads.mysql.com/archives/get/p/10/file/mysql-connector-odbc-8.0.19-linux-debian10-x86-64bit.tar.gz

解压

tar -xv -f mysql-connector-odbc-8.0.19-linux-debian10-x86-64bit.tar.gz

mkdir /usr/local/mysql-connector-odbc

cp -r mysql-connector-odbc-8.0.19-linux-debian10-x86-64bit/* /usr/local/mysql-connector-odbc

创建数据库 asterisk

查询下面的数据表建立数据

/usr/local/asterisk/asterisk20/contrib/realtime/mysql/mysql_config.sql

添加一个2007的账号,账号密码都为2007

insert into ps_aors (id, max_contacts,remove_existing) values (2007, 1,'yes');

insert into ps_auths (id, auth_type, password, username) values (2007, 'userpass', 2007, 2007);

insert into ps_endpoints (id, transport, aors, auth, context, disallow, allow, direct_media,rtp_symmetric,rewrite_contact,force_rport,asymmetric_rtp_codec) values (2007, 'transport-udp', '2007', '2007', 'default', '', 'ulaw|alaw|opus|gsm|g726|g729|vp8|h264|h265', 'no','yes','yes','yes','yes');

给cdr表添加一个字段

calldate datetime

不然插入坐席的时候 会失败。

ALTER TABLE cdr ADD COLUMN calldate DATETIME DEFAULT CURRENT_TIMESTAMP;

3.2 配置文件

#vi /etc/odbc.ini

[asterisk]

Description = Test asterisk

Driver = /usr/local/mysql-connector-odbc/lib/libmyodbc8a.so

SERVER = 172.17.0.1

PORT = 3306

DATABASE = asterisk

USER = root

PASSWORD = 12345

OPTION = 67108864

SocketBufferSize = 4096

FetchBufferSize = 100

CHARSET = UTF8

#vi /etc/asterisk/res_odbc.conf

[asterisk]

enabled => yes

dsn => asterisk

;username => root

;password => 123456

pre-connect => yes

#vi /etc/asterisk/sorcery.conf

[res_pjsip]

endpoint=realtime,ps_endpoints

auth=realtime,ps_auths

aor=realtime,ps_aors

domain_alias=realtime,ps_domain_aliases

contact=realtime,ps_contacts

[res_pjsip_endpoint_identifier_ip]

identify=realtime,ps_endpoint_id_ips

#vi /etc/asterisk/extconfig.conf

[settings]

ps_endpoints => odbc,asterisk

ps_auths => odbc,asterisk

ps_aors => odbc,asterisk

ps_domain_aliases => odbc,asterisk

ps_endpoint_id_ips => odbc,asterisk

ps_contacts=>odbc,asterisk

ps_registrations=>odbc,asterisk

#vi /etc/asterisk/modules.conf

preload = res_odbc.so

preload = res_config_odbc.so

noload = chan_sip.so

#vi /etc/asterisk/pjsip.conf

[transport-udp]

type=transport

protocol=udp    ;udp,tcp,tls,ws,wss

bind=0.0.0.0

external_media_address=192.168.20.29

external_signaling_address=192.168.20.29

配置cdr通话记录

vim /etc/asterisk/cdr_odbc.conf

[global]

dsn=asterisk

loguniqueid=yes

dispositionstring=yes

table=cdr               ;"cdr" is default table name

usegmtime=no             ; set to "yes" to log in GMT

hrtime=yes              ;Enables microsecond accuracy with the billsec and duration fields

newcdrcolumns=yes ; Enable logging of post-1.8 CDR columns (peeraccount, linkedid, sequence

重启服务

在命令模式下,输入core restart now

#./asterisk -vvvvc

pjsip show endpoints

输出如果有object了那么就ok了。

3.3 配置呼叫计划

#vi /etc/asterisk/extensions.conf

在文件的末尾,添加如下代码,注意exten => _2XXX,1,NoOp()中的_2XXX只的是账号的2000端,这个错了的话,无法呼叫成功的。

[default]

exten => _2XXX,1,NoOp()

same => n,Dial(PJSIP/${EXTEN})

如果全部号码都接入那么exten修改为

exten => _X.,1,NoOp()

打开 Asterisk 的配置文件 logger.conf,通常位于 /etc/asterisk/logger.conf

增加

debug => notice,warning,error,debug

保存

输入命令:logger reload

3.4 配置彩铃

3.4.1 音频格式

把相应的材料转换为 xxx.gsm格式 或者xxx.g729  ,具体格式看你写的端点支持的格式

比如文件名dingding.gsm

在/var/lib/asterisk/sounds 目录下创建目录 dingding

并且把dingding.gsm拷贝到dingding下面

如 mkdir dingding

cp dingding.gsm /var/lib/asterisk/sounds/dingding/

3.4.2加铃声配置

 vim /etc/asterisk/musiconhold.conf

[ding]

mode=files

directory=/var/lib/asterisk/sounds/dingding

3.4.3 修改呼叫计划

增加呼叫彩铃

vim /etc/asterisk/extensions.conf

修改任意的号码都接入

[default]

exten => _X.,1,NoOp()

same => n,Dial(PJSIP/${EXTEN},,m(ding))  #呼叫时候增加背景彩铃

same=> n,Hangup()

重启之后你就能够正常听见彩铃了。

3.5 配置web

vim  /etc/asterisk/http.conf

enabled=yes

bindaddr=0.0.0.0      #0.0.0.0表示本机的所有IP都可以访问

bindport=8088 #登陆服务器的端口

enablestatic=yes

vim /etc/asterisk/manager.conf

 [general]

 enabled = yes

 webenabled = yes

 port = 5038

 bindaddr = 0.0.0.0  

 [admin]              #登录时的账户名称

 secret=admin         #登录时的账户密码

 read = system,call,log,verbose,command,agent,config,read,write,originate

 write = system,call,log,verbose,command,agent,config,read,write,originate

http://192.168.20.29:8089/httpstatus

显示如下:

四、演示效果

命令模式下重启:

core restart now

下载程序linephone

呼叫,开始出现铃声。

对方接听后,出现如下画面。

五、部署

此步骤是方便后期移植部署

5.1导出镜像快照

docker export -o as_debian_240223.tar as

当前目录下会存在 as_debian_240223.tar

5.2 加载镜像快照

docker import as_debian_240223.tar as:1.0.0

修改名称

docker image tag [id] as:base

可以看到咱们得镜像已经好庞大了 3.1GB ,因为我把代码和编译等一系列工具都放进去了,后面感觉大了可以自己裁剪,删除相关代码工具,还有一些比如日志、配置等可以采取映射的方式到宿主机。

5.3  自定义镜像

新建文件:

Dockerfile

内容:

FROM as:1.0.0

#EXPOSE 5060 

#添加时区环境变量,上海

ENV TimeZone=Asia/Shanghai

CMD asterisk && tail -f /var/log/asterisk/debug

as:1.0.0为本地镜像,需要docker images 能够查询到对应的数据。

在当前目录执行文件

docker build -t as:1.0.1 .

可以看到

5.4 宿主机增加配置

 mkdir -p  /usr/local/as/etc

 mkdir -p  /usr/local/as/log

在etc下面创建odb.ini

把之前的内容填写进来。

[asterisk]

Description = Test asterisk

Driver = /usr/local/mysql-connector-odbc/lib/libmyodbc8a.so

SERVER = 172.17.0.1

PORT = 3306

DATABASE = asterisk

USER = root

PASSWORD = 12345

OPTION = 67108864

SocketBufferSize = 4096

FetchBufferSize = 100

CHARSET = UTF8

创建 pjsip.conf

#vi pjsip.conf

[transport-udp]

type=transport

protocol=udp    ;udp,tcp,tls,ws,wss

bind=0.0.0.0

external_media_address=192.168.20.29

external_signaling_address=192.168.20.29

六 执行

直接使用主机的网络。【推荐】

docker run --name=assip \

-v /usr/local/as/etc/odbc.ini:/etc/odbc.ini \

-v /usr/local/as/etc/pjsip.conf:/etc/asterisk/pjsip.conf \

-v /usr/local/as/log:/var/log/asterisk \

  -itd --net=host --restart=always as:1.0.1 

采用映射端口(映射端口太多容易卡死)

docker run --name=as1 \

-v /usr/local/as/etc/odbc.ini:/etc/odbc.ini \

-v /usr/local/as/etc/pjsip.conf:/etc/asterisk/pjsip.conf \

-v /usr/local/as/log/:/var/log/asterisk/ \

-p 5060:5060 -p 10000-20000 -p 5038:5038 -p 5039:5039 -p 8089:8089 \

  -itd  --restart=always as:1.0.1

指定容器名为as1

运行镜像 as:1.0.1

然后采用客户端连接上可以正常使用了,可以语音可以视频,网络好的情况都是比较流畅的,而且接上了数据库可以自我改造

建议采用客户端,开源还可以自己改造

linephone

Linphone open source VoIP SIP softphone - voice, video and instant messaging

七、相关的资源包下载:

https://download.csdn.net/download/p731heminyang/88868795

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐