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