riku
2020-06-11 585fb9b67dc81f9e14f2cbf59f1c3a02eb4fe98f
1.添加无人机多参数的数据接收解析函数
2.添加参数存储函数
已修改16个文件
已删除83个文件
已添加9个文件
已重命名2个文件
6685 ■■■■■ 文件已修改
src/main/kotlin/com/flightfeather/uav/domain/entity/AlarmData.java 619 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/CarLogin.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/CarLogout.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/DataStream.java 551 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/ObdData.java 622 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/ObdInfo.java 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/ObdUser.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/OriginData.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeData.java 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/ThresholdValue.java 499 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/VehicleInfo.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/AlarmDataMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/CarLoginMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/CarLogoutMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/DataStreamMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/ObdDataMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/ObdInfoMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/ObdUserMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/OriginDataMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/RealTimeDataMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/ThresholdValueMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/mapper/VehicleInfoMapper.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/AlarmDataVo.kt 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/CarLoginVo.kt 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/CarLogoutVo.kt 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/DataStreamVo.kt 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/LatLngVo.kt 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ObdDataVo.kt 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ObdInfoVo.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ObdUserVo.kt 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ThresholdValueVo.kt 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdAlarmService.kt 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdDataService.kt 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdThresholdValueService.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdUserService.kt 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdAlarmServiceImpl.kt 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdDataServiceImpl.kt 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdThresholdValueServiceImpl.kt 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdUserServiceImpl.kt 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/VehicleServiceImpl.kt 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdAlarmController.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdDataController.kt 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdThresholdController.kt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdUserController.kt 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/AirDataRepository.kt 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/CarLoginRepository.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/CarLogoutRepository.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/DataStreamRepository.kt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/ObdAlarmRepository.kt 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/ObdDataRepository.kt 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/ObdInfoRepository.kt 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/ObdThresholdValueRepository.kt 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/ObdUserRepository.kt 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/OriginDataRepository.kt 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/VehicleRepository.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/CarLoginDaoImpl.kt 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/CarLogoutDaoImpl.kt 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/DataStreamDaoImpl.kt 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdAlarmDaoImpl.kt 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdDataDaoImpl.kt 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdInfoDaoImpl.kt 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdThresholdValueDaoImpl.kt 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdUserDaoImpl.kt 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/OriginDataDaoImpl.kt 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/VehicleRepositoryImpl.kt 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/DeviceSession.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/SocketServerClient.kt 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/AirPackageData.kt 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/AirTypeData.kt 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/CarLogOutData.kt 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/CarRegisterData.kt 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/DataUnit.kt 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/EngineDataStream.kt 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/ObdInfo.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/ObdPackageData.kt 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/RealTimeData.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/ReplacementData.kt 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/SupplementDataStream.kt 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/TimeCalibrationData.kt 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/AirDataDecoder.kt 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/RealTimeDataDecoder.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt 127 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/RealTimeDataDecoderImpl.kt 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/eunm/AirCommandUnit.kt 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdCommandUnit.kt 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generator/generatorConfig.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/AlarmDataMapper.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/CarLoginMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/CarLogoutMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/DataStreamMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ObdDataMapper.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ObdInfoMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ObdUserMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OriginDataMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ThresholdValueMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/VehicleInfoMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/com/flightfeather/uav/Test.kt 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/com/flightfeather/uav/socket/decoder/VehicleDataDecoderTest.kt 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/entity/AlarmData.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/CarLogin.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/CarLogout.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/DataStream.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/ObdData.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/ObdInfo.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/ObdUser.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/OriginData.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,156 @@
package com.flightfeather.uav.domain.entity;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.*;
@Table(name = "air_real_time_data")
public class RealTimeData {
    @Id
    private Integer id;
    @Column(name = "device_code")
    private String deviceCode;
    private BigDecimal latitude;
    private BigDecimal longitude;
    private Float altitude;
    private Float height;
    @Column(name = "data_time")
    private Date dataTime;
    @Column(name = "create_time")
    private Date createTime;
    private String factors;
    /**
     * @return id
     */
    public Integer getId() {
        return id;
    }
    /**
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }
    /**
     * @return device_code
     */
    public String getDeviceCode() {
        return deviceCode;
    }
    /**
     * @param deviceCode
     */
    public void setDeviceCode(String deviceCode) {
        this.deviceCode = deviceCode == null ? null : deviceCode.trim();
    }
    /**
     * @return latitude
     */
    public BigDecimal getLatitude() {
        return latitude;
    }
    /**
     * @param latitude
     */
    public void setLatitude(BigDecimal latitude) {
        this.latitude = latitude;
    }
    /**
     * @return longitude
     */
    public BigDecimal getLongitude() {
        return longitude;
    }
    /**
     * @param longitude
     */
    public void setLongitude(BigDecimal longitude) {
        this.longitude = longitude;
    }
    /**
     * @return altitude
     */
    public Float getAltitude() {
        return altitude;
    }
    /**
     * @param altitude
     */
    public void setAltitude(Float altitude) {
        this.altitude = altitude;
    }
    /**
     * @return height
     */
    public Float getHeight() {
        return height;
    }
    /**
     * @param height
     */
    public void setHeight(Float height) {
        this.height = height;
    }
    /**
     * @return data_time
     */
    public Date getDataTime() {
        return dataTime;
    }
    /**
     * @param dataTime
     */
    public void setDataTime(Date dataTime) {
        this.dataTime = dataTime;
    }
    /**
     * @return create_time
     */
    public Date getCreateTime() {
        return createTime;
    }
    /**
     * @param createTime
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    /**
     * @return factors
     */
    public String getFactors() {
        return factors;
    }
    /**
     * @param factors
     */
    public void setFactors(String factors) {
        this.factors = factors == null ? null : factors.trim();
    }
}
src/main/kotlin/com/flightfeather/uav/domain/entity/ThresholdValue.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/entity/VehicleInfo.java
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/AlarmDataMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/CarLoginMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/CarLogoutMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/DataStreamMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/ObdDataMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/ObdInfoMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/ObdUserMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/OriginDataMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/RealTimeDataMapper.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.flightfeather.uav.domain.mapper
import com.flightfeather.uav.domain.MyMapper
import com.flightfeather.uav.domain.entity.RealTimeData
import org.apache.ibatis.annotations.Mapper
@Mapper
interface RealTimeDataMapper : MyMapper<RealTimeData>
src/main/kotlin/com/flightfeather/uav/domain/mapper/ThresholdValueMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/domain/mapper/VehicleInfoMapper.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/AlarmDataVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/CarLoginVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/CarLogoutVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/DataStreamVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/LatLngVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ObdDataVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ObdInfoVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ObdUserVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ThresholdValueVo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdAlarmService.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdDataService.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdThresholdValueService.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/ObdUserService.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdAlarmServiceImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdDataServiceImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdThresholdValueServiceImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ObdUserServiceImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/VehicleServiceImpl.kt
@@ -1,5 +1,6 @@
package com.flightfeather.uav.lightshare.service.impl
import com.flightfeather.uav.domain.entity.RealTimeData
import com.flightfeather.uav.lightshare.bean.VehicleInfoVo
import com.flightfeather.uav.lightshare.service.VehicleService
import com.flightfeather.uav.repository.VehicleRepository
@@ -11,18 +12,9 @@
 * Date: 2019/10/25
 */
