Перейти до основного вмісту

Meshtastic зблизька: як повідомлення стрибає через чужі вузли

· 16 хв. читання
UR3PKI
Software Engineer

Meshtastic — не стек і не платформа, а готовий продукт: дешева плата з LoRa-радіо, телефон по Bluetooth — і чат, який працює там, де немає ні мобільного зв'язку, ні інтернету. Ця нотатка — про те, як саме повідомлення стрибає через чужі вузли, скільки ефіру це коштує і чому меш задихається, коли вузлів стає забагато. Фізика радіо під ним — у розборі LoRa.

237 байтСтеля корисних даних в одному пакеті. Усе довше ріжеться або не йде
16 байтУвесь заголовок: кому, від кого, номер пакета, прапорці, канал
3 / 7Скільки пересилань дозволено за замовчуванням і максимум
1,07 кбіт/сШвидкість пресета LongFast — того, на якому працює майже весь світ

Що це таке — і чим воно не є​

Meshtastic — це прошивка для дешевих плат із LoRa-радіо плюс застосунок на телефон. Плата за 20–40 доларів, прошивка прямо з браузера, телефон по Bluetooth — і є чат, який не знає слова «провайдер».

Ключова відмінність від звичайної рації: повідомлення не мусить долетіти до адресата напряму. Якщо між двома людьми є ще хтось із таким самим вузлом, воно стрибне через нього. Кожен учасник одночасно і клієнт, і ретранслятор — саме це перетворює купу окремих рацій на мережу.

чого зазвичай чекаютьщо є насправді
«Інтернет без інтернету»Текстовий чат, координати на карті й телеметрія. Ні вебу, ні пошти, ні файлів
«Працює скрізь»Працює там, куди дістає радіо — своє або сусідніх вузлів. У чистому полі без інших вузлів дальність дорівнює прямій видимості
«Це анонімно»Ні. Вузол сам розповідає ефіру своє ім'я, номер і часто координати
«Дефолтний канал зашифрований»Формально так, але ключ до нього публічний і однаковий у всіх. Це радше «не відкритим текстом», ніж таємниця
«Чим більше вузлів, тим краще»До певної межі. Далі мережа починає душити сама себе — про це розділ «Ефір скінченний» нижче
«Можна дзвонити»Ні. Один пакет — 237 байт, швидкість — близько кілобіта на секунду

що вміє добре

Текст і координати

Групові повідомлення в каналі, приватні одному вузлу, позиції всіх учасників на карті, батарея й датчики. Саме те, що треба в поході, на змаганнях, на будмайданчику чи коли впав зв'язок.

що вміє несподівано

Бути очима й руками

Датчики (температура, тиск, вода в підвалі), кнопки, сирени, розумний будинок. Вузол без телефона теж корисний: він може просто доповідати або ретранслювати.

чого не вміє принципово

Возити дані

Фото, голос, файли, стрімінг — ні. Це не питання версії прошивки: стільки не пролізе в ефір, який ділять усі одночасно.

Як це працює за шістдесят секунд​

Конструкція складається з чотирьох частин, і в ній легко переплутати, хто що робить.

телефон · вузол · ефір · чужі вузли · телефон на тому кінцітелефонлише екрані клавіатураBluetoothвузолплата + LoRaробить усю роботунавіть коли телефонвимкнений чи далекосусідсусідсусідадресатйого телефонКожен сусід — така сама плата чийогось власника. Ніхто ні з ким не домовлявся: вузли просточують одне одного й переказують далі все, що почули вперше.
Найважливіше з цієї схеми: телефон — не учасник мережі. Він лише малює екран і віддає команди по Bluetooth. Навіть із вимкненим телефоном вузол і далі приймає, ретранслює чуже й накопичує повідомлення для власника. Саме тому вузол можна повісити на дах і забути про нього.
Ключова відмінність від рації

Рація чує лише те, що долітає напряму. Meshtastic перевикористовує чужі вузли: повідомлення переказує кожен, хто почув його вперше. Тому в місті з десятком активних вузлів зв'язок буває там, де пряма видимість давно закінчилася.

Вузол: ім'я, номер, роль​

