We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Termux в роли IoT‑шлюза: сбор данных с датчиков через MQTT, обработка в Node‑RED и хранение в InfluxDB

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:8086
  • INFLUX_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/sensorA
  • site1/sensorB

Termux может просто «слушать» и перенаправлять данные. Самый практичный путь: вы публикуете агрегированные/нормализованные данные в отдельный топик, а Node‑RED уже подписывается на него и пишет в InfluxDB.

Вариант А: Termux подписывается и пишет сообщения в локальный канал Node‑RED (HTTP)

Если Node‑RED настроен принимать входящие события через HTTP, Termux может отправлять данные туда. Для этого мы:

  1. подписываемся на MQTT;
  2. преобразуем JSON при необходимости;
  3. отправляем в 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)

  1. Вход: MQTT‑sub или HTTP‑endpoint.
  2. Transform: JSON parse, валидация полей, формирование point.
  3. 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 и сопровождением внедрения.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект