From 4db9806cc644bd58124aa9d8f1dbf9aee60d408f Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期三, 13 一月 2021 11:50:27 +0800
Subject: [PATCH] 1. 根据新协议做协议解析调整
---
src/main/kotlin/com/flightfeather/uav/lightshare/web/RealTimeDataController.kt | 19 ++
src/main/kotlin/com/flightfeather/uav/socket/bean/DataUnit.kt | 2
src/main/kotlin/com/flightfeather/uav/lightshare/service/RealTimeDataService.kt | 9 +
src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt | 18 +
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/lightshare/bean/DataVo.kt | 22 ++
src/main/kotlin/com/flightfeather/uav/common/utils/FileUtil.kt | 2
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt | 4
src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt | 29 +++
src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseResponse.kt | 34 ++++
/dev/null | 12 -
src/test/kotlin/com/flightfeather/uav/Test.kt | 34 ++++
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/eunm/FactorType.kt | 6
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt | 40 +++++
src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt | 6
src/main/kotlin/com/flightfeather/uav/common/utils/GsonUtils.kt | 85 ++++++++++
src/main/resources/application.yml | 5
20 files changed, 393 insertions(+), 65 deletions(-)
diff --git a/src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt b/src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt
new file mode 100644
index 0000000..746592c
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/common/config/CorsConfig.kt
@@ -0,0 +1,29 @@
+package com.flightfeather.uav.common.config
+
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.web.cors.CorsConfiguration
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource
+import org.springframework.web.filter.CorsFilter
+
+@Configuration
+class CorsConfig {
+
+ private fun buildConfig(): CorsConfiguration {
+ return CorsConfiguration().apply {
+ addAllowedOrigin("*")
+ addAllowedHeader("*")
+ addAllowedMethod("*")
+ allowCredentials = true
+ }
+ }
+
+ @Bean
+ fun corsFilter(): CorsFilter {
+ val source = UrlBasedCorsConfigurationSource().apply {
+ registerCorsConfiguration("/**", buildConfig())
+ }
+
+ return CorsFilter(source)
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/common/utils/FileUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/utils/FileUtil.kt
index f290f76..f825d2d 100644
--- a/src/main/kotlin/com/flightfeather/uav/common/utils/FileUtil.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/utils/FileUtil.kt
@@ -13,7 +13,7 @@
class FileUtil {
private var file: File
- private var basePath:String = "${File.separator}ObdData${File.separator}"
+ private var basePath:String = "${File.separator}UAVData${File.separator}"
private var closeThread: Thread? = null
private var fw: FileWriter? = null
private var bw: BufferedWriter? = null
diff --git a/src/main/kotlin/com/flightfeather/uav/common/utils/GsonUtils.kt b/src/main/kotlin/com/flightfeather/uav/common/utils/GsonUtils.kt
new file mode 100644
index 0000000..387be46
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/common/utils/GsonUtils.kt
@@ -0,0 +1,85 @@
+package com.flightfeather.uav.common.utils
+
+import com.google.gson.Gson
+import com.google.gson.JsonParser
+import java.util.ArrayList
+
+/**
+ * @author riku
+ * Date: 2019/4/28
+ * GSON搴忓垪鍖栧伐鍏风被
+ */
+object GsonUtils {
+
+ fun getNoteJsonString(jsonString: String, note: String): String {
+ if (jsonString.isEmpty()) {
+ throw RuntimeException("getNoteJsonString jsonString empty")
+ }
+ if (note.isEmpty()) {
+ throw RuntimeException("getNoteJsonString note empty")
+ }
+ val element = JsonParser().parse(jsonString)
+ if (element.isJsonNull) {
+ throw RuntimeException("getNoteJsonString element empty")
+ }
+ return element.asJsonObject.get(note).toString()
+ }
+
+
+ fun <T> parserJsonToArrayBeans(jsonString: String, note: String, beanClazz: Class<T>): List<T> {
+ val noteJsonString = getNoteJsonString(jsonString, note)
+ return parserJsonToArrayBeans(noteJsonString, beanClazz)
+ }
+
+
+ fun <T> parserJsonToArrayBeans(jsonString: String, beanClazz: Class<T>): List<T> {
+ if (jsonString.isEmpty()) {
+ throw RuntimeException("parserJsonToArrayBeans jsonString empty")
+ }
+ val jsonElement = JsonParser().parse(jsonString)
+ if (jsonElement.isJsonNull) {
+ throw RuntimeException("parserJsonToArrayBeans jsonElement empty")
+ }
+ if (!jsonElement.isJsonArray) {
+ throw RuntimeException("parserJsonToArrayBeans jsonElement is not JsonArray")
+ }
+ val jsonArray = jsonElement.asJsonArray
+ val beans = ArrayList<T>()
+ for (jsonElement2 in jsonArray) {
+ val bean = Gson().fromJson(jsonElement2, beanClazz)
+ beans.add(bean)
+ }
+ return beans
+ }
+
+
+ fun <T> parserJsonToBean(jsonString: String, clazzBean: Class<T>): T {
+ if (jsonString.isEmpty()) {
+ throw RuntimeException("parserJsonToBean jsonString empty")
+ }
+ val jsonElement = JsonParser().parse(jsonString)
+ if (jsonElement.isJsonNull) {
+ throw RuntimeException("parserJsonToBean jsonElement empty")
+ }
+ if (!jsonElement.isJsonObject) {
+ throw RuntimeException("parserJsonToBean is not object")
+ }
+ return Gson().fromJson(jsonElement, clazzBean)
+ }
+
+
+ fun <T> parserJsonToBean(jsonString: String, note: String, clazzBean: Class<T>): T {
+ val noteJsonString = getNoteJsonString(jsonString, note)
+ return parserJsonToBean(noteJsonString, clazzBean)
+ }
+
+
+ fun toJsonString(obj: Any?): String {
+ return if (obj != null) {
+ Gson().toJson(obj)
+ } else {
+ throw RuntimeException("obj could not be empty")
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseJson.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseJson.kt
deleted file mode 100644
index c8bdae3..0000000
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseJson.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.flightfeather.uav.lightshare.bean
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties
-import com.fasterxml.jackson.annotation.JsonInclude
-
-/**
- * 鍩虹Json缁撴瀯锛屾墍鏈夌殑鏁版嵁浠ユ涓哄熀绫�
- * @author riku
- * Date: 2019/8/27
- */
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonIgnoreProperties(ignoreUnknown = true)
-open class BaseJson{
- val cmdCode: Int? = null
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseResponse.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseResponse.kt
new file mode 100644
index 0000000..791825c
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/BaseResponse.kt
@@ -0,0 +1,34 @@
+package com.flightfeather.uav.lightshare.bean
+
+import com.fasterxml.jackson.annotation.JsonInclude
+
+
+/**
+ * @author riku
+ * Date: 2020/10/9
+ * 缃戠粶璇锋眰杩斿洖鏁版嵁鍩虹被
+ */
+//"璇锋眰杩斿洖鍩烘湰缁撴瀯"
+@JsonInclude(JsonInclude.Include.NON_NULL)
+data class BaseResponse<T>(
+ var success: Boolean,
+ var message: String = "",
+ val head: DataHead? = null,
+ val data: T? = null
+){
+ init {
+ if (message.isBlank()) {
+ message = if (success) {
+ "璇锋眰鎴愬姛"
+ } else {
+ "璇锋眰澶辫触"
+ }
+ }
+ }
+}
+
+//"鍒嗛〉淇℃伅"
+data class DataHead(
+ var page: Int = 1,
+ var totalPage: Int = 1
+)
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/DataVo.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/DataVo.kt
new file mode 100644
index 0000000..c3b6f14
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/DataVo.kt
@@ -0,0 +1,22 @@
+package com.flightfeather.uav.lightshare.bean
+
+import com.fasterxml.jackson.annotation.JsonInclude
+import com.flightfeather.uav.socket.bean.AirData
+
+/**
+ * @author riku
+ * Date: 2020/9/10
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+data class DataVo(
+ //鏃堕棿, yyyy-MM-dd HH:mm:ss
+ var time: String? = null,
+ //绔欑偣缂栧彿
+ var deviceCode: String? = null,
+ //鏁版嵁鍊�
+ var values: List<AirData>? = null,
+ //缁忓害
+ var lng: Double? = null,
+ //绾害
+ var lat: Double? = null
+)
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/VehicleInfoVo.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/bean/VehicleInfoVo.kt
deleted file mode 100644
index 8cf166e..0000000
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/bean/VehicleInfoVo.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.flightfeather.uav.lightshare.bean
-
-/**
- * @author riku
- * Date: 2019/10/25
- */
-class VehicleInfoVo : BaseJson() {
- var id: Int? = null
-
- var obdDeviceCode: String? = null
-
- var obdVin: String? = null
-
- var obdLicencePlate: String? = null
-
- /**
- * 0: 闆嗗崱锛� 1锛氭福鍦熻溅
- */
- var obdVehicleType: Int? = null
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/RealTimeDataService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/RealTimeDataService.kt
new file mode 100644
index 0000000..880a3b9
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/RealTimeDataService.kt
@@ -0,0 +1,9 @@
+package com.flightfeather.uav.lightshare.service
+
+import com.flightfeather.uav.lightshare.bean.BaseResponse
+import com.flightfeather.uav.lightshare.bean.DataVo
+
+interface RealTimeDataService {
+
+ fun getSecondData(deviceCode: String?, page: Int?, perPage: Int?): BaseResponse<List<DataVo>>
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
new file mode 100644
index 0000000..182ac66
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
@@ -0,0 +1,40 @@
+package com.flightfeather.uav.lightshare.service.impl
+
+import com.flightfeather.uav.common.utils.GsonUtils
+import com.flightfeather.uav.domain.entity.RealTimeData
+import com.flightfeather.uav.domain.mapper.RealTimeDataMapper
+import com.flightfeather.uav.lightshare.bean.BaseResponse
+import com.flightfeather.uav.lightshare.bean.DataHead
+import com.flightfeather.uav.lightshare.bean.DataVo
+import com.flightfeather.uav.lightshare.service.RealTimeDataService
+import com.flightfeather.uav.socket.bean.AirData
+import com.github.pagehelper.PageHelper
+import org.springframework.stereotype.Service
+import tk.mybatis.mapper.entity.Example
+import java.text.SimpleDateFormat
+
+@Service
+class RealTimeDataServiceImpl(val realTimeDataMapper: RealTimeDataMapper) : RealTimeDataService {
+
+ override fun getSecondData(deviceCode: String?, page: Int?, perPage: Int?): BaseResponse<List<DataVo>> {
+ val _perPage = perPage ?: 60
+ val _page = page ?: 1
+ val pageInfo = PageHelper.startPage<RealTimeData>(_page, _perPage)
+ val result = mutableListOf<DataVo>()
+ realTimeDataMapper.selectByExample(Example(RealTimeData::class.java).apply {
+ createCriteria().apply {
+ deviceCode?.let { andEqualTo("deviceCode", it) }
+ }
+ orderBy("dataTime").desc()
+ }).forEach {
+ result.add(DataVo(
+ SimpleDateFormat.getDateTimeInstance().format(it.dataTime),
+ it.deviceCode,
+ GsonUtils.parserJsonToArrayBeans(it.factors, AirData::class.java),
+ it.longitude.toDouble(), it.latitude.toDouble()
+ ))
+ }
+ result.reverse()
+ return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result)
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/web/RealTimeDataController.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/web/RealTimeDataController.kt
new file mode 100644
index 0000000..f72e1e0
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/web/RealTimeDataController.kt
@@ -0,0 +1,19 @@
+package com.flightfeather.uav.lightshare.web
+
+import com.flightfeather.uav.lightshare.service.RealTimeDataService
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RequestParam
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping("air/realtime")
+class RealTimeDataController(val realTimeDataService: RealTimeDataService) {
+
+ @GetMapping("/sec")
+ fun getSecondData(
+ @RequestParam(value = "deviceCode", required = false) deviceCode: String?,
+ @RequestParam(value = "page", required = false) page: Int?,
+ @RequestParam(value = "perPage", required = false) perPage: Int?
+ ) = realTimeDataService.getSecondData(deviceCode,page, perPage)
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/repository/VehicleRepository.kt b/src/main/kotlin/com/flightfeather/uav/repository/VehicleRepository.kt
deleted file mode 100644
index 910ebab..0000000
--- a/src/main/kotlin/com/flightfeather/uav/repository/VehicleRepository.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.flightfeather.uav.repository
-
-/**
- * @author riku
- * Date: 2019/10/25
- */
-interface VehicleRepository {
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt b/src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt
index 504b3ca..4f153e3 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt
@@ -24,6 +24,8 @@
companion object{
private lateinit var instance: MessageManager
+
+ private const val TAG = "UAV"
}
@Autowired
@@ -46,10 +48,10 @@
if (bccCheck(msg)) {
//淇濆瓨
DeviceSession.saveDevice(packageData.deviceCode, ctx)
-// saveToTxt(msg)
+ saveToTxt(msg)
saveToDataBase(packageData)
} else {
- println("------鏁版嵁BCC鏍¢獙澶辫触锛岃垗寮� [${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]")
+ println("------${TAG}鏁版嵁BCC鏍¢獙澶辫触锛岃垗寮� [${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]")
}
}
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt b/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
index 9a9b790..fc5202e 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
@@ -10,16 +10,23 @@
class ServerHandler : ChannelInboundHandlerAdapter() {
+ companion object {
+ private const val TAG = "UAV"
+ }
+
val attributeKey = AttributeKey.valueOf<String>("deviceCode")
+ val messageManager = MessageManager()
override fun channelRegistered(ctx: ChannelHandlerContext?) {
super.channelRegistered(ctx)
- println("------绔彛鏈塈P杩炴帴锛歔ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
+ println()
+ println("------${TAG}绔彛鏈塈P杩炴帴锛歔ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
// ctx?.fireChannelActive()
}
override fun channelActive(ctx: ChannelHandlerContext?) {
- println("------绔彛鏈塈P婵�娲伙細[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
+ println()
+ println("------${TAG}绔彛鏈塈P婵�娲伙細[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
super.channelActive(ctx)
}
@@ -29,7 +36,8 @@
val sb = StringBuilder()
if (msg is ByteArray) {
- println("------鏀跺埌鐨勫師濮嬫暟鎹細[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
+ println()
+ println("------${TAG}鏀跺埌鐨勫師濮嬫暟鎹細[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
msg.forEach {
val a: Int = if (it < 0) {
it + 256
@@ -48,7 +56,7 @@
}
val str = sb.toString()
if (str.isNotEmpty()) {
- MessageManager().dealStringMsg(str, ctx)
+ messageManager.dealStringMsg(str, ctx)
}
}
@@ -58,7 +66,7 @@
}
override fun channelInactive(ctx: ChannelHandlerContext?) {
- println("------绔彛鏈塈P涓嶆椿鍔細[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
+ println("------${TAG}绔彛鏈塈P涓嶆椿鍔細[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
super.channelInactive(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/bean/DataUnit.kt b/src/main/kotlin/com/flightfeather/uav/socket/bean/DataUnit.kt
index 11edd95..40a5d94 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/bean/DataUnit.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/bean/DataUnit.kt
@@ -11,5 +11,5 @@
* 鏍规嵁鍛戒护鍗曞厓 @see [AirCommandUnit] 鐨勫垎绫伙紝涓嶅悓绫诲瀷鐨勭粨鏋勪笉鍚岋紝瑙佸悇瀛愮被
*/
open class DataUnit {
- var time: Date? = null
+
}
\ 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/main/resources/application.yml b/src/main/resources/application.yml
index b44db72..ece910b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -8,6 +8,11 @@
url: jdbc:mysql://114.215.109.124:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
username: root
password: 123456
+ hikari:
+ maximum-pool-size: 500
+ minimum-idle: 20
+ idle-timeout: 60000
+ connection-timeout: 60000
jmx:
enabled: false
diff --git a/src/test/kotlin/com/flightfeather/uav/Test.kt b/src/test/kotlin/com/flightfeather/uav/Test.kt
index 6152cdb..9ab8a21 100644
--- a/src/test/kotlin/com/flightfeather/uav/Test.kt
+++ b/src/test/kotlin/com/flightfeather/uav/Test.kt
@@ -1,10 +1,44 @@
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.*
+
/**
* @author riku
* Date: 2019/9/12
*/
class Test {
+ @Test
+ fun foo1() {
+ val s = SimpleDateFormat.getDateTimeInstance().format(Date())
+ println(s)
+ }
+ @Test
+ fun foo2() {
+ 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 str = Gson().toJson(list)
+ out.append(str)
+ out.flush()
+ out.close()
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3