@Service
class VehicleServiceImpl(val vehicleRepository: VehicleRepository) : VehicleService {
class VehicleServiceImpl() : VehicleService {
    override fun getVehicleInfo(pageNum: Int?, pageSize: Int?): List<VehicleInfoVo> {
        val dbResult = vehicleRepository.getVehicleInfo(pageNum, pageSize)
        val resultList = mutableListOf<VehicleInfoVo>()
        dbResult.forEach {
            val vo = VehicleInfoVo()
            BeanUtils.copyProperties(it, vo)
            resultList.add(vo)
        }
        return resultList
        return emptyList()
    }
}
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdAlarmController.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdDataController.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdThresholdController.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/web/ObdUserController.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/AirDataRepository.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.flightfeather.uav.repository
import com.flightfeather.uav.socket.bean.AirPackageData
/**
 * @author riku
 * Date: 2020/6/11
 */
interface AirDataRepository {
    fun saveAirData(packageData: AirPackageData): Int
}
src/main/kotlin/com/flightfeather/uav/repository/CarLoginRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/CarLogoutRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/DataStreamRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/ObdAlarmRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/ObdDataRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/ObdInfoRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/ObdThresholdValueRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/ObdUserRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/OriginDataRepository.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/VehicleRepository.kt
@@ -1,15 +1,9 @@
package com.flightfeather.uav.repository
import com.flightfeather.uav.domain.entity.VehicleInfo
/**
 * @author riku
 * Date: 2019/10/25
 */
interface VehicleRepository {
    /**
     * èŽ·å–è½¦è¾†ä¿¡æ¯
     */
    fun getVehicleInfo(pageNum: Int?, pageSize: Int?): List<VehicleInfo>
}
src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.flightfeather.uav.repository.impl
import com.flightfeather.uav.domain.entity.RealTimeData
import com.flightfeather.uav.domain.mapper.RealTimeDataMapper
import com.flightfeather.uav.repository.AirDataRepository
import com.flightfeather.uav.socket.bean.AirPackageData
import com.google.gson.Gson
import org.springframework.stereotype.Repository
/**
 * @author riku
 * Date: 2020/6/11
 */
@Repository
class AirDataRepositoryImpl(private val realTimeDataMapper: RealTimeDataMapper): AirDataRepository {
    override fun saveAirData(packageData: AirPackageData): Int {
        val data = RealTimeData().apply {
            deviceCode = packageData.deviceCode
            latitude
            longitude
            altitude
            height
            factors = Gson().toJson(packageData.dataUnit)
            dataTime = packageData.dataTime
        }
        realTimeDataMapper.insert(data)
        return 0
    }
}
src/main/kotlin/com/flightfeather/uav/repository/impl/CarLoginDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/CarLogoutDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/DataStreamDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdAlarmDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdDataDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdInfoDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdThresholdValueDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/ObdUserDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/OriginDataDaoImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/impl/VehicleRepositoryImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/DeviceSession.kt
@@ -1,10 +1,11 @@
package com.flightfeather.uav.socket
import com.flightfeather.uav.socket.bean.AirTypeData
import io.netty.channel.ChannelHandlerContext
import java.util.concurrent.ConcurrentHashMap
/**
 * ç”¨äºŽä¿å­˜è¿žæŽ¥çš„设备及对应的session通道
 * ç”¨äºŽä¿å­˜è¿žæŽ¥çš„设备及对应的session通道以及对应的专属信息
 * Date: 2019.8.27
 * @author riku
 */
@@ -12,6 +13,8 @@
    companion object{
        private val deviceMap = ConcurrentHashMap<String, ChannelHandlerContext?>()
        private val typeMap = ConcurrentHashMap<String, List<AirTypeData>>()
        private const val DEFAULT_DEVICE = "default_device"
        fun saveDevice(deviceCode: String?, channel: ChannelHandlerContext?) {
            deviceCode?.let {
@@ -25,5 +28,21 @@
            else
                null
        }
        fun saveAirType(deviceCode: String?, types: List<AirTypeData>) {
            if (deviceCode == null) {
                typeMap[DEFAULT_DEVICE] = types
            } else {
                typeMap[deviceCode] = types
            }
        }
        fun getAirType(deviceCode: String?): List<AirTypeData>? {
            return if (typeMap.containsKey(deviceCode)) {
                typeMap[deviceCode]
            } else {
                null
            }
        }
    }
}
src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt
@@ -2,13 +2,10 @@
import com.flightfeather.uav.common.utils.FileUtil
import com.flightfeather.uav.repository.*
import com.flightfeather.uav.socket.bean.EngineDataStream
import com.flightfeather.uav.socket.bean.ObdInfo
import com.flightfeather.uav.socket.bean.ObdPackageData
import com.flightfeather.uav.socket.bean.SupplementDataStream
import com.flightfeather.uav.socket.decoder.VehicleDataDecoder
import com.flightfeather.uav.socket.bean.*
import com.flightfeather.uav.socket.decoder.AirDataDecoder
import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl
import com.flightfeather.uav.socket.eunm.ObdCommandUnit
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import io.netty.buffer.Unpooled
import io.netty.channel.ChannelHandlerContext
import org.springframework.beans.factory.annotation.Autowired
@@ -31,50 +28,40 @@
    }
    @Autowired
    lateinit var obdDataRepository: ObdDataRepository
    @Autowired
    lateinit var originDataRepository: OriginDataRepository
    @Autowired
    lateinit var obdInfoRepository: ObdInfoRepository
    @Autowired
    lateinit var dataStreamRepository: DataStreamRepository
    @Autowired
    lateinit var carLogoutRepository: CarLogoutRepository
    @Autowired
    lateinit var carLoginRepository: CarLoginRepository
    lateinit var airDataRepository: AirDataRepository
    val vehicleDataDecoder = VehicleDataDecoder()
    val vehicleDataDecoder = AirDataDecoder()
    val dataPackageDecoder = DataPackageDecoderImpl()
    @PostConstruct
    fun init() {
        instance = this
        instance.obdDataRepository = this.obdDataRepository
        instance.originDataRepository = this.originDataRepository
        instance.obdInfoRepository = this.obdInfoRepository
        instance.dataStreamRepository = this.dataStreamRepository
        instance.carLogoutRepository = this.carLogoutRepository
        instance.carLoginRepository = this.carLoginRepository
        airDataRepository = this.airDataRepository
    }
    fun dealStringMsg(msg: String, ctx: ChannelHandlerContext?) {
        //解包
        val packageData = vehicleDataDecoder.decode(msg)
        saveToTxt(msg)
        val isCommand = command(packageData, ctx)
        if (isCommand) {
            println("------远程控制指令 [${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]")
        } else {
            if (bccCheck(msg)) {
            if (packageData.commandUnit == AirCommandUnit.Confirm.value) {
                val t = mutableListOf<AirTypeData>()
                packageData.dataUnit.forEach {
                    if (it is AirTypeData) {
                        t.add(it)
                    }
                }
                DeviceSession.saveAirType(packageData.deviceCode, t)
            } else if (packageData.commandUnit == AirCommandUnit.AirData.value) {
                val types = DeviceSession.getAirType(packageData.deviceCode)
            }
                //保存
                DeviceSession.saveDevice(packageData.deviceCode, ctx)
                saveToDataBase(packageData, msg)
//            saveToTxt(msg)
            saveToDataBase(packageData)
            } else {
                println("------数据BCC校验失败,舍弃 [${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]")
            }
        }
    }
