Gsm-модем и отправление смс в OpenWrt

Долго и без дела валялся у меня дома usb-модем. Я думаю, у многих из вас он тоже есть. Про процесс прошивки Gsm-модема ZTE MF627 не буду здесь расписывать, т.к. этой информации достаточно в интернете. Честно говоря, поражает простота, с которой решается наша задача... Давайте посмотрим, как это делается!

На этапе конфигурации OpenWrt нужно отметить следующие модули:
Kernel modules:
Video Support:
<M> kmod-usb-serial
<M> kmod-usb-serial-option
<M> kmod-usb-serial-wwan

У меня была проблема с установкой модуля kmod-usb-serial-wwan. А именно: dmesg после загрузки выдавал следующее:

option: Unknown symbol usb_wwan_write (err 0)
option: Unknown symbol usb_wwan_close (err 0)
option: Unknown symbol usb_wwan_release (err 0)
option: Unknown symbol usb_wwan_tiocmget (err 0)
option: Unknown symbol usb_wwan_chars_in_buffer (err 0)
option: Unknown symbol usb_wwan_write_room (err 0)
option: Unknown symbol usb_wwan_disconnect (err 0)
option: Unknown symbol usb_wwan_startup (err 0)
option: Unknown symbol usb_wwan_set_termios (err 0)
option: Unknown symbol usb_wwan_dtr_rts (err 0)
option: Unknown symbol usb_wwan_open (err 0)
option: Unknown symbol usb_wwan_tiocmset (err 0)

Решается она правкой файла 'openWrt/package/kernel/modules/usb.mk'.
Добавляем раздел 'kmod-usb-serial-wwan'

define KernelPackage/usb-serial-wwan
TITLE:=Support for GSM and CDMA modems
KCONFIG:=CONFIG_USB_SERIAL_WWAN
FILES:=$(LINUX_DIR)/drivers/usb/serial/usb_wwan.ko
AUTOLOAD:=$(call AutoLoad,61,usb_wwan)
$(call AddDepends/usb-serial)
endef

define KernelPackage/usb-serial-wwan/description
Kernel support for USB GSM and CDMA modems
endef

$(eval $(call KernelPackage,usb-serial-wwan))
Правим раздел 'usb-serial-option'
define KernelPackage/usb-serial-option
TITLE:=Support for Option HSDPA modems
DEPENDS:=+kmod-usb-serial-wwan
KCONFIG:=CONFIG_USB_SERIAL_OPTION

Всё это описано вот здесь: https://dev.openwrt.org/ticket/7731. Большое спасибо автору.

Устанавливаем:

root@OpenWrt:/# opkg install kmod-usb-serial kmod-usb-serial-wwan kmod-usb-serial-option
Installing kmod-usb-serial-wwan (2.6.36-1) to root...
Downloading ftp://ftp:ftp@192.168.1.9/kmod-usb-serial-wwan_2.6.36-1_brcm47xx.ipk.
Installing kmod-usb-serial (2.6.36-1) to root...
Downloading ftp://ftp:ftp@192.168.1.9/kmod-usb-serial_2.6.36-1_brcm47xx.ipk.
Installing kmod-usb-serial-option (2.6.36-1) to root...
Downloading ftp://ftp:ftp@192.168.1.9/kmod-usb-serial-option_2.6.36-1_brcm47xx.ipk.
Configuring kmod-usb-serial.
Configuring kmod-usb-serial-wwan.
Configuring kmod-usb-serial-option.

Подключаем Gsm-модем и смотрим вывод dmesg:

usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for GSM modem (1-port)
option 1-1.2:1.0: GSM modem (1-port) converter detected
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0
option 1-1.2:1.1: GSM modem (1-port) converter detected
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1
option 1-1.2:1.3: GSM modem (1-port) converter detected
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems

Gsm-модем определился. Можно начать с ним работать. Как видно из лога, создалось три устройства ttyUSB: интерфейс доступа к sd-карте,интерфейс для настройки устройства,интерфейс, через который идет обмен данными. Нам нужен интерфейс обмена данными, у меня это ttyUSB1.

Определить, какой из трех интерфейсов нам нужен, очень просто. Подключаем Gsm-модем к компьютеру, запускаем терминал на скорости 19200 и вводим команду ati. Модем должен откликнуться.

ati
Manufacturer: ZTE INCORPORATED
Model: MF626
Revision: BD_P673M3V1.0.1B02
IMEI: 352846022764542
+GCAP: +CGSM,+FCLASS,+DS

OK

Для отправки смс будем использовать утилиту smstools. На момент написания этой статьи она не входит в стандартные утилиты OpenWrt. Поэтому, скачиваем исходники отсюда:
http://smstools3.kekekasvi.com/ и разархивируем.

