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 | 112 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 94 insertions(+), 18 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 1849efa..27149c5 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt @@ -1,7 +1,8 @@ package com.flightfeather.uav.socket.decoder import com.flightfeather.uav.socket.bean.DataUnit -import com.flightfeather.uav.socket.eunm.ObdCommandUnit +import com.flightfeather.uav.socket.eunm.AirCommandUnit +import java.util.* /** * uav 绗竴灞傛暟鎹寘瑙g爜鍣� @@ -11,32 +12,107 @@ * 鏁版嵁绗竴灞傜粨鏋勫畾涔夊涓嬶細 * 璧峰瀛楄妭 瀹氫箟 * 0 璧峰绗� - * 2 鍛戒护鍗曞厓 绫诲瀷@see [ObdCommandUnit] - * 3 杞﹁締璇嗗埆鍙� - * 4 缁堢杞欢鐗堟湰鍙� - * 21 鏁版嵁鍔犲瘑鏂瑰紡 - * 22 鏁版嵁鍗曞厓闀垮害 - * 24 鏁版嵁鍗曞厓 瑙g爜鍣ˊsee [DataUnitDecoder] - * 鍊掓暟绗�1 鏍¢獙鐮� + * 1 鍛戒护鍗曞厓 绫诲瀷@see [AirCommandUnit] + * 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 getVinCode(b: List<String>): String? - fun getSoftwareVersion(b: List<String>): Int? + 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 getEncryptionWay(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 getDataLength(b: List<String>): Int + 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 getDataUnit(b: List<String>): List<DataUnit> + fun getDataTime(b: List<String>): Date { + // FIXME: 2021/1/7 閲囨牱鏃堕棿鍜岀洃娴嬪洜瀛愪竴鍚屾斁鍦ㄤ簡鏁版嵁閮ㄥ垎锛屾澶勪笉鍐嶅仛瑙f瀽 + return Date() + } - fun getCheckCode(b: List<String>): Int? + fun getDataLength(b: List<String>): Int { + if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0 - fun toStringList(msg: String): List<String> + 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