Meshtastic зблизька: як повідомлення стрибає через чужі вузли
Meshtastic — не стек і не платформа, а готовий продукт: дешева плата з LoRa-радіо, телефон по Bluetooth — і чат, який працює там, де немає ні мобільного зв'язку, ні інтернету. Ця нотатка — про те, як саме повідомлення стрибає через чужі вузли, скільки ефіру це коштує і чому меш задихається, коли вузлів стає забагато. Фізика радіо під ним — у розборі LoRa.
Що це таке — і чим воно не є
Meshtastic — це прошивка для дешевих плат із LoRa-радіо плюс застосунок на телефон. Плата за 20–40 доларів, прошивка прямо з браузера, телефон по Bluetooth — і є чат, який не знає слова «провайдер».
Ключова відмінність від звичайної рації: повідомлення не мусить долетіти до адресата напряму. Якщо між двома людьми є ще хтось із таким самим вузлом, воно стрибне через нього. Кожен учасник одночасно і клієнт, і ретранслятор — саме це перетворює купу окремих рацій на мережу.
| чого зазвичай чекають | що є насправді |
|---|---|
| «Інтернет без інтернету» | Текстовий чат, координати на карті й телеметрія. Ні вебу, ні пошти, ні файлів |
| «Працює скрізь» | Працює там, куди дістає радіо — своє або сусідніх вузлів. У чистому полі без інших вузлів дальність дорівнює прямій видимості |
| «Це анонімно» | Ні. Вузол сам розповідає ефіру своє ім'я, номер і часто координати |
| «Дефолтний канал зашифрований» | Формально так, але ключ до нього публічний і однаковий у всіх. Це радше «не відкритим текстом», ніж таємниця |
| «Чим більше вузлів, тим краще» | До певної межі. Далі мережа починає душити сама себе — про це розділ «Ефір скінченний» нижче |
| «Можна дзвонити» | Ні. Один пакет — 237 байт, швидкість — близько кілобіта на секунду |
що вміє добре
Текст і координати
Групові повідомлення в каналі, приватні одному вузлу, позиції всіх учасників на карті, батарея й датчики. Саме те, що треба в поході, на змаганнях, на будмайданчику чи коли впав зв'язок.
що вміє несподівано
Бути очима й руками
Датчики (температура, тиск, вода в підвалі), кнопки, сирени, розумний будинок. Вузол без телефона теж корисний: він може просто доповідати або ретранслювати.
чого не вміє принципово
Возити дані
Фото, голос, файли, стрімінг — ні. Це не питання версії прошивки: стільки не пролізе в ефір, який ділять усі одночасно.
Як це працює за шістдесят секунд
Конструкція складається з чотирьох частин, і в ній легко переплутати, хто що робить.
Рація чує лише те, що долітає напряму. Meshtastic перевикористовує чужі вузли: повідомлення переказує кожен, хто почув його вперше. Тому в місті з десятком активних вузлів зв'язок буває там, де пряма видимість давно закінчилася.
Вузол: ім'я, номер, роль
У мережі немає ні реєстрації, ні акаунтів. Вузол просто вмикається й починає розповідати про себе — і з цих розповідей у всіх сусідів сам складається список учасників.
Що вузол розповідає про себе
- NodeInfo — номер, коротке й довге ім'я, модель плати, роль
- Position — координати з GPS, якщо ввімкнено. Можна задати вручну або не давати зовсім
- Telemetry — напруга й заряд батареї, завантаження каналу, дані датчиків
- NeighborInfo — кого цей вузол чує напряму: корисно для карти, дорого для ефіру
Перше, про що варто знати
Одразу після прошивки варто пам'ятати: коротке ім'я, довге ім'я й координати бачать усі в радіусі, зокрема незнайомці й ті, хто збирає вузли на публічні карти. Якщо це не входило в плани, передачу позиції краще вимкнути або поставити приблизну точку вручну.
Канали і ключі: хто що читає
Тут найбільше плутанини й найбільше помилок: слово «зашифровано» в Meshtastic означає зовсім не те, що зазвичай уявляють.
Канал — це пара «ім'я + ключ». Усе, що передається в каналі, шифрується цим ключем — AES, у дефолтного каналу ключ 128-бітний, у згенерованого застосунком 256-бітний. Хто має ключ, читає все. Каналами діляться через QR-код або посилання, і ключ лежить прямо в ньому.
Пастка в тому, що канал за замовчуванням, LongFast, має публічний ключ, однаковий у всіх на планеті. Це зроблено навмисно: щоб дві незнайомі людини, які вперше ввімкнули плати, одразу почули одне одного. Але це означає, що дефолтний канал — загальнодоступний ефір, а не приватна кімната.
1. Дефолтний канал — публічний майданчик, а не приватна кімната. 2. Хто отримав QR-код каналу, читає все в ньому назавжди: ключ не «протухає» й не міняється сам. 3. Forward secrecy тут немає: якщо хтось записував ефір і згодом дістав ключ, старі повідомлення розшифруються.
Анатомія пакета: 16 + 237
Радіокадр тут обмежений 256 байтами. Шістнадцять із них службові, решта — корисні дані. Ця цифра пояснює половину обмежень Meshtastic.
Байт прапорців
Мінус заголовок, мінус службові поля протоколу — лишається 237 байт. Довший текст застосунок обріже або розіб'є на кілька повідомлень, і кожне окремо полетить через увесь меш. Тому довгі простирадла в ефірі — поганий тон: одне таке повідомлення може коштувати мережі більше, ніж година звичайного листування.
Керований флуд — серце мережі
У Meshtastic немає таблиць маршрутів і немає нікого, хто знав би карту мережі. Замість цього — навмисно примітивне правило: почув уперше — перекажи далі один раз. Уся інженерія — у слові «керований»: як не дати цьому правилу перетворити ефір на кашу.
механізм 1
Лічильник хопів
Відправник ставить 3. Кожен, хто переказує, віднімає одиницю; на нулі пакет далі не йде. Максимум — 7, але це майже завжди погана ідея: кожен зайвий хоп множить кількість передач в ефірі.
механізм 2
Впізнавання дублів
У кожного пакета є номер. Вузол пам'ятає, що вже бачив, і другу копію просто викидає. Без цього одне повідомлення в щільній мережі породило б лавину, що забила б ефір на хвилини.
механізм 3
Хто далі — той перший
Перед переказом вузол чекає — тим менше, чим гірше почув сигнал. Тобто першим переказує найдальший, той, хто просуне повідомлення найдалі. Ближні, почувши повтор, розуміють, що їхня допомога вже не потрібна, і мовчать.
Чистий флуд добре працює на десятках вузлів і погано — на сотнях. Тому в нових версіях прошивки вузол запам'ятовує, через кого востаннє дійшло до конкретного адресата, і приватні повідомлення шле вже точково, а не всій мережі. Групові повідомлення в каналі й далі йдуть флудом — інакше їх ніхто б не почув.
Ролі вузлів — і чому ROUTER не комплімент
Роль — один параметр у налаштуваннях, який змінює, як вузол поводиться в ефірі. І найчастіше джерело шкоди мережі від новачків із найкращими намірами.
| роль | що робить | кому підходить |
|---|---|---|
| CLIENT | Звичайний учасник: шле своє, показує чат, переказує чуже | Вибір за замовчуванням для 95 % людей. Плата в кишені, в машині, вдома на столі |
| CLIENT_MUTE | Те саме, але не переказує чуже | Щільне місто з десятками вузлів, де переказ нічого не додає, лише з'їдає ефір і батарею |
| ROUTER | Переказує чуже з пріоритетом, економить енергію, менше розповідає про себе | Тільки вузол на висоті: дах, вежа, гора. Не квартира |
| ROUTER_LATE | Завжди переказує один раз, але після всіх інших — щоб докрити свою групу вузлів | Додатковий вузол на висоті, який страхує основний, а не змагається з ним |
| TRACKER | Регулярно доповідає координати, решту часу спить | Рюкзак, велосипед, собака, дрон |
| SENSOR | Доповідає дані датчика за розкладом | Теплиця, рівень води, датчик дверей |
Колись у цьому списку була ще роль REPEATER — «німа» ретрансляційна цеглина, яку не видно в списку вузлів. З прошивки 2.7.11 її позначено застарілою; на щоглах тепер ставлять ROUTER або ROUTER_LATE.
Поставити роль ROUTER, бо «звучить солідно», і залишити плату на підвіконні. Такий вузол отримує пріоритет у переказах, але чує погано — і замість подовжувати мережу лише додає зайві передачі й перебиває тих, хто справді стоїть високо. Правило просте: ROUTER — про висоту, а не про бажання допомогти. Якщо вузол не на даху й не на горі, його роль — CLIENT.
Коли варто CLIENT_MUTE
У центрі великого міста, де чути тридцять вузлів, переказ ще одного статистично не додає покриття: усе, що чує він, чують і сусіди. Зате додає ще одну передачу в і без того забитий ефір. Вимкнути переказ у такій ситуації — не егоїзм, а санітарія.
Скільки насправді треба «роутерів»
Здоровий меш — це кілька високо піднятих вузлів і багато звичайних клієнтів. Не навпаки. Один вузол на пагорбі дає більше покриття, ніж двадцять на підвіконнях, і водночас зменшує навантаження на ефір, бо повідомленню треба менше стрибків.
Пресети радіо: далеко проти швидко
Налаштування радіо тут зведені до одного вибору зі списку — пресета. Найважливіше про нього: це не регулятор якості, а спільна мова. Вузли з різними пресетами просто не чують одне одного.
Крім восьми пресетів на схемі є ще LONG_TURBO: SF11 на смузі 500 кГц, 1,34 кбіт/с. Широка смуга дозволена не в усіх регіонах, тож перед ним варто звірити правила свого діапазону. Що стоїть за SF і смугою — у розборі LoRa.
Перехід з LONG_FAST на LONG_SLOW додасть кілька децибелів чутливості — і вшестеро сповільнить мережу: 1,07 кбіт/с проти 0,18. А підняти антену на десять метрів або поставити нормальну антену замість «огризка» з комплекту дасть у рази більше. Висота й антена майже завжди перемагають налаштування.
Ефір скінченний: час в ефірі й duty cycle
Найважливіший розділ для тих, хто хоче, щоб меш працював. Уся мережа ділить одну частоту: поки хтось передає, решта мовчить. А передача тут повільна до незручності.
Пресет LONG_FAST дає приблизно 1070 біт на секунду. Повний пакет — 253 байти, тобто понад дві тисячі біт, тож одне довге повідомлення займає спільний ефір понад дві секунди — з преамбулою й службовими символами LoRa виходить 2,1 с. І кожен вузол, який його переказує, передає його ще раз.
| що летить | розмір | ефір на LONG_FAST | як часто |
|---|---|---|---|
| Позиція вузла | ≈ 46 байт | ≈ 0,60 с | За розкладом, автоматично — у кожного вузла з GPS |
| Телеметрія (батарея, датчики) | ≈ 40 байт | ≈ 0,56 с | За розкладом, автоматично |
| NodeInfo (хто я такий) | ≈ 60 байт | ≈ 0,68 с | Періодично, у кожного |
| Коротке повідомлення, 40 символів | ≈ 56 байт | ≈ 0,68 с | Коли пишуть |
| Повне повідомлення, 237 байт | 253 байти | ≈ 2,12 с | Коли пишуть простирадло |
Пораховано за формулою Semtech для LongFast: SF11, смуга 250 кГц, код 4/5, преамбула 16 символів — стільки ставить Meshtastic. Свій випадок можна прикинути калькулятором часу в ефірі з розбору LoRa. І кожну з цих цифр треба ще помножити на кількість вузлів, які перекажуть пакет.
завантаження каналу · те, що видно в застосунку
Що з'їдає ефір найбільше
- ✕ Короткі інтервали телеметрії й позицій — вони множаться на кількість вузлів
- ✕ NeighborInfo: корисно для карти, дорого для ефіру
- ✕ Hop limit 7 замість 3 — кожен зайвий хоп множить кількість передач
- ✕ Довгі повідомлення й боти, які регулярно пишуть у канал
- ✕ Міст із MQTT, налаштований так, що тягне в локальний меш увесь світ
Що робить мережу кращою
- ✓ Інтервали позиції й телеметрії — години, а не хвилини
- ✓ Hop limit 3, а в маленькій мережі — і 2
- ✓ Один добре піднятий вузол замість п'яти на підвіконнях
- ✓ CLIENT_MUTE там, де переказ нічого не додає
- ✓ Писати коротко: 40 символів займають ефір утричі менше, ніж 237
У більшості регіонів на цих частотах діє обмеження робочого циклу: пристрій має право передавати лише малу частку часу. Прошивка стежить за цим сама — і саме тому може тихо не відправити повідомлення, якщо ліміт вичерпано. Це не баг, а закон.
Телеметрія, позиції, traceroute
Більшість трафіку в типовому меші — не листування людей, а розповіді вузлів про самих себе. Варто розуміти, що саме летить і навіщо.
позиція
Де вузол
Координати з GPS або задані вручну. На карті в застосунку видно всіх, хто ділиться позицією. Можна не ділитися взагалі, ділитися приблизно або лише у своєму каналі.
телеметрія
Як почувається
Напруга й заряд батареї, завантаження каналу, час роботи. Плюс дані датчиків, якщо вони підключені: температура, вологість, тиск, рівень води.
traceroute
Яким шляхом дійшло
Окрема кнопка в застосунку: показує ланцюжок вузлів до адресата і якість сигналу на кожній ділянці. Найкорисніший інструмент, коли з'ясовують, чому зв'язок поганий.
MQTT: коли меш вилазить в інтернет
Вузол із Wi-Fi може стати мостом: усе, що він чує в ефірі, пересилає на сервер в інтернеті — і навпаки. Це найсуперечливіша можливість Meshtastic, бо вона водночас і найкорисніша, і найшкідливіша.
Навіщо це вмикають
- ✓ Побачити свій меш на публічній карті вузлів
- ✓ Зв'язати два віддалені меші — свій і друзів в іншому місті
- ✓ Витягти телеметрію в розумний будинок чи в графіки
- ✓ Архівувати повідомлення, бо сам вузол довго нічого не зберігає
Чому про це сперечаються
- ✕ Меш, що залежить від інтернету, перестає бути мережею «на випадок, коли інтернету немає»
- ✕ Необачно ввімкнений зворотний напрямок вбиває локальний ефір чужим трафіком
- ✕ Усе, що йде на публічний сервер у дефолтному каналі, стає публічним — разом із координатами
Компроміс: віддавати, але не приймати — і не на дефолтному каналі.
Залізо: плати, антена, сонце
«Правильної» плати не існує — є кілька родин, кожна під свій сценарій. Різниця між ними не в швидкості, а в тому, скільки вузол проживе без розетки.
Автономний вузол на щоглі
Найкорисніше, що можна зробити для локальної мережі, — підняти один вузол високо й залишити його там назавжди. Виглядає це приблизно так:
Чого Meshtastic не робить
Чесний список, щоб не розчаровуватися. Майже все тут — не недоробки, а прямі наслідки того, що мережа безкоштовна, без інфраструктури й ділить одну вузьку частоту.
- ✕ Не анонімізує. Вузол сам розповідає ефіру своє ім'я й номер, а часто й координати. Будь-хто поруч бачить, хто це і де.
- ✕ Не приховує за замовчуванням. Ключ дефолтного каналу однаковий у всіх на планеті. Приватність починається лише з власного каналу або з приватних повідомлень.
- ✕ Не чекає адресата. Якщо вузол зараз вимкнений, повідомлення для нього просто не дійде. Є окремий модуль Store & Forward, який зберігає й повторює повідомлення, але це рішення для конкретного вузла, а не властивість мережі.
- ✕ Не гарантує доставку в каналі. Підтвердження є для приватних повідомлень; групове летить «як вийде».
- ✕ Не масштабується необмежено. Кілька десятків активних вузлів у радіусі — добре. Кілька сотень — ефір закінчується, і мережа працює гірше саме тому, що учасників стало більше.
- ✕ Не возить дані. Ні файлів, ні фото, ні голосу: 237 байт на пакет і кілобіт на секунду — це стеля.
І ще: мережа не працює, якщо сусіди налаштовані інакше. Регіон, пресет і канал мають збігатися — це найчастіша причина «нічого не бачу».
Meshtastic і Reticulum: одна плата, різні задуми
Залізо в них однакове настільки, що на одній платі можна крутити то одне, то інше. Але це інструменти для різних задач, і плутанина між ними найпоширеніша.
| питання | Meshtastic | Reticulum |
|---|---|---|
| Що це | Готовий продукт: чат, карта, телеметрія. Увімкнув — працює | Мережевий стек: конструктор, на якому пишуть власні застосунки |
| Носій | Тільки LoRa | LoRa, аматорське радіо, кабель, TCP, I2P — що завгодно |
| Адреса | 4 байти з MAC-адреси плати | 16 байт хешу від криптографічного ключа |
| Маршрутизація | Керований флуд, стеля 3–7 хопів | Таблиці шляхів, до 128 хопів, склеювання різних носіїв |
| Шифрування | Ключ каналу для груп; власні ключі вузлів — для приватних | Наскрізне завжди, вимикача немає; ефемерні ключі в сесіях |
| Доставка офлайн | Лише через окремий модуль на конкретному вузлі | Вбудована: вузли доставки тримають пошту |
| Поріг входу | Година — і вже чат | Вечір — і зрозуміло, як воно влаштоване |
| Кому підійде | Групі в горах, волонтерам, сусідам по району, змаганням | Тим, хто будує власну мережу або застосунок під неї |
Meshtastic відповідає на питання «як поговорити без зв'язку прямо зараз». Reticulum — на питання «як побудувати мережу, яка нікому не належить». Перше — про похід цих вихідних, друге — про інфраструктуру.
Практика: від коробки до чату
Найдовше тут — дочекатися посилки. Решта — приблизно година.
Три кроки
Крок 1 — плата під свій регіон. Частота залежить від країни, і плати продаються під конкретні діапазони. Купити «не ту» плату — найдорожча помилка на старті: інша частота означає інше залізо радіо, налаштуваннями це не лікується. В Україні використовують діапазони 433 і 868 МГц, і в прошивці для них є окремі регіони — UA_433 та UA_868.
Крок 2 — прошивка прямо з браузера. Офіційний веб-флешер працює в Chrome чи Edge: плата підключається кабелем, обирається модель, одна кнопка. Нічого встановлювати не треба.
Крок 3 — застосунок і перше налаштування. Застосунок підключається до вузла по Bluetooth. Найперше — регіон: доки його не задано, вузол узагалі не передає, і це штатна поведінка, а не поломка. Далі — ім'я, роль CLIENT і нормальні інтервали телеметрії.
Те саме з командного рядка
# утиліта керування вузлом
pip install meshtastic
# що це за вузол і як налаштований
meshtastic --info
# регіон — найперше й найважливіше
meshtastic --set lora.region UA_868
# пресет: міняти лише разом із усіма
meshtastic --set lora.modem_preset LONG_FAST
# імена вузла
meshtastic --set-owner "Petro's node" \
--set-owner-short "PTRO"
# рідше доповідати про себе — економія ефіру
meshtastic --set telemetry.device_update_interval 3600
meshtastic --set position.position_broadcast_secs 3600
# приєднатися до каналу за посиланням
meshtastic --seturl "https://meshtastic.org/e/#..."
# написати в канал і подивитися список вузлів
meshtastic --sendtext "привіт"
meshtastic --nodes
# яким шляхом ідуть пакети до сусіда
meshtastic --traceroute '!8ab21044'
1. Увімкнути плату без прикрученої антени — можна зіпсувати радіо. 2. Поставити роль ROUTER у квартирі. 3. Підняти hop limit до 7, «щоб точно дійшло». 4. Лишити інтервали телеметрії та позиції на хвилинах — і самотужки завантажити ефір цілого району.
Словник
- Node ID — номер вузла: чотири байти з MAC-адреси плати, показується як
!127a3f19. - Short name — чотири символи, якими вузол підписаний на карті й у списку. Довге ім'я — для людей.
- Channel — ім'я плюс ключ. Хто має ключ, читає все в каналі. Ділиться QR-кодом або посиланням.
- LongFast — канал і пресет за замовчуванням. Ключ у нього публічний — це загальний ефір, а не приватна кімната.
- Preset — набір радіопараметрів. Спільна мова: вузли з різними пресетами не чують одне одного.
- Hop limit — скільки разів пакет можна переказати. Типово 3, максимум 7. Кожен зайвий хоп множить трафік.
- SNR / RSSI — наскільки добре чути сусіда. Саме з SNR рахується затримка перед переказом.
- Airtime — час, який пакет займає в ефірі. Повне повідомлення на LongFast — понад дві секунди.
- Duty cycle — законне обмеження частки часу передачі. Прошивка стежить сама й може не відправити повідомлення.
- Channel utilization — наскільки забитий ефір. Головний індикатор здоров'я мешу.
- Role — поведінка вузла в ефірі: CLIENT, CLIENT_MUTE, ROUTER, ROUTER_LATE, TRACKER, SENSOR та кілька вужчих.
- NodeInfo — періодична розповідь вузла про себе: номер, імена, залізо, роль.
- Traceroute — ланцюжок вузлів до адресата і якість сигналу на кожній ділянці.
- MQTT gateway — вузол із Wi-Fi, який пересилає трафік між ефіром і сервером в інтернеті.
- Store & Forward — модуль на окремому вузлі, що зберігає повідомлення й повторює їх для тих, кого не було в мережі.
- PKC — власні ключі вузлів (Curve25519, з версії 2.5) для приватних повідомлень: шифрують між конкретними вузлами й підтверджують відправника.
Назви параметрів і регіонів варто звіряти з документацією своєї версії прошивки: проєкт швидко розвивається.
- LoRa зблизька — фізичний рівень: чирп, spreading factor, час в ефірі, дальність
- Reticulum зблизька — мережевий стек, де адреса — це ключ, а LoRa — лише один із носіїв
- Чотири інтернети — Reticulum, I2P, Yggdrasil і Nostr поруч: хто на якому поверсі
