src/main/kotlin/com/flightfeather/obd/common/utils/FileUtil.kt
@@ -17,11 +17,13 @@ private var closeThread: Thread? = null private var fw: FileWriter? = null private var bw: BufferedWriter? = null private var oldTime: Date init { val fileName = "data-${SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(Date())}.txt" val path = "$basePath$fileName" file = File(path) oldTime = Date() } companion object{ @@ -43,7 +45,10 @@ println("----å建æä»¶ï¼${file.absolutePath}") } //æä»¶æå¤§512Kb,è¶ è¿åæ°å»ºææ¡£ if (file.length() + str.toByteArray().size > 512 * 1024) { if (file.length() + str.toByteArray().size > 512 * 1024 || TimeUtil.isNextDay(oldTime, Date())) { //è¶ è¿ä¸å¤©åï¼æ´æ°å½åæ¶é´ oldTime = Date() val fileName = "data-${SimpleDateFormat("yyyy-MM-dd-hh-mm-ss").format(Date())}.txt" val path = "$basePath$fileName" file = File(path) src/main/kotlin/com/flightfeather/obd/common/utils/TimeUtil.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.flightfeather.obd.common.utils import java.util.* /** * @author riku * Date: 2019/9/16 */ class TimeUtil { companion object { /** * æ¯å¦æ¯ç¬¬äºå¤©ææ´æ°çæ¶é´ */ fun isNextDay(oldTime: Date, newTime: Date): Boolean { val oldC = Calendar.getInstance().apply { time = oldTime } val newC = Calendar.getInstance().apply { time = oldTime } return when { newC[Calendar.YEAR] > oldC[Calendar.YEAR] -> true newC[Calendar.YEAR] == oldC[Calendar.YEAR] -> newC[Calendar.DAY_OF_YEAR] > oldC[Calendar.DAY_OF_YEAR] else -> false } } } } src/main/kotlin/com/flightfeather/obd/repository/impl/ObdDataDaoImpl.kt
@@ -50,7 +50,7 @@ override fun saveObdData(packageData: ObdPackageData): Boolean { val obdData = ObdData().apply { obdVin = packageData.vinCode obdVin = packageData.deviceCode } when (packageData.commandUnit) { ObdCommandUnit.CarRegister.value -> { src/main/kotlin/com/flightfeather/obd/socket/MessageManager.kt
@@ -1,17 +1,16 @@ package com.flightfeather.obd.socket import com.flightfeather.obd.common.utils.FileUtil import com.flightfeather.obd.lightshare.bean.BaseJson import com.flightfeather.obd.lightshare.bean.ObdDataVo import com.flightfeather.obd.repository.ObdDataRepository import com.flightfeather.obd.socket.bean.ObdPackageData import com.flightfeather.obd.socket.decoder.VehicleDataDecoder import com.google.gson.Gson import com.flightfeather.obd.socket.decoder.impl.DataPackageDecoderImpl import io.netty.channel.ChannelHandlerContext import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component import org.springframework.util.FileSystemUtils import java.text.SimpleDateFormat import java.util.* import javax.annotation.PostConstruct import javax.annotation.Resource /** * å¤çsocketæ¥æ¶çæ¶æ¯ @@ -30,6 +29,7 @@ lateinit var obdDataRepository: ObdDataRepository val vehicleDataDecoder = VehicleDataDecoder() val dataPackageDecoder = DataPackageDecoderImpl() @PostConstruct fun init() { @@ -38,29 +38,57 @@ } fun dealStringMsg(msg: String, ctx: ChannelHandlerContext?) { // try { // val baseJson = Gson().fromJson<BaseJson>(msg, BaseJson::class.java) // when (baseJson.cmdCode) { // 2001 -> { // val data = Gson().fromJson(msg, ObdDataVo::class.java) // DeviceSession.saveDevice(data.obdVin, ctx) // instance.obdDataRepository.saveObdData(data) // } // } // } catch (e: Throwable) { // } saveToTxt(msg) val packageData = vehicleDataDecoder.decode(msg) if (bccCheck(msg)) { //è§£å val packageData = vehicleDataDecoder.decode(msg) //ä¿å DeviceSession.saveDevice(packageData.deviceCode, ctx) saveToDataBase(packageData) } else { println("------æ°æ®BCCæ ¡éªå¤±è´¥ï¼èå¼ [${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]") } } fun dealByteArrayMsg(msg: ByteArray, ctx: ChannelHandlerContext?) { val b = ByteArray(20) {19} println(b) } /** * ä¿åè³txtææ¬ */ fun saveToTxt(msg: String) { val data = "data=> $msg" val data = "[${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]data=> $msg" FileUtil.instance?.saveObdData(data) } /** * ä¿åè³æ°æ®åº */ fun saveToDataBase(packageData: ObdPackageData) { instance.obdDataRepository.saveObdData(packageData) } /** * BCCï¼å¼ææ ¡éªï¼ */ fun bccCheck(msg: String):Boolean { val list = mutableListOf<String>().apply { addAll(dataPackageDecoder.toStringList(msg)) //å»é¤2 ä½èµ·å§ç¬¦ removeAt(0) removeAt(0) } //å徿°æ®å ä¸çbccæ ¡éªç»æ val oldBcc = list[list.size - 1].toInt(16) //å»é¤æ ¡éªç»æ list.removeAt(list.size-1) //计ç®bccæ ¡éªç»æ var newBcc = 0x00 list.forEach { newBcc = newBcc.xor(it.toInt(16)) } //è¿åæ ¡éªç»ææ¯å¦æ£ç¡® return oldBcc == newBcc } } src/main/kotlin/com/flightfeather/obd/socket/ObdByteDataDecoder.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,112 @@ package com.flightfeather.obd.socket import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.ByteToMessageDecoder import java.lang.StringBuilder /** * @author riku * Date: 2019/9/16 * æ°æ®ç²å åå è§£ç å¨ */ class ObdByteDataDecoder : ByteToMessageDecoder() { companion object { const val BASE_LENGTH = 2 + 1 + 17 + 1 + 1 + 2 + 0 + 1 const val HEAD = 0x23.toByte() } override fun decode(p0: ChannelHandlerContext?, p1: ByteBuf?, p2: MutableList<Any>?) { val dataList = mutableListOf<Byte>() p1?.let { // å¯è¯»é¿åº¦å¿ 须大äºåºæ¬é¿åº¦ if (it.readableBytes() >= BASE_LENGTH) { // 鲿¢socketåèæµæ»å» // 鲿¢ï¼å®¢æ·ç«¯ä¼ æ¥çæ°æ®è¿å¤§ if (it.readableBytes() > 2048) { it.skipBytes(it.readableBytes()) } // è®°å½å 头å¼å§çindex var beginReader = 0 while (true) { // è·åå 头å¼å§çindex beginReader = it.readerIndex() // æ è®°å 头å¼å§çindex it.markReaderIndex() // 读å°äºåè®®çå¼å§æ å¿ï¼ç»æwhileå¾ªç¯ val b = ByteArray(2) it.readBytes(b) if (b[0] == HEAD && b[1] == HEAD) { dataList.add(b[0]) dataList.add(b[1]) break } // æªè¯»å°å 头ï¼éç½®å°ä¹åè®°å½çå 头å¼å§ä½ç½® // ç¥è¿1个åèåï¼å循ç¯å¼å§è¯»å it.resetReaderIndex() it.readByte() //彿°æ®å é¿åº¦ä¸è¶³æ¶ï¼ç«å»ç»æï¼çå¾ åç»æ°æ®å°è¾¾ if (it.readableBytes() < BASE_LENGTH) { return } } ByteArray(1 + 17 + 1 + 1).apply { it.readBytes(this) }.forEach {b -> dataList.add(b) } //æ°æ®åå çé¿åº¦ val length = getDataUnitLength(it, dataList) // å¤æè¯·æ±æ°æ®åå æ°æ®å1个åèçæ ¡éªç æ¯å¦å°é½ if (it.readableBytes() < length + 1) { // è¿å读æé it.readerIndex(beginReader) return } //è¯»åæ°æ®åå åæ ¡éªç æ°æ® ByteArray(length + 1).apply { it.readBytes(this) }.forEach {b -> dataList.add(b) } p2?.add(dataList.toByteArray()) } } } /** * è·åæ°æ®åå é¿åº¦å¹¶å°å ¶æ·»å è³ç»æåè¡¨ä¸ */ private fun getDataUnitLength(p1: ByteBuf, dataList: MutableList<Byte>): Int { val sb = StringBuilder() ByteArray(2).apply { p1.readBytes(this) }.forEach { b -> var a = 0 a = if (b < 0) { b + 256 } else { b.toInt() } sb.append(a.toString(16)) dataList.add(b) } return sb.toString().toInt(16) } } src/main/kotlin/com/flightfeather/obd/socket/ServerHandler.kt
@@ -35,8 +35,13 @@ } else { it.toInt() } print("${a.toString(16)} ") sb.append(a.toString(16)).append(" ") val s = if (a < 16) { "0${a.toString(16)}" } else { a.toString(16) } print(s) sb.append(s).append(" ") } sb.deleteCharAt(sb.length - 1) } src/main/kotlin/com/flightfeather/obd/socket/SocketServerClient.kt
@@ -1,11 +1,14 @@ package com.flightfeather.obd.socket import io.netty.bootstrap.ServerBootstrap import io.netty.buffer.ByteBuf import io.netty.buffer.Unpooled import io.netty.channel.ChannelInitializer import io.netty.channel.ChannelOption import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.channel.socket.nio.NioSocketChannel import io.netty.handler.codec.DelimiterBasedFrameDecoder import io.netty.handler.codec.bytes.ByteArrayDecoder import io.netty.handler.codec.bytes.ByteArrayEncoder import io.netty.handler.codec.string.StringDecoder @@ -44,8 +47,7 @@ p0?.pipeline() // ?.addLast("decoder", StringDecoder()) // ?.addLast("encoder", StringEncoder()) ?.addLast(ByteArrayDecoder()) ?.addLast(ByteArrayEncoder()) ?.addLast(ObdByteDataDecoder()) ?.addLast(ServerHandler()) } }) src/main/kotlin/com/flightfeather/obd/socket/bean/CarLogOutData.kt
@@ -1,14 +1,19 @@ package com.flightfeather.obd.socket.bean import com.flightfeather.obd.socket.eunm.ObdCommandUnit import java.util.* /** * @author riku * Date: 2019/9/12 * 车è¾ç»åºä¿¡æ¯ * æ°æ®ç±»å @see [ObdCommandUnit.CarLogOut] * * æ°æ®è¡¨ç¤ºå 容 é¿åº¦ï¼åèï¼ æ°æ®ç±»å æè¿°åè¦æ± * ç»åºæ¶é´ 6 BYTE[6] æ¶é´ååºéç¨ GMT+8 æ¶é´ï¼æ¶é´å®ä¹ç¬¦å GB/T32960.3-2016 第 6.4 æ¡çè¦æ± * ç»åºæµæ°´å· 2 WORD ç»åºæµæ°´å·ä¸å½æ¬¡ç»å ¥æµæ°´å·ä¸è´ã@see [CarRegisterData] */ class CarLogOutData( var time: Date? = null, var serialNum: Int? = null ): DataUnit() time: Date?, serialNum: Int? ): DataUnit(time, serialNum) src/main/kotlin/com/flightfeather/obd/socket/bean/CarRegisterData.kt
@@ -1,5 +1,6 @@ package com.flightfeather.obd.socket.bean import com.flightfeather.obd.socket.eunm.ObdCommandUnit import java.util.* /** @@ -7,14 +8,15 @@ * Date: 2019/9/12 * * 车è¾ç»å ¥æ°æ®æ ¼å¼ * æ°æ®ç±»å @see [ObdCommandUnit.CarRegister] * * èµ·å§åè å 容 æè¿° * 0 æ°æ®ééæ¶é´ æ¶é´å®ä¹è§ 6.4.4 * 0 æ°æ®ééæ¶é´ æ¶é´ååºéç¨ GMT+8 æ¶é´ï¼æ¶é´å®ä¹ç¬¦å GB/T32960.3-2016 第 6.4 æ¡çè¦æ± * 6 ç»å ¥æµæ°´å· 车载ç»ç«¯æ¯ç»å ¥ä¸æ¬¡ï¼ç»å ¥æµæ°´å·èªå¨å 1ï¼ä» 1å¼å§å¾ªç¯ç´¯å ï¼æå¤§å¼ä¸º 65531ï¼å¾ªç¯å¨æä¸ºå¤©ã * 10 SIM å¡å· SIM å¡ ICCID å·ï¼ICCID åºä¸ºç»ç«¯ä» SIM å¡è·åçå¼ï¼ä¸åºäººä¸ºå¡«åæä¿®æ¹ï¼ã */ class CarRegisterData( var time: Date? = null, var serialNum: Int? = null, time: Date?, serialNum: Int?, var SIMCode: String? = null ): DataUnit() ): DataUnit(time, serialNum) src/main/kotlin/com/flightfeather/obd/socket/bean/DataUnit.kt
@@ -1,8 +1,16 @@ package com.flightfeather.obd.socket.bean import com.flightfeather.obd.socket.eunm.ObdCommandUnit import java.util.* /** * @author riku * Date: 2019/9/12 * * æ°æ®åå * æ ¹æ®å½ä»¤åå @see [ObdCommandUnit] çåç±»ï¼ä¸åç±»åçç»æä¸åï¼è§ååç±» */ open class DataUnit { } open class DataUnit( var time: Date?, var serialNum: Int? ) src/main/kotlin/com/flightfeather/obd/socket/bean/EngineDataFlow.kt
@@ -1,11 +1,13 @@ package com.flightfeather.obd.socket.bean import com.flightfeather.obd.socket.eunm.ObdDataType import java.util.* /** * @author riku * Date: 2019/9/15 * å卿ºæ°æ®æµ * 宿¶ä¿¡æ¯[RealTimeData] ä¸çå卿ºæ°æ®æµ * æ°æ®ç±»å @see [ObdDataType.EngineDataFlow] */ class EngineDataFlow( time: Date?, src/main/kotlin/com/flightfeather/obd/socket/bean/ObdData.kt
@@ -1,12 +1,14 @@ package com.flightfeather.obd.socket.bean import com.flightfeather.obd.socket.bean.* import com.flightfeather.obd.socket.eunm.ObdDataType import java.util.* /** * @author riku * Date: 2019/9/15 * 宿¶ä¿¡æ¯[RealTimeData] ä¸çobdæ°æ® * æ°æ®ç±»å @see [ObdDataType.ObdData] */ class ObdData( time: Date?, src/main/kotlin/com/flightfeather/obd/socket/bean/ObdPackageData.kt
@@ -1,16 +1,40 @@ package com.flightfeather.obd.socket.bean import com.flightfeather.obd.socket.eunm.ObdCommandUnit /** * @author riku * Date: 2019/9/12 * æ°æ®å ç»æ * * èµ·å§åè å®ä¹ æ°æ®ç±»å æè¿°åè¦æ± * 0 èµ·å§ç¬¦ STRING åºå®ä¸º ASCII å符â##âï¼ç¨â0x23ï¼0x23â表示 * 2 å½ä»¤åå BYTE å½ä»¤åå å®ä¹ @see [ObdCommandUnit] * 3 车è¾è¯å«å· STRING 车è¾è¯å«ç æ¯è¯å«çå¯ä¸æ è¯ï¼ç± 17 ä½åç ç»æï¼åç åºç¬¦å GB16735 ä¸ 4.5 çè§å® * 20 ç»ç«¯è½¯ä»¶çæ¬å· BYTE ç»ç«¯è½¯ä»¶çæ¬å·ææå¼èå´ 0~255 * 21 æ°æ®å 坿¹å¼ BYTE 0x01ï¼æ°æ®ä¸å å¯ï¼ * 0x02ï¼æ°æ®ç»è¿ RSA ç®æ³å å¯ï¼ * 0x03ï¼æ°æ®ç»è¿å½å¯ SM2 ç®æ³å å¯ï¼ * â0xFEâæ è¯å¼å¸¸ï¼â0xFFâè¡¨ç¤ºæ æï¼å ¶ä»é¢ç * 22 æ°æ®åå é¿åº¦ WORD æ°æ®åå é¿åº¦æ¯æ°æ®åå çæ»åèæ°ï¼ææèå´ï¼0~65531 * 24 æ°æ®åå è§æ°æ®åå æ ¼å¼åå®ä¹ @see [DataUnit] * åæ°ç¬¬ 1 æ ¡éªç BYTE éç¨ BCCï¼å¼ææ ¡éªï¼æ³ï¼æ ¡éªèå´èªææåå ç第ä¸ä¸ªåèå¼å§ï¼ååä¸ä¸ªåè弿ï¼ç´å°æ ¡éªç åä¸åè为æ¢ï¼æ ¡éªç å ç¨ä¸ä¸ªåè */ data class ObdPackageData constructor( //èµ·å§ç¬¦ var head: String? = null, //å½ä»¤åå var commandUnit: Int? = null, var vinCode: String? = null, //车è¾è¯å«å·(æobdæ°æ®éé设å¤çç¼å·) var deviceCode: String? = null, //ç»ç«¯è½¯ä»¶çæ¬å· var softwareVersion: Int? = null, //æ°æ®å 坿¹å¼ var encryptionWay: Int? = null, //æ°æ®åå é¿åº¦ var dataLength: Int? = null, //æ°æ®åå var dataUnit: List<DataUnit>, //æ ¡éªç var checkCode: Int? = null ) src/main/kotlin/com/flightfeather/obd/socket/bean/RealTimeData.kt
@@ -1,13 +1,26 @@ package com.flightfeather.obd.socket.bean import java.util.* import com.flightfeather.obd.socket.eunm.ObdDataType import com.flightfeather.obd.socket.eunm.ObdCommandUnit /** * @author riku * Date: 2019/9/12 * * 宿¶ä¿¡æ¯ * æ°æ®ç±»å @see[ObdCommandUnit.RealTimeData] * * æ°æ®è¡¨ç¤ºå 容 é¿åº¦ï¼åèï¼ æ°æ®ç±»å æè¿°åè¦æ± * æ°æ®ééæ¶é´ 6 BYTE[6] æ¶é´ååºéç¨ GMT+8 æ¶é´ï¼æ¶é´å®ä¹ç¬¦å GB/T32960.3-2016 第 6.4 æ¡çè¦æ± * ä¿¡æ¯æµæ°´å· 2 WORD 以天为åä½ï¼æ¯å 宿¶ä¿¡æ¯æµæ°´å·å¯ä¸ï¼ä» 1 å¼å§ç´¯å * ä¿¡æ¯ç±»åæ å¿ï¼nï¼ 1 BYTE ä¿¡æ¯ç±»åæ å¿ @see [ObdDataType] * ä¿¡æ¯ä½ï¼nï¼ æ ¹æ®ä¿¡æ¯ç±»åä¸åï¼é¿åº¦åæ°æ®ç±»åä¸å * â¦â¦ â¦â¦ * ä¿¡æ¯ç±»åæ å¿ï¼mï¼ 1 BYTE[6] ä¿¡æ¯ç±»åæ å¿ * ä¿¡æ¯ä½ï¼mï¼ æ ¹æ®ä¿¡æ¯ç±»åä¸åï¼é¿åº¦åæ°æ®ç±»åä¸å */ open class RealTimeData( var time: Date? = null, var serialNum: Int? = null ) : ReplacementData() time: Date?, serialNum: Int? ) : ReplacementData(time, serialNum) src/main/kotlin/com/flightfeather/obd/socket/bean/ReplacementData.kt
@@ -1,9 +1,15 @@ package com.flightfeather.obd.socket.bean import java.util.* import com.flightfeather.obd.socket.eunm.ObdCommandUnit /** * @author riku * Date: 2019/9/12 * è¡¥åä¿¡æ¯ä¸å®æ¶ä¿¡æ¯å 容ä¸è´ * è¡¥åä¿¡æ¯ä¸å®æ¶ä¿¡æ¯å 容ä¸è´ @see [RealTimeData] * æ°æ®ç±»å @see [ObdCommandUnit.ReplacementData] */ open class ReplacementData : DataUnit() { } open class ReplacementData ( time: Date?, serialNum: Int? ): DataUnit(time, serialNum) src/main/kotlin/com/flightfeather/obd/socket/bean/SupplementDataFlow.kt
@@ -1,11 +1,13 @@ package com.flightfeather.obd.socket.bean import java.util.* import com.flightfeather.obd.socket.eunm.ObdDataType /** * @author riku * Date: 2019/9/15 * è¡¥å æ°æ®æµ * æ°æ®ç±»å @see [ObdDataType.SupplementDataFlow] * * èµ·å§åè æ°æ®é¡¹ æ°æ®ç±»å åä½ æè¿°åè¦æ± * 0 å卿ºæç©æ¨¡å¼ BYTE 0ï¼è¶ é失æ src/main/kotlin/com/flightfeather/obd/socket/bean/TimeCalibrationData.kt
@@ -1,8 +1,16 @@ package com.flightfeather.obd.socket.bean import java.util.* import com.flightfeather.obd.socket.eunm.ObdCommandUnit /** * @author riku * Date: 2019/9/12 * * 车载ç»ç«¯æ ¡æ¶çæ°æ®åå 为空ã * æ°æ®ç±»å @see [ObdCommandUnit.TimeCalibration] * */ class TimeCalibrationData : DataUnit() { } class TimeCalibrationData( time: Date? = null, serialNum: Int? = null ) : DataUnit(time, serialNum) src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataPackageDecoderImpl.kt
@@ -13,7 +13,7 @@ private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl() //fixme 2019.9.12: ç°å¨æä¸¤ç§æ åµï¼1ï¼æ¥æ¶å°çå符串æ¯byte转ç åçï¼é£ä¹å ¶å°±è¡¨ç¤ºå符çASCIIç ï¼2ï¼å¦ä¸ç§å°±æ¯æ¥æ¶å°çæ¯è½¬ç åçå符串ãç®åå¾ å® // æ¥æ¶å°çå符串æ¯byte转ç åçï¼å ¶å°±è¡¨ç¤ºå符çASCIIç ï¼ override fun getHead(b: List<String>): String? { return if (b.size >= 2) { src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataUnitDecoderImpl.kt
@@ -35,10 +35,10 @@ val time = decodeDataTime(b) //彿 æ³: èµ·å§åè为7 å¼å§ç2个åè表示 æµæ°´å· // val serialNum = "${b[7]}${b[8]}".toInt(16) val serialNum = "${b[7]}${b[8]}".toInt(16) //䏿µ·æ³: èµ·å§åè为6 å¼å§ç2个åè表示 æµæ°´å· val serialNum = "${b[6]}${b[7]}".toInt(16) // val serialNum = "${b[6]}${b[7]}".toInt(16) val dataList = mutableListOf<String>().apply { addAll(b) } //å å»å6使¶é´ @@ -51,15 +51,15 @@ * å 廿µæ°´å·ï¼å¾å°ä¿¡æ¯æ å¿ä¸ä¿¡æ¯ä½çç»å * (彿 æ³ï¼å»é¤å6使¶é´åï¼èµ·å§åè为1 å¼å§ç2个åè表示 æµæ°´å·) */ // if (dataList.size >= 2) dataList.removeAt(1) // if (dataList.size >= 2) dataList.removeAt(1) if (dataList.size >= 2) dataList.removeAt(1) if (dataList.size >= 2) dataList.removeAt(1) /* * å 廿µæ°´å·ï¼å¾å°ä¿¡æ¯æ å¿ä¸ä¿¡æ¯ä½çç»å * (䏿µ·æ³ï¼å»é¤å6使¶é´åï¼èµ·å§åè为0 å¼å§ç2个åè表示 æµæ°´å·) */ if (dataList.isNotEmpty()) dataList.removeAt(0) if (dataList.isNotEmpty()) dataList.removeAt(0) // if (dataList.isNotEmpty()) dataList.removeAt(0) // if (dataList.isNotEmpty()) dataList.removeAt(0) val resultList = mutableListOf<RealTimeData>() @@ -84,6 +84,9 @@ for (i in 0 until data.size) { if (dataList.isNotEmpty()) dataList.removeAt(0) } }else if (dataList.isNotEmpty()) { //æç §è§å没æåå°ä¿¡æ¯ä½ï¼å¹¶ä¸åæ°æ®ä¸ä¸ºç©ºï¼è¡¨ç¤ºåæ°æ®æ ¼å¼é误ï¼éåºå¾ªç¯ // break } } src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/RealTimeDataDecoderImpl.kt
@@ -123,13 +123,15 @@ override fun getDataListByDataType(list: List<String>): MutableList<String> { if (list.isEmpty()) return mutableListOf() //fixme 2019.9.16 ä¸ç®¡ç¬¬ä¸ä½çä¿¡æ¯ç±»åæ å¿æ¯å¦æ£ç¡®ï¼è³å°è¿åä¸ä¸ªå¼ï¼æ¤æ¹æ³å¨ä¿¡æ¯ä½ç»ææ²¡æä¸¥æ ¼æç §æ åï¼ //fixme å³å¨åä¸ä¸ªä¿¡æ¯ç±»åæ å¿ååä¸ä¸ªä¿¡æ¯ä½ä¹é´ææ æå符æ¶ï¼è½å¤å°å ¶å¿½ç¥ï¼ä½ä¸ç¡®å®è¿ç§å¤çæ¹å¼æ¯å¦æ£ç¡®åå¿ è¦ val resultList = mutableListOf<String>().apply { //æ·»å ä¿¡æ¯ç±»åæ å¿ add(list[0]) } when (list[0].toIntOrNull(16)) { ObdDataType.ObdData.value -> { //ä»èµ·å§åè 1 å¼å§ï¼åºå®æ97个åèçæ°æ® for (i in 1..96) { resultList.add(list[i]) @@ -144,12 +146,14 @@ } } ObdDataType.EngineDataFlow.value -> { //ä»èµ·å§åè 1 å¼å§ï¼åºå®æ37个åèçæ°æ® for (i in 1..37) { resultList.add(list[i]) } } ObdDataType.SupplementDataFlow.value -> { //ä»èµ·å§åè 1 å¼å§ï¼åºå®æ17个åèçæ°æ® for (i in 1..17) { resultList.add(list[i]) src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdCommandUnit.kt
@@ -1,9 +1,20 @@ package com.flightfeather.obd.socket.eunm import com.flightfeather.obd.socket.bean.* /** * obd å½ä»¤åå * @author riku * Date: 2019/9/12 * * obd å½ä»¤åå * * ç¼ç å®ä¹ æ¹å * 0x01 车è¾ç»å ¥ ä¸è¡ @see [CarRegisterData] * 0x02 宿¶ä¿¡æ¯ä¸æ¥ ä¸è¡ @see [com.flightfeather.obd.socket.bean.RealTimeData] * 0x03 è¡¥åä¿¡æ¯ä¸æ¥ ä¸è¡ @see [com.flightfeather.obd.socket.bean.ReplacementData] * 0x04 车è¾ç»åº ä¸è¡ @see [CarLogOutData] * 0x05 ç»ç«¯æ ¡æ¶ ä¸è¡ @see [TimeCalibrationData] * 0x06~0x7F ä¸è¡æ°æ®ç³»ç»é¢ç ä¸è¡ */ enum class ObdCommandUnit constructor(val value: Int) { CarRegister(1), src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdDataType.kt
@@ -4,12 +4,13 @@ /** * @author riku * Date: 2019/9/15 * 宿¶ä¿¡æ¯[RealTimeData]åè¡¥åä¿¡æ¯[ReplacementData]ä¸çæ°æ®ç±»å * * 宿¶ä¿¡æ¯[RealTimeData]åè¡¥åä¿¡æ¯[ReplacementData] ä¸çæ°æ®ç±»å * ç±»åç¼ç 说æ * 0x01 OBD ä¿¡æ¯ * 0x02 æ°æ®æµä¿¡æ¯ * 0x01 OBD ä¿¡æ¯ @see [com.flightfeather.obd.socket.bean.ObdData] * 0x02 æ°æ®æµä¿¡æ¯ @see[com.flightfeather.obd.socket.bean.EngineDataFlow] * 0x03-0x7F é¢ç * 0x80 è¡¥å æ°æ®æµ * 0x80 è¡¥å æ°æ®æµ @see[com.flightfeather.obd.socket.bean.SupplementDataFlow] * 0x81~0xFE ç¨æ·èªå®ä¹ */ enum class ObdDataType constructor(val value: Int){ src/main/resources/log4j2.xml
@@ -56,7 +56,7 @@ </appenders> <!--root é»è®¤å è½½--> <loggers> <root level="DEBUG"> <root level="INFO"> <appender-ref ref="Console"/> <!--<appender-ref ref="allLog"/>--> <appender-ref ref="debugLog"/> src/test/kotlin/com/flightfeather/obd/Test.kt
@@ -19,9 +19,12 @@ @Test fun foo2() { val b = ByteArray(1){97} val s = "a" println() val b = ByteArray(2) b[0] = 0x01 b[1] = 0x80.toByte() println("${b[0].toString(16)}${b[1].toInt()}") println("${b[0]}${b[1]}".toInt(16)) } @Test @@ -85,4 +88,15 @@ } println(b.toString(16)) } @Test fun foo10() { val s = "2 31 37 36 39 31 35 33 31 39 30 39 31 32 30 30 30 36 1 1 0 42 13 9 f 12 33 3b 2 0 8a 1b 0 36 2e 0 23 60 11 b4 0 c8 0 b4 0 0 66 0 0 0 0 0 0 73 0 0 0 b9 4 75 0 2e d8 ed 0 0 0 0 80 0 bc 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" val ascii = s.split(" ") var bcc = 0x00 ascii.forEach { bcc = bcc.xor(it.toInt(16)) } println(bcc.toString(16)) } } src/test/kotlin/com/flightfeather/obd/socket/MessageManagerTest.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.flightfeather.obd.socket import org.junit.Test import org.junit.Assert.* /** * @author riku * Date: 2019/9/16 */ class MessageManagerTest { private val messageManager = MessageManager() @Test fun bccCheck() { val s = "23 23 2 31 37 36 39 31 35 33 31 39 30 39 31 32 30 30 30 36 1 1 0 42 13 9 f 12 34 8 2 0 8b 1c 0 d8 0 0 12 d8 9 6c 0 c8 0 b4 0 0 66 0 0 0 0 0 0 73 0 0 0 b9 4 32 0 2e d8 c4 0 0 0 0 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 f6" println(messageManager.bccCheck(s)) } }