Собрать нужно её, используя кросс-компилятор из OpenWrt. Для этого в файле smstools3/src/Makefile нужно добавить строчку:
CC=openwrt/staging_dir/toolchain-mipsel_gcc-4.3.3+cs_uClibc-0.9.30.1/bin/mipsel-openwrt-linux-gcc
т. е. указать путь до кросс-компилятора.

Запускаем make. В smstools3/src/ получаем файл демона sms-сервера smsd, который копируем на файловую систему в /usr/sbin. Заодно в директорию /etc положим файл конфигурации smsd.conf, который необходим для запуска smsd.

/etc/smsd.conf
devices = GSM1
logfile = /var/log/smstools/smsd.log
loglevel = 7

[GSM1]
device = /dev/ttyUSB1
incoming = no

# Service Center Address
smsc = 79168960220

send_delay = 10
baudrate = 19200
rtscts = no

Загружаемся. Также для работы smsd нужно создать следующие директории (используя mkdir, создадим их):
/var/log/smstools
/var/spool/sms/checked/
/var/spool/sms/outgoing/
/var/spool/sms/incoming/

Запускаем sms-сервер:

# smsd -c /etc/smsd.conf &

Смотрим лог и видим, что Gsm-модем проинициализировался:

tail -f /var/log/smstools/smsd.log

Можно отправлять смс. Смс отпраляются автоматически после того, как файл с смс будет помещен в директорию /var/spool/sms/outgoing/

Создадим файл send_sms.sms и поместим в эту директорию:

send_sms.sms
To: +79161737465

Privet iz OpenWrt!

Смотрим лог и видим, что сервер обнаружил новое неотправленное смс, приступил к его отпаравке и после отправки удалил файл:
tail -f /var/log/smstools/smsd.log

1970-01-01 00:03:54,5, GSM1: Waiting for messages to send...
1970-01-01 00:05:23,5, smsd: Moved file /var/spool/sms/outgoing/send_sms.sms to /var/spool/sms/checked
1970-01-01 00:05:23,6, GSM1: I have to send 1 short message for /var/spool/sms/checked/send_sms.sms
1970-01-01 00:05:23,6, GSM1: Sending SMS from to 79161737465
1970-01-01 00:05:23,6, GSM1: Checking if modem is ready
1970-01-01 00:05:24,7, GSM1: -> AT
1970-01-01 00:05:24,7, GSM1: Command is sent, waiting for the answer
1970-01-01 00:05:24,7, GSM1: <- OK
1970-01-01 00:05:24,6, GSM1: Pre-initializing modem
1970-01-01 00:05:24,7, GSM1: -> ATE0+CMEE=1;+CREG=2
1970-01-01 00:05:27,6, GSM1: Signal Strength Indicator: (13,99) -87 dBm (Workable), Bit Error Rate: not known or not detectable
1970-01-01 00:05:27,6, GSM1: Checking if Modem is registered to the network
1970-01-01 00:05:27,7, GSM1: -> AT+CREG?
1970-01-01 00:05:28,7, GSM1: Command is sent, waiting for the answer
1970-01-01 00:05:28,7, GSM1: <- +CREG: 0,1 OK
1970-01-01 00:05:28,6, GSM1: Modem is registered to the network
1970-01-01 00:05:28,6, GSM1: Selecting PDU mode
1970-01-01 00:05:29,7, GSM1: -> AT+CMGF=0
1970-01-01 00:05:29,7, GSM1: Command is sent, waiting for the answer
1970-01-01 00:05:30,7, GSM1: <- +ZUSIMR:2 OK
1970-01-01 00:05:30,6, GSM1: Changing SMSC
1970-01-01 00:05:30,7, GSM1: -> AT+CSCA="+79168960220"
1970-01-01 00:05:32,7, GSM1: Command is sent, waiting for the answer
1970-01-01 00:05:32,7, GSM1: <- +ZUSIMR:2 OK
1970-01-01 00:05:32,7, GSM1: -> AT+CMGS=29
1970-01-01 00:05:33,7, GSM1: Command is sent, waiting for the answer
1970-01-01 00:05:33,7, GSM1: <- >
1970-01-01 00:05:33,7, GSM1: -> 0011000B919711257733F30000FF115079DA5EA683D27A50FB4D2EB7C321#
1970-01-01 00:05:38,7, GSM1: Command is sent, waiting for the answer
1970-01-01 00:05:42,7, GSM1: <- +ZUSIMR:2 +ZUSIMR:2 +ZUSIMR:2 +ZUSIMR:2 +CMGS: 174 OK
1970-01-01 00:05:42,5, GSM1: SMS sent, Message_id: 174, To: 79161737465, sending time 19 sec.
1970-01-01 00:05:42,6, GSM1: Deleted file /var/spool/sms/checked/send_sms.sms