From 879378a9a2e73278dc822c97f8d1dda589919b6d Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期五, 21 五月 2021 17:36:44 +0800 Subject: [PATCH] 1. 根据新的协议,扩展了设备编号的位数从1位至6位; 2. 新增监测因子无人机高度; --- src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt | 86 +++++++++++++++++++++++++------------------ 1 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt index cb41fb8..e79b6c0 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt @@ -3,7 +3,9 @@ import com.flightfeather.uav.socket.bean.DataUnit import com.flightfeather.uav.socket.decoder.DataPackageDecoder import com.flightfeather.uav.socket.decoder.DataUnitDecoder -import com.flightfeather.uav.socket.eunm.ObdCommandUnit +import com.flightfeather.uav.socket.eunm.AirCommandUnit +import java.util.* +import kotlin.text.StringBuilder /** * @author riku @@ -11,81 +13,93 @@ */ class DataPackageDecoderImpl : DataPackageDecoder { + 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 + } + private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl() - // 鎺ユ敹鍒扮殑瀛楃涓叉槸byte杞爜鍓嶇殑锛屽叾灏辫〃绀哄瓧绗︾殑ASCII鐮侊紱 override fun getHead(b: List<String>): String? { - return if (b.size >= 2) { - "${b[0]}${b[1]}" + return if (b.isNotEmpty()) { + val s = StringBuilder() + repeat(HEAD_BYTES) { + s.append(b[it]) + } + s.toString() } else { null } } - override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 3) { - b[2].toIntOrNull(16) - } else { - null - } - - override fun getVinCode(b: List<String>): String? { - if (b.size < 20) return null - - //fixme 搴旇鏄渶瑕佸皢b褰撲綔ASCII鐮侊紝鍐嶈幏鍙栬浆鎹㈠悗鐨勫瓧绗︿覆 + override fun getCommandUnit(b: List<String>): Int? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES)) { val s = StringBuilder() - - for (i in 3..19) { - s.append(b[i].toIntOrNull(16)?.toChar()) + repeat(COMMAND_UNIT_BYTES) { + s.append(b[HEAD_BYTES + it]) } - - return s.toString() - } - - override fun getSoftwareVersion(b: List<String>): Int? = if (b.size >= 21) { - b[20].toIntOrNull(16) + s.toString().toIntOrNull(16) } else { null } - override fun getEncryptionWay(b: List<String>): Int? = if (b.size >= 21) { - b[21].toIntOrNull(16) + override 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 + } + + override fun getDataTime(b: List<String>): Date { + // FIXME: 2021/1/7 閲囨牱鏃堕棿鍜岀洃娴嬪洜瀛愪竴鍚屾斁鍦ㄤ簡鏁版嵁閮ㄥ垎锛屾澶勪笉鍐嶅仛瑙f瀽 + return Date() } override fun getDataLength(b: List<String>): Int { - if (b.size < 24) return 0 + if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0 - val hexNum = "${b[22]}${b[23]}" + 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 < 26) { + 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 24..b.size - 2) { + 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)) { - ObdCommandUnit.CarRegister.value -> getCarRegisterData(unit) - ObdCommandUnit.RealTimeData.value -> getRealTimeData(unit) - ObdCommandUnit.ReplacementData.value -> getReplacementData(unit) - ObdCommandUnit.CarLogOut.value -> getCarLogOutData(unit) - ObdCommandUnit.TimeCalibration.value -> getTimeCalibrationData(unit) + AirCommandUnit.Confirm.value -> getAirConfirmData(unit, getDeviceCode(b)) + AirCommandUnit.AirData.value -> getAirData(unit, getDeviceCode(b)) else -> emptyList() } } } override fun getCheckCode(b: List<String>): Int? { - return if (b.isNotEmpty()) { - b[b.size - 1].toIntOrNull(16) + 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 } -- Gitblit v1.9.3