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