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

Привет! В нашей области, как и во многих других, последние полгода проблемы с мобильным интернетом. И обнаруживаешь их, когда выходишь из дома, отключаясь от домашнего 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. Но это, наверно, больше для дебага, либо для особо любознательных пользователей домашнего интернета.

Добавил немного админских утилит, например рассылки сообщений по юзерам, чтобы например уведомлять о нововведениях или работах/сбоях.

Ссылка на репозиторий GitHub

Деплой

Такие небольшие приложения я привык разворачивать при помощи pm2, а деплоить – обычным sh скриптом при помощи rsync и ssh команд. Кстати, наконец разобрался почему у меня иногда не проходит стадия установки зависимостей. Оказалось что при запуске ssh команд нужно подгружать nvm.sh профайл чтобы ваша ssh сессия знала про nvm и текущую версию node.

На этом всё. Спасибо за внимание!
Подписывайтесь на мой Telegram канал Sleepless Tech.