riku
2025-08-28 3bb4fb15c664d29d179083698fdad35a661b1d7f
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
@@ -1,10 +1,9 @@
package com.flightfeather.uav.socket
import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl
import com.flightfeather.uav.socket.decoder.DataPackageDecoder
import io.netty.buffer.ByteBuf
import io.netty.channel.ChannelHandlerContext
import io.netty.handler.codec.ByteToMessageDecoder
import java.lang.StringBuilder
/**
 * @author riku
@@ -14,11 +13,13 @@
class UAVByteDataDecoder : ByteToMessageDecoder() {
    companion object {
        const val BASE_LENGTH = DataPackageDecoderImpl.HEAD_BYTES + DataPackageDecoderImpl.COMMAND_UNIT_BYTES +
                DataPackageDecoderImpl.DEVICE_CODE_BYTES + DataPackageDecoderImpl.DATA_LENGTH + DataPackageDecoderImpl.BCC_BYTES
        const val BASE_LENGTH = DataPackageDecoder.HEAD_BYTES + DataPackageDecoder.COMMAND_UNIT_BYTES +
                DataPackageDecoder.DEVICE_CODE_BYTES + DataPackageDecoder.DATA_LENGTH + DataPackageDecoder.BCC_BYTES
        const val HEAD1 = 0x01.toByte()
        const val HEAD_LENGTH = DataPackageDecoderImpl.HEAD_BYTES + DataPackageDecoderImpl.COMMAND_UNIT_BYTES +
                DataPackageDecoderImpl.DEVICE_CODE_BYTES
        const val COMMAND_1 = 0x04.toByte()
        const val COMMAND_2 = 0x05.toByte()
        const val HEAD_LENGTH = DataPackageDecoder.HEAD_BYTES + DataPackageDecoder.COMMAND_UNIT_BYTES +
                DataPackageDecoder.DEVICE_CODE_BYTES
    }
    override fun decode(p0: ChannelHandlerContext?, p1: ByteBuf?, p2: MutableList<Any>?) {
@@ -44,7 +45,8 @@
                    // 读到了协议的开始标志,结束while循环
                    val b = ByteArray(HEAD_LENGTH)
                    it.readBytes(b)
                    if (b[0] == HEAD1) {
                    if (b[0] == HEAD1 &&
                        (b[1] == COMMAND_1 || b[1] == COMMAND_2)) {
                        b.forEach {b ->
                            dataList.add(b)
                        }
@@ -71,14 +73,14 @@
                //数据单元的长度
                val length = getDataUnitLength(it, dataList)
                // 判断请求数据单元数据及[LENGTH_BYTES]个字节的校验码是否到齐
                if (it.readableBytes() < length + DataPackageDecoderImpl.BCC_BYTES) {
                if (it.readableBytes() < length + DataPackageDecoder.BCC_BYTES) {
                    // 还原读指针
                    it.readerIndex(beginReader)
                    return
                }
                //读取数据单元和校验码数据
                ByteArray(length + DataPackageDecoderImpl.BCC_BYTES).apply {
                ByteArray(length + DataPackageDecoder.BCC_BYTES).apply {
                    it.readBytes(this)
                }.forEach {b ->
                    dataList.add(b)