设备信息:

  • Raspberry pi Model B 版
  • 华为 E173s
  • Raspbian

初始化 3G 网卡

由于我的树莓派插上 E173s 这个 3G 网卡,没有在 /dev 下出现响应的 USB 端口,并且通过lsusb查看发现 modem 是 off。
所以需要安装 usb-modeswitch 来切换模式

sudo apt-get install usb-modeswitch

安装完后,需要手动设置 mode 切换的配置文件,配置文件在 /usr/share/usb_modeswitch,需要解压 configPack.tar.gz 文件,然后根据lsusb得到设备 ID,将对应的配置文件拷贝到 /etc/usb_modeswitch.d 目录下。

我的lsusb得到如下信息

Bus 001 Device 004: ID 12d1:1c0b Huawei Technologies Co., Ltd. E173s 3G broadband stick (modem off)

然后我就拷贝 12d1:1c0b 这个配置文件到 /etc/usb_modeswitch.d,然后重启下树莓派。理论上应该可以通过usb_modeswitch命令可以手动加载配置文件,但是我没有成功,只能重启了。

重启后可以看到设备从 off 变为了 on,并且在 /dev 下有了 /ttyUSB[0-2] 这三个设备了。

安装 gammu 用来收发短信

sudo apt-get install gammu

然后通过sudo gammu-config来配置 gammu,这个需要 root 权限,因为需要读写 USB 设备,gammu 配置如下

port = /dev/ttyUSB2
model =
connection = at19200
synchronizetime = yes
logfile =
logformat = nothing
use_locking =
gammuloc =

这里的 port 因设备不同而不同,我这个网卡的短信端口是 ttyUSB2。
然后通过sudo gammu --identify可以查看是否配置成功。

可以通过 gammu 在命令行发短信echo "test" | sudo gammu sendsms TEXT 186XXXXXXXX,中文需要设置编码。gammu 也有提供 Python 的 API 接口,这样可以很方便的来调用发送短信的接口。但是收短信比较麻烦。

安装 gammu-smsd 来收短信

通过 gammu-smsd 可以把收到的短信写入到文件、数据库中,还可以通过插入数据库的方式来发送短信,这样就可以很方便的编程扩展了,并且不局限于 Python 了,其他的语言都可以方便操作。

我选用的是 SQLite3 作为 SQL 的 Backend。

我的配置如下,具体其他配置选项可以看这里,但是要注意的是树莓派上通过包管理安装的是 gammu 是 1.31.90,而最新的文档是 1.33.90,可能有不同选项不同,比如 SQL 的 schema 就不同。

[gammu]
port = /dev/ttyUSB2
connection = at
[smsd]
service = sql
Driver = sqlite3
logfile = /home/pi/sms.log
database = sms.db
dbdir = /home/pi/sms/
debuglevel = 0

数据库的 schema 不能用官网的,因为不同,在 /usr/share/doc/gammu/examples/sql 下有 MySql、PgSQL 和 SQLite 的 schema,导入就行。

由于 SQL 模式依赖于 libdbi ,所以需要安装对应的库

sudo apt-get install libdbi1 libdbi-dev libdbd-sqlite3

然后启动 gammu-smsd

sudo gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --daemon --user gammu --group gammu

SQL 中,其中 inbox 是收到的短信,outbox 是待发送的短信,sentitems 是发出的短信

outbox 插入,可以用下面的语句

"INSERT INTO outbox ('InsertIntoDB', 'SendingDateTime', 'DestinationNumber', 'Coding', 'Class', 'CreatorID', 'SenderID', 'TextDecoded', 'RelativeValidity') VALUES(datetime(),datetime(),'186XXXXXXXX', 'Unicode_No_Compression', '', '', NULL, '这里是文字', '-1'

其中,Unicode_No_Compression 支持中文,最多70个字,Default_No_Compression 最多160个英文字符。

致谢