| | |
| | | import com.flightfeather.uav.socket.decoder.DataUnitDecoder |
| | | import com.flightfeather.uav.socket.eunm.AirCommandUnit |
| | | import java.util.* |
| | | import kotlin.text.StringBuilder |
| | | |
| | | /** |
| | | * @author riku |
| | |
| | | */ |
| | | class DataPackageDecoderImpl : DataPackageDecoder { |
| | | |
| | | companion object { |
| | | // 数据头 |
| | | const val HEAD_BYTES = 1 |
| | | // 监测参数确认指令位 |
| | | const val COMMAND_UNIT_BYTES = 1 |
| | | // 设备类型 |
| | | const val DEVICE_CODE_BYTES = 6 |
| | | // 本次监测的空气因子数量 |
| | | 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'代表车载设备,'0B'代表无人机设备,'0C'为网格化监测 |
| | | 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 采样时间和监测因子一同放在了数据部分,此处不再做解析 |
| | | 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() |
| | | } |
| | | } |
| | | } |
| | | |
| | | override fun getCheckCode(b: List<String>): Int? { |
| | | return if (b.size >= 5) { |
| | | return if (b.size >= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + BCC_BYTES) { |
| | | val hexNum = "${b[b.size - 2]}${b[b.size - 1]}" |
| | | |
| | | hexNum.toIntOrNull(16) |