AeroToss: UDP broadcast discovery + mDNS A record + имена

- Добавлен UDP broadcast discovery (порт 9999) как fallback
- Desktop отправляет broadcast каждые 3 секунды
- Android использует mDNS + UDP broadcast + Wi-Fi Direct
- mDNS: добавлена A-запись для разрешения IP
- Имена: Desktop=user@host, Android=manufacturer model
- TXT record: id, name, port, type для определения устройства
- Автоперерегистрация mDNS каждые 30 секунд
- mDNS: отправка query каждые 5 секунд
This commit is contained in:
2026-08-19 22:56:56 +03:00
parent ab7b917a01
commit 817e8f09aa
3 changed files with 164 additions and 2 deletions
@@ -230,13 +230,16 @@ class JmdnsDiscovery : DiscoveryManager {
}
private fun buildDnsResponse(servicePort: Int): ByteArray {
val localAddr = findLocalAddress()
val localIp = localAddr?.address ?: byteArrayOf(127, 0, 0, 1)
val baos = java.io.ByteArrayOutputStream()
val dos = java.io.DataOutputStream(baos)
dos.writeShort(0) // ID
dos.writeShort(0x8400) // Flags
dos.writeShort(0) // QDCOUNT
dos.writeShort(3) // ANCOUNT
dos.writeShort(4) // ANCOUNT (PTR + SRV + TXT + A)
dos.writeShort(0) // NSCOUNT
dos.writeShort(0) // ARCOUNT
@@ -287,6 +290,14 @@ class JmdnsDiscovery : DiscoveryManager {
dos.writeShort(txtBytes.size)
dos.write(txtBytes)
// A: AeroToss._aerotoss._tcp.local. → IP address
writeDnsName(baos, "AeroToss._aerotoss._tcp.local.")
dos.writeShort(1) // A
dos.writeShort(1) // IN
dos.writeInt(4500) // TTL
dos.writeShort(4) // RDLENGTH = 4 bytes for IPv4
dos.write(localIp)
dos.flush()
return baos.toByteArray()
}
@@ -352,4 +363,19 @@ class JmdnsDiscovery : DiscoveryManager {
const val SERVICE_TYPE = "_aerotoss._tcp"
const val SERVICE_NAME = "AeroToss"
}
private fun findLocalAddress(): InetAddress? {
return try {
NetworkInterface.getNetworkInterfaces()?.toList()
?.filter { iface ->
iface.isUp && !iface.isLoopback && !isVirtual(iface) &&
iface.inetAddresses.toList().any { it is java.net.Inet4Address }
}
?.flatMap { it.inetAddresses.toList() }
?.firstOrNull { it is java.net.Inet4Address }
?: InetAddress.getLocalHost()
} catch (_: Exception) {
try { InetAddress.getLocalHost() } catch (_: Exception) { null }
}
}
}