2021-03-29 19:47:24 +08:00
|
|
|
package com.geeksville.mesh.service
|
|
|
|
|
|
2021-03-29 20:20:38 +08:00
|
|
|
import com.geeksville.android.Logging
|
2021-03-29 20:33:06 +08:00
|
|
|
import java.io.BufferedInputStream
|
|
|
|
|
import java.io.BufferedOutputStream
|
|
|
|
|
import java.io.InputStream
|
|
|
|
|
import java.io.OutputStream
|
2021-03-29 19:47:24 +08:00
|
|
|
import java.net.InetAddress
|
|
|
|
|
import java.net.Socket
|
|
|
|
|
import kotlin.concurrent.thread
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TCPInterface(service: RadioInterfaceService, private val address: String) :
|
|
|
|
|
StreamInterface(service) {
|
|
|
|
|
|
2021-03-29 20:20:38 +08:00
|
|
|
companion object : Logging, InterfaceFactory('t') {
|
|
|
|
|
override fun createInterface(
|
|
|
|
|
service: RadioInterfaceService,
|
|
|
|
|
rest: String
|
|
|
|
|
): IRadioInterface = TCPInterface(service, rest)
|
|
|
|
|
|
|
|
|
|
init {
|
|
|
|
|
registerFactory()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-29 20:33:06 +08:00
|
|
|
var socket: Socket? = null
|
2021-03-29 19:47:24 +08:00
|
|
|
lateinit var outStream: OutputStream
|
|
|
|
|
lateinit var inStream: InputStream
|
|
|
|
|
|
|
|
|
|
init {
|
|
|
|
|
connect()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun sendBytes(p: ByteArray) {
|
2021-03-29 20:33:06 +08:00
|
|
|
outStream.write(p)
|
2021-03-29 19:47:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun flushBytes() {
|
|
|
|
|
outStream.flush()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onDeviceDisconnect(waitForStopped: Boolean) {
|
|
|
|
|
val s = socket
|
2021-03-29 20:33:06 +08:00
|
|
|
if (s != null) {
|
2021-03-29 19:47:24 +08:00
|
|
|
socket = null
|
|
|
|
|
outStream.close()
|
|
|
|
|
inStream.close()
|
|
|
|
|
s.close()
|
|
|
|
|
}
|
|
|
|
|
super.onDeviceDisconnect(waitForStopped)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun connect() {
|
|
|
|
|
//here you must put your computer's IP address.
|
|
|
|
|
//here you must put your computer's IP address.
|
|
|
|
|
val addr = InetAddress.getByName(address)
|
|
|
|
|
|
|
|
|
|
debug("TCP connecting to $address")
|
|
|
|
|
|
|
|
|
|
//create a socket to make the connection with the server
|
|
|
|
|
|
|
|
|
|
//create a socket to make the connection with the server
|
|
|
|
|
val port = 4403
|
|
|
|
|
val s = Socket(addr, port)
|
|
|
|
|
s.tcpNoDelay = true
|
|
|
|
|
socket = s
|
|
|
|
|
outStream = BufferedOutputStream(s.getOutputStream())
|
|
|
|
|
inStream = BufferedInputStream(s.getInputStream())
|
|
|
|
|
|
|
|
|
|
// No need to keep a reference to this thread - it will exit when we close inStream
|
|
|
|
|
thread(start = true, isDaemon = true, name = "TCP reader") {
|
|
|
|
|
try {
|
2021-03-29 20:33:06 +08:00
|
|
|
while (true) {
|
2021-03-29 19:47:24 +08:00
|
|
|
val c = inStream.read()
|
2021-03-29 20:33:06 +08:00
|
|
|
if (c == -1)
|
|
|
|
|
break
|
2021-03-29 19:47:24 +08:00
|
|
|
else
|
|
|
|
|
readChar(c.toByte())
|
|
|
|
|
}
|
2021-03-29 20:33:06 +08:00
|
|
|
} catch (ex: Throwable) {
|
2021-03-29 19:47:24 +08:00
|
|
|
errormsg("Exception in TCP reader: $ex")
|
|
|
|
|
onDeviceDisconnect(false)
|
|
|
|
|
}
|
|
|
|
|
debug("Exiting TCP reader")
|
|
|
|
|
}
|
|
|
|
|
super.connect()
|
|
|
|
|
}
|
|
|
|
|
}
|