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