riku
2020-06-11 585fb9b67dc81f9e14f2cbf59f1c3a02eb4fe98f
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/socket/ObdByteDataDecoder.kt ÐÞ¸Ä
@@ -7,14 +7,18 @@
/**
 * @author riku
 * Date: 2019/9/16
 * Date: 2020/06/02
 * æ•°æ®ç²˜åŒ…分包解码器
 */
class ObdByteDataDecoder : ByteToMessageDecoder() {
class UAVByteDataDecoder : ByteToMessageDecoder() {
    companion object {
        const val BASE_LENGTH = 2 + 1 + 17 + 1 + 1 + 2 + 0 + 1
        const val HEAD = 0x23.toByte()
        private const val HEAD_BYTES = 2//数据头所占长度
        private const val LENGTH_BYTES = 1//数据位数所占长度
        private const val BCC_BYTES = 2//校验码长度
        const val BASE_LENGTH = HEAD_BYTES + LENGTH_BYTES + BCC_BYTES
        const val HEAD1 = 0x01.toByte()
        const val HEAD2 = 0x05.toByte()
    }
    override fun decode(p0: ChannelHandlerContext?, p1: ByteBuf?, p2: MutableList<Any>?) {
@@ -40,7 +44,7 @@
                    // è¯»åˆ°äº†åè®®çš„开始标志,结束while循环
                    val b = ByteArray(2)
                    it.readBytes(b)
                    if (b[0] == HEAD && b[1] == HEAD) {
                    if (b[0] == HEAD1 && b[1] == HEAD2) {
                        dataList.add(b[0])
                        dataList.add(b[1])
                        break
@@ -57,7 +61,7 @@
                    }
                }
                ByteArray(1 + 17 + 1 + 1).apply {
                ByteArray(1).apply {
                    it.readBytes(this)
                }.forEach {b ->
                    dataList.add(b)
@@ -65,15 +69,15 @@
                //数据单元的长度
                val length = getDataUnitLength(it, dataList)
                // åˆ¤æ–­è¯·æ±‚数据单元数据及1个字节的校验码是否到齐
                if (it.readableBytes() < length + 1) {
                // åˆ¤æ–­è¯·æ±‚数据单元数据及[LENGTH_BYTES]个字节的校验码是否到齐
                if (it.readableBytes() < length + BCC_BYTES) {
                    // è¿˜åŽŸè¯»æŒ‡é’ˆ
                    it.readerIndex(beginReader)
                    return
                }
                //读取数据单元和校验码数据
                ByteArray(length + 1).apply {
                ByteArray(length + BCC_BYTES).apply {
                    it.readBytes(this)
                }.forEach {b ->
                    dataList.add(b)
@@ -91,11 +95,10 @@
    private fun getDataUnitLength(p1: ByteBuf, dataList: MutableList<Byte>): Int {
        val sb = StringBuilder()
        ByteArray(2).apply {
        ByteArray(1).apply {
            p1.readBytes(this)
        }.forEach { b ->
            var a = 0
            a = if (b < 0) {
            val a: Int = if (b < 0) {
                b + 256
            } else {
                b.toInt()
@@ -108,5 +111,4 @@
        return sb.toString().toInt(16)
    }
}