host address retrieving through assigned subnet information and broadcast message to learn host address
This commit is contained in:
@@ -10,14 +10,21 @@ sealed class MlrsNetworkEvent {
|
||||
/// Android hat eine zuvor bewilligte exakte SSID still erneut verbunden).
|
||||
/// [gatewayAddress] ist die Gateway-Adresse des Netzes, falls ermittelbar -
|
||||
/// dient als Vorbelegung der Zieladresse, bevor eine Gegenstelle aus dem
|
||||
/// Verkehr gelernt wurde (Doku Abschnitt 3). [ssid] ist die tatsaechliche
|
||||
/// SSID des verbundenen Netzes, falls ermittelbar - wird gemerkt, damit
|
||||
/// kuenftige Verbindungen exakt (statt per Praefix) angefragt werden koennen
|
||||
/// (siehe [MlrsNetworkController.requestNetwork]).
|
||||
/// Verkehr gelernt wurde (Doku Abschnitt 3). [broadcastAddress] ist die aus
|
||||
/// der zugewiesenen IPv4-Adresse + Praefixlaenge berechnete Subnetz-
|
||||
/// Broadcast-Adresse (z.B. 192.168.4.255) - robusterer Bootstrap-Fallback
|
||||
/// als eine geratene feste Standard-IP, falls die mLRS-Bruecke kein
|
||||
/// initiales Paket sendet, aus dem die App ihre Adresse lernen koennte: eine
|
||||
/// an die Broadcast-Adresse gesendete Anfrage erreicht die Bruecke
|
||||
/// unabhaengig von ihrer konkreten IP. [ssid] ist die tatsaechliche SSID des
|
||||
/// verbundenen Netzes, falls ermittelbar - wird gemerkt, damit kuenftige
|
||||
/// Verbindungen exakt (statt per Praefix) angefragt werden koennen (siehe
|
||||
/// [MlrsNetworkController.requestNetwork]).
|
||||
class MlrsNetworkAvailable extends MlrsNetworkEvent {
|
||||
const MlrsNetworkAvailable({this.gatewayAddress, this.ssid});
|
||||
const MlrsNetworkAvailable({this.gatewayAddress, this.broadcastAddress, this.ssid});
|
||||
|
||||
final String? gatewayAddress;
|
||||
final String? broadcastAddress;
|
||||
final String? ssid;
|
||||
}
|
||||
|
||||
@@ -160,6 +167,7 @@ class MethodChannelMlrsNetworkController implements MlrsNetworkController {
|
||||
return switch (map['type']) {
|
||||
'available' => MlrsNetworkAvailable(
|
||||
gatewayAddress: map['gatewayAddress'] as String?,
|
||||
broadcastAddress: map['broadcastAddress'] as String?,
|
||||
ssid: map['ssid'] as String?,
|
||||
),
|
||||
'ssid' => MlrsNetworkSsidUpdated(map['ssid']! as String),
|
||||
|
||||
@@ -165,15 +165,24 @@ class UdpTransport implements LinkTransport {
|
||||
// Reihenfolge: explizit konfigurierter Host > vom Netz gemeldete
|
||||
// Gateway-Adresse (bei der hier verwendeten lokalen, internetlosen
|
||||
// WifiNetworkSpecifier-Anfrage in der Praxis meist gar nicht gesetzt,
|
||||
// da solche Netze i.d.R. keine Default-Route haben) > fest hinterlegte
|
||||
// Standard-IP der mLRS-Bruecke. Diese Vorbelegung wird durch das erste
|
||||
// tatsaechlich empfangene Paket in [_onPacket] ueberschrieben - sie
|
||||
// greift also nur, solange (noch) kein Paket gelernt wurde, z.B. wenn
|
||||
// die Bruecke ihr erstes Paket nicht zuverlaessig sendet oder es durch
|
||||
// die unten beschriebene Startup-Race verpasst wuerde.
|
||||
// da solche Netze i.d.R. keine Default-Route haben) > Subnetz-
|
||||
// Broadcast-Adresse (Bootstrap-Fallback, siehe unten) > fest
|
||||
// hinterlegte Standard-IP der mLRS-Bruecke als allerletzter Rueckfall.
|
||||
// Diese Vorbelegung wird durch das erste tatsaechlich empfangene Paket
|
||||
// in [_onPacket] ueberschrieben - sie greift also nur, solange (noch)
|
||||
// kein Paket gelernt wurde.
|
||||
//
|
||||
// Die Broadcast-Adresse ist der eigentlich robuste Fallback: sendet
|
||||
// die App ihre erste MSP-Anfrage dorthin statt an eine geratene feste
|
||||
// Unicast-IP, erreicht sie die Bruecke unabhaengig davon, welche IP
|
||||
// diese tatsaechlich hat - deren (unicast) Antwort lernt dann ueber
|
||||
// [_onPacket] die echte Adresse. Das schliesst genau die Luecke, die
|
||||
// entsteht, wenn die Bruecke selbst nie unaufgefordert sendet UND die
|
||||
// geratene Standard-IP falsch liegt (dann kaeme ohne Broadcast
|
||||
// ueberhaupt kein Paket an, aus dem gelernt werden koennte).
|
||||
final prefillHost = (configuredHost != null && configuredHost.isNotEmpty)
|
||||
? configuredHost
|
||||
: (available.gatewayAddress ?? _defaultMlrsHost);
|
||||
: (available.gatewayAddress ?? available.broadcastAddress ?? _defaultMlrsHost);
|
||||
final parsed = InternetAddress.tryParse(prefillHost);
|
||||
if (parsed != null) {
|
||||
_peerAddress = parsed;
|
||||
|
||||
Reference in New Issue
Block a user