From 09f411e381f885619b32e05fc89cad26bb20824d Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期一, 01 三月 2021 14:27:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'obdserver2/master'

---
 /dev/null                                                                           |   12 ---
 src/test/kotlin/com/flightfeather/uav/Test.kt                                       |   31 +++++--
 src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt |   49 +++++++++---
 src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt    |   56 +++++++++----
 src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt                       |    3 
 src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt                  |   20 ++--
 src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt                 |    6 +
 src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt                     |    6 +
 src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt             |    4 
 9 files changed, 120 insertions(+), 67 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt b/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
index 1950bb4..fc5202e 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
@@ -15,6 +15,7 @@
     }
 
     val attributeKey = AttributeKey.valueOf<String>("deviceCode")
+    val messageManager = MessageManager()
 
     override fun channelRegistered(ctx: ChannelHandlerContext?) {
         super.channelRegistered(ctx)
@@ -55,7 +56,7 @@
         }
         val str = sb.toString()
         if (str.isNotEmpty()) {
-            MessageManager().dealStringMsg(str, ctx)
+            messageManager.dealStringMsg(str, ctx)
         }
 
     }
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt b/src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
index 937060f..3ca630f 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
@@ -1,5 +1,6 @@
 package com.flightfeather.uav.socket
 
+import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl
 import io.netty.buffer.ByteBuf
 import io.netty.channel.ChannelHandlerContext
 import io.netty.handler.codec.ByteToMessageDecoder