У мережі немає ні реєстрації, ні акаунтів. Вузол просто вмикається й починає розповідати про себе — і з цих розповідей у всіх сусідів сам складається список учасників.

звідки береться номер вузлаMAC-адреса залізаa4:cf:12:7a:3f:19останні 4 байти12 7a 3f 19номер вузла!127a3f19не хеш ключа, а простошматок заводської адресиплати — тому він і не змінюєтьсяа це вузол розповідає про себе сам · NodeInfoТИкожні кілька годин — «я тут, ось я хто»список вузлів у застосунку!127a3f19PTROPetro's node0 хопів!8ab21044HILLRepeater Hill1 хоп!5f90c3e1ANNAAnna T-Echo2 хопи!c4470b2aSOLRSolar mast3 хопиКоротке ім'я — рівно чотири символи: воно має влізти в крихітний екран і в ефір, де кожен байт на рахунку.
Різниця з Reticulum: там адреса — це криптографічний відбиток ключа, і підробити її неможливо. Тут номер — просто шматок заводської MAC-адреси, а ім'я власник пише сам. До появи власних ключів вузлів (про них — у розділі про канали) це означало, що представитися чужим іменем міг будь-хто.

Що вузол розповідає про себе

  • NodeInfo — номер, коротке й довге ім'я, модель плати, роль
  • Position — координати з GPS, якщо ввімкнено. Можна задати вручну або не давати зовсім
  • Telemetry — напруга й заряд батареї, завантаження каналу, дані датчиків
  • NeighborInfo — кого цей вузол чує напряму: корисно для карти, дорого для ефіру

Перше, про що варто знати

Одразу після прошивки варто пам'ятати: коротке ім'я, довге ім'я й координати бачать усі в радіусі, зокрема незнайомці й ті, хто збирає вузли на публічні карти. Якщо це не входило в плани, передачу позиції краще вимкнути або поставити приблизну точку вручну.

Канали і ключі: хто що читає​

Тут найбільше плутанини й найбільше помилок: слово «зашифровано» в Meshtastic означає зовсім не те, що зазвичай уявляють.

Канал — це пара «ім'я + ключ». Усе, що передається в каналі, шифрується цим ключем — AES, у дефолтного каналу ключ 128-бітний, у згенерованого застосунком 256-бітний. Хто має ключ, читає все. Каналами діляться через QR-код або посилання, і ключ лежить прямо в ньому.

Пастка в тому, що канал за замовчуванням, LongFast, має публічний ключ, однаковий у всіх на планеті. Це зроблено навмисно: щоб дві незнайомі людини, які вперше ввімкнули плати, одразу почули одне одного. Але це означає, що дефолтний канал — загальнодоступний ефір, а не приватна кімната.

одне й те саме повідомлення · три ситуаціїситуація 1 · дефолтний канал LongFastТИсусіднезнайомецьадресатчитають усі троє:ключ у всіх однаковийситуація 2 · власний канал зі своїм ключемТИмає ключключа немаємає ключбачить лише шумчитають лише ті,кому ти дав QR-кодситуація 3 · приватне повідомлення, наскрізні ключіТИпереказує,але не читаєтеж не читаєчитає лише адресат —навіть якщо канал спільний
Третя ситуація з'явилася не одразу. У ранніх версіях «приватне повідомлення» шифрувалося тим самим ключем каналу — тобто будь-хто в каналі міг його прочитати й навіть відправити від чужого імені. У версії 2.5 додали власні ключі вузлів (Curve25519): приватні повідомлення тепер шифруються між конкретними вузлами й підтверджують відправника.
Три правила, які рятують від розчарувань

1. Дефолтний канал — публічний майданчик, а не приватна кімната. 2. Хто отримав QR-код каналу, читає все в ньому назавжди: ключ не «протухає» й не міняється сам. 3. Forward secrecy тут немає: якщо хтось записував ефір і згодом дістав ключ, старі повідомлення розшифруються.

Анатомія пакета: 16 + 237​

Радіокадр тут обмежений 256 байтами. Шістнадцять із них службові, решта — корисні дані. Ця цифра пояснює половину обмежень Meshtastic.

