Commit 02a36148 authored by 马乐's avatar 马乐

1.完善登录流程

parent 7b98e668
package com.waytous.anticollision.concurrent
import com.blankj.utilcode.util.LogUtils
import com.waytous.anticollision.BuildConfig
import com.waytous.anticollision.tcp.Error
import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.locks.Condition
import java.util.concurrent.locks.Lock
class Signal(private val lock: Lock, private val count:Int) {
private val condition: Condition = lock.newCondition()
val flag by lazy {
AtomicReference(Error.NOError)
}
val retryCount:AtomicInteger = AtomicInteger(count)
val mResult by lazy {
AtomicReference(Result.Timeout)
}
enum class Result(val value:Int){
Invalid(-1),
Success(0),
Timeout(1),
Cancelled(2),
}
fun taskWait(time:Long){
lock.lock()
try {
condition.await()
} catch (e:InterruptedException) {
if (BuildConfig.DEBUG) {
LogUtils.e("send data error:${e.message}")
} else {
LogUtils.file("send data error:${e.message}")
}
}finally {
lock.unlock()
}
}
}
\ No newline at end of file
package com.waytous.anticollision.listener
import com.waytous.anticollision.tcp.Error
import com.waytous.anticollision.utils.ConnectStatus
interface SessionListener {
/**
* 连接状态发生变化
* */
fun onConnectStatusChanged(status: ConnectStatus)
/**
* 用户登录成功
* */
fun onUserSignIn()
/**
* 用户登录失败
* */
fun onUserSignOut(error: Error)
}
\ No newline at end of file
package com.waytous.anticollision.tcp
/**
* tcp通信错误定义
* */
enum class Error {
NOError,
IOError,
StreamClosed,
ConnectionRefused,
Timeout,
NotConnected,
UserDisconnected,
InvalidParam,
ServerUnknownError,
JT808EncodeError,
JT808DecodeError
}
\ No newline at end of file
...@@ -9,13 +9,7 @@ interface SyncMessageListener<T> { ...@@ -9,13 +9,7 @@ interface SyncMessageListener<T> {
* 设备注册 * 设备注册
* @param data * @param data
* */ * */
fun onRegistered(data:T) fun onSignUp(data:T)
/**
* 设备鉴权
* @param data
* */
fun onAuthenticated(data:T)
/** /**
* 平台通用应答 * 平台通用应答
......
...@@ -2,6 +2,7 @@ package com.waytous.anticollision.tcp ...@@ -2,6 +2,7 @@ package com.waytous.anticollision.tcp
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import com.waytous.anticollision.BuildConfig import com.waytous.anticollision.BuildConfig
import com.waytous.anticollision.utils.logd
import io.github.toggery.jt808.codec.* import io.github.toggery.jt808.codec.*
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.util.DefaultAttributeMap import io.netty.util.DefaultAttributeMap
...@@ -21,9 +22,10 @@ class SyncParser(private val syncMessageListener: SyncMessageListener<Codec<*>>) ...@@ -21,9 +22,10 @@ class SyncParser(private val syncMessageListener: SyncMessageListener<Codec<*>>)
fun parse(buf: ByteBuf){ fun parse(buf: ByteBuf){
try { try {
val message: Message<Codec<*>> = Message.decode(buf, MessageMetadata.outbounds(), DefaultAttributeMap()) val message: Message<Codec<*>> = Message.decode(buf, MessageMetadata.outbounds(), DefaultAttributeMap())
logd("【解析】:$message")
when(val codec:Codec<*> = message.body){ when(val codec:Codec<*> = message.body){
is B8001Codec -> syncMessageListener.onCommonResponse(codec) is B8001Codec -> syncMessageListener.onCommonResponse(codec)
is B8100Codec -> syncMessageListener.onRegistered(codec) is B8100Codec -> syncMessageListener.onSignUp(codec)
} }
LogUtils.d(message.toString()) LogUtils.d(message.toString())
} catch (e: Exception) { } catch (e: Exception) {
......
package com.waytous.anticollision.tcp
/**
* tcp通信错误定义
* */
enum class Error(val reason:String = "success") {
NOError,
IOError("io error"),
StreamClosed("stream closed"),
ConnectionRefused("connection refused"),
Timeout("time out"),
NotConnected("not connected"),
UserDisconnected("user disconnected"),
InvalidParam("invalid param"),
ServerUnknownError("server unknown error"),
JT808EncodeError("jt808 codec encode error"),
JT808DecodeError("jt808 codec decode error")
}
...@@ -35,7 +35,7 @@ const val READ_SIZE = 1024 ...@@ -35,7 +35,7 @@ const val READ_SIZE = 1024
* 链接状态 * 链接状态
* @author male * @author male
* */ * */
enum class ConnectStatus { internal enum class State {
/** /**
* 链接断开 * 链接断开
* */ * */
...@@ -112,7 +112,7 @@ internal class TcpManager( ...@@ -112,7 +112,7 @@ internal class TcpManager(
* @param error * @param error
* */ * */
fun disconnect(error: Error = Error.UserDisconnected) { fun disconnect(error: Error = Error.UserDisconnected) {
if (connection.connectStatus.get() == ConnectStatus.Disconnected) { if (connection.connectStatus.get() == State.Disconnected) {
return return
} }
receiveExecutor.execute { receiveExecutor.execute {
...@@ -127,7 +127,7 @@ internal class TcpManager( ...@@ -127,7 +127,7 @@ internal class TcpManager(
* @param data * @param data
* */ * */
fun send(data: ByteArray) { fun send(data: ByteArray) {
if (connection.connectStatus.get() == ConnectStatus.Connected) { if (connection.connectStatus.get() == State.Connected) {
sendExecutors.execute { connection.send(data) } sendExecutors.execute { connection.send(data) }
} }
} }
...@@ -160,8 +160,6 @@ internal class TcpManager( ...@@ -160,8 +160,6 @@ internal class TcpManager(
* */ * */
class Connection { class Connection {
private val TAG = "Connection"
/** /**
* 接收线程锁 * 接收线程锁
* */ * */
...@@ -176,7 +174,12 @@ internal class TcpManager( ...@@ -176,7 +174,12 @@ internal class TcpManager(
ReentrantLock() ReentrantLock()
} }
private lateinit var socket: Socket private val socket by lazy {
Socket().apply {
keepAlive = true
receiveBufferSize = BUFFER_SIZE
}
}
/** /**
* 数据接收流 * 数据接收流
...@@ -192,7 +195,7 @@ internal class TcpManager( ...@@ -192,7 +195,7 @@ internal class TcpManager(
* 链接状态 * 链接状态
* */ * */
val connectStatus by lazy { val connectStatus by lazy {
AtomicReference(ConnectStatus.Disconnected) AtomicReference(State.Disconnected)
} }
/** /**
...@@ -213,36 +216,32 @@ internal class TcpManager( ...@@ -213,36 +216,32 @@ internal class TcpManager(
receiveLock.lock() receiveLock.lock()
sendLock.lock() sendLock.lock()
var errorCode: Error = Error.NOError var errorCode: Error = Error.NOError
if (socket != null && socket.isConnected && connectStatus.get() > ConnectStatus.Disconnected) { if (socket.isConnected && connectStatus.get() > State.Disconnected) {
errorCode = Error.NOError errorCode = Error.NOError
} else if (socket != null) { } else {
closeSocket() closeSocket()
} }
connectStatus.set(ConnectStatus.Connecting) connectStatus.set(State.Connecting)
socket = Socket().apply { socket.soTimeout = receiveInterval
soTimeout = receiveInterval
keepAlive = true
receiveBufferSize = BUFFER_SIZE
}
socket.connect( socket.connect(
InetSocketAddress(host, port), InetSocketAddress(host, port),
if (timeout > 0) timeout else DEFAULT_TIMEOUT if (timeout > 0) timeout else DEFAULT_TIMEOUT
) )
inputStream = socket.getInputStream() inputStream = socket.getInputStream()
outputStream = socket.getOutputStream() outputStream = socket.getOutputStream()
connectStatus.set(ConnectStatus.Connected) connectStatus.set(State.Connected)
errorCode errorCode
} catch (e: IOException) { } catch (e: IOException) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
Error.IOError Error.IOError
} catch (e: SocketTimeoutException) { } catch (e: SocketTimeoutException) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
Error.Timeout Error.Timeout
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
Error.InvalidParam Error.InvalidParam
} catch (e: Exception) { } catch (e: Exception) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
Error.ServerUnknownError Error.ServerUnknownError
} finally { } finally {
sendLock.unlock() sendLock.unlock()
...@@ -289,7 +288,7 @@ internal class TcpManager( ...@@ -289,7 +288,7 @@ internal class TcpManager(
fun receive(): ReceivedResult { fun receive(): ReceivedResult {
try { try {
receiveLock.lock() receiveLock.lock()
if (connectStatus.get() != ConnectStatus.Connected) return ReceivedResult( if (connectStatus.get() != State.Connected) return ReceivedResult(
Error.NotConnected, Error.NotConnected,
0 0
) )
...@@ -299,22 +298,25 @@ internal class TcpManager( ...@@ -299,22 +298,25 @@ internal class TcpManager(
ReceivedResult(Error.NOError, len) ReceivedResult(Error.NOError, len)
} else { } else {
if (len == 0) { if (len == 0) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
ReceivedResult(Error.StreamClosed, len) ReceivedResult(Error.StreamClosed, len)
} else { } else {
cleanup() cleanup()
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
ReceivedResult(Error.IOError, len) ReceivedResult(Error.IOError, len)
} }
} }
} catch (e: IOException) { } catch (e: IOException) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
return ReceivedResult(Error.IOError, -1) return ReceivedResult(Error.IOError, -1)
} catch (e: SocketTimeoutException) {
connectStatus.set(State.Disconnected)
return ReceivedResult(Error.Timeout, 0)
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
return ReceivedResult(Error.InvalidParam, 0) return ReceivedResult(Error.InvalidParam, 0)
} catch (e: Exception) { } catch (e: Exception) {
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
return ReceivedResult(Error.ServerUnknownError, 0) return ReceivedResult(Error.ServerUnknownError, 0)
} finally { } finally {
receiveLock.unlock() receiveLock.unlock()
...@@ -333,7 +335,7 @@ internal class TcpManager( ...@@ -333,7 +335,7 @@ internal class TcpManager(
receiveLock.lock() receiveLock.lock()
sendLock.lock() sendLock.lock()
closeSocket() closeSocket()
connectStatus.set(ConnectStatus.Disconnected) connectStatus.set(State.Disconnected)
} catch (e: Exception) { } catch (e: Exception) {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
LogUtils.e("cleanup error:${e.message}") LogUtils.e("cleanup error:${e.message}")
......
package com.waytous.anticollision.utils package com.waytous.anticollision.utils
import com.blankj.utilcode.util.LogUtils
import com.waytous.anticollision.BuildConfig
/**
* 连接状态
* */
enum class ConnectStatus {
Disconnected, Connected
}
/**
* 登录状态
* */
enum class SignInStatus {
SignOut, SignIn
}
fun logd(message:String){
if (BuildConfig.DEBUG) {
if (BuildConfig.DEBUG) {
LogUtils.d(message)
} else {
LogUtils.file(message)
}
}
}
fun loge(message:String){
if (BuildConfig.DEBUG) {
if (BuildConfig.DEBUG) {
LogUtils.e(message)
} else {
LogUtils.file(message)
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment