| | |
| | | import com.flightfeather.uav.socket.bean.DataUnit |
| | | import com.flightfeather.uav.socket.decoder.DataPackageDecoder |
| | | import com.flightfeather.uav.socket.decoder.DataUnitDecoder |
| | | import com.flightfeather.uav.socket.eunm.ObdCommandUnit |
| | | import com.flightfeather.uav.socket.eunm.AirCommandUnit |
| | | import java.util.* |
| | | |
| | | /** |
| | | * @author riku |
| | |
| | | |
| | | private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl() |
| | | |
| | | // 接收到的字符串是byte转码前的,其就表示字符的ASCII码; |
| | | |
| | | override fun getHead(b: List<String>): String? { |
| | | return if (b.size >= 2) { |
| | | "${b[0]}${b[1]}" |
| | | return if (b.isNotEmpty()) { |
| | | b[0] |
| | | } else { |
| | | null |
| | | } |
| | | } |
| | | |
| | | override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 3) { |
| | | b[2].toIntOrNull(16) |
| | | override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 2) { |
| | | b[1].toIntOrNull(16) |
| | | } else { |
| | | null |
| | | } |
| | | |
| | | override fun getVinCode(b: List<String>): String? { |
| | | if (b.size < 20) return null |
| | | |
| | | //fixme 应该是需要将b当作ASCII码,再获取转换后的字符串 |
| | | val s = StringBuilder() |
| | | |
| | | for (i in 3..19) { |
| | | s.append(b[i].toIntOrNull(16)?.toChar()) |
| | | } |
| | | |
| | | return s.toString() |
| | | override fun getDeviceCode(b: List<String>): String? { |
| | | return null |
| | | } |
| | | |
| | | override fun getSoftwareVersion(b: List<String>): Int? = if (b.size >= 21) { |
| | | b[20].toIntOrNull(16) |
| | | } else { |
| | | null |
| | | } |
| | | |
| | | override fun getEncryptionWay(b: List<String>): Int? = if (b.size >= 21) { |
| | | b[21].toIntOrNull(16) |
| | | } else { |
| | | null |
| | | override fun getDataTime(b: List<String>): Date { |
| | | //fixme 2020/06/11 目前数据流中不包含采样时间,所以采用服务器接收时间作为采样时间 |
| | | return Date() |
| | | } |
| | | |
| | | override fun getDataLength(b: List<String>): Int { |
| | | if (b.size < 24) return 0 |
| | | if (b.size < 5) return 0 |
| | | |
| | | val hexNum = "${b[22]}${b[23]}" |
| | | val hexNum = b[2] |
| | | |
| | | return hexNum.toIntOrNull(16) ?: 0 |
| | | } |
| | | |
| | | override fun getDataUnit(b: List<String>): List<DataUnit> { |
| | | if (getDataLength(b) == 0 || b.size < 26) { |
| | | if (getDataLength(b) == 0 || b.size < 5) { |
| | | return emptyList() |
| | | } |
| | | |
| | | val unit = mutableListOf<String>() |
| | | for (i in 24..b.size - 2) { |
| | | for (i in 3..b.size - 3) { |
| | | unit.add(b[i]) |
| | | } |
| | | |
| | | dataUnitDecoder.run { |
| | | return when (getCommandUnit(b)) { |
| | | ObdCommandUnit.CarRegister.value -> getCarRegisterData(unit) |
| | | ObdCommandUnit.RealTimeData.value -> getRealTimeData(unit) |
| | | ObdCommandUnit.ReplacementData.value -> getReplacementData(unit) |
| | | ObdCommandUnit.CarLogOut.value -> getCarLogOutData(unit) |
| | | ObdCommandUnit.TimeCalibration.value -> getTimeCalibrationData(unit) |
| | | AirCommandUnit.Confirm.value -> getAirConfirmData(unit) |
| | | AirCommandUnit.AirData.value -> getAirData(unit) |
| | | else -> emptyList() |
| | | } |
| | | } |
| | | } |
| | | |
| | | override fun getCheckCode(b: List<String>): Int? { |
| | | return if (b.isNotEmpty()) { |
| | | b[b.size - 1].toIntOrNull(16) |
| | | return if (b.size >= 5) { |
| | | val hexNum = "${b[b.size - 2]}${b[b.size - 1]}" |
| | | |
| | | hexNum.toIntOrNull(16) |
| | | } else { |
| | | null |
| | | } |