使用gammu-smsd和EC20发送和接受短信以及短信转发
去年买了几个EC20模块准备放到吃灰的几个机顶盒上用来收发短信和语音,后来因为短信不支持纯volte的运营商而被闲置,如今又有时间和其它运营商的电话卡,所以可以拿出来玩一下了.
硬件准备
- EC20模块
- 转接板
- 一个带有usb接口的armbian/debian/ubuntu/openwrt设备(电脑/机顶盒/树莓派/路由器都可以)
首先是模块,EC20有好多版本和型号,各型号的主要区别是内存以及功能,有一些没有语音/GNSS之类的,有些内存是256m/512m
这里提供一个当前移远在售的EC20 MINIPCIE型号和功能表格
型号 | 数据 | 语音 | 短信 | GNSS | 分集天线 | 内存 |
---|---|---|---|---|---|---|
EC20CEHDLG-MINIPCIE-C | Y | Y | Y | N | N | 128M |
EC20CEHCLG-MINIPCIE-CB | Y | N | Y | N | N | 128M |
EC20CEHCLG-MINIPCIE-C | Y | Y | Y | N | N | 128M |
EC20CEFlILG-MINIPCIE-C | Y | Y | Y | Y | N | 128M |
EC20CEFHLG-MINIPCIE-CB | Y | N | Y | N | Y | 128M |
EC20CEFRSG-MINIPCIE-C | Y | Y | Y | Y | Y | 256M |
EC20CEFRG-MINIPCIE-C | Y | Y | Y | Y | Y | 512M |
需要注意的是这些是移远现在还在卖的版本,其实在很多代理商以及二手交易平台还有一些旧版本可以买到
根据移远所提供的型号表格,看起来结尾是CB的不支持语音,其它的则支持,但这也是我个人的猜测
此外还需要注意的是固件版本问题,移远官方只为直接从他们那里购买的用户提供固件,从第三方购买的只能看卖家有没有固件.
低版本固件不支持cdma以及纯volte的运营商收发短信,所以买回来基本只能用于上网和语音.
再有就是转接板,当然,如果你的机器有minipci-e接口以及sim卡槽可以直接插上试试,否则的话还是建议直接买usb转接板,可以去二手平台买,价格不贵,有一些usb协议但不是标准usb接口的转接板最低5块钱一片,但这种需要拿回来自己搞清接口定义然后接线.
本文的场景是以含有转接板为例的
设备这里以刷armbian的机顶盒为例
EC模块初始化和配置
将含有模块的转接板插到USB口之后使用命令ls /dev/ttyUSB*
查看当前系统中的tty模拟usb的设备,如果当前机器只有ec20模块的话大概会看到ttyUSB1
/ttyUSB2
/ttyUSB3
,有些还会有ttyUSB4
甚至更高,根据移远文档的说明,通常ttyUSB2
是AT命令口,这也是本文主要用到的接口.
确定转接板链接正常后通过apt install minicom
安装minicom然后通过命令minicom -D /dev/ttyUSB2
连接到模块执行AT命令
输入ATI
按回车可以看到模块返回的模块信息,大概如下
Quectel
EC20F
Revision: EC20CEFAGR06A10M4G
需要注意的是有些模块可能没有ttyUSB2
,但是有ttyUSB3
和ttyUSB4
,这时可以尝试使用ttyUSB3
.
如果设备插了多个模块和转接板,则后面的数字是顺延排列的,所以其实叫什么名无所谓,可以全都发一下AT指令试一下.
然后输入AT+QPRTPARA=3
重置模块设置,然后输入AT+CFUN=1,1
重启模块,重启时模块会和机器短暂断开连接,如果长时间链接不上可以执行ls /dev/ttyUSB*
看下数字是否发生变化,有时数字会往后顺延,这时需要重新拔插usb或者直接连接新的接口.
然后输入AT+COPS?
和AT+QNWINFO
查询是否已经注册到运营商网络,大概会返回如下信息
AT+COPS?
+COPS: 0,0,"CHN-UNICOM",7
OK
AT+QNWINFO
+QNWINFO: "FDD LTE","46001","LTE BAND 3",1650
OK
到这里EC模块就算是配置好了,如果没有你的SIM卡没有注册成功的话,先排除是否是欠费了,没有的话可以尝试开启VOLTE,操作方式的话还请google搜索.
配置短信接收和转发
首先通过apt install gammu-smsd
安装,然后修改/etc/gammu-smsdrc
,改后内容大致如下
[gammu]
port = /dev/ttyUSB2
connection = at19200
[smsd]
service = files
RunOnReceive = /bin/bash /root/gammu-receive.sh
logfile = syslog
debuglevel = 0
PhoneID = SMS1_1234567890
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/
其中gammu-receive.sh
是收到短信时用来转发的脚本,其实例在gammu-smsd
官方文档中可以找到,至于发到哪里怎么发送可以自行发挥,也可以使用其它语言编写,其原理就是gammu-smsd
收到短信时会执行RunOnReceive
的命令,短信的信息将已env的方式传递,这里提供我转发至telegram的脚本内容.
#!/usr/bin/env bash
TOKEN=你的bot token
CHAT_ID=你的TG id
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
NL=$'\n'
declare -i i MSGS
MSGS=${SMS_MESSAGES}
# CONTENT="${SMS_1_NUMBER}${NL}"
DEVICE="设备名称"
SOCKET="${PHONE_ID}"
FROM="${SMS_1_NUMBER}"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
CONTENT="Device:${DEVICE}${NL}Socket:${SOCKET}${NL}From:${FROM}${NL}Date:${DATE}${NL}------${NL}"
i=1
while [ $i -le $MSGS ]; do
declare "PART"="SMS_${i}_TEXT"
CONTENT="${CONTENT}${!PART}"
i=$(($i+1))
done
CONTENT=${CONTENT//&/%26}
CONTENT=${CONTENT//</%3C}
CONTENT=${CONTENT//>/%3E}
eval "curl -s -X POST $URL -d chat_id=$CHAT_ID -d text=\"${CONTENT}\""
脚本中的PHONE_ID
就是上方/etc/gammu-smsdrc
内的PhoneID
,如果有多个模块可以用来分辨接收设备,此外所有路径尽量使用绝对路径,配置好之后注意设置转发脚本的权限chmod 0755 /root/gammu-receive.sh
配置好后通过如下命令启动
gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --daemon --user root --group root
如果你的gammu-smsd是使用apt安装,则可以使用systemctl启动,启动前不要忘记使用pkill gammu-smsd
停止刚刚通过命令启动的Daemon
发送短信
这里网上大多数人看到的教程内都是使用echo "a test sms from ec20" | gammu sendsms TEXT 186XXXXXXXX
这种方式发送短信,但其实当gammu-smsd
启动后会将ttyUSB占用,此时会提示busy错误,除非每次发送短信之前都将gammu-smsd
停止.
其实安装gammu-smsd
的时候大概率会一同安装gammu-smsd-inject
(没有的话可以去github上找或者尝试通过apt安装)
然后只需要将命令换成echo "a test sms from ec20" | gammu-smsd-inject sendsms TEXT 186XXXXXXXX
即可,只是gammu-smsd-inject
发送会有延迟,因为其原理是将其书写成一个文件,gammu-smsd
会定时扫描发送.
其它
有些人会有修改imei的需求这里提供2个命令,一个是读取imeiAT+EGMR=0,7
以及一个修改imeiAT+EGMR=1,7,"IMEI"