Zbuduj własnego obserwera MeshCore

Set up your own MeshCore observer

Od flashowania do pierwszych pakietów — około 10 minut pracy
From flashing to your first packets — about 10 minutes of work
Instrukcja dla polskiej sieci MeshCore · sierpień 2026
Guide for the Polish MeshCore mesh · August 2026

Obserwer to zwykły węzeł MeshCore, który dodatkowo przesyła każdy usłyszany pakiet do brokera MQTT. Im więcej obserwerów, tym szerszy zasięg obserwacji, lepsza rekonstrukcja ścieżek i uczciwsze statystyki — dla wszystkich, którzy korzystają z publicznych analizatorów sieci.

  • Działa na dowolnej płytce LoRa z WiFi obsługiwanej przez MeshCore — Heltec V3/V4, Station G2, T-Beam, Xiao S3 WIO, RAK…
  • Twój węzeł nadal przekaźnikuje dokładnie tak jak wcześniej — obserwowanie to funkcja dodatkowa, nie zamiennik
  • Około 10 minut pracy: flashowanie, wklejenie kilku komend w konsoli, restart

Kroki 1–5 poniżej prowadzą przez całość, od początku do końca.

An observer is an ordinary MeshCore node that also uplinks every packet it hears to an MQTT broker. More observers means wider coverage, better path reconstruction and more honest statistics — for everyone using the public network analyzers.

  • Runs on any MeshCore-capable LoRa board with WiFi — Heltec V3/V4, Station G2, T-Beam, Xiao S3 WIO, RAK…
  • Your node keeps repeating exactly as before — observing is additive, not a replacement
  • About 10 minutes of work: flash, paste a few console commands, reboot

Steps 1–5 below walk through the whole thing.

Czego potrzebujesz

What you need

  • Płytka LoRa z WiFi obsługiwana przez MeshCore (lista jest we flasherze)
  • Komputer z przeglądarką Chrome lub Edge — flashowanie odbywa się przez Web Serial, które nie działa na telefonie ani w Safari
  • Kabel USB do transmisji danych — nie „tylko do ładowania”. To najczęstsza przyczyna „komputer nie widzi urządzenia”
  • WiFi 2,4 GHz w zasięgu węzła — te płytki nie mają radia 5 GHz
  • A LoRa board with WiFi supported by MeshCore (the flasher lists them)
  • A desktop computer with Chrome or Edge — flashing uses Web Serial, which does not work on phones or in Safari
  • A USB data cable — not a charge-only one. This is the single most common cause of “my computer does not see the device”
  • 2.4 GHz WiFi within reach of the node — these boards have no 5 GHz radio
1

Wgraj firmware obserwera

Flash the observer firmware

Flashuj ze strony observer.gessaman.com — to flasher działający w przeglądarce, wgrywający build MeshCore, który obsługuje do 6 brokerów MQTT jednocześnie. Dzięki temu zasilanie kolejnego analizatora nie kosztuje Cię niczego, co już masz.

  • Wybierz swoją płytkę z listy po lewej, a następnie rolę Repeater (rolę Room Server wybierz tylko wtedy, gdy chcesz dodatkowo hostować pokój czatowy)
  • Zostaw wersję na aktualnym wydaniu — tym bez przyrostka -dev
  • Aktualizujesz węzeł, który już działa? Nie zaznaczaj opcji Erase device — dzięki temu jego tożsamość i ustawienia przetrwają

Flash from observer.gessaman.com — a browser flasher for a MeshCore build that drives up to 6 MQTT brokers at once, so feeding another analyzer costs you nothing you already have.

  • Pick your board from the list on the left, then the role Repeater (choose Room Server only if you also want to host a chat room)
  • Leave the version on the current release — the one without a -dev suffix
  • Updating a node you already run? Leave Erase device unchecked so its identity and settings survive
Uwaga
Careful

Pełne kasowanie nadaje węzłowi nowy klucz publiczny, więc w analizatorach pojawi się on jako zupełnie nowy obserwer — a jego dotychczasowa historia zostanie przypisana do „starego” węzła.

A full erase gives the node a new public key, so it will show up in the analyzers as a brand-new observer — and its previous history stays attached to the “old” node.

2

Ustaw radio, nazwę i WiFi

Radio, name and WiFi

Otwórz Console w nagłówku flashera (port szeregowy, 115200) i wklejaj komendy pojedynczo, linia po linii:

