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> {
* 设备注册
* @param data
* */
fun onRegistered(data:T)
/**
* 设备鉴权
* @param data
* */
fun onAuthenticated(data:T)
fun onSignUp(data:T)
/**
* 平台通用应答
......
......@@ -2,6 +2,7 @@ package com.waytous.anticollision.tcp
import com.blankj.utilcode.util.LogUtils
import com.waytous.anticollision.BuildConfig
import com.waytous.anticollision.utils.logd
import io.github.toggery.jt808.codec.*
import io.netty.buffer.ByteBuf
import io.netty.util.DefaultAttributeMap
......@@ -21,9 +22,10 @@ class SyncParser(private val syncMessageListener: SyncMessageListener<Codec<*>>)
fun parse(buf: ByteBuf){
try {
val message: Message<Codec<*>> = Message.decode(buf, MessageMetadata.outbounds(), DefaultAttributeMap())
logd("【解析】:$message")
when(val codec:Codec<*> = message.body){
is B8001Codec -> syncMessageListener.onCommonResponse(codec)
is B8100Codec -> syncMessageListener.onRegistered(codec)
is B8100Codec -> syncMessageListener.onSignUp(codec)
}
LogUtils.d(message.toString())
} 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
* 链接状态
* @author male
* */
enum class ConnectStatus {
internal enum class State {
/**
* 链接断开
* */
......@@ -112,7 +112,7 @@ internal class TcpManager(
* @param error
* */
fun disconnect(error: Error = Error.UserDisconnected) {
if (connection.connectStatus.get() == ConnectStatus.Disconnected) {
if (connection.connectStatus.get() == State.Disconnected) {
return
}
receiveExecutor.execute {
......@@ -127,7 +127,7 @@ internal class TcpManager(
* @param data
* */
fun send(data: ByteArray) {
if (connection.connectStatus.get() == ConnectStatus.Connected) {
if (connection.connectStatus.get() == State.Connected) {
sendExecutors.execute { connection.send(data) }
}
}
......@@ -160,8 +160,6 @@ internal class TcpManager(
* */
class Connection {
private val TAG = "Connection"
/**
* 接收线程锁
* */
......@@ -176,7 +174,12 @@ internal class TcpManager(
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(
* 链接状态
* */
val connectStatus by lazy {
AtomicReference(ConnectStatus.Disconnected)
AtomicReference(State.Disconnected)
}
/**
......@@ -213,36 +216,32 @@ internal class TcpManager(
receiveLock.lock()
sendLock.lock()
var errorCode: Error = Error.NOError
if (socket != null && socket.isConnected && connectStatus.get() > ConnectStatus.Disconnected) {
if (socket.isConnected && connectStatus.get() > State.Disconnected) {
errorCode = Error.NOError
} else if (socket != null) {
} else {
closeSocket()
}
connectStatus.set(ConnectStatus.Connecting)
socket = Socket().apply {
soTimeout = receiveInterval
keepAlive = true
receiveBufferSize = BUFFER_SIZE
}
connectStatus.set(State.Connecting)
socket.soTimeout = receiveInterval
socket.connect(
InetSocketAddress(host, port),
if (timeout > 0) timeout else DEFAULT_TIMEOUT
)
inputStream = socket.getInputStream()
outputStream = socket.getOutputStream()
connectStatus.set(ConnectStatus.Connected)
connectStatus.set(State.Connected)
errorCode
} catch (e: IOException) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
Error.IOError
} catch (e: SocketTimeoutException) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
Error.Timeout
} catch (e: IllegalArgumentException) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
Error.InvalidParam
} catch (e: Exception) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
Error.ServerUnknownError
} finally {
sendLock.unlock()
......@@ -289,7 +288,7 @@ internal class TcpManager(
fun receive(): ReceivedResult {
try {
receiveLock.lock()
if (connectStatus.get() != ConnectStatus.Connected) return ReceivedResult(
if (connectStatus.get() != State.Connected) return ReceivedResult(
Error.NotConnected,
0
)
......@@ -299,22 +298,25 @@ internal class TcpManager(
ReceivedResult(Error.NOError, len)
} else {
if (len == 0) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
ReceivedResult(Error.StreamClosed, len)
} else {
cleanup()
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
ReceivedResult(Error.IOError, len)
}
}
} catch (e: IOException) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
return ReceivedResult(Error.IOError, -1)
} catch (e: SocketTimeoutException) {
connectStatus.set(State.Disconnected)
return ReceivedResult(Error.Timeout, 0)
} catch (e: IllegalArgumentException) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
return ReceivedResult(Error.InvalidParam, 0)
} catch (e: Exception) {
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
return ReceivedResult(Error.ServerUnknownError, 0)
} finally {
receiveLock.unlock()
......@@ -333,7 +335,7 @@ internal class TcpManager(
receiveLock.lock()
sendLock.lock()
closeSocket()
connectStatus.set(ConnectStatus.Disconnected)
connectStatus.set(State.Disconnected)
} catch (e: Exception) {
if (BuildConfig.DEBUG) {
LogUtils.e("cleanup error:${e.message}")
......
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