| | |
| | | package com.flightfeather.uav.socket.decoder |
| | | |
| | | import com.flightfeather.uav.socket.bean.* |
| | | import com.flightfeather.uav.socket.eunm.ObdCommandUnit |
| | | import com.flightfeather.uav.socket.eunm.AirCommandUnit |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import org.slf4j.LoggerFactory |
| | | import java.text.SimpleDateFormat |
| | | import java.util.* |
| | | |
| | | /** |
| | |
| | | * Date: 2019/9/12 |
| | | * |
| | | * 数据单元按照命令单元的类型共有以下几种类型: |
| | | * 命令单元 @see [ObdCommandUnit] |
| | | * 编码(byte) 定义 |
| | | * 0x01 车辆登入 |
| | | * 0x02 实时信息上报 |
| | | * 0x03 补发信息上报 |
| | | * 0x04 车辆登出 |
| | | * 0x05 终端校时 |
| | | * 0x06~0x7f 上行数据系统预留 |
| | | * 命令单元 @see [AirCommandUnit] |
| | | */ |
| | | interface DataUnitDecoder { |
| | | class DataUnitDecoder { |
| | | |
| | | fun getCarRegisterData(b: List<String>): List<CarRegisterData> |
| | | private val logger = LoggerFactory.getLogger(javaClass.name) |
| | | |
| | | fun getRealTimeData(b: List<String>): List<RealTimeData> |
| | | private val types = mutableMapOf<String?, MutableList<AirTypeData>>() |
| | | |
| | | fun getReplacementData(b: List<String>): List<ReplacementData> |
| | | 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)) |
| | | } |
| | | } |
| | | if (!types.containsKey(deviceCode)) { |
| | | types[deviceCode] = mutableListOf() |
| | | } |
| | | types[deviceCode]?.clear() |
| | | types[deviceCode]?.addAll(resultList) |
| | | |
| | | fun getCarLogOutData(b: List<String>): List<CarLogOutData> |
| | | return resultList |
| | | } |
| | | |
| | | fun getTimeCalibrationData(b: List<String>): List<TimeCalibrationData> |
| | | fun getAirData(b: List<String>, deviceCode: String?): List<AirData> { |
| | | val resultList = mutableListOf<AirData>() |
| | | |
| | | fun decodeDataTime(b: List<String>): Date? |
| | | if (!types.containsKey(deviceCode)) { |
| | | return resultList |
| | | } |
| | | |
| | | var i = 0 |
| | | types[deviceCode]?.forEach { |
| | | if (i > b.size - it.factorType.byteLength) { |
| | | return@forEach |
| | | } |
| | | |
| | | when (it.factorType) { |
| | | FactorType.LNG -> { |
| | | val valid = b[i].toInt(16).toChar()//经纬度是否有效(有效: A; 无效: V) |
| | | |
| | | //经纬度原始值,例: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 { |
| | | factorId = it.factorType.value?.toString() |
| | | factorName = it.factorType.des |
| | | 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].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() |
| | | 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.toDouble() |
| | | 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).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+3]}${b[i + 4]}".toInt(16) |
| | | var b2 = b[i + 5].toInt(16).toDouble() |
| | | 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 |
| | | }) |
| | | } |
| | | 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() |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | i += it.factorType.byteLength |
| | | } |
| | | |
| | | return resultList |
| | | } |
| | | |
| | | private fun numberFormat(num: String) = |
| | | if (num.length < 2) { |
| | | "0$num" |
| | | } else { |
| | | num |
| | | } |
| | | |
| | | } |