@@ -13,11 +14,11 @@
 class UAVByteDataDecoder : ByteToMessageDecoder() {
 
     companion object {
-        private const val HEAD_BYTES = 2//鏁版嵁澶存墍鍗犻暱搴�
-        private const val LENGTH_BYTES = 1//鏁版嵁浣嶆暟鎵�鍗犻暱搴�
-        private const val BCC_BYTES = 2//鏍¢獙鐮侀暱搴�
-        const val BASE_LENGTH = HEAD_BYTES + LENGTH_BYTES + BCC_BYTES
+        const val BASE_LENGTH = DataPackageDecoderImpl.HEAD_BYTES + DataPackageDecoderImpl.COMMAND_UNIT_BYTES +
+                DataPackageDecoderImpl.DEVICE_CODE_BYTES + DataPackageDecoderImpl.DATA_LENGTH + DataPackageDecoderImpl.BCC_BYTES
         const val HEAD1 = 0x01.toByte()
+        const val HEAD_LENGTH = DataPackageDecoderImpl.HEAD_BYTES + DataPackageDecoderImpl.COMMAND_UNIT_BYTES +
+                DataPackageDecoderImpl.DEVICE_CODE_BYTES
     }
 
     override fun decode(p0: ChannelHandlerContext?, p1: ByteBuf?, p2: MutableList<Any>?) {
@@ -41,11 +42,12 @@
                     // 鏍囪鍖呭ご寮�濮嬬殑index
                     it.markReaderIndex()
                     // 璇诲埌浜嗗崗璁殑寮�濮嬫爣蹇楋紝缁撴潫while寰幆
-                    val b = ByteArray(2)
+                    val b = ByteArray(HEAD_LENGTH)
                     it.readBytes(b)
                     if (b[0] == HEAD1) {
-                        dataList.add(b[0])
-                        dataList.add(b[1])
+                        b.forEach {b ->
+                            dataList.add(b)
+                        }
                         break
                     }
 
@@ -69,14 +71,14 @@
                 //鏁版嵁鍗曞厓鐨勯暱搴�
                 val length = getDataUnitLength(it, dataList)
                 // 鍒ゆ柇璇锋眰鏁版嵁鍗曞厓鏁版嵁鍙奫LENGTH_BYTES]涓瓧鑺傜殑鏍¢獙鐮佹槸鍚﹀埌榻�
-                if (it.readableBytes() < length + BCC_BYTES) {
+                if (it.readableBytes() < length + DataPackageDecoderImpl.BCC_BYTES) {
                     // 杩樺師璇绘寚閽�
                     it.readerIndex(beginReader)
                     return
                 }
 
                 //璇诲彇鏁版嵁鍗曞厓鍜屾牎楠岀爜鏁版嵁
-                ByteArray(length + BCC_BYTES).apply {
+                ByteArray(length + DataPackageDecoderImpl.BCC_BYTES).apply {
                     it.readBytes(this)
                 }.forEach {b ->
                     dataList.add(b)
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt b/src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt
index bd9b6ca..08b425f 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt
@@ -33,10 +33,12 @@
         //鏁版嵁涓殑淇濈暀瀛楄妭鏁�
         const val RESERVED_DATA_COUNT = 12
 
+        //涓�涓姩鎬佺洃娴嬪洜瀛愮殑灞炴�ф墍鍗犲瓧鑺傛暟
+        const val FACTOR_BIT_LENGTH_1 = 6
+
         //涓�涓繚鐣欑洃娴嬪洜瀛愮殑灞炴�ф墍鍗犲瓧鑺傛暟
         const val FACTOR_BIT_LENGTH_2 = 3
 
-        //涓�涓姩鎬佺洃娴嬪洜瀛愮殑灞炴�ф墍鍗犲瓧鑺傛暟
-        const val FACTOR_BIT_LENGTH_1 = 6
+        const val FACTOR_BIT_LENGTH_3 = 2
     }
 }
\ No newline at end of file
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 ce26095..f9a8179 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt
@@ -21,8 +21,8 @@
  */
 interface DataUnitDecoder {
 
-    fun getAirConfirmData(b: List<String>): List<AirTypeData>
+    fun getAirConfirmData(b: List<String>, deviceCode: String?): List<AirTypeData>
 
-    fun getAirData(b: List<String>): List<AirData>
+    fun getAirData(b: List<String>, deviceCode: String?): List<AirData>
 
 }
\ No newline at end of file
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 66ade0c..deadf89 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
@@ -5,6 +5,7 @@
 import com.flightfeather.uav.socket.decoder.DataUnitDecoder
 import com.flightfeather.uav.socket.eunm.AirCommandUnit
 import java.util.*
+import kotlin.text.StringBuilder
 
 /**
  * @author riku
@@ -12,54 +13,78 @@
  */
 class DataPackageDecoderImpl : DataPackageDecoder {
 
+    companion object {
+        const val HEAD_BYTES = 1
+        const val COMMAND_UNIT_BYTES = 1
+        const val DEVICE_CODE_BYTES = 1
+        const val DATA_LENGTH = 1
+        const val BCC_BYTES = 2
+    }
+
     private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl()
 
 
     override fun getHead(b: List<String>): String? {
         return if (b.isNotEmpty()) {
-            b[0]
+            val s = StringBuilder()
+            repeat(HEAD_BYTES) {
+                s.append(b[it])
+            }
+            s.toString()
         } else {
             null
         }
     }
 
-    override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 2) {
-        b[1].toIntOrNull(16)
+    override 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
     }
 
-    override fun getDeviceCode(b: List<String>): String? {
-        return null
+    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〃鏃犱汉鏈鸿澶�
+        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 2020/06/11  鐩墠鏁版嵁娴佷腑涓嶅寘鍚噰鏍锋椂闂达紝鎵�浠ラ噰鐢ㄦ湇鍔″櫒鎺ユ敹鏃堕棿浣滀负閲囨牱鏃堕棿
+        // FIXME: 2021/1/7 閲囨牱鏃堕棿鍜岀洃娴嬪洜瀛愪竴鍚屾斁鍦ㄤ簡鏁版嵁閮ㄥ垎锛屾澶勪笉鍐嶅仛瑙f瀽
         return Date()
     }
 
     override fun getDataLength(b: List<String>): Int {
-        if (b.size < 5) return 0
+        if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0
 
-        val hexNum = b[2]
+        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 < 5) {
+        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 3..b.size - 3) {
+        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)
-                AirCommandUnit.AirData.value -> getAirData(unit)
+                AirCommandUnit.Confirm.value -> getAirConfirmData(unit, getDeviceCode(b))
+                AirCommandUnit.AirData.value -> getAirData(unit, getDeviceCode(b))
                 else -> emptyList()
             }
         }
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
index 1af1944..a5ffbd5 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
@@ -16,26 +16,33 @@
 
     private val logger = LoggerFactory.getLogger(javaClass.name)
 
-    private val types = mutableListOf<AirTypeData>()
+    private val types = mutableMapOf<String?, MutableList<AirTypeData>>()
 
-    override fun getAirConfirmData(b: List<String>): List<AirTypeData> {
+    override 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))
             }
         }
-        types.clear()
-        types.addAll(resultList)
+        if (!types.containsKey(deviceCode)) {
+            types[deviceCode] = mutableListOf()
+        }
+        types[deviceCode]?.clear()
+        types[deviceCode]?.addAll(resultList)
 
         return resultList
     }
 
