From c9a3c06b37b5b2eb9b02d4e6348e5c53145284d9 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期一, 16 九月 2019 17:40:20 +0800 Subject: [PATCH] 1. 添加注释 2. 添加粘包分包解码器 3. 修改数据单元信息体获取逻辑 4. 修改接收数据转换后的string列表,展示为16进制数时,小于16的应该在前面补0,否则之后计算会出错 --- src/test/kotlin/com/flightfeather/obd/Test.kt | 20 ++ src/main/kotlin/com/flightfeather/obd/common/utils/FileUtil.kt | 7 src/main/kotlin/com/flightfeather/obd/socket/ObdByteDataDecoder.kt | 112 ++++++++++++++ src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdCommandUnit.kt | 13 + src/main/kotlin/com/flightfeather/obd/repository/impl/ObdDataDaoImpl.kt | 2 src/main/kotlin/com/flightfeather/obd/socket/bean/EngineDataFlow.kt | 4 src/test/kotlin/com/flightfeather/obd/socket/MessageManagerTest.kt | 20 ++ src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataUnitDecoderImpl.kt | 15 + src/main/kotlin/com/flightfeather/obd/socket/bean/CarLogOutData.kt | 11 + src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdDataType.kt | 9 src/main/kotlin/com/flightfeather/obd/socket/bean/ObdPackageData.kt | 26 +++ src/main/kotlin/com/flightfeather/obd/common/utils/TimeUtil.kt | 31 +++ src/main/kotlin/com/flightfeather/obd/socket/bean/TimeCalibrationData.kt | 12 + src/main/kotlin/com/flightfeather/obd/socket/SocketServerClient.kt | 6 src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataPackageDecoderImpl.kt | 2 src/main/kotlin/com/flightfeather/obd/socket/bean/DataUnit.kt | 12 + src/main/kotlin/com/flightfeather/obd/socket/bean/SupplementDataFlow.kt | 2 src/main/kotlin/com/flightfeather/obd/socket/bean/ReplacementData.kt | 12 + src/main/resources/log4j2.xml | 2 src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/RealTimeDataDecoderImpl.kt | 6 src/main/kotlin/com/flightfeather/obd/socket/bean/RealTimeData.kt | 19 ++ src/main/kotlin/com/flightfeather/obd/socket/bean/CarRegisterData.kt | 10 src/main/kotlin/com/flightfeather/obd/socket/MessageManager.kt | 76 ++++++--- src/main/kotlin/com/flightfeather/obd/socket/bean/ObdData.kt | 2 src/main/kotlin/com/flightfeather/obd/socket/ServerHandler.kt | 9 25 files changed, 374 insertions(+), 66 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/obd/common/utils/FileUtil.kt b/src/main/kotlin/com/flightfeather/obd/common/utils/FileUtil.kt index 7dea200..f0598e1 100644 --- a/src/main/kotlin/com/flightfeather/obd/common/utils/FileUtil.kt +++ b/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) diff --git a/src/main/kotlin/com/flightfeather/obd/common/utils/TimeUtil.kt b/src/main/kotlin/com/flightfeather/obd/common/utils/TimeUtil.kt new file mode 100644 index 0000000..687c377 --- /dev/null +++ b/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 + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/repository/impl/ObdDataDaoImpl.kt b/src/main/kotlin/com/flightfeather/obd/repository/impl/ObdDataDaoImpl.kt index 4abd7af..0781b69 100644 --- a/src/main/kotlin/com/flightfeather/obd/repository/impl/ObdDataDaoImpl.kt +++ b/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 -> { diff --git a/src/main/kotlin/com/flightfeather/obd/socket/MessageManager.kt b/src/main/kotlin/com/flightfeather/obd/socket/MessageManager.kt index 6f1a280..626194f 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/MessageManager.kt +++ b/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)) { + //瑙e寘 + 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) - } - + /** + * 淇濆瓨鑷硉xt鏂囨湰 + */ 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) + } + //鍙栧緱鏁版嵁鍖呬腑鐨刡cc鏍¢獙缁撴灉 + 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)) + } + + //杩斿洖鏍¢獙缁撴灉鏄惁姝g‘ + return oldBcc == newBcc + } } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/ObdByteDataDecoder.kt b/src/main/kotlin/com/flightfeather/obd/socket/ObdByteDataDecoder.kt new file mode 100644 index 0000000..0e0c2fa --- /dev/null +++ b/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 + * 鏁版嵁绮樺寘鍒嗗寘瑙g爜鍣� + */ +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) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/ServerHandler.kt b/src/main/kotlin/com/flightfeather/obd/socket/ServerHandler.kt index d904bca..475a87b 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/ServerHandler.kt +++ b/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) } diff --git a/src/main/kotlin/com/flightfeather/obd/socket/SocketServerClient.kt b/src/main/kotlin/com/flightfeather/obd/socket/SocketServerClient.kt index 991a4e7..80904b7 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/SocketServerClient.kt +++ b/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()) } }) diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/CarLogOutData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/CarLogOutData.kt index 954fdfd..adef0c0 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/CarLogOutData.kt +++ b/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() \ No newline at end of file + time: Date?, + serialNum: Int? +): DataUnit(time, serialNum) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/CarRegisterData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/CarRegisterData.kt index e06beae..3e55490 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/CarRegisterData.kt +++ b/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() \ No newline at end of file +): DataUnit(time, serialNum) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/DataUnit.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/DataUnit.kt index b63c8d1..2f2ba7c 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/DataUnit.kt +++ b/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 { -} \ No newline at end of file +open class DataUnit( + var time: Date?, + var serialNum: Int? +) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/EngineDataFlow.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/EngineDataFlow.kt index 12ff10c..fe81661 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/EngineDataFlow.kt +++ b/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?, diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/ObdData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/ObdData.kt index 817accf..c986cc6 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/ObdData.kt +++ b/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?, diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/ObdPackageData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/ObdPackageData.kt index 838a048..f6b5466 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/ObdPackageData.kt +++ b/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, + //杞﹁締璇嗗埆鍙�(鎸噊bd鏁版嵁閲囬泦璁惧鐨勭紪鍙�) + var deviceCode: String? = null, + //缁堢杞欢鐗堟湰鍙� var softwareVersion: Int? = null, + //鏁版嵁鍔犲瘑鏂瑰紡 var encryptionWay: Int? = null, + //鏁版嵁鍗曞厓闀垮害 var dataLength: Int? = null, + //鏁版嵁鍗曞厓 var dataUnit: List<DataUnit>, + //鏍¢獙鐮� var checkCode: Int? = null ) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/RealTimeData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/RealTimeData.kt index 619c311..1a4a880 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/RealTimeData.kt +++ b/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 寮�濮嬬疮鍔� + * 淇℃伅绫诲瀷鏍囧織锛坣锛� 1 BYTE 淇℃伅绫诲瀷鏍囧織 @see [ObdDataType] + * 淇℃伅浣擄紙n锛� 鏍规嵁淇℃伅绫诲瀷涓嶅悓锛岄暱搴﹀拰鏁版嵁绫诲瀷涓嶅悓 + * 鈥︹�� 鈥︹�� + * 淇℃伅绫诲瀷鏍囧織锛坢锛� 1 BYTE[6] 淇℃伅绫诲瀷鏍囧織 + * 淇℃伅浣擄紙m锛� 鏍规嵁淇℃伅绫诲瀷涓嶅悓锛岄暱搴﹀拰鏁版嵁绫诲瀷涓嶅悓 */ open class RealTimeData( - var time: Date? = null, - var serialNum: Int? = null -) : ReplacementData() \ No newline at end of file + time: Date?, + serialNum: Int? +) : ReplacementData(time, serialNum) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/ReplacementData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/ReplacementData.kt index e5f8b6b..7015597 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/ReplacementData.kt +++ b/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() { -} \ No newline at end of file +open class ReplacementData ( + time: Date?, + serialNum: Int? +): DataUnit(time, serialNum) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/SupplementDataFlow.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/SupplementDataFlow.kt index b5bf0f1..4460b73 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/SupplementDataFlow.kt +++ b/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锛氳秴閫熷け鏁� diff --git a/src/main/kotlin/com/flightfeather/obd/socket/bean/TimeCalibrationData.kt b/src/main/kotlin/com/flightfeather/obd/socket/bean/TimeCalibrationData.kt index b94fde1..9617379 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/bean/TimeCalibrationData.kt +++ b/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() { -} \ No newline at end of file +class TimeCalibrationData( + time: Date? = null, + serialNum: Int? = null +) : DataUnit(time, serialNum) \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataPackageDecoderImpl.kt b/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataPackageDecoderImpl.kt index 5df0e21..6b6d64a 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataPackageDecoderImpl.kt +++ b/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锛氭帴鏀跺埌鐨勫瓧绗︿覆鏄痓yte杞爜鍓嶇殑锛岄偅涔堝叾灏辫〃绀哄瓧绗︾殑ASCII鐮侊紱2锛氬彟涓�绉嶅氨鏄帴鏀跺埌鐨勬槸杞爜鍚庣殑瀛楃涓层�傜洰鍓嶅緟瀹� + // 鎺ユ敹鍒扮殑瀛楃涓叉槸byte杞爜鍓嶇殑锛屽叾灏辫〃绀哄瓧绗︾殑ASCII鐮侊紱 override fun getHead(b: List<String>): String? { return if (b.size >= 2) { diff --git a/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataUnitDecoderImpl.kt b/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataUnitDecoderImpl.kt index 139051c..ff459d2 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/DataUnitDecoderImpl.kt +++ b/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 } } diff --git a/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/RealTimeDataDecoderImpl.kt b/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/RealTimeDataDecoderImpl.kt index 3acf5e8..e1067f6 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/RealTimeDataDecoderImpl.kt +++ b/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 涓嶇绗竴浣嶇殑淇℃伅绫诲瀷鏍囧織鏄惁姝g‘锛岃嚦灏戣繑鍥炰竴涓�硷紝姝ゆ柟娉曞湪淇℃伅浣撶粨鏋勬病鏈変弗鏍兼寜鐓ф爣鍑嗭紝 + //fixme 鍗冲湪鍚庝竴涓俊鎭被鍨嬫爣蹇楀拰鍓嶄竴涓俊鎭綋涔嬮棿鏈夋棤鏁堝瓧绗︽椂锛岃兘澶熷皢鍏跺拷鐣ワ紝浣嗕笉纭畾杩欑澶勭悊鏂瑰紡鏄惁姝g‘鍜屽繀瑕� 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]) diff --git a/src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdCommandUnit.kt b/src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdCommandUnit.kt index c88fdc1..83956ca 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdCommandUnit.kt +++ b/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), diff --git a/src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdDataType.kt b/src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdDataType.kt index b426851..1a9b434 100644 --- a/src/main/kotlin/com/flightfeather/obd/socket/eunm/ObdDataType.kt +++ b/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){ diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 7353e5a..bf71a78 100644 --- a/src/main/resources/log4j2.xml +++ b/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"/> diff --git a/src/test/kotlin/com/flightfeather/obd/Test.kt b/src/test/kotlin/com/flightfeather/obd/Test.kt index 8b067b2..aa2c994 100644 --- a/src/test/kotlin/com/flightfeather/obd/Test.kt +++ b/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)) + } } \ No newline at end of file diff --git a/src/test/kotlin/com/flightfeather/obd/socket/MessageManagerTest.kt b/src/test/kotlin/com/flightfeather/obd/socket/MessageManagerTest.kt new file mode 100644 index 0000000..6b28470 --- /dev/null +++ b/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)) + } +} \ No newline at end of file -- Gitblit v1.9.3