DIY自己的电话呼叫转移
购买理由
由于最近工作生活的地区联通信号极差,移动信号却还尚可,但笔者主力卡又是联通,所以需要转发联通卡的通话和短信到移动的手机。搜索发现,之前的方案均需要安装在手机上,且都只能转发短信,对通话还是无法实现。为了解决上述的这些问题,本文笔者基于树莓派和EC20和东拼西凑的软件,实现了基于其他即时通讯软件的短信转发,并通过SIP客户端从互联网呼出和接听电话。
其他方案
GOIP设备
笔者在调研的时候发现很多推荐GOIP设备的,但再继续搜索之后发现能买到的价格实在太贵,而且好像这个设备因为一些特殊原因正在被下架
GSM Dongle
还有一些基于2g的通话网络的usb dongle也能实现通话的呼叫转移,但现在已经2023年了,5G都已经很完善了,似乎2G貌似在逐渐退网,现阶段VoLTE还是有必要的所以这个方案也被放弃了。
三方SIM托管服务
在搜索过程中发现早些年运营商自己和一些三方服务提供商都有这类的服务,但也是由于种种原因现在已经不对外提供服务了,所以这条路也就断了
选择方案介绍
首先是价格要便宜,能够旧物利用就最好,笔者最后选用了落灰已久的树莓派3b加Quectel EC20(移远出品的一款4G卡,支持LTE Cat4,使用Snapdragon X5 LTE Modem,这个卡有很多个版本,有部分版本只带上网功能,不能接打电话和发短信。如果需要收发短信和打电话,请尽量购买最高级的EC20CEFAG-512-SGNS,买mini-pcie接口的 ,移远的淘宝店买大概200一片,闲鱼购买大约50-60一片)的方案。
树莓派安装FreePBX+Asterisk,配置SIP服务进行网络通话的实现。
实现过程
关闭SIM卡的PIN,插入卡座,把EC20接上天线并通电,此时应该可以在/dev里看到若干个ttyUSB端口:
ttyUSB0
ttyUSB1 PCM语音,GPS信号
ttyUSB2 控制命令
ttyUSB3
使用minicom打开ttyUSB2端口
minicom -D /dev/ttyUSB2
# 输入ATI看一下EC20的版本号:
ATI
Quectel
EC20F
Revision: EC20CEFAGR06A15M4G
如果一切正常的话,可以先重置一遍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",1825
AT+QENG="servingcell"
+QENG: "servingcell","NOCONN","LTE","FDD",460,01,XXXXXXXXXX
开启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 说明没有激活
安装依赖
apt update
apt install vim minicom adb git autoconf automake libsqlite3-dev build-essential libasound2-dev alsa-utils
安装驱动
apt-get install raspberrypi-kernel-headers
git clone bacnh85/Quectel_Linux_USB_Driver.git
cd Quectel_Linux_USB_Driver/
make
make install
asterisk-chan-quectel
git clone IchthysMaranatha/asterisk-chan-quectel
cd asterisk-chan-quectel
./bootstrap
./configure --with-astversion=16
make
make install
随后把uac/quectel.conf复制到/etc/asterisk里。并通过systemctl restart asterisk重启asterisk。
输入asterisk -rvvv进入asterisk的cli界面并输入quectel show devices即可看到识别到的dongle了,也能看到dongle的imei和SIM卡的imsi:
asterisk -rvvv
Asterisk 16.21.1, Copyright (C) 1999 - 2021, Sangoma Technologies Corporation and others.
Created by Mark Spencer <markster@digium.com>
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.21.1 currently running on raspbx (pid = 3900)
-- Remote UNIX connection
raspbx*CLI> quectel show devices
ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number
quectel0 0 Free 20 0 0 CHN-UNICOM EC20F EC20CEFAGR06A17M4 86XXXX XXX +861XXXXXX
配置dailplan
直接参考驱动作者写的文章,下载文章里的sipext压缩包,解压后修改一下extensions.conf(请不要直接照抄!根据自己的实际情况和驱动作者的文章修改)然后粘贴到/etc/asterisk/extensions.conf 最后面:
全部修改完重启一次系统
在FreePBX网页上添加分机号
在 Applications-Extensions 里,点击add extension- SIP [pjsip_chan] extension,加一个200的extension(号码随意,只要不和asterisk虚拟机里的号码撞上了就行)
添加Trunk
添加之前,先按照本文前面的说明,修改/etc/asterisk/sip_custom.conf,把最底下70分机的host=192.168.x.x改成树莓派的IP,重启。
在FreePBX的Connectivity-Trunks里添加一个(pj)SIP Trunk,配置如下,其他默认:
Connectivity-Outbound Routes
Connectivity-Inbound Routes
测试通话
载一个免费版的zoiper,添加账户的时候用户名输入分机号@freepbx的IP,密码即上面设置的密码(注意不要输错了,freepbx默认有打开fail2ban,输错SIP密码也会触发fail2ban,还需要手动去删除iptables规则)。
确认注册上了之后可以尝试通过zoiper呼出到10010或者是自己的电话,测试一下语音和按键的DTMF音有被识别到。如果是外部呼入dongle里的号码的电话,呼入到freepbx之后会被直接转移给分机,此时zeoiper会有提示,直接点接听即可。
使用感受
在不打开SIP客户端时,打到dongle上的电话会提示用户忙,Zoiper付费版是支持push notification服务的,可以实现来电推送通知,用户点击通知进入Zoiper注册分机并接听,减少因为长时间待机的大量电池消耗。
总结
整体配置下来花了不到100元的成本基本满足了通话呼叫转移的目的,使用体验还可以继续完善,这里先挖个坑,后面慢慢填。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
乐唯静
校验提示文案
max2000
校验提示文案
忧伤的豹子
大哥您的要求,似乎可以这样:
1. 携号转网。
2. 买移动卡和相应的支持移动卡的手机(或者看看电信的卡和手机)。
3. 搬家吧!(这什么地方啊,信号这么差?买移动卡或移动手机会很不方便?要是那样,就搬家吧,不信大哥您比我这个穷屌丝还混的惨,不信!)
校验提示文案
落霞艳
除了打电话没办法,收发短信还是可以的
校验提示文案
值友1153823688
校验提示文案
我勒个去啦
校验提示文案
我勒个去啦
校验提示文案
值友1153823688
校验提示文案
落霞艳
除了打电话没办法,收发短信还是可以的
校验提示文案
忧伤的豹子
大哥您的要求,似乎可以这样:
1. 携号转网。
2. 买移动卡和相应的支持移动卡的手机(或者看看电信的卡和手机)。
3. 搬家吧!(这什么地方啊,信号这么差?买移动卡或移动手机会很不方便?要是那样,就搬家吧,不信大哥您比我这个穷屌丝还混的惨,不信!)
校验提示文案
乐唯静
校验提示文案
max2000
校验提示文案