From 4cb662daa3d2760cc4c892e58f73cbf10b265f6f Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 11 十二月 2020 11:55:56 +0800
Subject: [PATCH] 新增经纬度、和时间的解析逻辑

---
 src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt |  122 +++++++++++++++++++++++++++++++---------
 src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt   |   23 +++++++
 src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt                  |   12 ++-
 src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt                     |   11 ++-
 4 files changed, 131 insertions(+), 37 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt b/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt
index c507354..5c548e2 100644
--- a/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt
@@ -3,9 +3,12 @@
 import com.flightfeather.uav.domain.entity.RealTimeData
 import com.flightfeather.uav.domain.mapper.RealTimeDataMapper
 import com.flightfeather.uav.repository.AirDataRepository
+import com.flightfeather.uav.socket.bean.AirData
 import com.flightfeather.uav.socket.bean.AirDataPackage
+import com.flightfeather.uav.socket.eunm.FactorType
 import com.google.gson.Gson
 import org.springframework.stereotype.Repository
+import java.util.*
 
 /**
  * @author riku
@@ -15,7 +18,6 @@
 class AirDataRepositoryImpl(private val realTimeDataMapper: RealTimeDataMapper): AirDataRepository {
 
     override fun saveAirData(dataPackage: AirDataPackage): Int {
-
         val data = RealTimeData().apply {
             deviceCode = dataPackage.deviceCode
             latitude
@@ -25,6 +27,25 @@
             factors = Gson().toJson(dataPackage.dataUnit)
             dataTime = dataPackage.dataTime
         }
+        dataPackage.dataUnit.forEach {
+            if (it is AirData) {
+                when (it.factorId?.toInt()) {
+                    FactorType.LAT.value -> {
+                        data.latitude = it.factorData?.toBigDecimal()
+                    }
+                    FactorType.LNG.value -> {
+                        data.longitude = it.factorData?.toBigDecimal()
+                    }
+                    FactorType.TIME.value -> {
+                        it.factorData?.let { f-> Date(f)}?.let {d ->
+                            data.dataTime = d
+                        }
+                    }
+                }
+            }
+        }
+
+
         realTimeDataMapper.insert(data)
 
         return 0
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt b/src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt
index c51473c..f1528bc 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt
@@ -4,12 +4,17 @@
  * @author riku
  * Date: 2020/6/10
  */
-class AirData:DataUnit(){
+class AirData : DataUnit() {
     var factorId: String? = null
     var factorName: String? = null
     var sensorId: String? = null
+
     //鐩戞祴鍥犲瓙瀹為檯鍊�
-    var factorData: Double? = null
+    var factorData: Long? = null
+
     //鐩戞祴鍥犲瓙鐗╃悊閲忥紙鐢靛帇锛�
-    var physicalQuantity: Double? = null
+    var physicalQuantity: Long? = null
+
+    //鐘舵�佷綅
+    var statusList: List<String>? = null
 }
\ No newline at end of file
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 dac72d9..b6eba76 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
@@ -6,6 +6,7 @@
 import com.flightfeather.uav.socket.decoder.DataUnitDecoder
 import com.flightfeather.uav.socket.eunm.FactorType
 import org.slf4j.LoggerFactory
+import java.text.SimpleDateFormat
 
 /**
  * @author riku
@@ -38,49 +39,112 @@
             if (i > b.size - it.factorType.byteLength) {
                 return@forEach
             }
-            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]}${b[i + 1]}".toInt(16)
-                    var b2 = b[i + 2].toInt(16).toDouble()
+            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).toLong()
                     while (b2 >= 1) {
                         b2 /= 10
                     }
-                    val data2 = a2 + b2
+                    val lng = a1 + (b1 + b2) / 60
+                    val s = b[i + 5].toInt(16).toChar()
 
                     resultList.add(AirData().apply {
                         factorId = it.factorType.value?.toString()
                         factorName = it.factorType.des
-                        factorData = data1
-                        physicalQuantity = data2
+                        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]}${b[i + 3]}".toInt(16).toLong()
+                    while (b2 >= 1) {
+                        b2 /= 10
+                    }
+                    val lat = a1 + (b1 + b2) / 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
+                        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).toLong()
+                            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).toLong()
+                            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).toLong()
+                            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
+                            })
+                        }
+                    }
+                }
             }
+
             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
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 da16a68..ae56997 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
@@ -14,10 +14,12 @@
     PM10(7, "PM10",3),
     TEMPERATURE(8,"TEMPERATURE",3),
     HUMIDITY(9, "HUMIDITY",3),
-    VOC(10, "VOC",3),
-    NOI(11, "NOI",3),//璐熸哀绂诲瓙
-    LNG(12,"LNG",3),//缁忓害
-    LAT(13,"LAT",3);//绾害
+    VOC(10, "VOC",6),
+    NOI(11, "NOI",6),//璐熸哀绂诲瓙
+    LNG(12,"LNG",6),//缁忓害
+    LAT(13,"LAT",5),//绾害
+    VELOCITY(14, "VELOCITY", 3),//閫熷害
+    TIME(15, "TIME", 6);//鏃堕棿
 
     companion object {
 
@@ -35,6 +37,8 @@
             NOI.value -> NOI
             LNG.value -> LNG
             LAT.value -> LAT
+            VELOCITY.value -> VELOCITY
+            TIME.value -> TIME
             else -> null
         }
     }

--
Gitblit v1.9.3