HTTP и REST для IoT

HTTP — тот же протокол, по которому грузятся сайты. В IoT он самый простой способ обменяться данными с сервером.

Если устройству нужно изредка отправить показания или дёрнуть веб-сервис — HTTP идеален. Он знаком, понятен и поддерживается везде.

HTTP (HyperText Transfer Protocol) — протокол «запрос–ответ». Клиент (ESP32) отправляет запрос серверу, сервер отвечает. Два главных типа запросов: GET — «дай мне данные» и POST — «вот тебе данные, прими». Этого набора хватает для большинства простых IoT-сценариев: отправить температуру на сервер, забрать настройку, дёрнуть веб-хук.

Данные между устройством и сервером обычно передают в формате JSON — это текст вида «ключ: значение», который легко читать и людям, и машинам. ESP32 формирует JSON с показаниями и шлёт его POST-запросом на ваш сервер или облачный сервис.

Как это работает под капотом

   [ESP32] --- POST /sensor {"temp":23} ---> [СЕРВЕР]
   [ESP32] <------- 200 OK {"status":"ok"} ---- [СЕРВЕР]

   GET  = получить данные
   POST = отправить данные

Современные веб-сервисы обычно построены по принципу REST: у каждого ресурса (датчик, устройство, пользователь) есть свой URL, а действия выражаются методами HTTP. Это предсказуемо и удобно. Логику формирования и разбора JSON удобно отработать в обычном Python — запусти врезку «Посчитай сам ▶».

# Формируем и разбираем JSON-сообщение датчика (HTTP/REST)
import json

# ESP32 собирает показания и упаковывает в JSON для POST-запроса
payload = {
    "device": "esp32-livingroom",
    "temp": 23.4,
    "humidity": 41,
    "battery": 87
}
body = json.dumps(payload)
print("Отправляем на сервер:")
print(body)

# Сервер ответил — разбираем JSON обратно
response = '{"status": "ok", "command": "set_target", "value": 22}'
data = json.loads(response)
print("\nСервер просит установить цель:", data["value"], "°C")

# простое правило на основе ответа
if payload["temp"] > data["value"]:
    print("Решение: выключить обогреватель")
else:
    print("Решение: включить обогреватель")

Эта врезка показывает полный цикл: упаковали показания в JSON, отправили (концептуально), получили ответ-команду, разобрали его и приняли решение. На реальном ESP32 это делает HTTP-библиотека, а логика остаётся той же.

Но у HTTP есть слабые места для IoT. Каждый запрос — это отдельное соединение с заголовками: тяжеловато для частых мелких сообщений и для устройств на батарейке. И сервер не может сам «толкнуть» команду устройству — оно должно само спросить. Для постоянного двустороннего обмена лучше подходит MQTT, ему посвящён следующий урок.

Частые ошибки

  • Слать HTTP-запросы слишком часто. Накладные расходы съедают батарею и трафик.
  • Ждать команд от сервера по HTTP. Сервер не инициирует связь сам; устройство должно опрашивать (polling).
  • Игнорировать код ответа. 200 — успех, 4xx/5xx — ошибка; их нужно обрабатывать.

Best practices

  • Используй HTTP для редких событий и запросов настроек, не для потоковой телеметрии.
  • Всегда проверяй код ответа сервера и обрабатывай ошибки сети.
  • Передавай данные в JSON — это стандарт де-факто и легко парсится.

Где это встречается

HTTP в IoT хорош для интеграций с веб-сервисами. Хочешь, чтобы датчик при срабатывании отправил сообщение в мессенджер или записал строку в облачную таблицу? Почти все такие сервисы предоставляют веб-хуки и REST API, которые дёргаются простым POST-запросом. ESP32 формирует JSON и отправляет его — и вот физическое событие уже связано с облачным сервисом без всякого сложного протокола.

Современное развитие HTTP для устройств — это защищённый HTTPS и формат данных JSON, ставший общим языком интеграций. Многие платформы интернета вещей (облака для устройств) принимают данные именно по HTTP-эндпоинтам. Минус — накладные расходы на каждое соединение, поэтому HTTP выбирают для редких, событийных обращений. А для постоянного потока телеметрии и мгновенных команд тот же проект обычно дополняют MQTT — два протокола прекрасно уживаются в одном устройстве, каждый для своей роли.

Запомни главное

  • HTTP — протокол запрос–ответ с методами GET и POST.
  • Данные передают в формате JSON по принципам REST.
  • HTTP хорош для редких обращений, но однонаправлен и накладен.
  • Всегда проверяй код ответа сервера: 200 — успех, 4xx/5xx — ошибка.

Итог: HTTP — простой протокол «запрос–ответ» (GET/POST) с данными в JSON, удобный для редких обращений к серверу, но тяжеловатый и однонаправленный для постоянной связи. Для живого двустороннего обмена в IoT используют MQTT — переходим к нему.

Проверьте себя
1. Какой HTTP-метод используют, чтобы отправить данные на сервер?
AGET
BPOST
CDELETE
DHEAD
2. В чём слабость HTTP для постоянной связи в IoT?
AОн не работает по Wi-Fi
BСервер не может сам инициировать связь, а частые запросы тяжелы для батареи
CОн не поддерживает JSON
DОн слишком быстрый