src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/test/kotlin/com/flightfeather/uav/Test.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
@@ -15,6 +15,7 @@ } val attributeKey = AttributeKey.valueOf<String>("deviceCode") val messageManager = MessageManager() override fun channelRegistered(ctx: ChannelHandlerContext?) { super.channelRegistered(ctx) @@ -55,7 +56,7 @@ } val str = sb.toString() if (str.isNotEmpty()) { MessageManager().dealStringMsg(str, ctx) messageManager.dealStringMsg(str, ctx) } } src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
@@ -1,5 +1,6 @@ package com.flightfeather.uav.socket import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.ByteToMessageDecoder @@ -13,11 +14,11 @@ 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 = DataPackageDecoderImpl.HEAD_BYTES + DataPackageDecoderImpl.COMMAND_UNIT_BYTES + DataPackageDecoderImpl.DEVICE_CODE_BYTES + DataPackageDecoderImpl.DATA_LENGTH + DataPackageDecoderImpl.BCC_BYTES const val HEAD1 = 0x01.toByte() const val HEAD_LENGTH = DataPackageDecoderImpl.HEAD_BYTES + DataPackageDecoderImpl.COMMAND_UNIT_BYTES + DataPackageDecoderImpl.DEVICE_CODE_BYTES } override fun decode(p0: ChannelHandlerContext?, p1: ByteBuf?, p2: MutableList<Any>?) { @@ -41,11 +42,12 @@ // æ è®°å 头å¼å§ç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]) b.forEach {b -> dataList.add(b) } break } @@ -69,14 +71,14 @@ //æ°æ®åå çé¿åº¦ val length = getDataUnitLength(it, dataList) // å¤æè¯·æ±æ°æ®åå æ°æ®å[LENGTH_BYTES]个åèçæ ¡éªç æ¯å¦å°é½ if (it.readableBytes() < length + BCC_BYTES) { if (it.readableBytes() < length + DataPackageDecoderImpl.BCC_BYTES) { // è¿å读æé it.readerIndex(beginReader) return } //è¯»åæ°æ®åå åæ ¡éªç æ°æ® ByteArray(length + BCC_BYTES).apply { ByteArray(length + DataPackageDecoderImpl.BCC_BYTES).apply { it.readBytes(this) }.forEach {b -> dataList.add(b) src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt
@@ -33,10 +33,12 @@ //æ°æ®ä¸çä¿çåèæ° const val RESERVED_DATA_COUNT = 12 //ä¸ä¸ªå¨æçæµå åç屿§æå åèæ° const val FACTOR_BIT_LENGTH_1 = 6 //ä¸ä¸ªä¿ççæµå åç屿§æå åèæ° const val FACTOR_BIT_LENGTH_2 = 3 //ä¸ä¸ªå¨æçæµå åç屿§æå åèæ° const val FACTOR_BIT_LENGTH_1 = 6 const val FACTOR_BIT_LENGTH_3 = 2 } } src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt
@@ -21,8 +21,8 @@ */ interface DataUnitDecoder { fun getAirConfirmData(b: List<String>): List<AirTypeData> fun getAirConfirmData(b: List<String>, deviceCode: String?): List<AirTypeData> fun getAirData(b: List<String>): List<AirData> fun getAirData(b: List<String>, deviceCode: String?): List<AirData> } src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt
@@ -5,6 +5,7 @@ import com.flightfeather.uav.socket.decoder.DataUnitDecoder import com.flightfeather.uav.socket.eunm.AirCommandUnit import java.util.* import kotlin.text.StringBuilder /** * @author riku @@ -12,54 +13,78 @@ */ class DataPackageDecoderImpl : DataPackageDecoder { companion object { const val HEAD_BYTES = 1 const val COMMAND_UNIT_BYTES = 1 const val DEVICE_CODE_BYTES = 1 const val DATA_LENGTH = 1 const val BCC_BYTES = 2 } private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl() override fun getHead(b: List<String>): String? { return if (b.isNotEmpty()) { b[0] val s = StringBuilder() repeat(HEAD_BYTES) { s.append(b[it]) } s.toString() } else { null } } override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 2) { b[1].toIntOrNull(16) override fun getCommandUnit(b: List<String>): Int? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES)) { val s = StringBuilder() repeat(COMMAND_UNIT_BYTES) { s.append(b[HEAD_BYTES + it]) } s.toString().toIntOrNull(16) } else { null } override fun getDeviceCode(b: List<String>): String? { return null override fun getDeviceCode(b: List<String>): String? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES)) { //2021/1/7 '0A'代表车载设å¤ï¼'0B'代表æ 人æºè®¾å¤ val s = StringBuilder() repeat(DEVICE_CODE_BYTES) { s.append(b[HEAD_BYTES + COMMAND_UNIT_BYTES + it]) } s.toString() } else { null } override fun getDataTime(b: List<String>): Date { //fixme 2020/06/11 ç®åæ°æ®æµä¸ä¸å å«éæ ·æ¶é´ï¼æä»¥éç¨æå¡å¨æ¥æ¶æ¶é´ä½ä¸ºéæ ·æ¶é´ // FIXME: 2021/1/7 éæ ·æ¶é´åçæµå åä¸åæ¾å¨äºæ°æ®é¨åï¼æ¤å¤ä¸ååè§£æ return Date() } override fun getDataLength(b: List<String>): Int { if (b.size < 5) return 0 if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0 val hexNum = b[2] val hexNum = b[HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES] return hexNum.toIntOrNull(16) ?: 0 } override fun getDataUnit(b: List<String>): List<DataUnit> { if (getDataLength(b) == 0 || b.size < 5) { if (getDataLength(b) == 0 || b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) { return emptyList() } val unit = mutableListOf<String>() for (i in 3..b.size - 3) { val start = HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH for (i in start..b.size - 1 - BCC_BYTES) { unit.add(b[i]) } dataUnitDecoder.run { return when (getCommandUnit(b)) { AirCommandUnit.Confirm.value -> getAirConfirmData(unit) AirCommandUnit.AirData.value -> getAirData(unit) AirCommandUnit.Confirm.value -> getAirConfirmData(unit, getDeviceCode(b)) AirCommandUnit.AirData.value -> getAirData(unit, getDeviceCode(b)) else -> emptyList() } } src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
@@ -16,26 +16,33 @@ private val logger = LoggerFactory.getLogger(javaClass.name) private val types = mutableListOf<AirTypeData>() private val types = mutableMapOf<String?, MutableList<AirTypeData>>() override fun getAirConfirmData(b: List<String>): List<AirTypeData> { override fun getAirConfirmData(b: List<String>, deviceCode: String?): List<AirTypeData> { val resultList = mutableListOf<AirTypeData>() b.forEach { FactorType.getByIndex(it.toInt(16))?.let { f-> resultList.add(AirTypeData(f)) } } types.clear() types.addAll(resultList) if (!types.containsKey(deviceCode)) { types[deviceCode] = mutableListOf() } types[deviceCode]?.clear() types[deviceCode]?.addAll(resultList) return resultList } override fun getAirData(b: List<String>): List<AirData> { override fun getAirData(b: List<String>, deviceCode: String?): List<AirData> { val resultList = mutableListOf<AirData>() if (!types.containsKey(deviceCode)) { return resultList } var i = 0 types.forEach { types[deviceCode]?.forEach { if (i > b.size - it.factorType.byteLength) { return@forEach } @@ -43,13 +50,17 @@ when (it.factorType) { FactorType.LNG -> { val valid = b[i].toInt(16).toChar()//ç»çº¬åº¦æ¯å¦ææï¼ææ: A; æ æ: Vï¼ val a1 = b[i + 1].toInt(16) val b1 = b[i + 2].toInt(16) var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toDouble() while (b2 >= 1) { b2 /= 10 } val lng = a1 + (b1 + b2) / 60 //ç»çº¬åº¦åå§å¼ï¼ä¾ï¼121°30.0411â²ï¼å ¶ä¸ 121 对åºa1ï¼30对åºb1ï¼04对åºb2ï¼11对åºb3 val a1 = b[i + 1].toInt(16)//度 val b1 = b[i + 2].toInt(16)//åï¼æ´æ°ï¼ var b2 = b[i + 3].toInt(16).toDouble()//åï¼å°æ°é¨åå两ä½ï¼ var b3 = b[i + 4].toInt(16).toDouble()//åï¼å°æ°é¨åå两ä½ï¼ // var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toDouble() b2 /= 100 b3 /= 10000 val lng = a1 + (b1 + b2 + b3) / 60 val s = b[i + 5].toInt(16).toChar() resultList.add(AirData().apply { @@ -62,11 +73,12 @@ FactorType.LAT -> { val a1 = b[i].toInt(16) val b1 = b[i + 1].toInt(16) var b2 = "${b[i + 2]}${b[i + 3]}".toInt(16).toDouble() while (b2 >= 1) { b2 /= 10 } val lat = a1 + (b1 + b2) / 60 var b2 = b[i + 2].toInt(16).toDouble()//åï¼å°æ°é¨åå两ä½ï¼ var b3 = b[i + 3].toInt(16).toDouble()//åï¼å°æ°é¨åå两ä½ï¼ b2 /= 100 b3 /= 10000 val lat = a1 + (b1 + b2 + b3) / 60 val s = b[i + 4].toInt(16).toChar() resultList.add(AirData().apply { factorId = it.factorType.value.toString() @@ -131,6 +143,14 @@ physicalQuantity = data2 }) } AirDataPackage.FACTOR_BIT_LENGTH_3 -> { val data = "${b[i]}${b[i + 1]}".toInt(16) resultList.add(AirData().apply { factorId = it.factorType.value.toString() factorName = it.factorType.des factorData = data.toDouble() }) } } } } src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
@@ -19,7 +19,9 @@ LNG(12,"LNG",6),//ç»åº¦ LAT(13,"LAT",5),//纬度 VELOCITY(14, "VELOCITY", 3),//é度 TIME(15, "TIME", 6);//æ¶é´ TIME(15, "TIME", 6),//æ¶é´ WIND_SPEED(16, "WIND_SPEED", 3), WIND_DIRECTION(17, "WIND_DIRECTION", 2); companion object { @@ -39,6 +41,8 @@ LAT.value -> LAT VELOCITY.value -> VELOCITY TIME.value -> TIME WIND_SPEED.value -> WIND_SPEED WIND_DIRECTION.value -> WIND_DIRECTION else -> null } } src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt
ÎļþÒÑɾ³ý src/test/kotlin/com/flightfeather/uav/Test.kt
@@ -1,6 +1,13 @@ package com.flightfeather.uav import com.flightfeather.uav.socket.bean.DataUnit import com.flightfeather.uav.socket.decoder.AirDataDecoder import com.flightfeather.uav.socket.eunm.AirCommandUnit import com.google.gson.Gson import org.junit.Test import java.io.File import java.io.FileOutputStream import java.io.OutputStreamWriter import java.text.SimpleDateFormat import java.util.* @@ -18,16 +25,20 @@ @Test fun foo2() { val b = arrayOf("41", "79", "24", "04", "0B", "45") val i = 0 val valid = b[i].toInt(16).toChar()//ç»çº¬åº¦æ¯å¦ææï¼ææ: A; æ æ: Vï¼ val a1 = b[i + 1].toInt(16) val b1 = b[i + 2].toInt(16) var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toDouble() while (b2 >= 1) { b2 /= 10 val file = File("E:\\VSprojects\\uav-monitor\\asset\\data\\data-2020-12-24-01-34-24.txt") val outFile = File("E:\\VSprojects\\uav-monitor\\asset\\data\\data.json") val out = OutputStreamWriter(FileOutputStream(outFile)) val list = mutableListOf<List<DataUnit>>() file.readLines().forEach { val p = AirDataDecoder.instance.decode(it) // val str = Gson().toJson(p.dataUnit) if (p.commandUnit == AirCommandUnit.AirData.value) { list.add(p.dataUnit) } } val lng = a1 + (b1 + b2) / 60 val s = b[i + 5].toInt(16).toChar() val str = Gson().toJson(list) out.append(str) out.flush() out.close() } }