WiFi als companion-verbinding¶
NAAST ANDERE TRANSPORTEN · TCP 5000 · INLOGGEGEVENS IN DE BINARY · ALLEEN ESP32
WiFi is in MeshCore geen netwerklaag maar één van de manieren waarop een companion-app met een node praat. Sinds v1.17.1 komt het niet meer in de plaats van de BLE-verbinding of de seriële kabel, maar ernaast: welke transporten erin zitten is een buildkeuze, en een build kan er meerdere bevatten. Dit hoofdstuk beschrijft hoe die keuze valt, wat er over TCP gaat, en waarom de inloggegevens van je netwerk in de firmware terechtkomen.
Opmerking
Bron. Deze pagina is geverifieerd tegen de firmware zelf:
MeshCore v1.17.1, commit d929643, 14 augustus 2026 — bestanden
examples/companion_radio/main.cpp,
src/helpers/esp32/SerialWifiInterface.cpp,
src/helpers/BaseSerialInterface.h, src/helpers/MultiSerialInterface.h
en de WIFI_SSID-vlaggen in variants/. De tellingen zijn te reproduceren
met
tools/hardware-overview.py
met --pin d929643.
Elke vlag voegt een transport toe¶
De companionfirmware kiest de transporten met preprocessordirectieven, niet met een instelling. Voor WiFi:
examples/companion_radio/main.cpp r.34-46
// include wifi interface
#ifdef WIFI_SSID
#ifndef TCP_PORT
#define TCP_PORT 5000
#endif
#ifdef ESP32
// include esp32 wifi interface
#include <helpers/esp32/SerialWifiInterface.h>
SerialWifiInterface wifi_interface;
#else
#error "SerialWifiInterface is not defined for this platform"
#endif
#endif
In v1.16.0 stond hier een #elif-ketting: was WIFI_SSID gedefinieerd, dan
kwamen BLE en de seriële variant er niet meer in. In v1.17.1 heeft elk
transport zijn eigen #if. Bij het opstarten meldt de firmware WiFi aan bij
interface_manager, een MultiSerialInterface:
examples/companion_radio/main.cpp r.208-210
WiFi.begin(WIFI_SSID, WIFI_PWD);
wifi_interface.begin(TCP_PORT);
interface_manager.addInterface(InterfaceType::WiFi, &wifi_interface);
Een node kan dus tegelijk over BLE en over WiFi met een app praten, als de
build beide vlaggen zet. Wisselen zonder opnieuw te flashen kan nog steeds
niet: wat er niet in gecompileerd is, is er niet. Hoe MultiSerialInterface
de transporten samen bedient, en welke grens er aan het aantal zit, staat in
USB-serieel.
Opmerking
Dat verklaart waarom nodes met dezelfde chip zich verschillend gedragen: welk transport ze spreken is een eigenschap van de firmware die erop staat, niet van het bord. Welke borden welke aansluitmogelijkheden hebben staat in Nodematrix.
Alleen op ESP32¶
Op een ander platform stopt een build met WIFI_SSID met een foutmelding
(examples/companion_radio/main.cpp r.43-45). Dat is terug te zien in de
variantbestanden:
WIFI_SSID |
Aantal |
|---|---|
| actief | 25 regels in 21 variantmappen |
| uitgecommentarieerd | 4 regels, alle vier RP2040 |
Geteld over variants/*/platformio.ini; regels die met ; beginnen zijn
uitgecommentarieerd en tellen niet als buildvlag. Meer regels dan mappen,
omdat een variantbestand meerdere [env:…]-secties kan bevatten.
De vier uitgecommentarieerde regels staan in rak11310, rpi_picow,
waveshare_rp2040_lora en xiao_rp2040. In v1.16.0 stond in main.cpp nog
een uitgecommentarieerde RP2040-tak die naar een SerialWifiInterface voor
RP2040 verwees. Die tak is in v1.17.1 verdwenen, en zo'n klasse bestaat in de
firmware niet. Wie een van de vier regels aanzet, krijgt de foutmelding.
Wat er over de verbinding gaat¶
SerialWifiInterface opent een TCP-server. De poort is TCP_PORT, en als de
variant die niet zet is het 5000.
src/helpers/esp32/SerialWifiInterface.cpp r.4-7
void SerialWifiInterface::begin(int port) {
// wifi setup is handled outside of this class, only starts the server
server.begin(port);
}
De klasse doet zelf niets aan het netwerk — verbinden gebeurt buiten de
klasse, in main.cpp. Daar staat sinds v1.17.1 ook dat de node niet gaat
slapen zolang WiFi actief is (r.195), en dat hij na een verbroken verbinding
elke tien seconden opnieuw verbindt (r.198-206 en r.265-273). Wat er over de
verbinding gaat is hetzelfde als bij BLE en bij serieel: frames van maximaal
176 bytes, achter dezelfde interface.
src/helpers/BaseSerialInterface.h r.5
#define MAX_FRAME_SIZE 176 // +4 for transport codes (region scoping)
Elk frame krijgt over TCP dezelfde header als over de kabel, > of < en
twee lengtebytes (src/helpers/esp32/SerialWifiInterface.cpp r.91-94); een
frame dat niet met < begint slaat de node over (r.143-144). Alle
transporten implementeren BaseSerialInterface met writeFrame() en
checkRecvFrame(), en de rest van de firmware ziet alleen
MultiSerialInterface, niet welk transport eronder zit. Hoe die frames er
byte voor byte uitzien staat in USB-serieel.
De inloggegevens staan in de binary¶
WIFI_SSID en WIFI_PWD zijn buildvlaggen. Ze worden bij het compileren
in de code gesubstitueerd:
examples/companion_radio/main.cpp r.208-209
WiFi.begin(WIFI_SSID, WIFI_PWD);
wifi_interface.begin(TCP_PORT);
Waarschuwing
De naam en het wachtwoord van je WiFi-netwerk komen als leesbare tekst in het firmwarebestand terecht. Wie de binary heeft — of de node uitleest — heeft je netwerkwachtwoord. Deel geen zelfgebouwde WiFi-firmware en zet een node met WiFi-firmware niet op een netwerk dat je niet kwijt wilt. Voor een gastnetwerk of een apart VLAN is dit precies de situatie waar die voor bedoeld zijn.
Dit is een andere afweging dan bij BLE, waar een pincode in de firmware staat maar geen netwerkgeheim. Zie BLE Architectuur.
Bronnen¶
Firmware, commit d929643 (v1.17.1, 14 augustus 2026):
examples/companion_radio/main.cpp— de#ifper transport, het aanmelden bijinterface_manager,WiFi.begin()en het opnieuw verbindensrc/helpers/esp32/SerialWifiInterface.cpp— de TCP-server, de header en de zendwachtrijsrc/helpers/BaseSerialInterface.h— de gedeelde interface enMAX_FRAME_SIZEsrc/helpers/MultiSerialInterface.h— de klasse die alle transporten samen bedient
Verwante hoofdstukken:
- BLE Architectuur — het transport dat sinds v1.17.1 naast WiFi in één build kan zitten
- USB-serieel — hetzelfde frame over een kabel, en
MultiSerialInterface - Hardware van een node — waar dit onderdeel zit
- Nodematrix — welk bord WiFi aan boord heeft
- De vier platformfamilies — welke families WiFi kennen