Курс доллара можно превратить в автоматическое SMS-уведомление для сотрудников, закупщиков или клиентов: источник данных передаёт новое значение, сервис сравнивает его с заданным порогом, а приложение отправляет сообщение через SMPP-шлюз. В статье разберём схему от получения курса из API до DLR на телефоне, покажем структуру сообщения и разберём ошибки, из-за которых алерт приходит с задержкой или не доходит.
Как устроен валютный SMS-алерт через SMPP?
Схема состоит из четырёх частей. Первая получает курс из источника данных. Вторая хранит последнее обработанное значение и решает, нужно ли отправлять уведомление. Третья открывает SMPP-соединение и передаёт сообщение шлюзу. Четвёртая принимает DLR, то есть отчёт о статусе доставки SMS.
Для малого бизнеса этого достаточно. Например, закупщик задаёт порог изменения курса доллара, а приложение проверяет его через выбранный интервал. Если условие выполнено, программа формирует текст и отправляет его на заранее подготовленный номер. После этого система сохраняет идентификатор сообщения и ждёт отчёт от шлюза.
Автоматизация SMS-рассылок обычно включает планирование, отправку и обработку событий без ручной загрузки списков. Для валютного мониторинга особенно важен именно событийный сценарий: сообщение отправляется после изменения показателя, а не по календарю.
Как подключить источник курса и задать условие отправки?
Сначала определите, какое значение нужно отслеживать. Это может быть официальный курс доллара, курс покупки или продажи, значение из внутренней учётной системы либо цена, которую использует закупочный отдел. Название показателя должно быть закреплено в настройках, иначе разные сотрудники будут трактовать слово «курс» по-разному.
Источник данных передаёт приложению дату, валюту и числовое значение. Программа проверяет, что ответ получен, значение относится к доллару и имеет корректный формат. Если API вернул пустой ответ, старое значение нельзя считать новым курсом. В таком случае система записывает ошибку и повторяет запрос по отдельному правилу.
Порог лучше задавать одним из двух способов:
- изменение на заданную величину в белорусских рублях;
- изменение на заданную долю относительно последнего сохранённого значения.
Для первого варианта условие выглядит так: если новый курс минус предыдущий курс больше порога, отправить сообщение. Для падения курса используется обратное сравнение. Если алерт должен срабатывать при каждом пересечении уровня, приложение хранит состояние «выше порога» или «ниже порога», чтобы не посылать одинаковое SMS при каждом опросе.
Пример настройки без конкретных чисел: закупщик получает уведомление, когда курс поднимается выше установленного уровня. После отправки система запоминает событие и не повторяет его, пока курс не вернётся ниже контрольной отметки. Такой механизм защищает телефон от серии одинаковых сообщений при небольших колебаниях.
Как передать валютное SMS через SMPP?
Приложение подключается к SMPP-шлюзу с параметрами bind: адресом сервера, портом, логином, паролем и типом соединения. Для исходящих сообщений обычно используют transmitter либо transceiver, если тому же соединению нужны входящие ответы и статусы. Настройки зависят от шлюза, поэтому их берут из технической документации поставщика.
В запросе submit_sm нужно передать адрес отправителя, номер получателя, текст, параметры кодировки и, при необходимости, срок действия сообщения. Для кириллицы выбирают кодировку, которую поддерживает конкретный шлюз. Если текст длинный, SMPP разбивает его на части, а телефон собирает их в одно сообщение. До запуска проверьте, как провайдер считает такие части и какие ограничения установлены для sender ID.
Пример текста для внутреннего алерта:
«Курс USD изменился: 3,2450 BYN. Проверьте закупочные цены.»
В рабочем сообщении полезно указать валюту, новое значение, направление изменения и время обновления. Слишком короткая фраза вроде «Курс изменился» не помогает принять решение. При этом длинный комментарий увеличивает объём SMS и усложняет чтение на обычном телефоне.
Если бизнес получает данные из 1С, отдельного скрипта или бота, SMPP можно оставить транспортным уровнем, а правила сравнения держать в приложении. Для примера интеграции учётной системы пригодится материал как настроить отправку SMS из 1С через SMPP-шлюз. Для Telegram-бота применяется похожая логика: бот показывает событие, а SMPP отправляет его на телефон через шлюз.
Как использовать DLR и проверить доставку на телефон?
Отправка через SMPP подтверждает приём сообщения шлюзом, но это ещё не означает, что SMS появилось на телефоне. Поэтому приложение должно обрабатывать DLR. В отчёте обычно передаются идентификатор сообщения и статус: оно принято, доставлено, отклонено или завершилось ошибкой.
Для каждого SMS сохраните:
- внутренний идентификатор валютного события;
- message_id, который вернул шлюз;
- номер получателя в согласованном формате;
- курс и время, при которых сработало условие;
- финальный статус DLR.
Эти записи позволяют отличить три ситуации: приложение не отправило запрос, шлюз не принял сообщение или SMS не дошло до телефона. Без message_id все сбои смешиваются, и разработчик видит только жалобу «уведомление не пришло».
DLR нужно сопоставлять с конкретным message_id. Нельзя считать любое входящее уведомление доказательством доставки: в системе могут одновременно работать несколько алертов. Коды ошибок и трактовку статусов лучше сверить с документацией вашего SMPP-центра; справочный материал по этой теме есть в статье как проверить скорость и стабильность SMPP-шлюза.
Для контроля работы задайте таймер ожидания статуса. Если отчёт не пришёл в установленный срок, приложение записывает событие в журнал и передаёт его на повторную обработку по правилам шлюза. Повтор нельзя запускать бесконечно: так одна проблема с соединением превращается в дубли SMS.
Как сделать мониторинг устойчивым к сбоям?
Проверку курса запускайте по расписанию, но сам SMPP-сеанс держите под контролем. При обрыве соединения приложение должно закрыть старый bind, выдержать паузу и открыть новый. Параметры переподключения задаются отдельно от логики валютного порога, чтобы временный сбой сети не создавал новое событие.
До отправки проверьте четыре условия: источник вернул свежий ответ, курс прошёл проверку формата, порог действительно пересечён, а такое событие ещё не отправлялось. Последнее условие особенно важно после перезапуска сервиса. Для него сохраняют состояние в базе или другом постоянном хранилище, а не только в оперативной памяти.
Если офисный интернет нестабилен, проверьте keepalive, таймауты и порядок повторного bind. Практическая инструкция по этой части собрана в материале как настроить SMPP-bind при нестабильном интернете в офисе.
Журнал должен показывать не только ошибку, но и контекст: время запроса курса, полученное значение, предыдущее значение, причину срабатывания и ответ SMPP. Для малого проекта достаточно обычной таблицы событий. Она быстро показывает, где возникла задержка: на стороне источника курса, приложения, SMPP-шлюза или мобильной сети.
Какие подходы к валютным SMS выбрать?
| Подход | Когда подходит | Что учесть |
|---|---|---|
| Проверка по расписанию | Курс нужен несколько раз в день | Нужно выбрать интервал и хранить последнее значение |
| Алерт при пересечении уровня | Нужно реагировать на конкретный порог | Нужно хранить состояние порога и защищаться от повторов |
| Уведомление при любом изменении | Изменения отслеживает небольшая группа сотрудников | При частых обновлениях быстро растёт число SMS |
| Запрос из внутренней системы | Курс уже используется в учёте или закупках | Нужно согласовать формат данных и права доступа приложения |
Для ИП или небольшой компании обычно начинают с проверки по расписанию и одного порога. Такой вариант проще проверить вручную: в журнале видны два значения, условие и отправленный текст. Когда появляется несколько валют, групп получателей или разных порогов, правила выносят в конфигурацию, чтобы не менять программный код при каждой настройке.
Какие ошибки чаще всего ломают валютные SMPP-алерты?
- Сравнивают новое значение с предыдущим после перезапуска. Если последнее значение не сохранено, приложение принимает первый ответ за резкое изменение и отправляет лишнее SMS.
- Не учитывают дробную часть. Курс, пришедший строкой, нужно преобразовать в число с заданной точностью, иначе сравнение может работать непредсказуемо.
- Отправляют сообщение при каждом опросе. Для порогового алерта храните факт уже отправленного события и состояние пересечения уровня.
- Считают submit_sm подтверждением доставки. Для контроля результата нужен DLR и сопоставление по message_id.
- Не проверяют кодировку кириллицы. В итоге текст приходит с непонятными символами или разбивается на части иначе, чем ожидалось.
- Запускают бесконечные повторы после сбоя. Ограничьте число попыток и записывайте причину каждой повторной отправки.
3 шага, которые можно сделать на этой неделе:
- Определить источник курса, валюту, частоту проверки и точное условие срабатывания.
- Собрать тестовый SMPP-сценарий: получить значение, отправить одно кириллическое SMS и принять DLR.
- Добавить журнал событий, защиту от дублей и переподключение при разрыве bind.



