Работа с SMS на Linux


Предпосылки

Сервис коротких сообщений (Short Message Service/SMS), предоставляемый операторами сотовой связи, представляется неплохим интерфейсом для телеметрических задач. Например, в ИТ-инфраструктуре действует система наблюдения за аварийными состояниями аппаратуры или ПО. Как правило, в подобных системах уже встроена возможность рассылки уведомлений. Обычно для этого используются электронная почта и/или SNMP. Но бывают ситуации, когда уведомление о наступлении того или иного события должно быть доставлено немедленно, ну, или, с минимально возможной задержкой. В таких ситуациях на помощь приходит SMS.

Замечание К слову, SMS-сервер может быть полезным и в двустороннем обмене

Подготовка

Для работы SMS-сервера необходим модем. Проще всего, в качестве модема, использовать сотовый телефон. Подходит телефон для работы в режиме модема или нет можно выяснить либо по его техническому описанию, либо (что надёжнее), подключив его к Linux-системе:

  1. Подключить телефон с помощью кабеля USB
  2. Выбрать на телефоне режим подключения, отличный от подключения в виде накопителя, например: “Nokia PC Suite”, “Modem Mode” и т.п.
  3. Изучить журнал команды dmesg

Если “dmesg” возвращает что-то вроде “ttyACM0: USB ACM device”, то телефон подходит для работы в режиме модема. Но этого недостаточно. Отправка SMS, скорей всего, будет работать, но с приёмом SMS дела обстоят посложнее. Для того, чтобы сообщения принимались на компьютер необходимо, чтобы телефон в режиме модема предоставлял доступ к ячейкам своей памяти.

Для проверки доступа к ячейкам памяти телефона необходимо выполнить AT-запрос “AT+CPMS”. Подключиться и опросить модем:

[orca@blizzard ~]$ sudo ckermit
(/home/orca/) C-Kermit>
set line /dev/ttyACM0
set speed 115200
set carrier-watch off
connect
AT[Enter]
OK

ATI[Enter]
Sony Ericsson K750

AT+CPMS=?[Enter]
+CPMS: ("ME","SM"),("ME","SM"),("ME","SM")

AT+CPMS?
+CPMS: "SM",19,20,"SM",19,20,"ME",103,205

Если на запрос “AT+CPMS=?” будет возвращён результат типа “+CPMS: (,),(,),(,)”, то телефон/модем не подходит для приёма сообщений на компьютер.


Установка ПО

Установить SMS Server Tools 3 (http://smstools3.kekekasvi.com/). Пример для ArchLinux:

[orca@blizzard ~]$ cd /store/Install/AUR
[orca@blizzard AUR]$ curl https://aur.archlinux.org/packages/sm/smstools3/smstools3.tar.gz -o "smstools3.tar.gz"
[orca@blizzard AUR]$ tar -xvzf ./smstools3.tar.gz
[orca@blizzard AUR]$ cd ./smstools3/
[orca@blizzard smstools3]$ makepkg -s
[orca@blizzard smstools3]$ sudo pacman -U smstools3-3.1.15.tar.gz

Конфигурация SMS-сервера (smsd) находится в файле /etc/smsd.conf. Создать резервную копию и отредактировать его. Для проверки пока достаточно правильно указать путь к устройству GSM, например: /dev/ttyACM0.

Запустить SMS-демон, отправить тестовое сообщение:

[orca@blizzard ~]$ sudo /etc/rc.d/smsd start
[orca@blizzard ~]$ sudo sendsms 99893XXXXXXX 'Проверка связи'

Если сообщение не дошло до адресата, изучить файл журнала /var/log/smsd/smsd.log


Настройка ПО

Директории для сообщений

С установкой ПО создаются директории:

  • /var/spool/sms/incoming для входящих
  • /var/spool/sms/outgoing для исходящих
  • /var/spool/sms/checked для проверенных исходящих

Эти директории используются SMS-демоном по умолчанию.

Отправка сообщений

Отправка с командной строки:

[orca@blizzard ~]$ sudo sendsms 99893XXXXXXX 'Проверка связи'

Отправка из директории:

[orca@blizzard ~]$  sudo vi /var/spool/sms/outgoing/00001.txt
To: 99893XXXXXXX

Message from file
[orca@blizzard ~]$

Здесь важно, чтобы файл сообщения был правильно оформлен. Подробнее здесь: http://smstools3.kekekasvi.com/index.php?p=fileformat

Приём сообщений

Если телефон/модем принимает сообщения в свою память а не на SIM-карту, то в файле конфигурации SMS-демона необходимо добавить строку инициализации модема:

[orca@blizzard ~]$ sudo vi /etc/smsd.conf
devices = GSM1
logfile = /var/log/smsd/smsd.log
loglevel = 7

[GSM1]
device = /dev/ttyACM0
incoming = yes
#pin = 1111
init = AT+CPMS="ME","ME","ME"

Перезапустить SMS-демон. Отправить на номер модема короткое сообщение и проверить наличие нового файла в директории /var/spool/sms/incoming.

Замечено, что, при получении сообщений на русском языке, система неверно отображает содержимое сообщения. Чтобы устранить эту проблему необходимо сохранять входящие сообщения с полем PDU (Protocol Data Unit), а затем, преобразовывать его в читаемый вид.

  1. Добавить директиву “store_received_pdu = 3” в глобальной секции конфигурации SMS-демона (/etc/smsd.conf)
  2. Перезапустить SMS-демон
  3. Файлы входящих сообщений прогонять через сценарий “sms2unicode” (/usr/bin/sms2unicode)

Теперь файлы всех входящих сообщений будут содержать PDU-поле, а после отработки сценария sms2unicode PDU будет преобразован в читаемый текст.

Используя “incrond” можно автоматизировать процессы обработки сообщений. Пример для ознакомления:

[orca@blizzard ~]$ vi /tmp/myscript
#/usr/bin/bash

echo File $1 created >> /tmp/myscript.log

[orca@blizzard ~]$ chmod 755 /tmp/myscript
[orca@blizzard ~]$ sudo incrontab -u root -l
no table for root
[orca@blizzard ~]$ sudo incrontab -u root -e
/var/spool/sms/incoming IN_CREATE /tmp/myscript $@/$#
[orca@blizzard ~]$ sudo incrond

Подробнее о событиях и шаблонах демона “incron” здесь: http://linux.die.net/man/5/incrontab.