4кому
4від кого
4номер пакета
1прапорці
1канал
1далі
1переказав
237текст, до 237 байт
0заголовок 16 байт — решта під текст253 байти
Три типи пакетів: текст може зайняти всі 237 байт, а от позиція й телеметрія — це компактні структури на пару десятків байт. Різниця важлива: саме дрібні службові пакети, які шлються автоматично й регулярно, з'їдають ефір швидше за живе листування.

Байт прапорців​

HOP LIMITскільки пересилань ще дозволено — 3 біти, тобто максимум 7
ACKчи потрібне підтвердження
MQTTчи пакет прийшов з інтернету
HOP STARTскільки було дозволено на старті — щоб порахувати пройдені хопи
Пара «скільки лишилось» і «скільки було» — маленька, але розумна деталь: віднявши одне від одного, застосунок точно знає, через скільки вузлів пройшло повідомлення, і показує це поруч із кожним відправником.
Чому саме 237

Мінус заголовок, мінус службові поля протоколу — лишається 237 байт. Довший текст застосунок обріже або розіб'є на кілька повідомлень, і кожне окремо полетить через увесь меш. Тому довгі простирадла в ефірі — поганий тон: одне таке повідомлення може коштувати мережі більше, ніж година звичайного листування.

Керований флуд — серце мережі​

У Meshtastic немає таблиць маршрутів і немає нікого, хто знав би карту мережі. Замість цього — навмисно примітивне правило: почув уперше — перекажи далі один раз. Уся інженерія — у слові «керований»: як не дати цьому правилу перетворити ефір на кашу.

одне повідомлення · чотири рівні · дублікати у смітникAвідправникхопів: 3B2чути добре → чекає довшеC2чути ледь-ледь → переказує першимD1E1F0далі переказувати вже не можнаGадресат: дійшло✕той самий номер пакета —уже бачив, викидаю✕сірі кульки — дублікати: вони прилітають другими й нікуди далі не йдуть
Три механізми, які роблять флуд керованим: лічильник хопів обмежує глибину; номер пакета дозволяє впізнати дубль і мовчки його викинути; а затримка перед переказом залежить від того, наскільки добре вузол почув сигнал. Логіка остання — контрінтуїтивна й дуже елегантна.

механізм 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

У центрі великого міста, де чути тридцять вузлів, переказ ще одного статистично не додає покриття: усе, що чує він, чують і сусіди. Зате додає ще одну передачу в і без того забитий ефір. Вимкнути переказ у такій ситуації — не егоїзм, а санітарія.

Скільки насправді треба «роутерів»

Здоровий меш — це кілька високо піднятих вузлів і багато звичайних клієнтів. Не навпаки. Один вузол на пагорбі дає більше покриття, ніж двадцять на підвіконнях, і водночас зменшує навантаження на ефір, бо повідомленню треба менше стрибків.

Пресети радіо: далеко проти швидко​

Налаштування радіо тут зведені до одного вибору зі списку — пресета. Найважливіше про нього: це не регулятор якості, а спільна мова. Вузли з різними пресетами просто не чують одне одного.

той самий компроміс, вісім основних пресетівдалекоблизькоповільно · 0,18 кбіт/сшвидко · 21,88 кбіт/сLONG_SLOW0,18 кбіт/с · SF12LONG_MODERATE0,34 кбіт/сLONG_FAST1,07 кбіт/с · SF11 · за замовчуванням у всьому світіMEDIUM_SLOW1,95 кбіт/сMEDIUM_FAST3,52 кбіт/сSHORT_SLOW6,25 кбіт/сSHORT_FAST10,94 кбіт/сSHORT_TURBO21,88 кбіт/с · не всюди дозволений
Чому майже всі сидять на LONG_FAST: це компроміс, обраний за замовчуванням, і саме тому він працює. Мережа має сенс лише тоді, коли сусіди чують одне одного, — а отже, перемикатися поодинці немає жодного сенсу. Змінюють пресет лише домовившись усією локальною спільнотою.

Крім восьми пресетів на схемі є ще 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. І кожну з цих цифр треба ще помножити на кількість вузлів, які перекажуть пакет.

завантаження каналу · те, що видно в застосунку

