89. Сетевые протоколы и mesh-сети
Прибор в сети отвечает на два вопроса: чем передать — провод или радио, какой именно — и что передать — на каком языке говорить с сервером. Первое решает дальность, питание и цену, второе — объём трафика и то, как прибор переживает потерю связи.
Раздел — карта обоих уровней для прибора и отдельно — ячеистые (mesh) сети, где приборы сами передают сообщения друг друга. Проверено опытом: клиент CoAP на переносимом C против настоящего сервера CoAP в контейнере и модель mesh-сети из 49 узлов.
Как это называется в документации
Оригинал Перевод application protocol, transport протокол данных, способ передачи CoAP: confirmable (CON), non-confirmable (NON), acknowledgement (ACK) подтверждаемое, неподтверждаемое сообщение, подтверждение piggybacked response ответ прямо в подтверждении message ID, token номер сообщения, токен differential pair, driver enable (DE) дифференциальная пара, включение передатчика holding register регистр хранения (Modbus) LPWAN маломощные сети дальнего действия spreading factor (SF), time on air, duty cycle коэффициент расширения, время в эфире, доля времени в эфире mesh, router, end device, gateway ячеистая сеть, ретранслятор, конечное устройство, шлюз flooding, routing, TTL лавинная рассылка, маршрутизация, предел прыжков self-healing самовосстановление
89.1 Два уровня: чем и что
Протоколы данных описывают, что значат байты. Сетевые технологии описывают, как эти байты доходят. Одно от другого почти не зависит: MQTT ходит поверх Ethernet, Wi-Fi и сотовой сети одинаково, а Modbus — поверх RS-485 и поверх TCP.
| Протокол данных | Поверх чего | Модель | Для прибора |
|---|---|---|---|
| MQTT | TCP | издатель-подписчик через брокер | основной выбор (разделы 37.2 и 87) |
| CoAP | UDP | запрос-ответ, как REST | узлы, которым TCP тяжёл: мало памяти, сон, сети на 802.15.4 |
| HTTP | TCP | запрос-ответ | просто и везде, но тяжело: заголовки текстом (раздел 88) |
| AMQP | TCP | очереди с гарантиями доставки | между серверами, а не на приборе |
| Modbus | RS-485, TCP | ведущий опрашивает ведомых | промышленное оборудование, счётчики |
89.2 CoAP: REST поверх UDP
CoAP переносит идеи HTTP — методы, адреса ресурсов, коды ответа — в двоичный формат поверх UDP. Сообщение начинается с четырёх байт:
| Байт | Что внутри |
|---|---|
| 0 | версия (1), тип: 0 — подтверждаемое, 1 — неподтверждаемое, 2 — подтверждение, 3 — сброс; длина токена |
| 1 | код: класс и деталь — 0.01 GET, 0.02 POST, 2.05 данные, 2.04 изменено, 4.04 нет ресурса |
| 2–3 | номер сообщения — по нему узнают повтор |
Дальше идут токен (по нему ответ находит свой запрос), опции (путь,
формат данных) и после байта 0xFF сами данные. Номер опции пишется
приращением к предыдущему, поэтому опции идут по возрастанию номера:
/* Опция: номер — приращением к предыдущей, поэтому опции идут по возрастанию */
static size_t coap_option(uint8_t *p, unsigned delta, const void *val, size_t len)
{
uint8_t ext[4];
size_t n = 0;
unsigned d = coap_nibble(delta, ext, &n);
unsigned l = coap_nibble(len, ext, &n);
p[0] = (uint8_t)((d << 4) | l);
memcpy(p + 1, ext, n);
memcpy(p + 1 + n, val, len);
return 1 + n + len;
}
/* Запрос: 4 байта заголовка, 2 байта токена, по опции Uri-Path на каждую
* часть пути, формат данных (fmt < 0 — без него, до 255), 0xFF и данные */
size_t coap_request(uint8_t *buf, unsigned type, unsigned code, uint16_t mid, uint16_t token,
const char *path, int fmt, const void *data, size_t len)
{
size_t k = 0;
unsigned last = 0;
buf[k++] = (uint8_t)(0x40 | (type << 4) | 2); /* версия 1, тип, длина токена */
buf[k++] = (uint8_t)code;
buf[k++] = (uint8_t)(mid >> 8);
buf[k++] = (uint8_t)mid;
buf[k++] = (uint8_t)(token >> 8);
buf[k++] = (uint8_t)token;
while (*path) {
const char *e = strchr(path, '/');
size_t n = e ? (size_t)(e - path) : strlen(path);
k += coap_option(buf + k, COAP_URI_PATH - last, path, n);
last = COAP_URI_PATH;
path += e ? n + 1 : n;
}
if (fmt >= 0) {
uint8_t v = (uint8_t)fmt;
k += coap_option(buf + k, COAP_CONTENT_FORMAT - last, &v, fmt > 0); /* ноль — пустое значение */
}
if (len) {
buf[k++] = 0xFF;
memcpy(buf + k, data, len);
k += len;
}
return k;
}
coap_nibble кладёт номер или длину в 4 бита, а если они больше 12 —
добавляет один или два байта расширения. Путь sensors/temp становится
двумя опциями: 0xB7 (номер 11 — Uri-Path, длина 7) и 0x04 (прирост
0, длина 4). Весь запрос GET — 19 байт. Разбор ответа (coap_parse) —
зеркальный: код, номер, токен и данные после 0xFF; номера опций прибору
здесь не нужны.
Опыт. В сети контейнеров работает настоящий сервер CoAP (aiocoap) с двумя ресурсами. «Прибор» — тот же код, собранный для компьютера:
| Что прибор отправил | Что ответил сервер |
|---|---|
GET /sensors/temp, подтверждаемое, номер 8901, токен a1b2 |
подтверждение с кодом 2.05, тем же номером и токеном, данные 21.50 |
POST /count с JSON, номер 8902 |
2.04, счётчик 1 |
| тот же пакет ещё раз — будто ответ потерялся | 1 — сервер узнал номер и не выполнил запрос второй раз |
POST /count, номер 8903 |
2 |
GET /nope |
4.04 |
Ответ пришёл прямо в подтверждении: один пакет туда, один обратно, и никакого соединения. Повтор с тем же номером сообщения сервер обязан узнать и ответить прежним ответом. Отсюда правило прошивки: при повторе после таймаута номер сообщения тот же, для нового запроса — новый. Такая защита действует минуты, пока сервер помнит номера; для записи данных по-прежнему нужна идемпотентность (раздел 88.4).
Подтверждаемое сообщение CoAP повторяет сам: первое ожидание — случайное от 2 до 3 с, каждое следующее вдвое длиннее. Четыре повтора укладываются в 45 с, через 93 с отправитель сдаётся. Код 4.xx значит «запрос неверен» — повторять его бессмысленно, как и в HTTP.
89.3 Одно измерение — три способа
Одно и то же — {"temp":21.50} в sensors/temp:
| Сообщение | С заголовками IP и UDP/TCP | Что ещё нужно | |
|---|---|---|---|
| CoAP | 36 байт | 64 | ничего: датаграмма и подтверждение |
| MQTT | 30 байт | 70 | открытое соединение TCP и один раз CONNECT |
| HTTP | 127 байт | 167 | с Connection: close — новое соединение TCP на каждый запрос |
Сами сообщения CoAP и MQTT почти равны; разница — в том, что вокруг. MQTT выгоден, когда соединение держится постоянно и сообщений много. CoAP — когда прибор просыпается, отправляет одно измерение и засыпает: установить соединение TCP стоит дороже самого измерения.
89.4 Провода: Ethernet, RS-485 и Modbus, M-Bus
Ethernet — самая быстрая и надёжная связь: на F407 контроллер есть на кристалле, для любого камня есть микросхемы со стеком (раздел 37.1). По тому же кабелю можно подать питание.
RS-485 — электрический стандарт: дифференциальная пара, на которую вешают десятки приборов, и расстояния до километра. Modbus — протокол: что значат байты. Их часто называют через запятую, но это два уровня: Modbus ходит и по RS-485, и по TCP, а по RS-485 ходит не только Modbus.
⚠️ «10 Мбит/с на 1200 м» — это два предела в одной строке. Для RS-485 есть правило: произведение скорости на длину линии — около 10⁸. На 1200 м это около 100 кбит/с, а 10 Мбит/с — это примерно 10 м.
На линии RS-485 обязательны две вещи. Терминаторы — по 120 Ом между A и B, ровно два, на концах линии: без них на длинном кабеле и большой скорости фронты отражаются, и байты бьются. Смещение — подтяжка A к питанию и B к земле, один комплект на всю линию. Пока все передатчики выключены, линия иначе висит между порогами приёмника (±200 мВ) и ловит из шума ложные старт-биты — как раз в паузах, по которым Modbus ищет конец кадра. Через два терминатора (вместе 60 Ом) смещение должно дать не меньше 200 мВ: при питании 5 В это резисторы 560–680 Ом (254 и 211 мВ), при 3,3 В — около 390 Ом (236 мВ; 560 Ом дают там только 168 мВ). У многих новых приёмопередатчиков порог сдвинут так, что тишина на линии читается единицей, — тогда смещение не нужно.
Линия полудуплексная: передатчик включают выводом DE перед отправкой и
выключают после. У USART F1 и F407 аппаратного управления этим выводом
нет — в заголовках нет ни бита DEM, ни таймаута приёма RTOEN. Всё
делает прошивка: выставить DE, отправить, дождаться флага TC — не
TXE, — снять DE. TXE значит «регистр данных свободен», а последний
байт в этот момент ещё уходит в линию (раздел 16).
Кадр Modbus RTU — адрес, функция, данные и CRC:
/* CRC-16/MODBUS: полином 0xA001 (отражённый 0x8005), начальное 0xFFFF */
uint16_t crc16_modbus(const uint8_t *p, size_t n)
{
uint16_t crc = 0xFFFF;
while (n--) {
crc ^= *p++;
for (int i = 0; i < 8; i++)
crc = (crc & 1) ? (uint16_t)((crc >> 1) ^ 0xA001) : (uint16_t)(crc >> 1);
}
return crc;
}
/* «Прочитать регистры хранения» (функция 3): адрес, функция, первый регистр
* и их число — старшим байтом вперёд, а CRC — младшим */
size_t modbus_read_holding(uint8_t *p, uint8_t addr, uint16_t first, uint16_t count)
{
p[0] = addr;
p[1] = 3;
p[2] = (uint8_t)(first >> 8);
p[3] = (uint8_t)first;
p[4] = (uint8_t)(count >> 8);
p[5] = (uint8_t)count;
uint16_t crc = crc16_modbus(p, 6);
p[6] = (uint8_t)crc;
p[7] = (uint8_t)(crc >> 8);
return 8;
}
«Прочитать 10 регистров с нулевого у прибора 1» — 01 03 00 00 00 0A C5 CD.
Данные идут старшим байтом вперёд, а CRC — младшим: на этом ошибаются
чаще всего.
Конец кадра в Modbus RTU — тишина на линии в 3,5 символа. Символ —
11 бит, поэтому на 9600 бод это 4,0104 мс, на 19 200 — 2,0052 мс (таймер
ставят с округлением вверх: 4,011 и 2,006 мс), а выше
19 200 пауза постоянная, 1,75 мс. Флаг IDLE (раздел 16.5) взводится
после тишины в один символ — меньше, чем нужно; 3,5 символа отсчитывает
таймер, который перезапускают каждым принятым байтом.
M-Bus — шина для счётчиков воды, тепла и газа. Ведущий питает ведомых по той же паре, по которой их опрашивает, так что счётчику не нужна своя батарейка для связи. У M-Bus есть и беспроводной вариант на 868 МГц.
89.5 Радио
| Технология | Частота | Дальность | Скорость | Питание | Сеть |
|---|---|---|---|---|---|
| Wi-Fi | 2,4 и 5 ГГц | десятки метров | десятки Мбит/с и больше | высокое | своя, есть почти везде |
| Bluetooth LE | 2,4 ГГц | метры — десятки метров | до 2 Мбит/с в эфире | низкое | телефон рядом или шлюз |
| Zigbee | 2,4 ГГц | десятки метров на прыжок | 250 кбит/с | низкое у конечных | своя, ячеистая |
| NFC | 13,56 МГц | сантиметры | — | метку питает считыватель | — |
| RFID | несколько диапазонов | от сантиметров до метров | — | пассивные метки без батареи | — |
| LoRaWAN | 868 МГц | километры | 0,3–5,5 кбит/с | очень низкое | своя или оператора |
| Sigfox | 868 МГц | километры | 100 бит/с | очень низкое | только оператора |
| NB-IoT, LTE-M | лицензированные | как у сотовой связи | десятки кбит/с и больше | низкое со сном | оператора, SIM-карта |
Wi-Fi есть везде, но дорог по энергии: подключение к сети занимает секунды (раздел 37.1), и держать его на батарейке долго не выйдет. Его выбор — приборы с сетевым питанием, экраном, обновлениями по воздуху.
Bluetooth бывает двух видов. Классический — для потока: звук, обмен файлами. BLE — для коротких посылок и долгого сна; 2 Мбит/с — это скорость в эфире в быстром режиме, полезных данных проходит заметно меньше. Маячки iBeacon — это BLE, который только объявляет о себе:
| Поле кадра iBeacon | Байт |
|---|---|
| флаги: длина, тип, значение | 3 |
| длина и тип «данные производителя» | 2 |
| код производителя | 2 |
| тип iBeacon и длина остатка (21) | 2 |
| идентификатор места (UUID) | 16 |
| major и minor — номер зоны и маячка | 4 |
| мощность на расстоянии 1 м | 1 |
| итого | 30 из 31 возможного |
Телефон сравнивает принятую мощность с записанной и оценивает расстояние — грубо: «рядом», «близко», «далеко» (почему грубо — раздел 92).
Zigbee изначально ячеистый: 62,5 тысячи символов в секунду по 4 бита — 250 кбит/с. Он делит диапазон 2,4 ГГц с Wi-Fi и BLE, и каналы стоит выбирать с оглядкой:
| Кто | Не пересекается с Wi-Fi 1, 6 и 11 |
|---|---|
| Zigbee | каналы 15, 20, 25, 26 |
| BLE, каналы объявлений | 2402, 2426 и 2480 МГц — выбраны именно так |
NFC и RFID. Длина волны на 13,56 МГц — 22,1 м, а работает NFC на сантиметрах — глубоко в ближней зоне, где антенны не излучают, а связаны как две катушки трансформатора. Поэтому метке не нужна батарейка: её питает поле считывателя. Метка на металле без специальной конструкции не читается — металл гасит поле.
LoRaWAN — дальность за счёт скорости. Коэффициент расширения SF растягивает каждый символ: чем он больше, тем дальше слышно и тем дольше пакет в эфире. Время в эфире считают по формуле:
/* Время пакета в эфире, мкс: sf 7…12, bw в Гц (125000, 250000, 500000),
* cr 1…4 (4/5…4/8), преамбула 8 символов, явный заголовок, CRC включён.
* Оптимизация низкой скорости — при символе длиннее 16 мс. */
uint32_t lora_airtime_us(unsigned sf, uint32_t bw, unsigned cr, unsigned payload)
{
uint32_t tsym = (1000000u << sf) / bw; /* при SF12 — 4,096·10^9, ещё влезает */
unsigned de = tsym > 16000u;
int num = 8 * (int)payload - 4 * (int)sf + 28 + 16;
int den = 4 * ((int)sf - 2 * (int)de);
uint32_t blocks = num > 0 ? (uint32_t)((num + den - 1) / den) : 0;
uint32_t quarters = 4u * 8u + 17u + 4u * (8u + blocks * (cr + 4u)); /* 8 + 4,25 символа преамбулы */
return quarters * tsym / 4u;
}
10 байт данных плюс 13 служебных байт LoRaWAN, полоса 125 кГц:
| SF | Время в эфире | Сообщений в час при 1 % эфира |
|---|---|---|
| 7 | 61,7 мс | 583 |
| 8 | 113,2 мс | 318 |
| 9 | 205,8 мс | 174 |
| 10 | 370,7 мс | 97 |
| 11 | 823,3 мс | 43 |
| 12 | 1,48 с | 24 |
Тот же расчёт для своих SF, полосы, CR и длины пакета делает вкладка «LoRa» в калькуляторах приложения.
В европейском диапазоне 868 МГц прибор может занимать эфир не больше 1 % времени — правила конкретной страны смотрят в её частотном регламенте. Прибор на краю зоны (SF12) отправляет в 24 раза реже, чем прибор у шлюза, поэтому сеть сама снижает SF тем, кого хорошо слышит. Скорость на 125 кГц — от 293 бит/с (SF12) до 5,5 кбит/с (SF7).
Sigfox — наоборот, сверхузкая полоса: сообщение занимает крошечный кусок спектра и поэтому пробивается через шум. Пределы жёсткие: 12 байт на сообщение и 140 сообщений в сутки — 1680 байт. Это не прихоть оператора, а следствие того же 1 %: сутки — 86 400 с, 1 % — 864 с, а каждое сообщение уходит трижды на разных частотах и длится около 2 с — 140 × 3 × 2 = 840 с. Сеть есть только у оператора: нет его покрытия — нет связи.
NB-IoT и LTE-M — сотовая связь для приборов в лицензированных диапазонах. NB-IoT занимает 180 кГц — один ресурсный блок LTE, 12 поднесущих по 15 кГц, — и хорош для неподвижных приборов в подвалах и колодцах. LTE-M быстрее и переходит между вышками на ходу — для трекеров. Обе умеют глубокий сон: прибор договаривается с сетью, что будет недоступен часами, и не тратит энергию на поддержание связи.
Антенны привязаны к длине волны. Штырь в четверть волны:
| Частота | Длина волны | Четверть волны |
|---|---|---|
| 13,56 МГц | 22,1 м | — (антенна — катушка) |
| 868 МГц | 34,5 см | 8,6 см |
| 2,4 ГГц | 12,5 см | 3,1 см |
Поэтому модуль на 868 МГц с антенной-«пружинкой» заметно проигрывает модулю с нормальным штырём, а металлический корпус вокруг антенны гасит связь любого диапазона.
89.6 Как выбрать
Выбор решают шесть вопросов: дальность; объём и частота данных; питание — сеть или батарейка и на сколько лет; цена — модуль, шлюз и абонентская плата; масштаб — сколько приборов на один шлюз; среда — стены, металл, подвалы. Седьмой вопрос часто забывают: чья сеть. Своя сеть требует обслуживания, сеть оператора зависит от его покрытия и тарифов.
| Задача | Разумный выбор |
|---|---|
| датчики в цехе, провода можно проложить | RS-485 и Modbus, Ethernet |
| счётчики в подвалах, раз в сутки | NB-IoT, LoRaWAN, беспроводной M-Bus |
| датчики на батарейках по зданию | Zigbee, Thread, BLE mesh |
| прибор с экраном и обновлениями по воздуху | Wi-Fi, Ethernet |
| метка на товаре или пропуск | RFID, NFC |
| трекер в движении | LTE-M |
89.7 Mesh-сети
В сети «звезда» каждый прибор говорит со шлюзом напрямую. В ячеистой (mesh) сети приборы передают сообщения друг друга, и сообщение доходит до шлюза через несколько прыжков. Роли узлов:
| Роль | Что делает |
|---|---|
| ретранслятор | принимает и пересылает чужие сообщения — приёмник включён всегда |
| конечное устройство | только своё: просыпается, отправляет ближайшему ретранслятору, засыпает |
| шлюз | выход из ячеистой сети в интернет |
Отсюда следствие, которое часто упускают: mesh экономит энергию только конечным устройствам. Возьмём батарейку на 2000 мА·ч. Ретранслятор с постоянно включённым приёмником на 5 мА проживёт 16,7 суток. Конечное устройство, которое просыпается на 10 мс в минуту, берёт в среднем 2,83 мкА (0,83 мкА — 10 мс по 5 мА раз в минуту, и 2 мкА тока сна) и проживёт десятки лет — дольше самой батарейки. Поэтому ретрансляторы питают от сети: в Zigbee это розетки, лампы, выключатели.
Устройство сети бывает трёх видов. В инфраструктурной сети ретрансляторы образуют каркас, а клиенты подключаются к ним звездой. В клиентской сети маршрутизируют сами клиентские устройства. Гибридная сеть сочетает оба подхода.
Как сообщение находит дорогу. Два способа: лавина — каждый пересылает всё, что услышал, — и маршрут — каждый знает, кому передать дальше. Лавине нужны две защиты: предел прыжков (TTL) и кэш повторов — узел помнит, что уже пересылал:
/* Узел помнит последние сообщения, чтобы не пересылать их повторно: кольцо
* пар «отправитель, номер». Адрес 0 не используется — им помечена пустая
* ячейка. Вернёт 1, если сообщение уже видели. */
#define MESH_SEEN 16
struct mesh_cache {
uint16_t src[MESH_SEEN];
uint16_t seq[MESH_SEEN];
unsigned head;
};
int mesh_seen(struct mesh_cache *c, uint16_t src, uint16_t seq)
{
for (unsigned i = 0; i < MESH_SEEN; i++)
if (c->src[i] == src && c->seq[i] == seq)
return 1;
c->src[c->head] = src;
c->seq[c->head] = seq;
c->head = (c->head + 1) % MESH_SEEN;
return 0;
}
Модель. Сетка 7 × 7, 49 узлов, каждый слышит только соседей по стороне. Шлюз — в одном углу, отправитель — в противоположном. Шлюз сообщение принимает, но дальше не пересылает:
| Способ | Передач | Результат |
|---|---|---|
| маршрут по таблице | 12 | дошло за 12 прыжков |
| лавина с кэшем повторов, TTL 12 | 48 | дошло за 12 прыжков |
| лавина без кэша, TTL 12 | 577 067 | до шлюза дошло 924 копии |
Лавина с кэшем задевает каждый узел ровно один раз: цена сообщения растёт с размером сети, а не с числом путей. Без кэша эфир забивается копиями одного сообщения. Утверждение «число узлов не влияет на эффективность» верно только для маршрутов: каждое сообщение лавины стоит столько передач, сколько в сети узлов.
Отказ. Отправитель теперь в соседнем углу, в шести прыжках от шлюза. Затем отказывает «стена» — шесть узлов поперёк сети, проход остаётся только у края:
| Что происходит | Результат |
|---|---|
| маршрут по старой таблице | потерян: следующий узел молчит |
| лавина с TTL 8 — запас 2 над обычным путём | 20 передач, не дошло |
| таблица перестроена | 18 прыжков вместо 6 |
| лавина с TTL 18 | 42 передачи, дошло за 18 прыжков |
«Самовосстановление» — не свойство сети, а работа: маршруты надо перестроить, а предел прыжков — выбирать по худшему пути, а не по обычному. Путь в три раза длиннее — и задержка втрое больше. Сеть, которая сама обходит отказы, заодно их и прячет: чтобы найти отказавший узел, каждый узел должен сообщать шлюзу соседей и заряд батарейки.
⚠️ Какую маршрутизацию используют на самом деле. «Кратчайший путь через мосты» (SPB), который упоминают рядом с mesh, — стандарт проводных коммутаторов Ethernet. Беспроводные сети решают задачу иначе: Zigbee ищет маршрут по запросу, когда он понадобился; в Thread ретрансляторы обмениваются таблицами; BLE mesh использует ровно лавину с TTL и кэшем повторов, как в модели выше; Wi-Fi mesh — свой протокол в стандарте 802.11s или решение производителя.
Wi-Fi mesh закрывает дом или цех без проводов, но за каждый прыжок на том же канале платит эфиром: ретранслятор сначала принимает, потом передаёт то же самое, и скорость падает с каждым прыжком. Узлам нужно питание, а расстановку приходится планировать — это и есть радиообследование (раздел 92).
89.8 Грабли
RS-485 теряет последний байт ответа. DE снимают по TXE, а надо по
TC.
Modbus отвечает ошибкой CRC. Байты CRC переставлены: CRC идёт младшим байтом вперёд, в отличие от данных.
Кадры Modbus слипаются или режутся. Конец кадра ищут по флагу IDLE
или по фиксированной паузе, а не по тишине в 3,5 символа при данной
скорости.
Сервер CoAP выполнил команду дважды. Повтор отправили с новым номером сообщения — для сервера это новый запрос.
Ответ CoAP «не от того» запроса. Прибор не сверяет токен: при нескольких запросах подряд ответы приходят в любом порядке.
Прибор LoRaWAN замолкает на минуты. На SF12 пакет идёт полторы секунды, и 1 % эфира кончается после двух десятков сообщений в час.
Zigbee теряет пакеты, когда рядом работает Wi-Fi. Выбран канал, который перекрывается с каналом Wi-Fi.
Метка NFC не читается на корпусе. Корпус металлический, а метка обычная.
Ретранслятор mesh-сети на батарейке сел за две недели. Приёмник ретранслятора включён всегда.
Mesh-сеть захлёбывается после добавления узлов. В лавине нет кэша повторов, или TTL слишком велик.
После отказа узла сообщения пропадают. Маршрут не перестраивается, а TTL выбран по обычному пути.
89.9 Итоги
- Протокол данных (MQTT, CoAP, HTTP, Modbus) и способ передачи (провод или радио) выбирают независимо.
- CoAP — REST поверх UDP: ответ приходит в подтверждении, повтор с тем же номером сервер не выполняет второй раз; для прибора, который просыпается на одно сообщение, он дешевле TCP.
- RS-485 — электрика, Modbus — протокол. Правило для RS-485 — скорость ×
длина ≈ 10⁸. Передатчик выключают после
TC, CRC Modbus идёт младшим байтом вперёд, конец кадра — 3,5 символа тишины. - У LoRaWAN дальность оплачена временем в эфире: 61,7 мс на SF7 и 1,48 с на SF12 для 10 байт. Правило 1 % эфира ограничивает сообщения в час. Пределы Sigfox — 12 байт и 140 сообщений в сутки — следуют из того же 1 %.
- На 2,4 ГГц Zigbee лучше ставить на каналы 15, 20, 25 или 26.
- Mesh экономит энергию конечным устройствам, а не ретрансляторам. Лавине нужны кэш повторов и TTL по худшему пути. После отказа маршрут перестраивают, и путь может вырасти втрое.
Дальше: раздел 90 «Архитектура IoT-решений».