Open Console in the flasher header (serial, 115200) and paste the commands one line at a time:

set radio 869.617981,62.5,8,8
set tx 22
set name PL-KRK YOUR_NODE_NAME
set mqtt.iata KRK
set timezone Europe/Warsaw
set wifi.ssid YOUR_WIFI_SSID
set wifi.pwd YOUR_WIFI_PASSWORD

Podmień YOUR_NODE_NAME na nazwę swojego węzła, a YOUR_WIFI_SSID i YOUR_WIFI_PASSWORD na dane swojej sieci WiFi. Kod miasta (KRK w przykładzie) ustaw na najbliższy sobie:

Replace YOUR_NODE_NAME with your node’s name, and YOUR_WIFI_SSID / YOUR_WIFI_PASSWORD with your WiFi credentials. Set the city code (KRK in the example) to the one nearest you:

MiastoCity KodCode MiastoCity KodCode
BydgoszczBZGRadomRDO
GdańskGDNRzeszówRZE
KatowiceKTWSzczecinSZZ
KrakówKRKWarszawaWAW
LublinLUZWarszawa — ModlinWMI
ŁódźLCJWrocławWRO
OlsztynSZYZielona GóraIEG
PoznańPOZ
Jak wybrać kod
How to pick a code

To kody IATA polskich lotnisk komunikacyjnych — służą wyłącznie jako etykieta regionu w temacie MQTT, nie mają nic wspólnego z lotnictwem. Wybierz najbliższe duże lotnisko, a nie najbliższe miasto. Jeśli w Twojej okolicy działają już inne węzły, najlepiej użyć tego kodu, którego używają one — im mniej rozdrobnienia, tym czytelniejsze grupowanie na mapie. Nie ma Twojego regionu na liście? Napisz, dobierzemy kod.

These are IATA codes of Polish commercial airports — they serve purely as a region label in the MQTT topic and have nothing to do with aviation. Pick your nearest major airport, not your nearest town. If other nodes already run near you, use the code they use — less fragmentation means clearer grouping on the map. Your region not listed? Write to me and we will pick a code.

  • Ustawienia radia powyżej to EU/UK Narrow — preset używany w większości Polski. Śląsk ma własny preset — zapytaj lokalnie, zanim założysz
  • set tx 22 to maksimum Helteca — dopasuj do swojej lokalnej sieci
  • Prefiks PL-KRK w nazwie to zwyczaj, nie wymóg — ułatwia rozpoznanie węzła na mapie
  • The radio settings above are EU/UK Narrow — the preset used across most of Poland. Silesia runs its own preset — ask locally before you assume
  • set tx 22 is the Heltec maximum — match your local mesh
  • The PL-KRK prefix in the name is a convention, not a requirement — it just makes the node easier to recognise on the map
Nie pomijaj tego
Do not skip this

Bez mqtt.iata temat MQTT wychodzi pusty i analizatory zignorują Twój węzeł. To najczęstsza przyczyna sytuacji „wszystko wygląda dobrze, a mnie nigdzie nie widać”.

Without mqtt.iata the MQTT topic comes out empty and the analyzers will ignore your node. This is the number one cause of “everything looks fine but I appear nowhere”.

3

Skieruj węzeł na pierwszego brokera

Point it at the first broker

Nadal w konsoli. To jest ta część, która wysyła Twój ruch do analizatora analyzer.marwoj.net.

Still in the Console. This is the part that sends your traffic to the analyzer.marwoj.net analyzer.

Od v1.17.1.4 — jedno polecenie, bez zakładania konta
From v1.17.1.4 — one command, no account needed

Od wydania v1.17.1.4 broker mqtt.marwoj.net jest wbudowany w firmware obserwera jako preset marwoj. Nie podajesz hosta, portu ani loginu — i nie musisz do mnie pisać po konto.

Sprawdź, co masz na węźle, poleceniem ver. Potrzebujesz v1.17.1.4 lub nowszej — odpowiedź wygląda mniej więcej tak: v1.17.1.4-observer-c2c4cb5. Masz coś starszego? Przeflashuj z observer.gessaman.com (Krok 1) albo zjedź niżej, do starszej metody.

Since release v1.17.1.4 the mqtt.marwoj.net broker is built into the observer firmware as the marwoj preset. No host, no port, no credentials — and no need to write to me for an account.