0–25 % · здорова мережа25–50 % · прошивка вже притримує зайве50 %+ · повідомлення починають губитися
Цей показник — головний індикатор здоров'я мешу. Коли він повзе вгору, прошивка сама починає економити: рідше шле телеметрію, притримує необов'язкове. Але якщо вузлів у радіусі стає надто багато й кожен щедро доповідає про себе, ніяка автоматика не врятує — ефір просто закінчується.

Що з'їдає ефір найбільше

  • ✕ Короткі інтервали телеметрії й позицій — вони множаться на кількість вузлів
  • ✕ NeighborInfo: корисно для карти, дорого для ефіру
  • ✕ Hop limit 7 замість 3 — кожен зайвий хоп множить кількість передач
  • ✕ Довгі повідомлення й боти, які регулярно пишуть у канал
  • ✕ Міст із MQTT, налаштований так, що тягне в локальний меш увесь світ

Що робить мережу кращою

  • ✓ Інтервали позиції й телеметрії — години, а не хвилини
  • ✓ Hop limit 3, а в маленькій мережі — і 2
  • ✓ Один добре піднятий вузол замість п'яти на підвіконнях
  • ✓ CLIENT_MUTE там, де переказ нічого не додає
  • ✓ Писати коротко: 40 символів займають ефір утричі менше, ніж 237
І ще юридичне

У більшості регіонів на цих частотах діє обмеження робочого циклу: пристрій має право передавати лише малу частку часу. Прошивка стежить за цим сама — і саме тому може тихо не відправити повідомлення, якщо ліміт вичерпано. Це не баг, а закон.

Телеметрія, позиції, traceroute​

Більшість трафіку в типовому меші — не листування людей, а розповіді вузлів про самих себе. Варто розуміти, що саме летить і навіщо.

позиція

Де вузол

Координати з GPS або задані вручну. На карті в застосунку видно всіх, хто ділиться позицією. Можна не ділитися взагалі, ділитися приблизно або лише у своєму каналі.

телеметрія

Як почувається

Напруга й заряд батареї, завантаження каналу, час роботи. Плюс дані датчиків, якщо вони підключені: температура, вологість, тиск, рівень води.

traceroute

Яким шляхом дійшло

Окрема кнопка в застосунку: показує ланцюжок вузлів до адресата і якість сигналу на кожній ділянці. Найкорисніший інструмент, коли з'ясовують, чому зв'язок поганий.

traceroute · шлях і якість сигналу на кожній ділянціТИHILLSOLRANNA−6 дБчути відмінно−14 дБна межі, але тримається−4 дБчути відмінноСлабка ланка видно одразу: якщо зв'язок із ANNA рветься, винна не вона, а ділянка HILL → SOLR.
Як це читати: число — співвідношення сигналу до шуму. Ближче до нуля й вище — добре; нижче мінус п'ятнадцяти — межа, на якій пакети починають губитися. Traceroute показує не «чи є зв'язок», а де саме він ламається, — і це перетворює здогадки на діагностику.

MQTT: коли меш вилазить в інтернет​

Вузол із Wi-Fi може стати мостом: усе, що він чує в ефірі, пересилає на сервер в інтернеті — і навпаки. Це найсуперечливіша можливість Meshtastic, бо вона водночас і найкорисніша, і найшкідливіша.

локальний ефір · шлюз · інтернет · чужий мешлокальний мешшлюзвузол + Wi-FiMQTT-серверчийсь меш за тисячу кілометрів!зворотний напрямок: увесь світ полізеу локальний ефір — і задушить йогоЗелене й блакитне — корисний напрямок: локальний меш стає видимим на карті. Червоне — те, що вмикають необачно.
Асиметрія тут принципова. Віддавати свій трафік в інтернет дешево: ефір на це не витрачається, бо пакет уже пролунав. А от тягнути трафік з інтернету назад у ефір — це нові передачі в каналі, який і так спільний. Саме тому зворотний напрямок вимкнений за замовчуванням, і в локальних спільнотах його просять не вмикати без потреби.

Навіщо це вмикають

  • ✓ Побачити свій меш на публічній карті вузлів
  • ✓ Зв'язати два віддалені меші — свій і друзів в іншому місті
  • ✓ Витягти телеметрію в розумний будинок чи в графіки
  • ✓ Архівувати повідомлення, бо сам вузол довго нічого не зберігає

