ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/socket/ObdByteDataDecoder.kt ÐÞ¸Ä |
| | |
| | | |
| | | /** |
| | | * @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>?) { |
| | |
| | | // 读å°äºåè®®çå¼å§æ å¿ï¼ç»æ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 |
| | |
| | | } |
| | | } |
| | | |
| | | ByteArray(1 + 17 + 1 + 1).apply { |
| | | ByteArray(1).apply { |
| | | it.readBytes(this) |
| | | }.forEach {b -> |
| | | dataList.add(b) |
| | |
| | | |
| | | //æ°æ®åå
çé¿åº¦ |
| | | 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) |
| | |
| | | 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() |
| | |
| | | |
| | | return sb.toString().toInt(16) |
| | | } |
| | | |
| | | } |