From 81bd0388494d45463de42cd91bd8c33f10f0030a Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期四, 17 六月 2021 10:27:21 +0800 Subject: [PATCH] 1. 新增用电量数据的接收协议 2. 调整socket接收模块的代码结构 --- src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt | 99 +++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 90 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt index 8740c9c..27149c5 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt @@ -16,22 +16,103 @@ * 2 鏁版嵁鍗曞厓闀垮害 * 鍊掓暟绗�2 鏍¢獙鐮� */ -interface DataPackageDecoder { +class DataPackageDecoder { - fun getHead(b: List<String>): String? + companion object { + // 鏁版嵁澶� + const val HEAD_BYTES = 1 + // 鐩戞祴鍙傛暟纭鎸囦护浣� + const val COMMAND_UNIT_BYTES = 1 + // 璁惧绫诲瀷 + const val DEVICE_CODE_BYTES = 6 + // 鏈鐩戞祴鐨勭┖姘斿洜瀛愭暟閲� + const val DATA_LENGTH = 1 + // 鏍¢獙 + const val BCC_BYTES = 2 + } - fun getCommandUnit(b: List<String>): Int? + private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoder() - fun getDeviceCode(b: List<String>): String? - fun getDataTime(b: List<String>): Date + fun getHead(b: List<String>): String? { + return if (b.isNotEmpty()) { + val s = StringBuilder() + repeat(HEAD_BYTES) { + s.append(b[it]) + } + s.toString() + } else { + null + } + } - fun getDataLength(b: List<String>): Int + 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 + } - fun getDataUnit(b: List<String>): List<DataUnit> + fun getDeviceCode(b: List<String>): String? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES)) { + //2021/1/7 '0A'浠h〃杞﹁浇璁惧锛�'0B'浠h〃鏃犱汉鏈鸿澶囷紝'0C'涓虹綉鏍煎寲鐩戞祴 + val s = StringBuilder() + repeat(DEVICE_CODE_BYTES) { + s.append(b[HEAD_BYTES + COMMAND_UNIT_BYTES + it]) + } + s.toString() + } else { + null + } - fun getCheckCode(b: List<String>): Int? + fun getDataTime(b: List<String>): Date { + // FIXME: 2021/1/7 閲囨牱鏃堕棿鍜岀洃娴嬪洜瀛愪竴鍚屾斁鍦ㄤ簡鏁版嵁閮ㄥ垎锛屾澶勪笉鍐嶅仛瑙f瀽 + return Date() + } - fun toStringList(msg: String): List<String> + fun getDataLength(b: List<String>): Int { + if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0 + + val hexNum = b[HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES] + + return hexNum.toIntOrNull(16) ?: 0 + } + + fun getDataUnit(b: List<String>): List<DataUnit> { + if (getDataLength(b) == 0 || b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) { + return emptyList() + } + + val unit = mutableListOf<String>() + 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, getDeviceCode(b)) + AirCommandUnit.AirData.value -> getAirData(unit, getDeviceCode(b)) + else -> emptyList() + } + } + } + + fun getCheckCode(b: List<String>): Int? { + return if (b.size >= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + BCC_BYTES) { + val hexNum = "${b[b.size - 2]}${b[b.size - 1]}" + + hexNum.toIntOrNull(16) + } else { + null + } + } + + fun toStringList(msg: String): List<String> { + return msg.split(" ") + } + } \ No newline at end of file -- Gitblit v1.9.3