Работа с 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'
...
Параметр |
Имя |
Значение по умолчанию |
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 |