@@ -89,27 +76,9 @@
    /**
     * ä¿å­˜è‡³æ•°æ®åº“
     */
    fun saveToDataBase(packageData: ObdPackageData, msg: String) {
//        instance.obdDataRepository.saveObdData(packageData)
        instance.originDataRepository.saveOriginData(packageData, msg)
    fun saveToDataBase(packageData: AirPackageData) {
        when (packageData.commandUnit) {
            ObdCommandUnit.CarRegister.value -> instance.carLoginRepository.saveCarLogin(packageData)
            ObdCommandUnit.RealTimeData.value,
            ObdCommandUnit.ReplacementData.value -> {
                var done = false
                for (i in 0 until packageData.dataUnit.size) {
                    when (packageData.dataUnit[i]) {
                        is ObdInfo -> instance.obdInfoRepository.saveObdInfo(packageData)
                        is EngineDataStream,
                        is SupplementDataStream -> {
                            instance.dataStreamRepository.saveDataStream(packageData)
                            done = true
                        }
                    }
                    if (done) break
                }
            }
            ObdCommandUnit.CarLogOut.value-> instance.carLogoutRepository.saveCarLogout(packageData)
            AirCommandUnit.AirData.value -> instance.airDataRepository.saveAirData(packageData)
        }
    }
@@ -139,37 +108,6 @@
        return oldBcc == newBcc
    }
    /**
     * è¿œç¨‹æŒ‡ä»¤
     */
    fun command(packageData: ObdPackageData, ctx: ChannelHandlerContext?): Boolean {
        if (packageData.commandUnit == ObdCommandUnit.Update.value) {
            val channel = DeviceSession.getDevice(packageData.deviceCode)
            if (channel != null) {
                val s = getDataPackage(packageData.deviceCode)
                if (s == null) {
                    ctx?.writeAndFlush("[${packageData.deviceCode}] è®¾å¤‡ç¼–号为空")
                } else {
                    val bytes = encodeToBytes(s)
                    channel.writeAndFlush(Unpooled.copiedBuffer(bytes))
                    ctx?.writeAndFlush("[${packageData.deviceCode}] æŒ‡ä»¤å‘送成功")
                }
            } else {
                ctx?.writeAndFlush("[${packageData.deviceCode}] è®¾å¤‡æœªè¿žæŽ¥æˆ–不存在")
            }
            return true
        } else if (packageData.commandUnit != ObdCommandUnit.CarRegister.value
                && packageData.commandUnit != ObdCommandUnit.RealTimeData.value
                && packageData.commandUnit != ObdCommandUnit.ReplacementData.value
                && packageData.commandUnit != ObdCommandUnit.CarLogOut.value
                && packageData.commandUnit != ObdCommandUnit.TimeCalibration.value) {
            ctx?.writeAndFlush("[${packageData.deviceCode}] å‘½ä»¤ä¸å­˜åœ¨")
            return true
        } else {
            return false
        }
    }
    fun encodeToBytes(msg:String): ByteArray {
        val list = msg.split(" ")
src/main/kotlin/com/flightfeather/uav/socket/ServerHandler.kt
@@ -31,8 +31,7 @@
        if (msg is ByteArray) {
            println("------收到的原始数据:[ip:${ctx?.channel()?.remoteAddress()}] ${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}")
            msg.forEach {
                var a = 0
                a = if (it < 0) {
                val a: Int = if (it < 0) {
                    it + 256
                } else {
                    it.toInt()
src/main/kotlin/com/flightfeather/uav/socket/SocketServerClient.kt
@@ -6,6 +6,7 @@
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.string.StringDecoder
import io.netty.handler.codec.string.StringEncoder
import java.nio.charset.Charset
@@ -41,7 +42,7 @@
                        override fun initChannel(p0: NioSocketChannel?) {
                            p0?.pipeline()
//                                    ?.addLast("decoder", StringDecoder())
                                    ?.addLast(ObdByteDataDecoder())
                                    ?.addLast(UAVByteDataDecoder())
                                    ?.addLast("encoder", StringEncoder(Charset.forName("UTF-8")))
                                    ?.addLast(ServerHandler())
                        }
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/socket/ObdByteDataDecoder.kt ÐÞ¸Ä
@@ -7,14 +7,18 @@
/**
 * @author riku
 * Date: 2019/9/16
 * Date: 2020/06/02
 * æ•°æ®ç²˜åŒ…分包解码器
 */
class ObdByteDataDecoder : ByteToMessageDecoder() {
class UAVByteDataDecoder : ByteToMessageDecoder() {
    companion object {
        const val BASE_LENGTH = 2 + 1 + 17 + 1 + 1 + 2 + 0 + 1
        const val HEAD = 0x23.toByte()
        private const val HEAD_BYTES = 2//数据头所占长度
        private const val LENGTH_BYTES = 1//数据位数所占长度
        private const val BCC_BYTES = 2//校验码长度
        const val BASE_LENGTH = HEAD_BYTES + LENGTH_BYTES + BCC_BYTES
        const val HEAD1 = 0x01.toByte()
        const val HEAD2 = 0x05.toByte()
    }
    override fun decode(p0: ChannelHandlerContext?, p1: ByteBuf?, p2: MutableList<Any>?) {
@@ -40,7 +44,7 @@
                    // è¯»åˆ°äº†åè®®çš„开始标志,结束while循环
                    val b = ByteArray(2)
                    it.readBytes(b)
                    if (b[0] == HEAD && b[1] == HEAD) {
                    if (b[0] == HEAD1 && b[1] == HEAD2) {
                        dataList.add(b[0])
                        dataList.add(b[1])
                        break
@@ -57,7 +61,7 @@
                    }
                }
                ByteArray(1 + 17 + 1 + 1).apply {
                ByteArray(1).apply {
                    it.readBytes(this)
                }.forEach {b ->
                    dataList.add(b)
@@ -65,15 +69,15 @@
                //数据单元的长度
                val length = getDataUnitLength(it, dataList)
                // åˆ¤æ–­è¯·æ±‚数据单元数据及1个字节的校验码是否到齐
                if (it.readableBytes() < length + 1) {
                // åˆ¤æ–­è¯·æ±‚数据单元数据及[LENGTH_BYTES]个字节的校验码是否到齐
                if (it.readableBytes() < length + BCC_BYTES) {
                    // è¿˜åŽŸè¯»æŒ‡é’ˆ
                    it.readerIndex(beginReader)
                    return
                }
                //读取数据单元和校验码数据
                ByteArray(length + 1).apply {
                ByteArray(length + BCC_BYTES).apply {
                    it.readBytes(this)
                }.forEach {b ->
                    dataList.add(b)
@@ -91,11 +95,10 @@
    private fun getDataUnitLength(p1: ByteBuf, dataList: MutableList<Byte>): Int {
        val sb = StringBuilder()
        ByteArray(2).apply {
        ByteArray(1).apply {
            p1.readBytes(this)
        }.forEach { b ->
            var a = 0
            a = if (b < 0) {
            val a: Int = if (b < 0) {
                b + 256
            } else {
                b.toInt()
@@ -108,5 +111,4 @@
        return sb.toString().toInt(16)
    }
}
src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.flightfeather.uav.socket.bean
import java.util.*
/**
 * @author riku
 * Date: 2020/6/10
 */
class AirData:DataUnit(){
    var factorId: String? = null
    var factorName: String? = null
    var sensorId: String? = null
    var factorData: Double? = null
}
src/main/kotlin/com/flightfeather/uav/socket/bean/AirPackageData.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.flightfeather.uav.socket.bean
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import java.util.*
/**
 * @author riku
 * Date: 2019/9/12
 * æ•°æ®åŒ…结构
 *
 * èµ·å§‹å­—节                     å®šä¹‰                  æ•°æ®ç±»åž‹                        æè¿°åŠè¦æ±‚
 *
 */
data class AirPackageData constructor(
        //起始符
        var head: String? = null,
        //命令单元
        var commandUnit: Int? = null,
        //设备编号
        var deviceCode: String? = null,
        //采样时间
        var dataTime: Date? = null,
        //数据加密方式
//        var encryptionWay: Int? = null,
        //数据单元长度
        var dataLength: Int? = null,
        //数据单元
        var dataUnit: List<DataUnit>,
        //校验码
        var checkCode: Int? = null
)
src/main/kotlin/com/flightfeather/uav/socket/bean/AirTypeData.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.flightfeather.uav.socket.bean
import com.flightfeather.uav.socket.eunm.FactorType
/**
 * @author riku
 * Date: 2020/6/10
 */
class AirTypeData(var factorType: FactorType): DataUnit()
src/main/kotlin/com/flightfeather/uav/socket/bean/CarLogOutData.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/CarRegisterData.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/DataUnit.kt
@@ -1,6 +1,6 @@
package com.flightfeather.uav.socket.bean
import com.flightfeather.uav.socket.eunm.ObdCommandUnit
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import java.util.*
/**
@@ -8,9 +8,8 @@
 * Date: 2019/9/12
 *
 * æ•°æ®å•å…ƒ
 * æ ¹æ®å‘½ä»¤å•å…ƒ @see [ObdCommandUnit] çš„分类,不同类型的结构不同,见各子类
 * æ ¹æ®å‘½ä»¤å•å…ƒ @see [AirCommandUnit] çš„分类,不同类型的结构不同,见各子类
 */
open class DataUnit(
        var time: Date?,
        var serialNum: Int?
)
open class DataUnit {
    var time: Date? = null
}
src/main/kotlin/com/flightfeather/uav/socket/bean/EngineDataStream.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/ObdInfo.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/ObdPackageData.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/RealTimeData.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/ReplacementData.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/SupplementDataStream.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/bean/TimeCalibrationData.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/decoder/AirDataDecoder.kt
ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/socket/decoder/VehicleDataDecoder.kt ÐÞ¸Ä
@@ -1,26 +1,25 @@
package com.flightfeather.uav.socket.decoder
import com.flightfeather.uav.socket.bean.ObdPackageData
import com.flightfeather.uav.socket.bean.AirPackageData
import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl
/**
 * è½¦è¾† uav æ•°æ®è§£ç å™¨
 * ç©ºæ°”质量多参数数据解码器
 * @author riku
 * Date: 2019/9/12
 */
class VehicleDataDecoder {
class AirDataDecoder {
    private val dataPackageDecoder: DataPackageDecoder = DataPackageDecoderImpl()
    fun decode(msg: String): ObdPackageData {
    fun decode(msg: String): AirPackageData {
        val list = dataPackageDecoder.toStringList(msg)
        dataPackageDecoder.run {
            return ObdPackageData(
            return AirPackageData(
                    getHead(list),
                    getCommandUnit(list),
                    getVinCode(list),
                    getSoftwareVersion(list),
                    getEncryptionWay(list),
                    getDeviceCode(list),
                    getDataTime(list),
                    getDataLength(list),
                    getDataUnit(list),
                    getCheckCode(list)
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt
@@ -1,7 +1,8 @@
package com.flightfeather.uav.socket.decoder
import com.flightfeather.uav.socket.bean.DataUnit
import com.flightfeather.uav.socket.eunm.ObdCommandUnit
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import java.util.*
/**
 * uav ç¬¬ä¸€å±‚数据包解码器
@@ -11,13 +12,9 @@
 * æ•°æ®ç¬¬ä¸€å±‚结构定义如下:
 * èµ·å§‹å­—节         å®šä¹‰
 * 0                    èµ·å§‹ç¬¦
 * 2                    å‘½ä»¤å•å…ƒ  ç±»åž‹@see [ObdCommandUnit]
 * 3                    è½¦è¾†è¯†åˆ«å·
 * 4                    ç»ˆç«¯è½¯ä»¶ç‰ˆæœ¬å·
 * 21                   æ•°æ®åŠ å¯†æ–¹å¼
 * 22                   æ•°æ®å•元长度
 * 24                   æ•°æ®å•å…ƒ  è§£ç å™¨@see [DataUnitDecoder]
 * å€’数第1           æ ¡éªŒç 
 * 1                   å‘½ä»¤å•å…ƒ  ç±»åž‹@see [AirCommandUnit]
 * 2                   æ•°æ®å•元长度
 * å€’数第2           æ ¡éªŒç 
 */
interface DataPackageDecoder {
@@ -25,11 +22,9 @@
    fun getCommandUnit(b: List<String>): Int?
    fun getVinCode(b: List<String>): String?
    fun getDeviceCode(b: List<String>): String?
    fun getSoftwareVersion(b: List<String>): Int?
    fun getEncryptionWay(b: List<String>): Int?
    fun getDataTime(b: List<String>): Date
    fun getDataLength(b: List<String>): Int
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataUnitDecoder.kt
@@ -1,7 +1,7 @@
package com.flightfeather.uav.socket.decoder
import com.flightfeather.uav.socket.bean.*
import com.flightfeather.uav.socket.eunm.ObdCommandUnit
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import java.util.*
/**
@@ -10,7 +10,7 @@
 * Date: 2019/9/12
 *
 * æ•°æ®å•元按照命令单元的类型共有以下几种类型:
 * å‘½ä»¤å•å…ƒ @see [ObdCommandUnit]
 * å‘½ä»¤å•å…ƒ @see [AirCommandUnit]
 * ç¼–码(byte)        å®šä¹‰
 * 0x01                 è½¦è¾†ç™»å…¥
 * 0x02                 å®žæ—¶ä¿¡æ¯ä¸ŠæŠ¥
@@ -21,16 +21,8 @@
 */
interface DataUnitDecoder {
    fun getCarRegisterData(b: List<String>): List<CarRegisterData>
    fun getAirConfirmData(b: List<String>): List<AirTypeData>
    fun getRealTimeData(b: List<String>): List<RealTimeData>
    fun getReplacementData(b: List<String>): List<ReplacementData>
    fun getCarLogOutData(b: List<String>): List<CarLogOutData>
    fun getTimeCalibrationData(b: List<String>): List<TimeCalibrationData>
    fun decodeDataTime(b: List<String>): Date?
    fun getAirData(b: List<String>): List<AirData>
}
src/main/kotlin/com/flightfeather/uav/socket/decoder/RealTimeDataDecoder.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt
@@ -3,7 +3,8 @@
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
@@ -13,79 +14,62 @@
    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())
    override fun getDeviceCode(b: List<String>): String? {
        return null
        }
        return s.toString()
    }
    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
        }
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
@@ -1,12 +1,10 @@
package com.flightfeather.uav.socket.decoder.impl
import com.flightfeather.uav.socket.bean.*
import com.flightfeather.uav.socket.bean.AirData
import com.flightfeather.uav.socket.bean.AirTypeData
import com.flightfeather.uav.socket.decoder.DataUnitDecoder
import com.flightfeather.uav.socket.decoder.RealTimeDataDecoder
import com.flightfeather.uav.socket.eunm.ObdDataType
import com.flightfeather.uav.socket.eunm.FactorType
import org.slf4j.LoggerFactory
import java.lang.StringBuilder
import java.util.*
/**
 * @author riku
@@ -15,113 +13,34 @@
class DataUnitDecoderImpl : DataUnitDecoder {
    private val logger = LoggerFactory.getLogger(javaClass.name)
    private var realTimeDataDecoder: RealTimeDataDecoder = RealTimeDataDecoderImpl()
    override fun getCarRegisterData(b: List<String>): List<CarRegisterData> {
        val time = decodeDataTime(b)
        val serialNum = "${b[6]}${b[7]}".toInt(16)
        val simCode = StringBuilder()
        for (i in 10 until b.size) {
            simCode.append(b[i].toInt(16).toChar())
        }
        return mutableListOf(CarRegisterData(time, serialNum, simCode.toString()))
    }
    override fun getRealTimeData(b: List<String>): List<RealTimeData> {
        val time = decodeDataTime(b)
        //国标法: èµ·å§‹å­—节为7 å¼€å§‹çš„2个字节表示 æµæ°´å·
//        val serialNum = "${b[7]}${b[8]}".toInt(16)
        //上海法: èµ·å§‹å­—节为6 å¼€å§‹çš„2个字节表示 æµæ°´å·
        val serialNum = "${b[6]}${b[7]}".toInt(16)
        val dataList = mutableListOf<String>().apply { addAll(b) }
        //删去前6位时间
        for (i in 0..5) {
            if (dataList.isNotEmpty()) dataList.removeAt(0)
        }
        //fixme 2019.9.15 ç›®å‰ä¸¤ç§è§„则有冲突,并且只从数据内容无法区分。暂时使用 å›½æ ‡æ³•
        /*
        * åˆ åŽ»æµæ°´å·ï¼Œå¾—åˆ°ä¿¡æ¯æ ‡å¿—ä¸Žä¿¡æ¯ä½“çš„ç»„åˆ
        * (国标法:去除前6位时间后,起始字节为1 å¼€å§‹çš„2个字节表示 æµæ°´å·)
        */
//        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)
        val resultList = mutableListOf<RealTimeData>()
        /*
         * æœ€ç»ˆå¾—到的数据结构为 [ ä¿¡æ¯ç±»åž‹æ ‡å¿—, ä¿¡æ¯ä½“, ...... , ä¿¡æ¯ç±»åž‹æ ‡å¿—, ä¿¡æ¯ä½“ ]
         */
        while (dataList.isNotEmpty()) {
            //得到最前面的一组信息类型+信息体列表
            val data = realTimeDataDecoder.getDataListByDataType(dataList)
            if (data.isNotEmpty()) {
                val r = when (data[0].toInt(16)) {
                    ObdDataType.ObdData.value -> realTimeDataDecoder.getObdData(time, serialNum, data)
                    ObdDataType.EngineDataFlow.value -> realTimeDataDecoder.getEngineDataStream(time, serialNum, data)
                    ObdDataType.SupplementDataFlow.value -> realTimeDataDecoder.getSupplementDataStream(time, serialNum, data)
                    else -> null
                }
                if (r != null) {
                    resultList.add(r)
                }
                for (i in 0 until data.size) {
                    if (dataList.isNotEmpty()) dataList.removeAt(0)
                }
            }else if (dataList.isNotEmpty()) {
                //按照规则没有取到信息体,并且原数据不为空,表示原数据格式错误,退出循环
                logger.error("-------数据信息流或补充数据流格式错误")
                break
    override fun getAirConfirmData(b: List<String>): List<AirTypeData> {
        val resultList = mutableListOf<AirTypeData>()
        b.forEach {
            FactorType.getByIndex(it.toInt(16))?.let { f->
                resultList.add(AirTypeData(f))
            }
        }
        return resultList
    }
    override fun getReplacementData(b: List<String>): List<ReplacementData> = getRealTimeData(b)
    override fun getCarLogOutData(b: List<String>): List<CarLogOutData> {
        val time = decodeDataTime(b)
        val serialNum = "${b[6]}${b[7]}".toInt(16)
        return mutableListOf(CarLogOutData(time, serialNum))
    override fun getAirData(b: List<String>): List<AirData> {
        val resultList = mutableListOf<AirData>()
        var i = 0
        while (i < b.size - 3) {
            val a = "${b[i]}${b[i + 1]}".toInt(16)
            var b1 = b[i + 2].toInt(16).toDouble()
            while (b1 >= 1) {
                b1 /= 10
            }
            val data = a + b1
            resultList.add(AirData().apply {
                factorData = data
            })
            i += 3
    }
    override fun getTimeCalibrationData(b: List<String>): List<TimeCalibrationData> = emptyList()
    override fun decodeDataTime(b: List<String>): Date? {
        if (b.size < 6) {
            return null
        }
        val year = b[0].toInt(16) + 2000
        if (year < 2000 || year > 2099) return null
        val month = b[1].toInt(16)
        val day = b[2].toInt(16)
        val hour = b[3].toInt(16)
        val min = b[4].toInt(16)
        val sec = b[5].toInt(16)
        val cal  = Calendar.getInstance().apply {
            set(year, month - 1, day, hour, min, sec)
            set(Calendar.MILLISECOND, 0)
        }
        return cal.time
        return resultList
    }
}
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/RealTimeDataDecoderImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/eunm/AirCommandUnit.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.flightfeather.uav.socket.eunm
/**
 * @author riku
 * Date: 2019/9/12
 *
 * uav å‘½ä»¤å•å…ƒ
 *
 * ç¼–码                   å®šä¹‰
 * 0x04            ç›‘测参数确认指令位
 * 0x05            ç›‘测参数反馈指令位
 *
 */
enum class AirCommandUnit constructor(val value: Int) {
    Confirm(4),
    AirData(5)
}
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.flightfeather.uav.socket.eunm
/**
 * @author riku
 * Date: 2020/6/10
 */
enum class  FactorType(val value: Int, val des: String){
    NO2(1, "NO2"),
    CO(2,"CO"),
    H2S(3,"H2S"),
    SO2(4,"SO2"),
    O3(5,"O3"),
    PM25(6,"PM25"),
    PM10(7, "PM10"),
    TEMPERATURE(8,"TEMPERATURE"),
    HUMIDITY(9, "HUMIDITY");
    companion object {
        fun getByIndex(index: Int): FactorType? = when (index) {
            NO2.value -> NO2
            CO.value -> CO
            H2S.value -> H2S
            SO2.value -> SO2
            O3.value -> O3
            PM25.value -> PM25
            PM10.value -> PM10
            TEMPERATURE.value -> TEMPERATURE
            HUMIDITY.value -> HUMIDITY
            else -> null
        }
    }
}
src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdCommandUnit.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/socket/eunm/ObdDataType.kt
@@ -1,17 +1,9 @@
package com.flightfeather.uav.socket.eunm
import com.flightfeather.uav.socket.bean.*
/**
 * @author riku
 * Date: 2019/9/15
 *
 * å®žæ—¶ä¿¡æ¯[RealTimeData]和补发信息[ReplacementData] ä¸­çš„æ•°æ®ç±»åž‹
 * ç±»åž‹ç¼–码                     è¯´æ˜Ž
 * 0x01                           OBD ä¿¡æ¯    @see [com.flightfeather.uav.socket.bean.ObdInfo]
 * 0x02                          æ•°æ®æµä¿¡æ¯  @see[com.flightfeather.uav.socket.bean.EngineDataStream]
 * 0x03-0x7F                é¢„ç•™
 * 0x80                          è¡¥å……数据流   @see[com.flightfeather.uav.socket.bean.SupplementDataStream]
 * 0x81~0xFE                ç”¨æˆ·è‡ªå®šä¹‰
 */
enum class ObdDataType constructor(val value: Int){
    ObdData(1),
src/main/resources/application.yml
@@ -1,9 +1,15 @@
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://47.100.191.150:3306/uav?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
    username: uav
    password: obd2019
#    url: jdbc:mysql://47.100.191.150:3306/uav?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
#    username: uav
#    password: obd2019
    url: jdbc:mysql://114.215.109.124:3306/dronemonitor?serverTimezone=Asia/Shanghai&prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
    username: root
    password: 123456
mybatis:
  type-aliases-package: com.flightfeather.uav.domain.entity
src/main/resources/generator/generatorConfig.xml
@@ -24,9 +24,9 @@
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/obd"
                        userId="obd"
                        password="obd2019">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://114.215.109.124:3306/dronemonitor"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
@@ -54,6 +54,6 @@
        <!--<table tableName="obd_car_logout" domainObjectName="CarLogout" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
        <!--<table tableName="obd_data_stream" domainObjectName="DataStream" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
        <!--<table tableName="obd_info" domainObjectName="ObdInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
        <table tableName="obd_vehicle_info" domainObjectName="VehicleInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
        <table tableName="air_real_time_data" domainObjectName="RealTimeData" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>
src/main/resources/mapper/AlarmDataMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/CarLoginMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/CarLogoutMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/DataStreamMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/ObdDataMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/ObdInfoMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/ObdUserMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/OriginDataMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/ThresholdValueMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/VehicleInfoMapper.xml
ÎļþÒÑɾ³ý
src/test/kotlin/com/flightfeather/uav/Test.kt
@@ -1,150 +1,10 @@
package com.flightfeather.uav
import org.junit.Test
import java.text.SimpleDateFormat
import java.util.*
/**
 * @author riku
 * Date: 2019/9/12
 */
class Test {
    @Test
    fun foo1() {
        val b = ByteArray(20) {8}
        val a = 1
        println(a.toString(2))
    }
    @Test
    fun foo2() {
        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
    fun foo3() {
        val hexNum = "ff"
        val length = hexNum.toInt(16)
        println(length)
    }
    @Test
    fun foo4() {
        val h = "0101"
        val byte = 0xff
        val b = h.toInt(16)
        println(b)
    }
    @Test
    fun foo5() {
        val s = "23 23 30 30 30 30 30 35 33 31 36 30 38 30 31 30 35 33 36"
        val sb = StringBuilder()
        val ascii = s.split(" ")
        ascii.forEach {
            sb.append(it.toIntOrNull(16)?.toChar())
        }
        println(sb.toString())
    }
    @Test
    fun foo6() {
        val cal  = Calendar.getInstance().apply {
            set(2019, 9, 15, 23, 16, 59)
        }
        println(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.time))
    }
    @Test
    fun foo7() {
        val a = "0AAF".toIntOrNull(16)?.toString(2)
        println(a)
    }
    @Test
    fun foo8() {
        val byte = ByteArray(2)
        byte[0] = 0x23
        byte[1] = 0x23
        byte[0].toString(16)
    }
    @Test
    fun foo9() {
        val b = 128.toByte()
        var a = 0
        if (b < 0) {
            a = b + 256
        } else {
            a = b.toInt()
        }
        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))
    }
    @Test
    fun foo11() {
        val b = mutableListOf<String>().apply {
            add("13")
            add("09")
            add("10")
            add("10")
            add("2b")
            add("2f")
        }
        if (b.size < 6) {
            println("null")
        }
        val year = b[0].toInt(16) + 2000
        if (year < 2000 || year > 2099) println("null")
        val month = b[1].toInt(16)
        val day = b[2].toInt(16)
        val hour = b[3].toInt(16)
        val min = b[4].toInt(16)
        val sec = b[5].toInt(16)
        val cal  = Calendar.getInstance().apply {
            set(year, month - 1, day, hour, min, sec)
        }
        println(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.time))
    }
    @Test
    fun f0012() {
        val sb = java.lang.StringBuilder()
        val byte = ByteArray(2)
        byte[0] = 0x00
        byte[1] = 0xBD.toByte()
        byte.forEach { b ->
            var a = 0
            a = if (b < 0) {
                b + 256
            } else {
                b.toInt()
            }
            sb.append(a.toString(16))
        }
        println(sb.toString().toInt(16))
    }
}
src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt
@@ -1,12 +1,8 @@
package com.flightfeather.uav
import com.flightfeather.uav.domain.mapper.ObdDataMapper
import com.flightfeather.uav.lightshare.bean.ObdDataVo
import com.google.gson.Gson
import org.junit.Test
import org.junit.runner.RunWith
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner
@@ -14,8 +10,6 @@
@SpringBootTest
class UAVApplicationTests {
    @Autowired
    lateinit var obdDataMapper: ObdDataMapper
    @Test
    fun contextLoads() {
@@ -23,16 +17,7 @@
    @Test
    fun foo1(): Unit {
//        val map = GsonJsonParser().parseMap("{\"vin\":\"vin001\",\"protocol\":2}")
        val map = Gson().fromJson("{\"vin\":\"vin001\",\"protocol\":2,\"cmdCode\":2001}", ObdDataVo::class.java)
        val res = obdDataMapper.selectAll()
        res.forEach {
            println(it.obdVin)
            println(it.obdTime)
        }
        println(map.obdVin)
        println(map.obdProtocol)
        println(map.cmdCode)
    }
    @Test
src/test/kotlin/com/flightfeather/uav/socket/decoder/VehicleDataDecoderTest.kt
ÎļþÒÑɾ³ý