О проекте
Веб-приложение для приёма, отправки и хранения SMS через модемы Huawei HiLink. Сообщения автоматически переносятся из памяти модема в локальную базу SQLite и удаляются с устройства после сохранения. С доверенных телефонных номеров можно отправлять SMS-команды, которые запускают подключённые Bash- или Python-обработчики и возвращают результат выполнения ответным сообщением.
- Стек
- PHP · SQLite · Bash · Python · nginx · PHP-FPM · systemd
- Направление
- Автоматизация
- Год
- 2026
Задача
Huawei HiLink позволяет работать с SMS через собственный веб-интерфейс и API, но при постоянном использовании быстро возникает несколько проблем: сообщения остаются в ограниченной памяти модема, историю неудобно хранить и просматривать, а использовать SMS как резервный канал управления инфраструктурой приходится отдельными самописными скриптами.
Задачей проекта было сделать небольшой универсальный SMS-шлюз, который самостоятельно забирает сообщения с модема, хранит их на сервере и при этом позволяет использовать обычное SMS как канал выполнения заранее разрешённых административных команд.
При этом само приложение не должно быть привязано к конкретной организации или инфраструктуре. Все специфические действия — диагностика серверов, проверка сервисов, управление оборудованием и другие сценарии — должны подключаться отдельно и не требовать изменения основного кода.
Реализация
Huawei SMS работает как обычное PHP-приложение с SQLite и использует API Huawei HiLink для чтения, отправки и удаления SMS.
Периодический опрос выполняется отдельным однократным заданием. За один запуск приложение последовательно читает сообщения из памяти модема, сохраняет их в SQLite и после успешного переноса удаляет с Huawei. Таким образом, память модема используется только как временное хранилище, а полная история остаётся на сервере.
Веб-интерфейс позволяет просматривать входящие и исходящие сообщения, отправлять новые SMS и вручную запускать синхронизацию. Доступ защищён паролем, поддерживается двухфакторная аутентификация TOTP, ограничение попыток входа и защита запросов от подделки.
Отдельная часть проекта — механизм SMS-команд. Для доверенных телефонных номеров входящее сообщение может быть распознано как команда. Основное приложение проверяет аргументы и ограничения, после чего запускает внешний Bash- или Python-обработчик без использования командной оболочки. Текст, который обработчик выводит в стандартный поток вывода, становится ответным SMS.
Пользовательские команды подключаются через локальный файл commands.local.php и каталог scripts.local/. Для каждой команды можно задать псевдонимы, число и формат аргументов, время выполнения, максимальный размер результата и параметры журналирования. Благодаря этому можно подключать собственную диагностику или автоматизацию, не изменяя основной код проекта.
В комплект входят три базовые команды: проверка доступности узла, проверка TCP-порта и диагностика самого Huawei-модема.
Также реализованы контроль доступности модема, уведомления о потере и восстановлении связи, плановая перезагрузка Huawei и отправка уведомлений через Telegram, MAX и Matrix. Для Telegram и MAX поддерживается работа через прокси-сервер с авторизацией и возможность прямого подключения при недоступности прокси.
Конфигурация конкретной установки, доверенные номера, токены, пользовательские команды и локальные скрипты отделены от основного кода и не входят в публичный репозиторий.
Результат
Получился самостоятельный SMS-шлюз, который можно использовать как обычный веб-интерфейс для Huawei HiLink и одновременно как резервный канал автоматизации.
Сообщения больше не зависят от памяти модема и сохраняются в локальной базе, а добавление новых SMS-команд не требует изменения ядра приложения. Достаточно зарегистрировать команду и подключить собственный Bash- или Python-скрипт.
Проект прошёл проверку на реальном Huawei-модеме: приём и удаление сообщений из памяти устройства, хранение входящих и исходящих SMS, выполнение команд с доверенного номера, отправка ответов, проверка узлов и портов, а также диагностика параметров мобильной сети.
Huawei SMS опубликован как самостоятельный проект и не содержит настроек или скриптов, привязанных к конкретной инфраструктуре.