-    override fun getAirData(b: List<String>): List<AirData> {
+    override fun getAirData(b: List<String>, deviceCode: String?): List<AirData> {
         val resultList = mutableListOf<AirData>()
 
+        if (!types.containsKey(deviceCode)) {
+            return resultList
+        }
+
         var i = 0
-        types.forEach {
+        types[deviceCode]?.forEach {
             if (i > b.size - it.factorType.byteLength) {
                 return@forEach
             }
@@ -43,13 +50,17 @@
             when (it.factorType) {
                 FactorType.LNG -> {
                     val valid = b[i].toInt(16).toChar()//缁忕含搴︽槸鍚︽湁鏁堬紙鏈夋晥: A; 鏃犳晥: V锛�
-                    val a1 = b[i + 1].toInt(16)
-                    val b1 = b[i + 2].toInt(16)
-                    var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toDouble()
-                    while (b2 >= 1) {
-                        b2 /= 10
-                    }
-                    val lng = a1 + (b1 + b2) / 60
+
+                    //缁忕含搴﹀師濮嬪�硷紝渚嬶細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 {
@@ -62,11 +73,12 @@
                 FactorType.LAT -> {
                     val a1 = b[i].toInt(16)
                     val b1 = b[i + 1].toInt(16)
-                    var b2 = "${b[i + 2]}${b[i + 3]}".toInt(16).toDouble()
-                    while (b2 >= 1) {
-                        b2 /= 10
-                    }
-                    val lat = a1 + (b1 + b2) / 60
+                    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()
@@ -131,6 +143,14 @@
                                 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()
+                            })
+                        }
                     }
                 }
             }
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt b/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
index ae56997..a4ddeaf 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
@@ -19,7 +19,9 @@
     LNG(12,"LNG",6),//缁忓害
     LAT(13,"LAT",5),//绾害
     VELOCITY(14, "VELOCITY", 3),//閫熷害
-    TIME(15, "TIME", 6);//鏃堕棿
+    TIME(15, "TIME", 6),//鏃堕棿
+    WIND_SPEED(16, "WIND_SPEED", 3),
+    WIND_DIRECTION(17, "WIND_DIRECTION", 2);
 
     companion object {
 
@@ -39,6 +41,8 @@
             LAT.value -> LAT
             VELOCITY.value -> VELOCITY
             TIME.value -> TIME
+            WIND_SPEED.value -> WIND_SPEED
+            WIND_DIRECTION.value -> WIND_DIRECTION
             else -> null
         }
     }
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt b/src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt
deleted file mode 100644
index 6313196..0000000
--- a/src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.flightfeather.uav.socket.eunm
-
-/**
- * @author riku
- * Date: 2019/9/15
- *
- */
-enum class ObdDataType constructor(val value: Int){
-    ObdData(1),
-    EngineDataFlow(2),
-    SupplementDataFlow(128)
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/flightfeather/uav/Test.kt b/src/test/kotlin/com/flightfeather/uav/Test.kt
index 7927e80..9ab8a21 100644
--- a/src/test/kotlin/com/flightfeather/uav/Test.kt
+++ b/src/test/kotlin/com/flightfeather/uav/Test.kt
@@ -1,6 +1,13 @@
 package com.flightfeather.uav
 
+import com.flightfeather.uav.socket.bean.DataUnit
+import com.flightfeather.uav.socket.decoder.AirDataDecoder
+import com.flightfeather.uav.socket.eunm.AirCommandUnit
+import com.google.gson.Gson
 import org.junit.Test
+import java.io.File
+import java.io.FileOutputStream
+import java.io.OutputStreamWriter
 import java.text.SimpleDateFormat
 import java.util.*
 
@@ -18,16 +25,20 @@
 
     @Test
     fun foo2() {
-        val b = arrayOf("41", "79", "24", "04", "0B", "45")
-        val i = 0
-        val valid = b[i].toInt(16).toChar()//缁忕含搴︽槸鍚︽湁鏁堬紙鏈夋晥: A; 鏃犳晥: V锛�
-        val a1 = b[i + 1].toInt(16)
-        val b1 = b[i + 2].toInt(16)
-        var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toDouble()
-        while (b2 >= 1) {
-            b2 /= 10
+        val file = File("E:\\VSprojects\\uav-monitor\\asset\\data\\data-2020-12-24-01-34-24.txt")
+        val outFile = File("E:\\VSprojects\\uav-monitor\\asset\\data\\data.json")
+        val out = OutputStreamWriter(FileOutputStream(outFile))
+        val list = mutableListOf<List<DataUnit>>()
+        file.readLines().forEach {
+            val p = AirDataDecoder.instance.decode(it)
+//            val str = Gson().toJson(p.dataUnit)
+            if (p.commandUnit == AirCommandUnit.AirData.value) {
+                list.add(p.dataUnit)
+            }
         }
-        val lng = a1 + (b1 + b2) / 60
-        val s = b[i + 5].toInt(16).toChar()
+        val str = Gson().toJson(list)
+        out.append(str)
+        out.flush()
+        out.close()
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3