Check what your node runs with the ver command. You need v1.17.1.4 or newer — the answer looks roughly like v1.17.1.4-observer-c2c4cb5. Older than that? Reflash from observer.gessaman.com (Step 1), or scroll down to the older method.

set mqtt1.preset marwoj
set bridge.enabled on
set mqtt.rx on
set mqtt.packets on
set repeat on
reboot
  • Żadnych danych logowania do podmiany — preset niesie je w sobie
  • Masz już tutaj obserwera na indywidualnym koncie? Nic się dla Ciebie nie zmienia — działa dalej, nie musisz nic przestawiać
  • Slot ustawiony na marwoj zastępuje wbudowany cel us/eu, więc węzeł publikuje tam, gdzie go skierujesz
  • Chcesz czystego słuchacza, który nigdy nie retransmituje? Wpisz set repeat off zamiast on

Krok 5 potwierdzi, że połączenie żyje — w get mqtt.status slot 1 powinien pokazać marwoj (ok).

  • Nothing to substitute — the preset carries the credentials
  • Already running an observer here on an individual account? Nothing changes for you — it keeps working, no need to switch
  • A slot set to marwoj replaces the built-in us/eu target, so the node publishes where you point it
  • Want a pure listener that never re-transmits? Use set repeat off instead of on

Step 5 confirms the link is alive — in get mqtt.status slot 1 should read marwoj (ok).

Preset chodzi po TLS — co to znaczy bez PSRAM
The preset runs over TLS — what that means without PSRAM

W odróżnieniu od starej metody (port 1883, bez szyfrowania) preset marwoj łączy się po MQTT over TLS na porcie 8883. Płytki bez PSRAM (np. Heltec V3) ciągną maksymalnie 2 aktywne sloty TLS/WSS naraz, bo każde takie połączenie zjada ~40 KB wewnętrznej sterty; klasyczne ESP32 T-LoRa V2.1–1.6 — tylko jeden. W układzie z tej instrukcji (slot 1 = marwoj po TLS, slot 2 = zwykły MQTT z Kroku 4) mieścisz się spokojnie nawet na Heltecu V3. Dokładasz kolejne sloty TLS/WSS? Te ponad limit pokażą się w get mqtt.status jako (inactive).

Unlike the older method (port 1883, unencrypted), the marwoj preset connects over MQTT over TLS on port 8883. Boards without PSRAM (Heltec V3) sustain at most 2 active TLS/WSS slots at once, since each such connection costs ~40 KB of internal heap; the classic ESP32 T-LoRa V2.1–1.6 only one. With the layout on this page (slot 1 = marwoj over TLS, slot 2 = plain MQTT from Step 4) you stay well inside that even on a Heltec V3. Adding further TLS/WSS slots? The ones past the limit show up as (inactive) in get mqtt.status.

Starsze firmware (przed v1.17.1.4) albo masz już indywidualne kontoOlder firmware (before v1.17.1.4), or you already have an individual account

Jeśli z jakiegoś powodu nie chcesz teraz flashować, ten sam broker działa dalej po staremu — zwykły MQTT na porcie 1883, na indywidualnym loginie. Konto do niego zakładam ręcznie dla każdego obserwera: napisz do mnie, a odeślę login i hasło, zwykle tego samego dnia.

[email protected]

If you would rather not reflash right now, the same broker still works the old way — plain MQTT on port 1883, on an individual login. I issue such an account by hand for each observer: drop me a line and I will send back a username and password, usually the same day.

[email protected]

set mqtt1.preset custom
set mqtt1.server mqtt.marwoj.net
set mqtt1.port 1883
set mqtt1.username YOUR_USERNAME
set mqtt1.password YOUR_PASSWORD
set bridge.enabled on
set mqtt.rx on
set mqtt.packets on
set repeat on
reboot

Podmień YOUR_USERNAME i YOUR_PASSWORD na dane, które dostaniesz mailem. Węzły już działające na tej konfiguracji zostawiam bez zmian — nie ma potrzeby nic ruszać.

Replace YOUR_USERNAME and YOUR_PASSWORD with the credentials you receive by e-mail. Nodes already running this configuration stay as they are — there is nothing you need to touch.

Co robią bridge.enabled i mqtt.rx?
What do bridge.enabled and mqtt.rx do?

