| | |
| | | package com.flightfeather.uav.socket |
| | | |
| | | 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 |
| | |
| | | class UAVByteDataDecoder : ByteToMessageDecoder() { |
| | | |
| | | companion object { |
| | | 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 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 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>?) { |
| | |
| | | // 标记包头开始的index |
| | | it.markReaderIndex() |
| | | // 读到了协议的开始标志,结束while循环 |
| | | val b = ByteArray(2) |
| | | val b = ByteArray(HEAD_LENGTH) |
| | | it.readBytes(b) |
| | | if (b[0] == HEAD1) { |
| | | dataList.add(b[0]) |
| | | dataList.add(b[1]) |
| | | if (b[0] == HEAD1 && |
| | | (b[1] == COMMAND_1 || b[1] == COMMAND_2)) { |
| | | b.forEach {b -> |
| | | dataList.add(b) |
| | | } |
| | | break |
| | | } |
| | | |
| | |
| | | //数据单元的长度 |
| | | val length = getDataUnitLength(it, dataList) |
| | | // 判断请求数据单元数据及[LENGTH_BYTES]个字节的校验码是否到齐 |
| | | if (it.readableBytes() < length + BCC_BYTES) { |
| | | if (it.readableBytes() < length + DataPackageDecoder.BCC_BYTES) { |
| | | // 还原读指针 |
| | | it.readerIndex(beginReader) |
| | | return |
| | | } |
| | | |
| | | //读取数据单元和校验码数据 |
| | | ByteArray(length + BCC_BYTES).apply { |
| | | ByteArray(length + DataPackageDecoder.BCC_BYTES).apply { |
| | | it.readBytes(this) |
| | | }.forEach {b -> |
| | | dataList.add(b) |