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/DataUnitDecoder.kt | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 156 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt index 0975dd8..6b848c4 100644 --- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt +++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt @@ -2,6 +2,9 @@ import com.flightfeather.uav.socket.bean.* import com.flightfeather.uav.socket.eunm.AirCommandUnit +import com.flightfeather.uav.socket.eunm.FactorType +import org.slf4j.LoggerFactory +import java.text.SimpleDateFormat import java.util.* /** @@ -12,10 +15,160 @@ * 鏁版嵁鍗曞厓鎸夌収鍛戒护鍗曞厓鐨勭被鍨嬪叡鏈変互涓嬪嚑绉嶇被鍨嬶細 * 鍛戒护鍗曞厓 @see [AirCommandUnit] */ -interface DataUnitDecoder { +class DataUnitDecoder { - fun getAirConfirmData(b: List<String>, deviceCode: String?): List<AirTypeData> + private val logger = LoggerFactory.getLogger(javaClass.name) - fun getAirData(b: List<String>, deviceCode: String?): List<AirData> + private val types = mutableMapOf<String?, MutableList<AirTypeData>>() + + 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)) + } + } + if (!types.containsKey(deviceCode)) { + types[deviceCode] = mutableListOf() + } + types[deviceCode]?.clear() + types[deviceCode]?.addAll(resultList) + + return resultList + } + + fun getAirData(b: List<String>, deviceCode: String?): List<AirData> { + val resultList = mutableListOf<AirData>() + + if (!types.containsKey(deviceCode)) { + return resultList + } + + var i = 0 + types[deviceCode]?.forEach { + if (i > b.size - it.factorType.byteLength) { + return@forEach + } + + when (it.factorType) { + FactorType.LNG -> { + val valid = b[i].toInt(16).toChar()//缁忕含搴︽槸鍚︽湁鏁堬紙鏈夋晥: A; 鏃犳晥: V锛� + + //缁忕含搴﹀師濮嬪�硷紝渚嬶細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 { + factorId = it.factorType.value?.toString() + factorName = it.factorType.des + factorData = lng + statusList = listOf(valid.toString(), s.toString()) + }) + } + FactorType.LAT -> { + val a1 = b[i].toInt(16) + val b1 = b[i + 1].toInt(16) + 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() + factorName = it.factorType.des + factorData = lat + statusList = listOf(s.toString()) + }) + } + FactorType.TIME -> { + val year = b[i].toInt(16).toString().run { numberFormat(this) } + val month = b[i + 1].toInt(16).toString().run { numberFormat(this) } + val day = b[i + 2].toInt(16).toString().run { numberFormat(this) } + val hour = b[i + 3].toInt(16).toString().run { numberFormat(this) } + val minute = b[i + 4].toInt(16).toString().run { numberFormat(this) } + val second = b[i + 5].toInt(16).toString().run { numberFormat(this) } + val date = "20$year-$month-$day $hour:$minute:$second" + val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).time + resultList.add(AirData().apply { + factorId = it.factorType.value.toString() + factorName = it.factorType.des + factorData = time.toDouble() + statusList = listOf(date) + }) + } + else -> { + when (it.factorType.byteLength) { + AirDataPackage.FACTOR_BIT_LENGTH_2 -> { + val a1 = "${b[i]}${b[i + 1]}".toInt(16) + var b1 = b[i + 2].toInt(16).toDouble() + while (b1 >= 1) { + b1 /= 10 + } + val data1 = a1 + b1 + + resultList.add(AirData().apply { + factorId = it.factorType.value?.toString() + factorName = it.factorType.des + factorData = data1 + }) + } + AirDataPackage.FACTOR_BIT_LENGTH_1 -> { + //鏁版嵁瀹為檯鍊硷紙3浣嶅瓧鑺傝〃绀猴級 + val a1 = "${b[i]}${b[i + 1]}".toInt(16) + var b1 = b[i + 2].toInt(16).toDouble() + while (b1 >= 1) { + b1 /= 10 + } + val data1 = a1 + b1 + + //鏁版嵁鐗╃悊閲忥紙3浣嶅瓧鑺傝〃绀猴級 + val a2 = "${b[i+3]}${b[i + 4]}".toInt(16) + var b2 = b[i + 5].toInt(16).toDouble() + while (b2 >= 1) { + b2 /= 10 + } + val data2 = a2 + b2 + + resultList.add(AirData().apply { + factorId = it.factorType.value?.toString() + factorName = it.factorType.des + factorData = data1 + 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() + }) + } + } + } + } + + i += it.factorType.byteLength + } + + return resultList + } + + private fun numberFormat(num: String) = + if (num.length < 2) { + "0$num" + } else { + num + } } \ No newline at end of file -- Gitblit v1.9.3