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:
@@ -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 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user