Чому про це сперечаються

  • ✕ Меш, що залежить від інтернету, перестає бути мережею «на випадок, коли інтернету немає»
  • ✕ Необачно ввімкнений зворотний напрямок вбиває локальний ефір чужим трафіком
  • ✕ Усе, що йде на публічний сервер у дефолтному каналі, стає публічним — разом із координатами

Компроміс: віддавати, але не приймати — і не на дефолтному каналі.

Залізо: плати, антена, сонце​

«Правильної» плати не існує — є кілька родин, кожна під свій сценарій. Різниця між ними не в швидкості, а в тому, скільки вузол проживе без розетки.

типова плата · що на ній єUSBESP32 / nRF52LoRa SX126xGPSне в усіх платахакумулятор18650 або LiPoантена — ніколи не вмикай без неїLoRa-радіо — те саме, що в Reticulumмікроконтролер: ESP32 або nRF52акумулятор: від днів до тижнівекран — не обов'язковий, але зручнийпередача без антени псує підсилюваччіп той самий, різниця лише в прошивціnRF52 економніший, ESP32 має Wi-FiGPS і екран з'їдають найбільшебез нього вузол керується лише з телефона
Головна розвилка при купівлі: ESP32 дешевший, має Wi-Fi (а отже, може бути MQTT-шлюзом) і більше пам'яті, але їсть помітно більше. nRF52 коштує дорожче й без Wi-Fi, зате вузол на ньому живе від тієї самої батареї в рази довше. Для носимого вузла — nRF52, для стаціонарного з живленням — ESP32.

Автономний вузол на щоглі​

Найкорисніше, що можна зробити для локальної мережі, — підняти один вузол високо й залишити його там назавжди. Виглядає це приблизно так:

вузол+ АКБантена — найвищепанель — на південькоробка герметичнависота важливіша за будь-які налаштуваннявзимку світла втричі менше — тримай запасконденсат убиває більше вузлів, ніж морозвузол у долиніодин такий вузол дає покриття цілій долині
Чому це найкраща інвестиція в мережу: вузол на висоті скорочує кількість стрибків для всіх довкола. Менше стрибків — менше передач в ефірі — менше завантаження каналу. Тобто він не просто додає покриття, він розвантажує мережу. П'ять вузлів на підвіконнях дають протилежний ефект.

Чого Meshtastic не робить​

Чесний список, щоб не розчаровуватися. Майже все тут — не недоробки, а прямі наслідки того, що мережа безкоштовна, без інфраструктури й ділить одну вузьку частоту.

  • ✕ Не анонімізує. Вузол сам розповідає ефіру своє ім'я й номер, а часто й координати. Будь-хто поруч бачить, хто це і де.
  • ✕ Не приховує за замовчуванням. Ключ дефолтного каналу однаковий у всіх на планеті. Приватність починається лише з власного каналу або з приватних повідомлень.
  • ✕ Не чекає адресата. Якщо вузол зараз вимкнений, повідомлення для нього просто не дійде. Є окремий модуль Store & Forward, який зберігає й повторює повідомлення, але це рішення для конкретного вузла, а не властивість мережі.
  • ✕ Не гарантує доставку в каналі. Підтвердження є для приватних повідомлень; групове летить «як вийде».
  • ✕ Не масштабується необмежено. Кілька десятків активних вузлів у радіусі — добре. Кілька сотень — ефір закінчується, і мережа працює гірше саме тому, що учасників стало більше.
  • ✕ Не возить дані. Ні файлів, ні фото, ні голосу: 237 байт на пакет і кілобіт на секунду — це стеля.

І ще: мережа не працює, якщо сусіди налаштовані інакше. Регіон, пресет і канал мають збігатися — це найчастіша причина «нічого не бачу».

Meshtastic і Reticulum: одна плата, різні задуми​

Залізо в них однакове настільки, що на одній платі можна крутити то одне, то інше. Але це інструменти для різних задач, і плутанина між ними найпоширеніша.

питанняMeshtasticReticulum
Що цеГотовий продукт: чат, карта, телеметрія. Увімкнув — працюєМережевий стек: конструктор, на якому пишуть власні застосунки
НосійТільки LoRaLoRa, аматорське радіо, кабель, 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 поруч: хто на якому поверсі