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 $(eval $(call KernelPackage,usb-serial-wwan)) |
Всё это описано вот здесь:
Устанавливаем:
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. Поэтому, скачиваем исходники отсюда:
Собрать нужно её, используя кросс-компилятор из 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] # Service Center Address send_delay = 10 |
Загружаемся. Также для работы 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 |