Termux на Android можно использовать как компактный полевой шлюз: он работает «на месте», получает телеметрию от датчиков (напрямую по MQTT или через промежуточные устройства), выполняет первичную обработку при необходимости и отправляет данные в централизованную платформу визуализации и хранения. Такой подход снижает нагрузку на серверы и упрощает масштабирование новых точек.
Ниже — практическая схема: датчики публикуют данные в MQTT, Termux выступает подписчиком и шлюзом, Node‑RED выполняет обработку/маршрутизацию и отправляет данные в InfluxDB.
Архитектура решения
- MQTT broker: принимает сообщения от датчиков.
- Termux: подписывается на нужные топики MQTT (как IoT‑шлюз/агрегатор данных) и при необходимости нормализует формат.
- Node‑RED: подписывается на «вход» (или принимает данные от Termux), выполняет преобразования и записывает в InfluxDB.
- InfluxDB: хранит временные ряды (time series) и служит источником для дашбордов.
Важно: для устойчивой работы убедитесь, что устройства находятся в одной локальной сети (например, через Wi‑Fi), либо организуйте локальную сеть с помощью VPN строго для связности внутри вашей среды. Не используйте VPN для обхода блокировок.
Подготовка окружения
1) MQTT broker
Вы можете использовать любой совместимый MQTT broker (например, Mosquitto). Для примера предположим, что брокер доступен по адресу 192.168.1.10 и использует порт 1883.
2) InfluxDB
Разверните InfluxDB (версия 2.x или 1.x зависит от вашей платформы). Ниже приведен подход, который типично используют для 2.x: создаются организация, bucket и токен с правами записи.
В примерах далее предполагаются переменные:
INFLUX_URL— например,http://192.168.1.20:8086INFLUX_TOKEN— токенINFLUX_ORG— организацияINFLUX_BUCKET— bucket
3) Node‑RED
Установите Node‑RED на сервер/ПК в локальной сети. Обычно он доступен по адресу http://192.168.1.30:1880.
Установка компонентов в Termux
В Termux нам понадобится клиент MQTT для подписки. Чаще всего удобно использовать mosquitto-clients (команда mosquitto_sub), но можно выбрать и другие клиенты. Ниже — вариант с mosquitto.
pkg update && pkg upgrade -y
pkg install -y mosquitto netcat-openbsd jqПроверка: убедитесь, что команда доступна.
mosquitto_sub -h 192.168.1.10 -p 1883 -t "test/+" -C 1Если на топике идут сообщения — команда завершится после одного сообщения (параметр -C 1).
Сбор данных с датчиков через MQTT в Termux
Допустим, датчики публикуют телеметрию в топик вида:
site1/sensorAsite1/sensorB
Termux может просто «слушать» и перенаправлять данные. Самый практичный путь: вы публикуете агрегированные/нормализованные данные в отдельный топик, а Node‑RED уже подписывается на него и пишет в InfluxDB.
Вариант А: Termux подписывается и пишет сообщения в локальный канал Node‑RED (HTTP)
Если Node‑RED настроен принимать входящие события через HTTP, Termux может отправлять данные туда. Для этого мы:
- подписываемся на MQTT;
- преобразуем JSON при необходимости;
- отправляем в Node‑RED по HTTP POST.
Предположим, у вас в Node‑RED есть endpoint:
http://192.168.1.30:1880/iot/ingest
Тогда скрипт в Termux может выглядеть так (пример упрощенный):
#!/data/data/com.termux/files/usr/bin/sh
MQTT_HOST="192.168.1.10"
MQTT_PORT="1883"
TOPIC="site1/+/telemetry"
NODE_RED_URL="http://192.168.1.30:1880/iot/ingest"
mosquitto_sub -h "$MQTT_HOST" -p "$MQTT_PORT" -t "$TOPIC" -v | while read -r line; do
# line вида: "site1/sensorA/telemetry {"temp":24.5,"hum":40}"
# В зависимости от формата MQTT, разбор может отличаться.
# Здесь предполагаем, что -v выводит "topic payload".
topic="$(echo "$line" | awk '{print $1}')"
payload="$(echo "$line" | cut -d' ' -f2-)"
curl -s -X POST "$NODE_RED_URL"
-H "Content-Type: application/json"
-d "{"topic":"$topic","payload":$payload}"
doneСделайте скрипт исполняемым:
chmod +x mqtt_to_nodered.shЗапуск:
./mqtt_to_nodered.shЕсли у вас в Termux нет curl:
pkg install -y curlВариант B: Termux не пересылает, а лишь агрегирует и публикует в «чистый» топик
Можно сделать так, чтобы Termux публиковал обработанные/нормализованные данные обратно в MQTT, например в топик:
site1/gateway/telemetry
Тогда Node‑RED подписывается на этот топик и пишет в InfluxDB. Для публикации в MQTT понадобится mosquitto_pub (он входит в mosquitto-clients).
pkg install -y mosquittoПример «слушаем входной топик и публикуем в выходной» (упрощенно):
mosquitto_sub -h 192.168.1.10 -p 1883 -t "site1/+/telemetry" -v |
while read -r topic payload; do
# Простейшая упаковка. В реальном проекте здесь делайте нормализацию.
out_payload="{"source_topic":"${topic}","data":${payload}}"
mosquitto_pub -h 192.168.1.10 -p 1883 -t "site1/gateway/telemetry" -m "$out_payload"
doneПосле этого Node‑RED может работать только с «единым» топиком.
Обработка данных в Node‑RED
Node‑RED позволяет:
- распарсить JSON из payload;
- вычислить дополнительные поля (например, преобразование единиц измерения);
- проставить метаданные (device id, location);
- записать измерения в InfluxDB.
Рекомендованный поток (flow)
- Вход: MQTT‑sub или HTTP‑endpoint.
- Transform: JSON parse, валидация полей, формирование point.
- InfluxDB out: запись в bucket.
Пример: Node‑RED принимает HTTP и пишет в InfluxDB
1) Добавьте узел http in с методом POST и URL, например: /iot/ingest.
2) Добавьте узел http response (чтобы быстро отвечать Termux/клиенту).
3) Добавьте узел function для преобразования к формату InfluxDB (на практике конкретный формат зависит от используемого узла InfluxDB).
Пример функции (концептуально):
// msg.payload приходит как JSON со структурой:
// { "topic": "...", "payload": { "temp": 24.5, "hum": 40 } }
const body = msg.payload || {};
const topic = body.topic || "unknown";
const data = body.payload || {};
const temp = Number(data.temp);
const hum = Number(data.hum);
// Пример простой валидации
if (Number.isNaN(temp) || Number.isNaN(hum)) {
msg.error = "Invalid payload: temp/hum not numbers";
return [null, msg]; // если у вас разведены ветки ошибок
}
// Формируем point для InfluxDB
// (Точный шаблон зависит от узла, но общий смысл: measurement, fields, tags, timestamp)
msg.influxPoint = {
measurement: "sensor_telemetry",
tags: {
source: topic
},
fields: {
temp_c: temp,
hum_pct: hum
}
};
return [msg, null];4) Добавьте узел InfluxDB (выберите соответствующий тип узла для вашей версии Node‑RED/InfluxDB).
В настройках узла обычно задаются: url, token, org, bucket.
Дальше в поле конфигурации point используйте msg.influxPoint (если ваш узел это поддерживает) или соберите точки через шаблон согласно документации узла.
Пример: Node‑RED подписывается на MQTT и сразу пишет в InfluxDB
Если выбран вариант B (Termux публикует в site1/gateway/telemetry), в Node‑RED добавьте:
- mqtt in: topic
site1/gateway/telemetry - function: parse JSON и формирование point
- influxdb out
Функция для парсинга payload может выглядеть так:
const raw = msg.payload;
let obj;
try {
// Часто mqtt in кладет payload в строку
obj = typeof raw === "string" ? JSON.parse(raw) : raw;
} catch (e) {
node.error("JSON parse error: " + e.message, msg);
return null;
}
const data = obj.data || {};
const temp = Number(data.temp);
const hum = Number(data.hum);
if (Number.isNaN(temp) || Number.isNaN(hum)) {
node.error("Invalid numbers in payload", msg);
return null;
}
msg.influxPoint = {
measurement: "sensor_telemetry",
tags: { source: obj.source_topic || "unknown" },
fields: { temp_c: temp, hum_pct: hum }
};
return msg;Хранение в InfluxDB: ключевые настройки
Чтобы данные корректно сохранялись и удобно строились графики, продумайте:
- measurement — например,
sensor_telemetry - tags — источник/устройство (например,
source) - fields — числовые параметры (
temp_c,hum_pct) - timestamp — если датчик присылает время, используйте его; если нет — время прихода
Старайтесь, чтобы в fields были только измерения (числа, boolean), а строковые классификаторы — в tags.
Запуск и тестирование контура
Проверка MQTT
На Termux откройте подписку на тестовый топик:
mosquitto_sub -h 192.168.1.10 -p 1883 -t "site1/+" -vПараллельно в Node‑RED убедитесь, что входящий узел получает сообщения и не падает по ошибкам разбора JSON.
Проверка записи в InfluxDB
Проверьте, что записи появляются в нужном bucket. В зависимости от UI/инструментов вы можете посмотреть первые точки в InfluxDB.
Если вы используете dashboards (например, Grafana), построение графиков должно быть быстрым: новые поля и измерения будут доступны.
Надежность и безопасность в локальном контуре
- Формат сообщений: используйте JSON и придерживайтесь схемы (температура/влажность/статус).
- Идемпотентность: если возможны повторы, добавляйте идентификатор события или используйте timestamp.
- Сетевые ошибки: в Termux добавляйте обработку с повторной отправкой при ошибках HTTP (если выбрали HTTP‑сценарий).
- Локальная сеть: по возможности держите трафик внутри вашей сети. Если применяете VPN, то только для создания локальной сети между устройствами/узлами, а не для обхода блокировок.
Частые проблемы
- Node‑RED не парсит данные: проверьте, что payload действительно JSON, а не строка с неправильной кодировкой.
- InfluxDB принимает, но графики пустые: проверьте measurement/fields названия (особенно регистр) и соответствие типов.
- Termux «не получает» сообщения: убедитесь, что подписка корректна по топикам (включая wildcard
+/#). - Сетевая связность: убедитесь, что адреса (MQTT/Node‑RED/InfluxDB) доступны с Android устройства.
Заключение
Termux можно эффективно использовать в роли IoT‑шлюза: принимать телеметрию по MQTT, организовать первичную агрегацию/нормализацию и передавать данные в Node‑RED для обработки и маршрутизации, а затем сохранять результаты в InfluxDB как временные ряды. Такая связка упрощает внедрение промышленного подхода к IoT‑данным — от датчика до аналитики на графиках.
Хотите собрать подобный контур под ваши датчики и условия сети? Обратитесь в РыбинскЛАБ — поможем с проектированием, настройкой MQTT/Node‑RED/InfluxDB и сопровождением внедрения.