Использование smstools или GSM модем в Linux

Настройка

После установки пакета 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 руб.

А вот исходные абракадабры были:
sms

Запрос баланса

Просто записываем команду в файл для регулярного запуска
Пример, скрипт запроса баланса:

 
#!/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
то скрипт берет последнюю строку в логе и перекодирует ее в читаемый формат.

Обсуждение закрыто.