diff --git a/app/build.gradle b/app/build.gradle index db545db..340e332 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.11' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.1.0' implementation 'androidx.core:core-ktx:1.9.0' def base_version = "1.6.1" implementation "androidx.appcompat:appcompat:${base_version}" @@ -100,8 +100,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-exo2:v8.4.0-release-jitpack' //更多ijk的编码支持 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' - //TCP - implementation 'io.netty:netty-all:4.1.23.Final' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index db545db..340e332 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.11' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.1.0' implementation 'androidx.core:core-ktx:1.9.0' def base_version = "1.6.1" implementation "androidx.appcompat:appcompat:${base_version}" @@ -100,8 +100,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-exo2:v8.4.0-release-jitpack' //更多ijk的编码支持 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' - //TCP - implementation 'io.netty:netty-all:4.1.23.Final' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt index bd69f52..40f35ec 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt @@ -2,41 +2,57 @@ import android.app.Service import android.content.Intent +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import com.casic.app.safetreecontroller.extensions.handleGasConcentration -import com.casic.app.safetreecontroller.tcp.OnSocketConnectionListener -import com.casic.app.safetreecontroller.tcp.TcpClient import com.casic.app.safetreecontroller.utils.CommandCreator +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.socket.tcp.OnTcpConnectStateListener +import com.pengxh.kt.lite.utils.socket.tcp.TcpClient -class SocketCommunicationService : Service(), OnSocketConnectionListener { +class SocketCommunicationService : Service(), OnTcpConnectStateListener, Handler.Callback { private val kTag = "SocketService" + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private val tcpClient by lazy { TcpClient(this) } + + override fun handleMessage(msg: Message): Boolean { + return true + } + + /** + * 甲烷查询 + * */ + private val methaneRunnable = object : Runnable { + override fun run() { + tcpClient.sendMessage(CommandCreator.createMethaneCommand()) + // 每5s重复一次 + weakReferenceHandler.postDelayed(this, 5 * 1000L) + } + } override fun onCreate() { super.onCreate() Log.d(kTag, "onCreate: SocketCommunicationService") - } - - private var tcpClient: TcpClient? = null - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - tcpClient = TcpClient("192.168.161.200", 3000, this) - tcpClient?.start() - return START_STICKY + tcpClient.start("192.168.10.51", 333) +// tcpClient.start("192.168.161.200", 3000) } override fun onConnected() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110501) - tcpClient?.sendMessage(CommandCreator.createMethaneCommand()) + weakReferenceHandler.post(methaneRunnable) } override fun onDisconnected() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110502) + weakReferenceHandler.removeCallbacks(methaneRunnable) } override fun onConnectFailed() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110503) + weakReferenceHandler.removeCallbacks(methaneRunnable) } override fun onMessageReceived(bytes: ByteArray?) { @@ -52,7 +68,8 @@ override fun onDestroy() { super.onDestroy() - tcpClient?.stop() + weakReferenceHandler.removeCallbacks(methaneRunnable) + tcpClient.stop() } override fun onBind(intent: Intent?): IBinder? { diff --git a/app/build.gradle b/app/build.gradle index db545db..340e332 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.11' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.1.0' implementation 'androidx.core:core-ktx:1.9.0' def base_version = "1.6.1" implementation "androidx.appcompat:appcompat:${base_version}" @@ -100,8 +100,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-exo2:v8.4.0-release-jitpack' //更多ijk的编码支持 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' - //TCP - implementation 'io.netty:netty-all:4.1.23.Final' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt index bd69f52..40f35ec 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt @@ -2,41 +2,57 @@ import android.app.Service import android.content.Intent +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import com.casic.app.safetreecontroller.extensions.handleGasConcentration -import com.casic.app.safetreecontroller.tcp.OnSocketConnectionListener -import com.casic.app.safetreecontroller.tcp.TcpClient import com.casic.app.safetreecontroller.utils.CommandCreator +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.socket.tcp.OnTcpConnectStateListener +import com.pengxh.kt.lite.utils.socket.tcp.TcpClient -class SocketCommunicationService : Service(), OnSocketConnectionListener { +class SocketCommunicationService : Service(), OnTcpConnectStateListener, Handler.Callback { private val kTag = "SocketService" + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private val tcpClient by lazy { TcpClient(this) } + + override fun handleMessage(msg: Message): Boolean { + return true + } + + /** + * 甲烷查询 + * */ + private val methaneRunnable = object : Runnable { + override fun run() { + tcpClient.sendMessage(CommandCreator.createMethaneCommand()) + // 每5s重复一次 + weakReferenceHandler.postDelayed(this, 5 * 1000L) + } + } override fun onCreate() { super.onCreate() Log.d(kTag, "onCreate: SocketCommunicationService") - } - - private var tcpClient: TcpClient? = null - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - tcpClient = TcpClient("192.168.161.200", 3000, this) - tcpClient?.start() - return START_STICKY + tcpClient.start("192.168.10.51", 333) +// tcpClient.start("192.168.161.200", 3000) } override fun onConnected() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110501) - tcpClient?.sendMessage(CommandCreator.createMethaneCommand()) + weakReferenceHandler.post(methaneRunnable) } override fun onDisconnected() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110502) + weakReferenceHandler.removeCallbacks(methaneRunnable) } override fun onConnectFailed() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110503) + weakReferenceHandler.removeCallbacks(methaneRunnable) } override fun onMessageReceived(bytes: ByteArray?) { @@ -52,7 +68,8 @@ override fun onDestroy() { super.onDestroy() - tcpClient?.stop() + weakReferenceHandler.removeCallbacks(methaneRunnable) + tcpClient.stop() } override fun onBind(intent: Intent?): IBinder? { diff --git a/app/src/main/java/com/casic/app/safetreecontroller/tcp/OnSocketConnectionListener.kt b/app/src/main/java/com/casic/app/safetreecontroller/tcp/OnSocketConnectionListener.kt deleted file mode 100644 index b436cab..0000000 --- a/app/src/main/java/com/casic/app/safetreecontroller/tcp/OnSocketConnectionListener.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.app.safetreecontroller.tcp - -interface OnSocketConnectionListener { - fun onConnected() - fun onDisconnected() - fun onConnectFailed() - fun onMessageReceived(bytes: ByteArray?) -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index db545db..340e332 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.11' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.1.0' implementation 'androidx.core:core-ktx:1.9.0' def base_version = "1.6.1" implementation "androidx.appcompat:appcompat:${base_version}" @@ -100,8 +100,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-exo2:v8.4.0-release-jitpack' //更多ijk的编码支持 implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' - //TCP - implementation 'io.netty:netty-all:4.1.23.Final' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt index bd69f52..40f35ec 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketCommunicationService.kt @@ -2,41 +2,57 @@ import android.app.Service import android.content.Intent +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import com.casic.app.safetreecontroller.extensions.handleGasConcentration -import com.casic.app.safetreecontroller.tcp.OnSocketConnectionListener -import com.casic.app.safetreecontroller.tcp.TcpClient import com.casic.app.safetreecontroller.utils.CommandCreator +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.socket.tcp.OnTcpConnectStateListener +import com.pengxh.kt.lite.utils.socket.tcp.TcpClient -class SocketCommunicationService : Service(), OnSocketConnectionListener { +class SocketCommunicationService : Service(), OnTcpConnectStateListener, Handler.Callback { private val kTag = "SocketService" + private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } + private val tcpClient by lazy { TcpClient(this) } + + override fun handleMessage(msg: Message): Boolean { + return true + } + + /** + * 甲烷查询 + * */ + private val methaneRunnable = object : Runnable { + override fun run() { + tcpClient.sendMessage(CommandCreator.createMethaneCommand()) + // 每5s重复一次 + weakReferenceHandler.postDelayed(this, 5 * 1000L) + } + } override fun onCreate() { super.onCreate() Log.d(kTag, "onCreate: SocketCommunicationService") - } - - private var tcpClient: TcpClient? = null - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - tcpClient = TcpClient("192.168.161.200", 3000, this) - tcpClient?.start() - return START_STICKY + tcpClient.start("192.168.10.51", 333) +// tcpClient.start("192.168.161.200", 3000) } override fun onConnected() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110501) - tcpClient?.sendMessage(CommandCreator.createMethaneCommand()) + weakReferenceHandler.post(methaneRunnable) } override fun onDisconnected() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110502) + weakReferenceHandler.removeCallbacks(methaneRunnable) } override fun onConnectFailed() { ForegroundRunningService.weakReferenceHandler?.sendEmptyMessage(2024110503) + weakReferenceHandler.removeCallbacks(methaneRunnable) } override fun onMessageReceived(bytes: ByteArray?) { @@ -52,7 +68,8 @@ override fun onDestroy() { super.onDestroy() - tcpClient?.stop() + weakReferenceHandler.removeCallbacks(methaneRunnable) + tcpClient.stop() } override fun onBind(intent: Intent?): IBinder? { diff --git a/app/src/main/java/com/casic/app/safetreecontroller/tcp/OnSocketConnectionListener.kt b/app/src/main/java/com/casic/app/safetreecontroller/tcp/OnSocketConnectionListener.kt deleted file mode 100644 index b436cab..0000000 --- a/app/src/main/java/com/casic/app/safetreecontroller/tcp/OnSocketConnectionListener.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.app.safetreecontroller.tcp - -interface OnSocketConnectionListener { - fun onConnected() - fun onDisconnected() - fun onConnectFailed() - fun onMessageReceived(bytes: ByteArray?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt b/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt deleted file mode 100644 index f7d27b5..0000000 --- a/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.casic.app.safetreecontroller.tcp - -import android.util.Log -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.lifecycleScope -import io.netty.bootstrap.Bootstrap -import io.netty.channel.AdaptiveRecvByteBufAllocator -import io.netty.channel.Channel -import io.netty.channel.ChannelFuture -import io.netty.channel.ChannelFutureListener -import io.netty.channel.ChannelHandlerContext -import io.netty.channel.ChannelInitializer -import io.netty.channel.ChannelOption -import io.netty.channel.EventLoopGroup -import io.netty.channel.SimpleChannelInboundHandler -import io.netty.channel.nio.NioEventLoopGroup -import io.netty.channel.socket.SocketChannel -import io.netty.channel.socket.nio.NioSocketChannel -import io.netty.handler.codec.bytes.ByteArrayDecoder -import io.netty.handler.codec.bytes.ByteArrayEncoder -import io.netty.handler.timeout.IdleStateHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.net.InetSocketAddress -import java.util.concurrent.TimeUnit - -class TcpClient( - private val host: String, - private val port: Int, - private val listener: OnSocketConnectionListener -) : LifecycleOwner { - - private val registry = LifecycleRegistry(this) - - override fun getLifecycle(): Lifecycle { - return registry - } - - private val kTag = "TcpClient" - private val reconnectDelay = 5L - private var bootstrap: Bootstrap = Bootstrap() - private var loopGroup: EventLoopGroup = NioEventLoopGroup() - private var channel: Channel? = null - private var isRunning = false - private var retryTimes = 0 - - fun start() { - if (isRunning) { - return - } - bootstrap.group(loopGroup) - .channel(NioSocketChannel::class.java) - .option(ChannelOption.TCP_NODELAY, true) //无阻塞 - .option(ChannelOption.SO_KEEPALIVE, true) //长连接 - .option( - ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(5000, 5000, 8000) - ) - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) - .handler(SimpleChannelInitializer()) - connect() - } - - private inner class SimpleChannelInitializer : ChannelInitializer() { - override fun initChannel(ch: SocketChannel?) { - ch?.apply { - pipeline() - .addLast(ByteArrayDecoder()) - .addLast(ByteArrayEncoder()) - .addLast(IdleStateHandler(0, 0, 60))//如果连接没有接收或发送数据超过60秒钟就发送一次心跳 - .addLast(object : SimpleChannelInboundHandler() { - override fun channelActive(ctx: ChannelHandlerContext) { - val address = ctx.channel().remoteAddress() as InetSocketAddress - Log.d(kTag, "${address.address.hostAddress} 已连接") - listener.onConnected() - } - - override fun channelInactive(ctx: ChannelHandlerContext) { - val address = ctx.channel().remoteAddress() as InetSocketAddress - Log.d(kTag, "${address.address.hostAddress} 已断开") - listener.onDisconnected() - reconnect() - } - - override fun channelRead0(ctx: ChannelHandlerContext, msg: ByteArray?) { - listener.onMessageReceived(msg) - } - - override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) { - Log.d(kTag, "exceptionCaught: ${cause.message}") - listener.onConnectFailed() - ctx.close() - } - }) - } - } - } - - private fun connect() { - if (channel != null && channel!!.isActive) { - return - } - lifecycleScope.launch(Dispatchers.IO) { - try { - val channelFuture = bootstrap.connect(host, port) - .addListener(object : ChannelFutureListener { - override fun operationComplete(channelFuture: ChannelFuture) { - if (channelFuture.isSuccess) { - isRunning = true - retryTimes = 0 - channel = channelFuture.channel() - } - } - }).sync() - channelFuture.channel().closeFuture().sync() - } catch (e: Exception) { - Log.d(kTag, "连接失败: ${e.message}") - reconnect() - } - } - } - - private fun reconnect() { - retryTimes++ - Log.d(kTag, "开始第 $retryTimes 次重连") - loopGroup.schedule({ connect() }, reconnectDelay, TimeUnit.SECONDS) - } - - fun stop() { - isRunning = false - channel?.close() - loopGroup.shutdownGracefully() - } - - fun sendMessage(bytes: ByteArray) { - if (!isRunning) { - return - } - channel?.writeAndFlush(bytes) - } -} \ No newline at end of file