EC20模块使用asterisk及freepbx实现短信转发和网络电话

EC20模块使用asterisk及freepbx实现短信转发和网络电话

记忆の风
2025-06-23 / 0 评论 / 6 阅读 / 正在检测是否收录...
前提

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虚拟机里的号码撞上了就行):
1750643217821.png
剩下部分保持默认,点submit,并点击一下右上角的apply config。

添加中继
添加之前,先按照前面的帖子的指引,修改asterisk虚拟机里的/etc/asterisk/sip.conf,把最底下70分机的host=192.168.x.x改成freepbx虚拟机的IP,重启asterisk。

在freepbx的中继里添加一个SIP(chan_pjsip)中继,配置如下,其他默认:
1750643302699.png

名字随意,outbound CallerID改成asterisk虚拟机那边设置的数值(70)
1750643328044.png
SIP server要改成asterisk虚拟机的IP,也就是将图片上10.16.X.X改成ubuntu18虚拟机的ip地址

路由
在出局线路里,新建路由,将出方向的路由都转发给前一步创建的SIP中继:
1750643664127.png

在入局线路里,新建路由,将入方向的路由都转发给分机上面设置的分机号:
1750643708217.png

如果未来连接了多个分机或者多个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

评论 (0)

取消