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