前提
EC20型号:EC20CEFAG-512-SGNS(mini-pcie接口)
额外配件:
1、4G模块转接板Mini PCIE转USB的卡座,卡座上有插SIM的地方
2、若干根IPEX转SMA转接线
3、SMA接口的4G天线
服务器:最好是虚拟机系统,如:exsi或者PVE。
1、部署ubuntu18.04虚拟机
2、安装Asterisk 16.23
3、安装Freepbx 16或者17
正题
1、PVE系统下检查EC20模块
1、打开PVE系统,使用shell进入。
关闭SIM卡的PIN,插入卡座,把EC20接上天线并通电,使用以下命令,查询EC20模块的usb端口
ls /dev/ttyUSB*
ttyUSB0
ttyUSB1 PCM语音,GPS信号
ttyUSB2 控制命令
ttyUSB3
安装picocom或者minicom软件与EC20模块进行通信
apt install picocom
或者
apt install minicom
命令如下
picocom -b 115200 /dev/ttyUSB2
或者
minicom -D /dev/ttyUSB2
输入ATI看一下EC20的版本号:
ATI
Quectel
EC20F
Revision: EC20CEFAGR08A03M4G
非必要:如果一切正常的话,可以先重置一遍EC20,以防上一个用户在卡内设置了错误的配置(但不要经常重置EC20,重置操作对dongle的闪存有损耗)。
重置模块
at+qprtpara=3
重启
AT+CFUN=1,1
重置并重启完后,可以通过以下命令检查一下SIM卡是否已经注册成功了(下面的例子是联通的,其他运营商同理):
AT+COPS?
+COPS: 0,0,"CHN-UNICOM",7
AT+QNWINFO
+QNWINFO: "FDD LTE","46001","LTE BAND 3",1650
AT+QENG="servingcell"
+QENG: "servingcell","CONNECT","LTE","FDD",460,01
注:电信3g已拆除,只有打开4g volte才能查看到楼上数据,so电信卡需要先配置VOLET,不然是没信号的。
配置VoLTE
打开ims AT+QCFG="ims",1
查看dongle内的mbn文件 AT+QMBNCFG="List"
+QMBNCFG: "List",0,1,1,"ROW_Generic_3GPP",0x05010824,201806201
+QMBNCFG: "List",1,0,0,"OpenMkt-Commercial-CU",0x05011510,201911151
+QMBNCFG: "List",2,0,0,"OpenMkt-Commercial-CT",0x0501131C,201911141
+QMBNCFG: "List",3,0,0,"Volte_OpenMkt-Commercial-CMCC",0x05012011,201904261
# 尽管这里列出了移动联通电信的VoLTE配置文件,但使用默认的自动选择CU/CT/CMCC并不能注册VoLTE,需要强制选择ROW_Generic_3GPP才能成功注册VoLTE。
关闭自动选择mbn文件 AT+QMBNCFG="AutoSel",0
反激活当前的mbn at+qmbncfg="deactivate"
强制选择3gpp AT+QMBNCFG="select","ROW_Generic_3GPP"
重启 AT+CFUN=1,1
可以再确认一下mbn的选择状态,如果ROW_Generic_3GPP的第二位和第三位都是1的话,说明dongle目前选择了这个配置 AT+QMBNCFG="List"
+QMBNCFG: "List",0,1,1,"ROW_Generic_3GPP",0x05010824,201806201
+QMBNCFG: "List",1,0,0,"OpenMkt-Commercial-CU",0x05011510,201911151
+QMBNCFG: "List",2,0,0,"OpenMkt-Commercial-CT",0x0501131C,201911141
+QMBNCFG: "List",3,0,0,"Volte_OpenMkt-Commercial-CMCC",0x05012011,201904261
重启完后检查ims的状态 AT+QCFG="ims"
如果返回的是 +QCFG: "ims",1,1 即为激活,如果是+QCFG: "ims",1,0 说明没有激活
可选(激活UAC数字音频),最好打开
在模块上启用 UAC,这是一个一次性设置,将在重启后继续有效
AT+QCFG="USBCFG"
如果未启用 UAC,将收到响应
“+QCFG:“usbcfg”,0x2C7C,0x0125,1,1,1,1,1,0,0”
请注意,产品代码后应有 7 位数字,可以是 1 或 0。最后一位是 UAC 参数,如果参数少于 7 位,则表示设备不支持 UAC。现在复制整个字符串,并将最后一位改为 1,然后发出新的命令。
AT+QCFG="USBCFG",0x2C7C,0x0125,1,1,1,1,1,0,1
现在 UAC 将启用,并且
aplay -L
应该会向您显示一个新的声音设备,如
hw:CARD=Android,DEV=0
Android, USB Audio
使用新的 quectel.conf 文件,取消注释并设置 quec_uac=1,同时取消注释 alsadevice 行(以下步骤会复制/uac/quectel.conf过去,所以这步可以跳过)
2、安装asterisk虚拟机
安装asterisk和一些依赖
首先更新系统并安装必要的依赖包:
apt update && apt upgrade -y
apt install -y wget build-essential subversion libedit-dev libjansson-dev libssl-dev libxml2-dev libncurses5-dev uuid-dev
(1)下载并安装稳定的 Asterisk 16
wget https://github.com/asterisk/asterisk/archive/refs/heads/16.23.zip
unzip 16.23.zip
cd asterisk-16.23
(2)运行 Asterisk 提供的依赖安装脚本:
contrib/scripts/install_prereq install
(以下命令时,它可能会提示输入国家电话代码,您可以提供您想要的内容。此脚本会自动安装缺失的依赖项,如 libpjproject)
(3)配置与编译
./configure
错误提示
Downloading https://raw.githubusercontent.com/asterisk/third-party/master/pjproject/2.10/pjproject-2.10.tar.bz2 to /tmp/pjproject-2.10.tar.bz2
目前没有直接从githubusercontent下载,可以搜索githubusercontent加速,把raw.githubusercontent.com进行替换。替换后先进行下载
手动下载 pjproject
进入到/tmp(读取是在这个文件夹)
cd /tmp
wget https://加速站替换地址/asterisk/third-party/master/pjproject/2.10/pjproject-2.10.tar.bz2 to /tmp/pjproject-2.10.tar.bz2
然后重新运行 configure
./configure --with-pjproject=/tmp/pjproject-2.10.tar.bz2
验证安装
成功配置后你应该能看到:
checking for PJPROJECT... yes
接着再进行编译
make
make install
make config
cp configs/samples/. /etc/asterisk
cd /etc/asterisk
find . -name "*.sample" -exec sh -c 'mv "$1" "${1%.sample}"' _ {} \;
设置 chan_quectel
cd
wget https://github.com/IchthysMaranatha/asterisk-chan-quectel/archive/refs/heads/master.zip
unzip master.zip
cd asterisk-chan-quectel-master
./bootstrap
./configure --with-astversion=16.23
make
make install
现在使用 将 quectel.conf 复制到 /etc/asterisk
cp uar/quectel.conf /etc/asterisk
确保在 quectel.conf 中为您的设备正确设置了音频端口(前面已经进行设置了)
重启asterisk
systemctl restart asterisk
进入asterisk的cli界面
asterisk -rvvv
输入
quectel show devices
即可看到识别到的dongle了,也能看到dongle的imei和SIM卡的imsi:
# asterisk -rvvv
Asterisk 16.16.1~dfsg-1+deb11u1, Copyright (C) 1999 - 2018, Digium, Inc. and others.
Created by Mark Spencer <[email protected]>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 16.16.1~dfsg-1+deb11u1 currently running on debian-asterisk (pid = 1403)
debian-asterisk*CLI> quectel show devices
ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number
quectel0 0 Free 27 0 0 CHN-UNICOM EC20F EC20CEFAGR06A15M4 86XXXXX 46XXXXX Unknown
debian-asterisk*CLI>
配置dialplan
直接参考驱动作者写的帖子,下载帖子里的sipext.zip,解压后放到/etc/asterisk下,同时修改一下/etc/asterisk/extensions.conf和sip.conf (请不要直接照抄!根据自己的实际情况和驱动作者的帖子修改)。
在 sip.conf 文件中,[70] 部分下,将主机 IP 地址更改为您 PC/笔记本电脑在家庭网络中的 IP 地址。然后将两个文件复制到 /etc/asterisk。
以下为本人使用的配置(IP段为192.168.1.0/24,freepbxip192.168.1.111),可以直接在/etc/asterisk进行修改。里面这2个文件其实都有的。
extensions.conf
[incoming-mobile]
#exten => _.,1,Dial(SIP/70/100)
#same => n,Hangup()
#exten => s,1,Set(CALLERID(name)=${CALLERID(num)})
#same => n,Dial(SIP/70)
; 来电处理
exten => s,1,NoOp(== 来电:${CALLERID(num)} ==)
same => n,Set(CALLERID(name)=${CALLERID(num)})
same => n,Dial(SIP/70,50) ; 尝试拨打 SIP 分机 70,最多 50 秒
same => n,Playback(vm-goodbye) ; 播放语音提示(可选)
same => n,Hangup()
; 短信处理
exten => sms,1,Verbose(SMS from ${CALLERID(num)})
same => n,System(/usr/local/bin/sms2bark.sh '${CALLERID(num)}' '${SMS_BASE64}')
same => n,Hangup()
; USSD 处理(如果你用 AT+CUSD 发 USSD 查询)
exten => ussd,1,Verbose(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
same => n,System(echo '${STRFTIME(${EPOCH},,%F %T)} - USSD: ${BASE64_DECODE(${$
same => n,Hangup()
[Outbound-1001]
exten => _.,1,Dial(Quectel/quectel0/${EXTEN})
same => n,Hangup()
sip.conf
[general]
context=sip-default
udpbindaddr=0.0.0.0:46000
tcpbindaddr=0.0.0.0:47000
tlsbindaddr=0.0.0.0:5063
tlscipher=ALL
tlsclientmethod=tlsv1
accept_outofcall_message=yes
allow=!all,slin,ulaw,alaw
allowguest=no
allowtransfer=yes
alwaysauthreject=yes
authfailureevents=no
autoframing=no
defaultexpiry=120
dumphistory=no
dynamic_exclude_static=no
faxdetect=no
g726nonstandard=no
jbenabled=no
jbforce=no
jbimpl=fixed
language=en
maxcallbitrate=384
maxexpiry=3600
minexpiry=60
notifycid=no
notifyhold=no
notifyringing=yes
preferred_codec_only=no
recordhistory=no
rtpholdtimeout=300
rtptimeout=30
sipdebug=no
srvlookup=no
tonezone=us
tos_audio=ef
tos_sip=cs3
tos_video=af41
videosupport=no
nat=force_rport,comedia
websocket_enabled=false
autodomain=no
allowexternaldomains=yes
tcpenable=yesy
tlsenable=no
tlsdontverifyserver=no
localnet=192.168.1.0/255.255.255.0
useragent=VitalPBX
callcounter=yes
tos_text=af41
cos_sip=3
cos_audio=5
cos_video=4
cos_text=3
recordonfeature=one_touch_rec
recordofffeature=one_touch_rec
vmexten=*97
outofcall_message_context=messages
auth_message_requests=no
transport=udp
[70]
context=Outbound-1001
description=ext70
dtmfmode=rfc2833
allow=!all,slin,alaw,ulaw
nat=force_rport,comedia
host=192.168.1.111
port=5060
insecure=port,invite
type=friend
qualify=no
修改完后再重启一次asterisk。
systemctl restart asterisk
设置BARK短信转发
在extensions.conf设置中其实已经把bark转发的一点点配置加入进去了。现在我们需要做个bark转发脚本。
在/usr/local/bin下面创建sms2bark.sh
cd /usr/local/bin
nano sms2bark.sh
sms2bark.sh
#!/bin/bash
# 来电号码(对方号码)
SENDER="$1"
# 短信内容(base64 编码)
MESSAGE_BASE64="$2"
# 你的手机号,用于标注“来自 xxx”
MY_NUMBER="199xxxxxxxx"
# Bark 推送地址(替换为你自己的推送 key)
BARK_URL="https://api.day.app/你自己的推送key"
# 解码短信内容
DECODED=$(echo "$MESSAGE_BASE64" | base64 -d 2>/dev/null)
# 最终短信内容 + 你自己的标记
FINAL_MSG="$DECODED
来自 $MY_NUMBER"
# 发起推送(title 是发信号码)
curl -s -G \
--data-urlencode "title=$SENDER" \
--data-urlencode "body=$FINAL_MSG" \
"$BARK_URL" >/dev/null
现在发条短信给你的ec20手机号码测试看看。。。不出意外,应该是可以成功收到。
Freepxb部分
去freepbx官网上下载freepbx的iso镜像(看起来是一个CentOS7):https://www.freepbx.org/downloads/。使用镜像安装系统,安装时选择freepbx 16 with asterisk 18。安装完后用浏览器访问虚拟机的IP,设置初始的管理员密码(最开始可以暂不打开防火墙,方便配置)。
添加分机号
在 Applications-Extensions 里,点击add extension- SIP extension,加一个200的extension(号码随意,只要不和asterisk虚拟机里的号码撞上了就行):
剩下部分保持默认,点submit,并点击一下右上角的apply config。
添加中继
添加之前,先按照前面的帖子的指引,修改asterisk虚拟机里的/etc/asterisk/sip.conf,把最底下70分机的host=192.168.x.x改成freepbx虚拟机的IP,重启asterisk。
在freepbx的中继里添加一个SIP(chan_pjsip)中继,配置如下,其他默认:
名字随意,outbound CallerID改成asterisk虚拟机那边设置的数值(70)
SIP server要改成asterisk虚拟机的IP,也就是将图片上10.16.X.X改成ubuntu18虚拟机的ip地址
路由
在出局线路里,新建路由,将出方向的路由都转发给前一步创建的SIP中继:
在入局线路里,新建路由,将入方向的路由都转发给分机上面设置的分机号:
如果未来连接了多个分机或者多个dongle,需要根据用户进行分流的话,可以详细配置上面的DID和CallerID来进行过滤。
测试通话
下载portsip uc,ios可以常驻后台
配置很简单的。不解释了。
其他
使用模块上网(未设置验证)
如果使用的手机卡包含流量,我们也可以一并配置模块的上网功能,以便在机器的有线/无线网络挂掉后,还能正常的转发短信和通话。
首先,在连上串口后输入
AT+QCFG="usbnet",1,
设置usbnet模式为ECM(1是ECM,2是NDIS,3是RNDIS)
接着,用
AT+CFUN=1,1
重启一下模块,随后查看ip a,应该能看到一个类似enxe2eeabcd123的接口,在这个接口上直接运行dhclient即可获取v4或v6地址。如果怕interface的名字经常变化,可以参考这个问题,把interface的名字根据MAC地址重命名成quectel-usbX这样方便管理的名字。
3: quectel-usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether ff:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff
inet 192.168.225.41/24 brd 192.168.225.255 scope global dynamic quectel-usb0
valid_lft 28802sec preferred_lft 28802sec
inet6 2408::/64 scope global dynamic mngtmpaddr
valid_lft forever preferred_lft forever
inet6 fe80::/64 scope link
valid_lft forever preferred_lft forever
该教程参考 使用EC20模块配合asterisk及freepbx实现短信转发和网络电话 ,感谢作者。
评论 (0)