From faa779798d7082eca8ae68f5b475854861ed7375 Mon Sep 17 00:00:00 2001 From: andrekir Date: Thu, 9 Jan 2025 08:12:33 -0300 Subject: [PATCH] feat: support custom ports in TCP interface --- .../java/com/geeksville/mesh/model/BTScanModel.kt | 11 +++-------- .../mesh/repository/network/NetworkRepository.kt | 9 ++++++++- .../geeksville/mesh/repository/radio/TCPInterface.kt | 8 +++++++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt index 98d9eb419..a47193c17 100644 --- a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt @@ -22,7 +22,6 @@ import android.app.Application import android.bluetooth.BluetoothDevice import android.content.Context import android.hardware.usb.UsbManager -import android.net.nsd.NsdServiceInfo import android.os.RemoteException import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -32,6 +31,7 @@ import com.geeksville.mesh.android.Logging import com.geeksville.mesh.R import com.geeksville.mesh.repository.bluetooth.BluetoothRepository import com.geeksville.mesh.repository.network.NetworkRepository +import com.geeksville.mesh.repository.network.NetworkRepository.Companion.toAddressString import com.geeksville.mesh.repository.radio.InterfaceId import com.geeksville.mesh.repository.radio.RadioInterfaceService import com.geeksville.mesh.repository.usb.UsbRepository @@ -91,7 +91,8 @@ class BTScanModel @Inject constructor( // Include Network Service Discovery tcp.forEach { service -> - addDevice(TCPDeviceListEntry(service)) + val address = service.toAddressString() + addDevice(DeviceListEntry(address, "t$address", true)) } usb.forEach { (_, d) -> @@ -140,12 +141,6 @@ class BTScanModel @Inject constructor( usbManager.hasPermission(usb.device), ) - class TCPDeviceListEntry(val service: NsdServiceInfo) : DeviceListEntry( - service.host.toString().substring(1), - service.host.toString().replace("/", "t"), - true - ) - override fun onCleared() { super.onCleared() debug("BTScanModel cleared") diff --git a/app/src/main/java/com/geeksville/mesh/repository/network/NetworkRepository.kt b/app/src/main/java/com/geeksville/mesh/repository/network/NetworkRepository.kt index a52dfee90..875f8a807 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/network/NetworkRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/network/NetworkRepository.kt @@ -48,6 +48,13 @@ class NetworkRepository @Inject constructor( companion object { // To find all available services use SERVICE_TYPE = "_services._dns-sd._udp" internal const val SERVICE_NAME = "Meshtastic" - internal val SERVICE_TYPES = listOf("_http._tcp.", "_meshtastic._tcp.") + internal const val SERVICE_PORT = 4403 + private const val SERVICE_TYPE = "_meshtastic._tcp." + internal val SERVICE_TYPES = listOf("_http._tcp.", SERVICE_TYPE) + + fun NsdServiceInfo.toAddressString() = buildString { + append(@Suppress("DEPRECATION") host.toString().substring(1)) + if (serviceType == SERVICE_TYPE && port != SERVICE_PORT) append(":$port") + } } } diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/TCPInterface.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/TCPInterface.kt index b5eacc365..be621e1db 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/TCPInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/TCPInterface.kt @@ -19,6 +19,7 @@ package com.geeksville.mesh.repository.radio import com.geeksville.mesh.android.Logging import com.geeksville.mesh.concurrent.handledLaunch +import com.geeksville.mesh.repository.network.NetworkRepository import com.geeksville.mesh.util.Exceptions import dagger.assisted.Assisted import dagger.assisted.AssistedInject @@ -42,6 +43,7 @@ class TCPInterface @AssistedInject constructor( const val MAX_RETRIES_ALLOWED = Int.MAX_VALUE const val MIN_BACKOFF_MILLIS = 1 * 1000L // 1 second const val MAX_BACKOFF_MILLIS = 5 * 60 * 1000L // 5 minutes + const val SERVICE_PORT = NetworkRepository.SERVICE_PORT } private var retryCount = 1 @@ -100,7 +102,11 @@ class TCPInterface @AssistedInject constructor( // Create a socket to make the connection with the server private suspend fun startConnect() = withContext(Dispatchers.IO) { debug("TCP connecting to $address") - Socket(InetAddress.getByName(address), 4403).use { socket -> + + val (host, port) = address.split(":", limit = 2) + .let { it[0] to (it.getOrNull(1)?.toIntOrNull() ?: SERVICE_PORT) } + + Socket(InetAddress.getByName(host), port).use { socket -> socket.tcpNoDelay = true socket.soTimeout = 500 this@TCPInterface.socket = socket