mqtt.packets on to sam uplink — publikuje to, co węzeł usłyszał. mqtt.rx on razem z bridge.enabled on dokłada drogę powrotną: węzeł subskrybuje brokera i rozgłasza ten ruch z powrotem w lokalne LoRa. Chcesz tylko wysyłać, bez wstrzykiwania czegokolwiek w swoje lokalne RF? Użyj set mqtt.rx off.

mqtt.packets on is the uplink — it publishes what the node hears. mqtt.rx on with bridge.enabled on adds the return path: the node subscribes to the broker and re-broadcasts that traffic onto local LoRa. Want upload only, with nothing injected into your local RF? Use set mqtt.rx off.

4

Dodaj drugiego brokera (opcjonalnie)

Add a second broker (optional)

Sześć slotów MQTT oznacza, że jeden analizator nie musi być Twoim jedynym uplinkiem. Slot 2, skierowany na brokera społeczności polskiej — tego, z którego korzysta mapa mcmap.cheaterenator.trade:

Six MQTT slots means one analyzer never has to be your only uplink. Slot 2, pointed at the Polish community broker — the one behind the mcmap.cheaterenator.trade map:

set mqtt2.preset custom
set mqtt2.server 185.238.72.131
set mqtt2.port 41986
set mqtt2.username loramc2
set mqtt2.password LorA-82049
reboot
  • Wszystkie sloty dzielą to samo mqtt.iata, więc oba dostaną meshcore/KRK/<klucz>/…. Jeśli jakiś broker oczekuje innego tematu: set mqtt2.topic <szablon>
  • Slot 2 to zwykły MQTT, bez TLS — więc dokłada się do slotu 1 (marwoj po TLS) nie ruszając limitu TLS na płytkach bez PSRAM
  • Sloty od 3 do 6 działają identycznie: mqtt3.*, mqtt4.* i tak dalej
  • Every slot shares the same mqtt.iata, so both receive meshcore/KRK/<key>/…. If a broker wants a different topic: set mqtt2.topic <template>
  • Slot 2 is plain MQTT, no TLS — so it sits alongside the TLS slot 1 (marwoj) without touching the TLS budget on boards with no PSRAM
  • Slots 3 to 6 work identically: mqtt3.*, mqtt4.* and so on
5

Sprawdź, czy zadziałało

Check that it worked

Około 30–60 sekund po restarcie, ponownie w konsoli:

About 30–60 seconds after the reboot, back in the Console:

get wifi.status
get mqtt.status
get mqtt1.diag
get mqtt.iata
  • wifi.status powinno zwrócić adres IP i RSSI
  • mqtt.status powinno pokazać slot 1 jako connected
  • Jeśli slot odmawia połączenia, mqttN.diag poda powód — synchronizacja czasu, TLS albo gniazdo sieciowe
  • mqtt.iata nie może być puste

Potem znajdź siebie na liście obserwerów: analyzer.marwoj.net → Observers. Daj kilka minut, zanim wpadną pierwsze pakiety.

  • wifi.status should report an IP address and RSSI
  • mqtt.status should show slot 1 as connected
  • If a slot refuses to connect, mqttN.diag names the reason — time sync, TLS or socket
  • mqtt.iata must not be empty

Then find yourself on the observers list: analyzer.marwoj.net → Observers. Give it a few minutes for the first packets to land.

Nadal nic po 10 minutach?
Still nothing after 10 minutes?

Napisz do mnie — to prawie zawsze brakujące mqtt.iata albo WiFi działające wyłącznie na 5 GHz.

Message me — it is almost always a missing mqtt.iata or a 5 GHz-only WiFi.

Zobacz efekt

See the result

Oba serwisy poniżej są otwarte dla wszystkich — bez konta i bez własnego sprzętu. Twój obserwer po prostu sprawia, że obraz sieci na nich jest ostrzejszy.

Both services below are open to everyone — no account, no hardware required. Your observer simply makes the picture on them sharper.

Częste pytania

Frequently asked questions

Czy muszę mieć obserwera, żeby korzystać z analizatora?Do I need an observer to use the analyzer?

Nie. Pakiety, mapa, podgląd na żywo, kanały i statystyki są otwarte dla wszystkich — bez konta i bez sprzętu. Uruchomienie obserwera po prostu wyostrza obraz dla nas wszystkich.

No. Packets, map, live view, channels and statistics are open to everyone, no account and no hardware required. Running an observer simply makes the picture sharper for all of us.

Jakiego presetu radiowego używa polska sieć?What radio preset does the Polish mesh use?

