Используем старый смартфон для мониторинга доступности мобильного интернета

Привет! В нашей области, как и во многих других, последние полгода проблемы с мобильным интернетом. И обнаруживаешь их, когда выходишь из дома, отключаясь от домашнего wi-fi. Пока собираю ребенка утром, не успеваю вспомнить и проверить мобильный интернет, а он нужен, чтобы включить для ребенка подкаст по дороге в сад. Поэтому я решил написать относительно бесполезного бота, который бы мониторил и присылал статус в Telegram с утра.
Как мониторить состоянии сети в регионе
Я посмотрел доступные сервисы, которые можно было бы парсить, и они все работают по принципу обращения клиентов. Т.е. скорее всего с большими задержками, да и не совсем точно, потому что пользователи могут жаловаться по многим причинам (может у кого-то деньги кончились на тарифе, или какие-нибудь частные сбои). Поэтому я решил отыскать какой-нибудь старенький смартфон, который бы служил датчиком наличия мобильной сети (благо есть вторая симка).
Что дальше?
Первая идея была запустить как-нибудь Telegram бота прямо на нем, но единственная проблема – как отправить сообщение при отказе мобильной сети. Т.к. я пишу на NodeJS, то у меня нет возможности на этой платформе переключить сеть на wifi (ну или я о ней не знаю, но все равно это решение нестабильное). С другими платформами (нативной разработки под андроид, например) заморачиваться не хочу даже с чатом гопоты.
Поэтому возникла вторая идея – отправлять с телефона запросы на сервер 1 раз в минуту, и если до сервера не дошел ни один запрос в течение 5 минут, то, видимо, смартфон потерял соединение, и мобильный интернет (у данного оператора) отвалился.
Как превратить смартфон в платформу для исполнения кода?
Есть замечательное приложение для Androind – Termux, и его различные модификации. По факту Termux – это приложение-эмулятор терминала Linux для Android, которое предоставляет полноценную Linux-среду на смартфоне или планшете без необходимости root-прав. Оно позволяет устанавливать и запускать множество программ из репозитория Linux с помощью пакетного менеджера pkg
, используя командную строку. Можно даже поставить nodejs и запускать сервер на смартфоне. Нам же достаточно sh скрипта, который при помощи curl будет в бесконечном цикле отправлять запросы на наш сервер.
Заходим в termux и устанавливаем curl
pkg install curl cronie -y
создаем наш скрипт (с помощью редактора nano): nano heartbeat.sh
#!/data/data/com.termux/files/usr/bin/bash
while true
do
curl -H "Authorization: Bearer your_auth_secret" http://YOUR_VPS_DOMAIN/heartbeat
sleep 60
done
Добавим заголовок аутентификации, чтобы абы кто не мог слать запросы на наш сервер Authorization: Bearer your_auth_secret
Сделаем его исполняемым: chmode +x heartbeat.sh
Перед запуском скрипта выполним команду termux-wake-lock
(это поможет не гасить вашу сессию termux при выключении экрана).
Стартуем ./heartbeat.sh
Можно погасить экран. Смартфон, конечно, будет оптимизировать работу программ, чтобы сэкономить батарею, и запросы будут отправляться реже, но для нас это не критично (да и termux-wake-lock должен помочь) .
Делаем бота
Попросил бездушную машину накидать мне простого бота на стеке NodeJS: telegraf + express + JSON в качестве базы данных. Подправил, и в итоге логика работы такая.
Стартует сервер, который будет принимать запрос от нашего смартфона. Сохраняем время последнего пришедшего запроса для статистики. Если в течение 5 минут нет запросов, значит, пропал мобильный интернет.
Пользователь бота при старте может настроить время ежедневного уведомления, чтобы проснувшись, знать статус сети. В назначенное время ему придет сообщение со статусом. Либо можно руками проверить статус, вызвав команду /status.
Пользователь бота также может подписаться на смену статуса командой /setstatuschange. Но это, наверно, больше для дебага, либо для особо любознательных пользователей домашнего интернета.
Добавил немного админских утилит, например рассылки сообщений по юзерам, чтобы например уведомлять о нововведениях или работах/сбоях.
Деплой
Такие небольшие приложения я привык разворачивать при помощи pm2, а деплоить – обычным sh скриптом при помощи rsync и ssh команд. Кстати, наконец разобрался почему у меня иногда не проходит стадия установки зависимостей. Оказалось что при запуске ssh команд нужно подгружать nvm.sh профайл чтобы ваша ssh сессия знала про nvm и текущую версию node.
На этом всё. Спасибо за внимание!
Подписывайтесь на мой Telegram канал Sleepless Tech.