MENU

使用gammu-smsd和EC20发送和接受短信以及短信转发

去年买了几个EC20模块准备放到吃灰的几个机顶盒上用来收发短信和语音,后来因为短信不支持纯volte的运营商而被闲置,如今又有时间和其它运营商的电话卡,所以可以拿出来玩一下了.

硬件准备

  • EC20模块
  • 转接板
  • 一个带有usb接口的armbian/debian/ubuntu/openwrt设备(电脑/机顶盒/树莓派/路由器都可以)

首先是模块,EC20有好多版本和型号,各型号的主要区别是内存以及功能,有一些没有语音/GNSS之类的,有些内存是256m/512m
这里提供一个当前移远在售的EC20 MINIPCIE型号和功能表格

型号数据语音短信GNSS分集天线内存
EC20CEHDLG-MINIPCIE-CYYYNN128M
EC20CEHCLG-MINIPCIE-CBYNYNN128M
EC20CEHCLG-MINIPCIE-CYYYNN128M
EC20CEFlILG-MINIPCIE-CYYYYN128M
EC20CEFHLG-MINIPCIE-CBYNYNY128M
EC20CEFRSG-MINIPCIE-CYYYYY256M
EC20CEFRG-MINIPCIE-CYYYYY512M

需要注意的是这些是移远现在还在卖的版本,其实在很多代理商以及二手交易平台还有一些旧版本可以买到
根据移远所提供的型号表格,看起来结尾是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,但是有ttyUSB3ttyUSB4,这时可以尝试使用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"

最后编辑于: 2024 年 06 月 08 日
996.icu 996.icu