设备信息:
- 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个英文字符。