SMS-шлюз на базе смартфона Android, настройка
24.01.2026
Сегодня мы настраиваем на Android-телефоне sms-шлюз.
Последние несколько лет я пользуюсь странным приложением SMS Forwarder. В принципе оно меня почти не подводило и могу его порекомендовать. Какая-то очень странная политика у его разработчиков вокруг платности приложения, но это всё можно было бы потерпеть... Но оно работает только на пересылку входящих SMS-сообщений. А у меня сегодня другая задача.
Есть у меня в хозяйстве sms-шлюз, построенный на базе модемов Huawei E3131, E153, E352 и других их друзей. Все они прицеплены к Intel NUC, где им был много лет рад smsd из smstools. Кто не в курсе - это старый, добрый, ламповый демон, который работает с ними с помощью AT-команд. Он, наверное, из прошлого века ещё. Не буду сейчас искать подтверждение, но очень на то похоже.
Задача у него была всегда простая - приём каких-то смс (в основном от банков) и передача их на дальнейшую обработку (в основном простая пересылка в телеграм нужным получателям, но иногда и какая-то осмысленная обработка).
И всё с ним было хорошо, пока не случилось две странные вещи.
Сначала сотовые операторы в СПб начали отключать 3G-частоты. Это оказалось неслабо болезненно для стареньких 3G-модемов... Но это кое-как удалось решить путём полного перехода на 2G. Не всегда это, правда, помогает, потому что современные фемтосоты (например у МТС) уже не умеют 2G, а работают только в 4G. Но как-то пока справились.
А потом пришла вторая беда... Сотовые операторы ввели "период охлаждения" для иностранных SIM-карт. Вначале, если кто не помнит, была совсем беда - SIM-карты после первого включения не работали сутки. Точнее даже не так. SIM-карты после "любого" включения не работали сутки, даже после перезагрузки телефона. И даже без перезагрузки работали они странно, поскольку с завидной регулярностью глушили сотовую сеть, а после её восстановления - снова начинался "период охлаждения".
Но потом вроде бы стало лучше. Сотовые операторы начали присылать SMS, где можно было указать, что ты не робот и период охлаждения заканчивался. Причём у Мегафона можно было пройти по ссылке даже не самого телефона, а уже с того устройства, куда SMS была переслана. Стало удобнее! Интересно, почему только Мегафон сделал такие уникальные ссылки? А у остальных операторов это что-то типа http://visit.mts.ru/ и https://balance.beeline.ru/guest/. Чтоб они все были здоровы...
Плюс, после введения этого адского механизма - с какими-то SIM-картами просто всё пошло плохо. Они просто отказывались нормально работать. Может с самими sim-картами что-то не так, может с модемами, может ОПСОС как-то отдельно не рад IMEI, которые он получал. Трудно сказать. Диагностика на уровне шаманства.
А тут ещё из новостей полилось какое-то барахло на предмет того, что вот-вот введут предварительную регистрацию IMEI. Если они это начнут делать, то скорее всего у меня всё развалится окончательно. Нужно что-то менять.
Я попытался было перейти на свежие 4G-модемы. Но не тут-то было. Там сразу куча всего... Huawei перестал поставлять в Россию модемы. То, что поставляется, идёт под какими-то странными брендами. Но главное - практически везде (вообще везде!) убран так называемый stick-mode, который отвечает за работу в AT-режиме. Теперь там режим Hilink. Это когда модем представляется не tty-устройством, а сразу сетевой картой. И через эту сетевую карту ваш ноутбук (или что там ещё) сразу получает доступ в интернет. При этом на самом свистке крутится web-сервер. Мало того, что он просто ужасный (это само собой), так он ещё у каждого модема разный! Туда лезут своими руками все кому не лень и пытаться там что-то автоматизировать просто нереально.
Короче, история с модемами, кажется, себя исчерпала. Я просто сдался.
Но вот подумалось мне... А не перевести ли мне мой прекрасный шлюз на Android-телефон? В этом случае большая часть проблем, которую я описал, должна как-то уйти сама собой... Ну, будем пробовать. Время покажет.
Я взял несколько смартфонов Samsung A07 (вроде сносный не очень дорогой телефон на две SIM-карты).
Долго читал про httpSMS. Но там точно всё было облачное, а облачное мне не нужно...
Остановился на android-sms-gateway. Понятного в документации для начала мало. Но вроде бы по описанию они на меня рассчитывали. Попробуем.
Вот тут release page, где можно добыть свежий APK. Есть просто release, есть insecure. Insecure интересен тем, что по локальной сети может работать без SSL, что сильно упростит отладку.
Устанавливаем его. Дальше было немного странно, на что у меня ушло прилично времени.
Есть два пункта. Local и Cloud. Почему-то я подумал, что мне нужен Cloud, благо в его настройках можно было прописать мой собственный сервер, к которому оно и начало обращаться. Было любопытно разобраться что же там происходит, но в какой-то момент начало становиться слишком сложно. Я было уже собрался сдаться, но дело оказалось в другом. Под cloud-сервером подразумевается отдельный сервер, разработанный capcom6. Он там где-то тоже лежит в исходниках на github. Но он сложный и предназначен для чего-то куда более масштабного, чем мне нужно.
А мне был нужен Local. В этом режиме на телефоне поднимается небольшой HTTP-сервис, который готов со мной работать. При этом сам он принимает запросы по HTTP (реализовывать TLS они не стали), а вот отправку делает уже как положено, поскольку это стандартный функционал.
Из настроек нужно выставить логин и пароль, для защиты HTTP-сервиса. Если не выставить - он сам что-то рандомное назначит.
Включаем Local, переводим всё это в ONLINE и это в общем почти вся инициализация, которую нужно сделать.
И можно отправить SMS:
curl -v -X POST "http://10.25.235.35:8080/message" -u "sms:jrshQjyk" -H "Content-Type: application/json" -d '{ "textMessage": { "text": "Привет! Это тест." }, "phoneNumbers": ["+79211234567"], "simNumber": 2 }'
Конечно же это сработало не сразу, но теперь-то я уже точно знаю, как это работает! :)
Дальше нужно зарегистрировать наш вебхук, на который будут пересылаться входящие SMS. Выглядит максимально прозрачно:
curl -X POST -u sms:jrshQjyk -H "Content-Type: application/json" -d '{ "id": "incoming-1", "url": "https://yoursite.com/receive_sms.cgi", "event": "sms:received" }' http://10.25.235.35:8080/webhooks
В ответе он даже расскажет, как он успешно это сделал.
И вот наша входящая царская SMS (прилетает к нам через POST в JSON):
{
"deviceId":"0000000035d4b8d30000019befdeeb42",
"event":"sms:received",
"id":"cww2N1eiWnMDEXUnf80PE",
"payload":
{
"message":"Привет, я твоя sms!",
"receivedAt":"2026-01-24T18:53:07.000+03:00",
"messageId":"b97bd7cd",
"phoneNumber":"+79211234567",
"simNumber":2
},
"webhookId":"incoming-1"}
Есть какой-то косяк с тем, что она иногда прилетает несколько раз подряд на webhook. Но в документации (да и вообще в предсказуемой логике) крайне рекомендуют использовать дедупликацию. Это проблему точно снимет, поскольку messageid прилетает уникальный для SMS-сообщения. Отдельно порадовала возможность отправки запроса, который инициировал пересылку всех уже сохранённых в смартфоне SMS-сообщений за указанный период. Явно можно использовать на случай проблем со связью и вообще дополнительного контроля.
curl -X POST http://10.25.235.35:8080/messages/inbox/export -u "sms:jrshQjyk" -H "Content-Type: application/json" -d '{ "since": "2026-01-20T00:00:00+03:00", "until": "2026-01-24T23:59:59+03:00" }'
Да в общем-то это, кажется, и всё...
Это выглядит как победа над "решением шлюза" на телефоне. Понятно, что ко всему этому нужно ещё сделать какой-то простенький бэкенд, но выглядит это так, как будто без модема Huawei можно как-то жить!
Теперь устранение дальнейших проблем.
Есть какая-то беда с автозапуском приложения SMSGate. Если снять с телефона все блокировки (pattern/pin и прочие), то после перезагрузки всё должно запуститься само. Но явно есть какая-то ошибка в SMSGate и в таком режиме оно падает при старте и запускаться само не хочет. Попробуем это исправить с помощью Macrodroid (Tasker не поставить простым способом в России). Ставим...
Но у меня почему-то и Macrodroid не скачать из Play Store. Попробую поставить отсюда. Macrodroid APK.
Здесь всё получилось достаточно просто и быстро. Интерфейс относительно понятный, да и задача у меня была простая. Оставлю здесь ссылку нас получившийся макрос. Его достаточно просто скачать и импортировать в Macrodroid. Для себя я его ещё сложил на Google Drive, и от-туда его оказалось забирать проще через пункт "Open with...".
Решил, что мне обязательно нужен удалённый доступ до телефонов в ручном режиме. Многие вещи, даже на Android, можно сделать только вручную. "О времена...". Для этого неплохо подходит scrcpy. Сделал проброс порта ADB с сервера к себе и всё сразу заработало. Но при подключении второго телефона в систему - всё рассыпалось и разборки заняли у меня какое-то неимоверное количество времени. Решение нашлось, но к этому моменту нервы были на пределе. Оказалось, что в Debian "bullseye" (с LTS до Aug 2026) пакет adb содержит версию 28.0.2 (May 2019). Её замена на текущий релиз решила все проблемы.
Теперь у меня на экране в доступе был пучок экранов, с которыми можно было работать. Конечно же, первое, что я сделал - я их перепутал. Оказалось неудобно то, что я не могу их "легко" отличить. Для этого я решил поставить на них просто разный фон экрана. Получилось удобно. Но его нужно было как-то в автоматическом или полуавтоматическом режиме создавать. Вот простейшая утилита. Откройте ссылку, измените параметр в URL на нужный вам текст, появится картинка с фоном. Нажмите на картинку и выберите Download. Откройте загрузившуюся картинку в приложении "Gallery". Три точки справа наверху и выберите "Set as wallpaper". Ссылка.
Дальше нужно было сделать какой-то мониторинг телефонов (что они не сдохли, сеть не потеряли и так далее). При написании этой части я наткнулся на странный момент... Один из аппаратов выдаёт в качестве типа сотового подключения IWLAN. Попытки погуглить привели меня к выводу, что это включенный режим WiFi Calling. И вот тут я для себя узнал много интересного... Понятно, что я догадывался что такое "WiFi Calling". Но есть нюансы...
Смысл WiFi Calling состоит в том, что телефон сначала регистрируется в сотовой сети оператора (может быть даже в роуминге). А после этого он получает от дальней стороны "разрешение" перейти в WiFi Calling режим. И после этого, как оказалось, ему наличие сотовой связи становится ненужным. То есть он может существовать только на чистом WiFi (и голос и SMS, но, понятно, без передачи данных). Но если WiFi отвалится, то повторно он подключиться к нему не сможет, пока не поймает нормальный сигнал сотовой сети.
Но это уже очень интересно само по себе! Получается, что если наши операторы продолжат периодически глушить сотовую связь в рамках борьбы с БПЛА, то устройство, которое к этому моменту уже зацепилось за WiFi Calling, будет работать без проблем и перерывов связи. Это интересное, изящное решение! И уже даже только этот рывок может оправдать кучу возни по смене стареньких модемов на смартфоны.
К этому моменту истории могу рассказать ещё вот о чём...
Не нужно включать пучок телефонов к хабу с внешним блоком питания, который к этому не готов. Не знаю, о чём я думал... Но блок питания на 24Вт (12VDC / 2A) не рассчитан на подключение к нему большого количества незаряженных смартфонов. И если мне почему-то подумалось, что он их будет заряжать "медденно", то он подумал совсем о другом. Он перегрелся и со странным звуком "ушёл". Мило с его стороны, что всё закончилось так хорошо. Заменил его на 12VDC/7A.
Не забудьте во всех настройках полезных приложений на смартфоне включить режим Unrestricted в свойствах приложения / Battery. Иначе это просто боль. И заодно там же отключить "Remove permission if app is unused".
Ну и куда же без мелких поделок... Вот так выглядит эта "мега-ферма"...
А так выглядит интерфейс управления.
Торжественное прощание со старой системой...





