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