| | |
| | | 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接收的消息 |
| | |
| | | lateinit var obdDataRepository: ObdDataRepository |
| | | |
| | | val vehicleDataDecoder = VehicleDataDecoder() |
| | | val dataPackageDecoder = DataPackageDecoderImpl() |
| | | |
| | | @PostConstruct |
| | | fun init() { |
| | |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | } |