DokumentacemDNS discovery

mDNS discovery

Cílem je, aby se člen kapely připojil bez zadávání čehokoli. Aplikace proto zkouší najít leadera několika cestami zároveň.

Jak objevování funguje

Když leader spustí relaci, děje se toto:

  1. Zjistí si vlastní IP adresu v lokální síti.
  2. Nastartuje HTTP server.
  3. Ohlásí se přes mDNS/Bonjour jako služba _eutepio._tcp.

Zařízení, které hledá relaci, běží ve dvou režimech současně:

  • mDNS dotaz — rychlá cesta, funguje během vteřin
  • Sken lokálního rozsahu — záložní cesta pro sítě bez multicastu
Sken projíždí adresy 1254 ve tvém podsíťovém rozsahu a opakuje se každé 2 sekundy. Adresy, kde byl leader viděn naposledy, se zkoušejí přednostně (až osm posledních), takže opětovné připojení k téže kapele bývá okamžité.

Obě cesty běží paralelně, ne za sebou. Když ti multicast v síti nefunguje, relace se stejně najde — jen o kousek pomaleji.

Service record a porty

text
Typ služby:  _eutepio._tcp
Protokol:    TCP
Port:        8765
Fallback:    8766, 8767, 8768, 8769
Leader se snaží obsadit port 8765. Pokud je zabraný — třeba jinou aplikací nebo jinou instancí Eutepia na stejném stroji — zkusí postupně další čtyři. Hledající zařízení prochází při skenu stejný rozsah, takže fallback funguje i bez mDNS.

HTTP endpointy

Leaderův server vystavuje čtyři endpointy:

EndpointMetodaK čemu
/discoverGETVrátí informace o relaci — název, počet členů, zda je chráněná heslem
/joinPOSTPřipojení člena, ověření hesla, přidělení identity
/wsGETUpgrade na WebSocket, přes který jede veškerý provoz relace
/healthGETRychlá kontrola, že leader ještě žije
Po navázání WebSocketu drží spojení naživu ping každých 10 sekund a heartbeat od člena každých 5 sekund. Člen, od kterého leader neslyší 25 sekund, se ze seznamu odstraní.

Další způsoby připojení

QR kód

Leader zobrazí QR kód s odkazem ve tvaru:

text
eutepio://join?ip=192.168.0.42&port=8765&pin=1234&session=…&leader=…

Člen ho naskenuje vestavěnou čtečkou a připojí se přímo — bez čekání na objevování. Hodí se na místech, kde je síť přeplněná nebo multicast blokovaný.

Ruční IP adresa

V seznamu relací je volba pro ruční zadání adresy. Leader svoji IP zobrazuje na obrazovce synchronizace.

Heslo relace

Leader může relaci chránit PINem. Ten se ověřuje při volání /join; bez správného hesla se člen k WebSocketu nedostane. PIN je součástí QR kódu, takže při skenování ho nikdo nezadává ručně.

Požadavky na síť

PodmínkaProč
Stejná lokální síť / podsíťSken i mDNS pracují jen uvnitř tvého segmentu sítě
Povolený multicastNutný pro rychlou cestu přes mDNS
Vypnutá izolace klientůMnoho hotelových a klubových WiFi zakazuje komunikaci mezi zařízeními
Vypnutá VPNVPN přesměruje provoz mimo lokální síť
Když je síť nespolehlivá, nejjistější řešení je hotspot z jednoho z telefonů. Nepotřebuje internet — stačí, aby na něm byla obě zařízení.

Oprávnění na iOS

iOS 14 a novější vyžaduje explicitní souhlas s přístupem do lokální sítě. Aplikace má v projektu deklarovanou službu _eutepio._tcp i text výzvy; dialog se objeví při prvním pokusu o objevování.

Oprávnění na Androidu

Android potřebuje pro mDNS oprávnění k multicastu. Aby synchronizace přežila zhasnutou obrazovku, běží při aktivní relaci služba na popředí s notifikací.

Řešení problémů

Relace se na druhém zařízení neobjeví

  1. Ověř, že jsou obě zařízení na stejné síti — ne jedno na WiFi a druhé na mobilních datech.
  2. Zkontroluj, jestli síť nemá zapnutou izolaci klientů (typicky veřejné a hotelové WiFi).
  3. Vypni VPN na obou zařízeních.
  4. Zkus QR kód nebo ruční IP — obejdou objevování úplně.
  5. Pokud nic nepomáhá, udělej z jednoho telefonu hotspot a připoj se na něj.

Na iOS se neobjevil dialog o lokální síti

Dialog se ukazuje jen jednou. Když jsi ho odmítl, povolení se zapíná v Nastavení iOS → Eutepio → Lokální síť.

Spojení se během hraní ztrácí

Nejčastější příčinou je přepínání mezi přístupovými body nebo úsporný režim, který uspí síťové rozhraní. Aplikace se po výpadku pokouší připojit zpět automaticky — jak přesně, popisuje Řešení konfliktů.

Leader nabíhá na jiném portu

To je normální chování při obsazeném portu 8765. Objevování i sken s tím počítají; ruční zadání adresy ale port neuhodne, proto v takové situaci použij QR kód.