EU/UK Narrow w większości kraju:
869.618 MHz · BW 62.5 kHz · SF 8 · CR 8

Wybierz EU/UK Narrow w aplikacji MeshCore albo we flasherze, ewentualnie wpisz wartości ręcznie. Śląsk ma własny preset — zapytaj lokalnie, zanim założysz.

EU/UK Narrow across most of the country:
869.618 MHz · BW 62.5 kHz · SF 8 · CR 8

Pick EU/UK Narrow in the MeshCore app or flasher, or enter the values by hand. Silesia runs its own preset — ask locally before you assume.

Czy mój obserwer nadal będzie przekaźnikował pakiety?Can my observer keep repeating packets?

Tak — i to jest ustawienie domyślne. set repeat on zostawia węzeł pełnym repeaterem, który dodatkowo wysyła dane na MQTT; set repeat off zamienia go w cichego słuchacza, który tylko obserwuje. W obu przypadkach strona MQTT zachowuje się tak samo.

Yes — that is the default. set repeat on keeps the node a full repeater that also uplinks; set repeat off turns it into a silent listener that only observes. Either way the MQTT side behaves the same.

Co dzieje się z danymi, które wysyła mój obserwer?What happens to the data my observer sends?

Stają się publiczne na stronach analizatorów: metadane pakietów (SNR, liczba przeskoków, ścieżka, znaczniki czasu) plus te treści, które i tak są publiczne w eterze — adverty oraz ruch na kanałach, których klucz jest powszechnie znany. Wszystko zaszyfrowane kluczem, którego analizator nie posiada, pozostaje nieczytelne.

It becomes public on the analyzer sites: packet metadata (SNR, hops, path, timestamps) plus payloads that are already public on the air — adverts and traffic on channels whose key is publicly known. Anything encrypted with a key the analyzer does not hold stays unreadable.

Prowadzę już obserwera dla innego analizatoraI already run an observer for another analyzer

Wtedy potrzebujesz wyłącznie kroku 3. Build gessamana utrzymuje jednocześnie do 6 brokerów, więc dodaj mqtt1 (albo pierwszy wolny slot) i zostaw całą resztę dokładnie tak, jak jest.

Then you only need step 3. The gessaman build keeps up to 6 brokers alive at once, so add mqtt1 (or the first free slot) and keep everything else exactly as it is.

Czy jest jakiś repeater w mojej okolicy?Is there a repeater near me?

Otwórz mapę sieci, żeby zobaczyć aktywne repeatery i to, gdzie faktycznie są słyszane. Lista obserwerów pokazuje, które uplinki zasilają analizator w tej chwili.

Open the network map to see active repeaters and where they are actually being heard. The observers page shows which uplinks are currently feeding the analyzer.

Dla operatorów analizatorów — lustrzana kopia feedu

For analyzer operators — mirroring the feed

Prowadzisz własną instancję CoreScope albo innego konsumenta MQTT? Możesz zrobić lustrzaną kopię tego brokera — nie musisz wcześniej pytać. Użyj konta tylko do odczytu poniżej: może subskrybować, ale nigdy publikować.

Running your own CoreScope, or any other MQTT consumer? You are welcome to mirror this broker — no need to ask first. Use the read-only account below: it may subscribe, but never publish.

server   mqtt.marwoj.net
port     1883 (plain) / 8883 (TLS)
username analyzer-friend
password 2r2s5WsopLVt
topics   meshcore/#
  • W CoreScope trafia to do sekcji mqttSources w config.json — dodaj connectTimeoutSec: 45, bo domyślna wartość bywa zbyt ciasna
  • Nadaj swojemu klientowi unikalne MQTT client ID: konto jest wspólne, a dwaj klienci z tym samym ID rozłączają się nawzajem w nieskończonej pętli
  • Nie używaj tutaj konta publikującego z kroku 3 — ono ma prawo zapisu, a konsument nigdy tego nie potrzebuje
  • Około 350 tys. pakietów dziennie od blisko 100 obserwerów, już zdeduplikowanych między źródłami
  • In CoreScope this goes into mqttSources in config.json — add connectTimeoutSec: 45, the default is often too tight
  • Give your client a unique MQTT client ID: the account is shared, and two clients sharing an ID disconnect each other in a loop
  • Please do not reuse the publishing account from step 3 here — it has write access, and a consumer never needs that
  • Roughly 350k packets a day from around 100 observers, already deduplicated across sources