不喜勿喷,个人不足的地方还有很多,有问题及解决思路的直接在留言方留言,或者私信给我,一起解决问题.
情景:
连接硬件板块,和硬件进行通信
TCP概念性质的知识可以观看别的博客
// 定义一个类来继承协程使整个类拥有协程的上下文.
internal class TransparentTcp : CoroutineScope{
private val job = Job()
override val coroutineContext: CoroutineContext = IO + job
}
internal 关键字的意义:该变量/类/方法仅在此工程中可见,因为我做这个TCP这个工程最后需要打包为一个SDK,给界面使用,给界面使用的过程中,我不想让他直接操作我的这个TCP工作类,我给他一个代理类,让他对代理类进行操作.他们引入我的SDK之后,该类是可见的,但不可访问,下图就是关键字的意思,
以下是需要工作用到的字段
private val IP = "192.168.xxx.xxx"
private val PORT = 4028
private val TCP_CONNETION_TIME = 5000L // TCP重连
private val TCP_MESSAGE_TIME = 3000L // tcp检测心跳
/**
* TCP 超时连接30s 因为TCP有重发机制,所以时间稍微久一点也可以
*/
private val TCP_CONNECTION_TIMEOUT = 30 * 1000
private var tempTime = 0L // 临时保存时间
private var socket: Socket? = null
private lateinit var socketIn: InputStream
private lateinit var socketOut: OutputStream
/**
* 开始工作协程
*/
private lateinit var startlaun: Job
/**
* 心跳协程
*/
private var heartLaun: Job? = null
/**
* 接收信息协程
*/
private var readLaun: Job? = null
/**
* 发送信息协程
*/
private var sendLaun: Job? = null
工作协程
@Suppress("BlockingMethodInNonBlockingContext")
private fun startConnetion() =
launch(coroutineContext, CoroutineStart.LAZY) {
// 创建socket
while (true) {
try {
socket = Socket()
Log.i(TAG, "连接tcp")
// 创建 socket连接地址
val inetSocketAddress = InetSocketAddress(IP, PORT)
// 等待tcp连接成功,连接失败直接抛异常
socket?.connect(inetSocketAddress, 30000)
socketIn = socket?.getInputStream()!!
socketOut = socket?.getOutputStream()!!
heartLaun = heartPackage()
sendLaun = sendMessageTcp()
readLaun = readTcpData()
// 先暂停5s,如果接收到tcp的消息(因为接收协程已经开启[readLaun]),则会继续往下阻塞
delay(5000)
// 阻塞当前的协程继续循环,等待要是出意外或者超时则会重新遍历继续重连tcp
async {
while (true) {
// 重复检测当前的时间是否超时
delay(1000