logo

Работа с smsd на роутерах iRZ

smsd - сервис для приёма и отправки SMS на роутерах iRZ

Что делает smsd?

  • периодически опрашивает модем на наличие новых SMS

  • считывает SMS из памяти SIM-карты/модема

  • декодирует SMS, экспортирует переменные среды и по очереди запускает скрипты, находящиеся в директории /etc/uagent.d/smsd/ Порядок сортировки скриптов - алфавитный (по имени)

  • удаляет принятые SMS из памяти SIM/модема

  • получает SMS, передваваемые на отправку через утилиту send-sms

  • перемещает SMS в очередь "на отправку", дожидается когда модем освободится, и затем передаёт SMS. Если отправка невозможна, переносит SMS в конец очереди и повторяет попытку позже.

Приём SMS

Переменные окружения для скриптов из /etc/uagent.d/smsd/

DEVICE - tty интерфейс модема, с которого считана SMS, например '/dev/ttyMODEM1_AUX'

FROM - номер телефона в формате <код страны><код оператора><номер телефона>, без + и без 8

MODEM - имя модема из файла конфигурации, например 'modem1'

TEXT- декодированый текст сообщения

REPR - всё вышеперечисленное в .json формате, например

'{"FROM":"7XXXYYYZZQQ","TEXT":"Test message","MODEM":"modem1","DEVICE":"/dev/ttyMODEM1_AUX"}'
PWD='/'

Добавление собственных скриптов обработки SMS

Для добавления собственных обработчиков достаточно положить скрипт в /etc/uagent.d/smsd/

Пример скрипта, который будет сохранять SMS и вызывать стороннее приложение /usr/bin/external.bin с аргументами FROM и TEXT

cat <<EOF > /etc/uagent.d/smsd/00-custom.sh     # начало записи скрипта в файл
#!/bin/sh                                       # указание интерпретатора
TEMP_DIR="/var/sms/incoming"                    # запись в переменную строки пути временной директории
mkdir -p $TEMP_DIR                              # создание временной директории, если ее нет
DATE="$(date +%Y-%m-%d_%H-%M-%S)"               # запись в переменную строки текущей даты, например 2022-09-13_13-25-27
FNAME="${TEMP_DIR}/${FROM}_${DATE}.txt"         # запись в переменную пути временного файла
echo "FROM=$FROM" > $FNAME                      # создание временного файла и запись в него строки с номером адресата
echo "TEXT=\"$TEXT\"" >> $FNAME                 # дописывание во временный файл текста сообщения
/usr/bin/external.bin "$FROM" "$TEXT"           # запуск внешней программы с аргументами номера и текста сообщения
EOF                                             # конец записи скрипта в файл

Отправка SMS

Пример отправки сообщения через утилиту send-sms

root@iRZ-Router:~# send-sms [OPTIONS] RECIPIENT TEXT0 [TEXT1:...]

Для отправки SMS с конкретного модуля используется ключ -m с указанием номера модема (модуля):

send-sms -m 1 7XXXYYYZZQQ Test message

Для просмотра ID отправленного SMS используйте ключ -S ( --show)

send-sms -S 7XXXYYYZZQQ Test message

Для вызова дополнительной информации используйте ключ -h ( --help)

send-sms -h

Очередь отправки SMS

За управление очередью отправки SMS отвечает /etc/config/smsd

root@iRZ-Router:~# cat /etc/config/smsd

config smsd
	option verbose '0'
	option r_polltime '72'
	option t_client_timeout '30'
	option t_queue_size '10'
	option t_modem_timeout '30'
	option t_post_error_delay '5'
	option t_tries_limit '3'
	option t_postpone '60'
...
Table 1. Значение параметров config smsd

Параметр

Имя

Значение по умолчанию

r_polltime

Интервал чтения SMS, секунд

72

t_modem_timeout

Время ожидания ответа на команду отправленную модему, секунд

30

t_queue_size

Размер очереди сообщений

64

t_post_error_delay

Задержка перед следующей итерации, если произошла ошибка при отправке SMS, секунд

30

t_tries_limit

Число попыток отправки сообщения. Чтобы отключить лимит попыток отправки, нужно выставить значение t_tries_limit '0'

3

t_postpone

Минимальная задержка перед следующей попыткой отправки сообщения, секунд

60

Лог

В доступный на пользовательском уровне лог вынесены следующие сообщения:

Tекст сообщения

Аргументы

Значение

create message[%i]

ID исходящей SMS

Создано сообщение с указанным ID

queue message full, dropping 1 message[%i]

ID исходящей SMS

Очередь исходящих сообщений заполнена, сообщение отброшено

Modem %i - message[%i] sent successfully

номер модема, ID исходящей SMS

Сообщение успешно отправлено через модем с указанным номером

failed to submit message[%i], retries exceeded

ID исходящей SMS

Сообщение не отправлено, лимит попыток отправки исчерпан

message queue is not empty on exit, dropping %d messages

размер очереди

Будет выведено при закрытии программы, которая еще не успела отправить все SMS