Настройка
После установки пакета smstools в нашем распоряжении есть конфигурационный файл, где мы указываем имя устройства (GSM модем по USB).
Пример:
devices = GSM1 incoming = /var/spool/sms/incoming outgoing = /var/spool/sms/outgoing checked = /var/spool/sms/checked sent = /var/spool/sms/sent logfile = /var/log/smsd/smsd.log loglevel = 7 user = smstools infofile = /var/run/smsd/smsd.working pidfile = /var/run/smsd/smsd.pid # 3.1.5 introduced smart logging # once your configuration is OK, set log level lower (5 is good in most cases) smart_logging = yes [default] regular_run_interval = 10 regular_run_logfile = /var/log/smsd/regular_run.log [GSM1] device = /dev/ttyACM0 incoming = yes #pin = 1111 regular_run_cmdfile = /var/spool/sms/regular_run.cmdfile
тут по порядку значит указано:
- основной блок
- имя устройства GSM1, которое мы ниже опишем
- каталог входящих, исходящих, проверенных и отправленных sms
- лог файл и уровень логирования
- пользователь, код которым будет запущен сервис (при этом требуется проверить, чтобы у этого пользователя были права чтения и записи в устройство GSM)
- прочие настройки (pid файл и т.д, используемые при запуске сервиса для идентификации его)
- блок [default]:
- интервал запуска регулярной команды
- лог файл регулярного запуска
- блок [GSM1]:
- путь устройства
- включена поддержка входящих sms
- файл с командой, выполняемой регулярно
Права на устройство
Проверим:
ls -l /dev/ttyACM0
и получим примерно такое:
crw-rw---- 1 root dialout
нашего пользователя smstools нужно соответственно добавить в группу dialout
Отправка SMS
Используем команду smstools:
sudo -u smstools /usr/bin/smssend 79876543210 "Text"
данная команда сформирует текстовый файл в каталог outgoing, который затем будет автоматически обработан сервисом smsd и отправлен, после чего перемещен в каталог sent
Чтение SMS
Входящие SMS попадают в каталог incoming, обычно сообщение в кирилице закодировано в UCS2 формат, чтобы его прочесть, требуется перекодировать.
Пример, скрипт для чтения всех сообщений в порядке их получения:
#!/bin/bash for i in $(ls /var/spool/sms/incoming/* -tcr1); do echo $i tail -n 1 $i| recode UCS-2..utf8 echo "" do
тут берется последняя строка (сам текст), а заголовки отсекаются.
Вот пример, что получим:
/var/spool/sms/incoming/GSM1.2ECcZc Баланс менее 30 руб.
А вот исходные абракадабры были:
Запрос баланса
Просто записываем команду в файл для регулярного запуска
Пример, скрипт запроса баланса:
#!/bin/bash echo 'AT+CUSD=1,"*100#"' > /var/spool/sms/regular_run.cmdfile n=15 echo -n "Wait " >&2 for ((i=1;i<=$n;i++)); do sleep 1 echo -n "." >&2 test -f /var/spool/sms/regular_run.cmdfile || break done echo "" >&2 dt=$(tail -n 1 /var/log/smsd/regular_run.log | awk -F"," '{print $1}') str=$(tail -n 1 /var/log/smsd/regular_run.log | awk -F"," '{gsub(/"/,"",$5); print $5}' | sed 's/..../, 0x&/g' | sed 's/..//' | recode utf16/x2..utf8) echo "$dt : $str"
Скрипт записывает команду в файл regular_run_cmdfile, затем этот файл через regular_run_interval автоматически подхватится сервисом, после чего сервис его удаляет, и затем придет ответ в лог regular_run_logfile или в виде sms.
Если ответ придет в лог в виде строки:
2015-12-15 13:02:17,5, GSM1: CMD: AT+CUSD=1,»*100#»: OK +CUSD: 2,»002D0036002E0038003700200440002E000A041C0430043B043E002004340435043D043504330020043D0430002004410447043504420435003F0020041F043E043F043E043B043D044F04390442043500200447043504400435043700200418043D044204350440043D0435044200210020006F0070006C006100740061002E006200650065006C0069006E0065002E00720075″,72
то скрипт берет последнюю строку в логе и перекодирует ее в читаемый формат.