riku
2020-07-15 25d0f31f22f77a914a50bbc088902e00e28c4889
根据新的多参数传输协议,修改解析规则
已修改13个文件
已删除3个文件
已添加1个文件
已重命名1个文件
408 ■■■■■ 文件已修改
pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/UAVApplication.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/VehicleService.kt 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/VehicleServiceImpl.kt 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/VehicleInfoController.kt 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/AirDataRepository.kt 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/DeviceSession.kt 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/AirDataDecoder.kt 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/log4j2.xml 116 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/RealTimeDataMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -9,11 +9,11 @@
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.flightfeather</groupId>
    <artifactId>obd</artifactId>
    <artifactId>uav</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>
    <name>obd</name>
    <description>Obd data server</description>
    <description>Uav data server</description>
    <properties>
        <java.version>1.8</java.version>
src/main/kotlin/com/flightfeather/uav/UAVApplication.kt
@@ -11,7 +11,7 @@
    @Bean
    fun runner() = ApplicationRunner{
        SocketServerClient().startServer(9000)
        SocketServerClient().startServer(9030)
    }
}
src/main/kotlin/com/flightfeather/uav/lightshare/service/VehicleService.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/VehicleServiceImpl.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/lightshare/web/VehicleInfoController.kt
ÎļþÒÑɾ³ý
src/main/kotlin/com/flightfeather/uav/repository/AirDataRepository.kt
@@ -1,6 +1,6 @@
package com.flightfeather.uav.repository
import com.flightfeather.uav.socket.bean.AirPackageData
import com.flightfeather.uav.socket.bean.AirDataPackage
/**
 * @author riku
@@ -8,5 +8,5 @@
 */
interface AirDataRepository {
    fun saveAirData(packageData: AirPackageData): Int
    fun saveAirData(dataPackage: AirDataPackage): Int
}
src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt
@@ -3,7 +3,7 @@
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.flightfeather.uav.socket.bean.AirDataPackage
import com.google.gson.Gson
import org.springframework.stereotype.Repository
@@ -14,16 +14,16 @@
@Repository
class AirDataRepositoryImpl(private val realTimeDataMapper: RealTimeDataMapper): AirDataRepository {
    override fun saveAirData(packageData: AirPackageData): Int {
    override fun saveAirData(dataPackage: AirDataPackage): Int {
        val data = RealTimeData().apply {
            deviceCode = packageData.deviceCode
            deviceCode = dataPackage.deviceCode
            latitude
            longitude
            altitude
            height
            factors = Gson().toJson(packageData.dataUnit)
            dataTime = packageData.dataTime
            factors = Gson().toJson(dataPackage.dataUnit)
            dataTime = dataPackage.dataTime
        }
        realTimeDataMapper.insert(data)
src/main/kotlin/com/flightfeather/uav/socket/DeviceSession.kt
@@ -38,10 +38,10 @@
        }
        fun getAirType(deviceCode: String?): List<AirTypeData>? {
            return if (typeMap.containsKey(deviceCode)) {
                typeMap[deviceCode]
            } else {
                null
            return when {
                deviceCode == null -> typeMap[DEFAULT_DEVICE]
                typeMap.containsKey(deviceCode) -> typeMap[deviceCode]
                else -> null
            }
        }
    }
src/main/kotlin/com/flightfeather/uav/socket/MessageManager.kt
@@ -6,7 +6,6 @@
import com.flightfeather.uav.socket.decoder.AirDataDecoder
import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import io.netty.buffer.Unpooled
import io.netty.channel.ChannelHandlerContext
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
@@ -30,7 +29,7 @@
    @Autowired
    lateinit var airDataRepository: AirDataRepository
    val vehicleDataDecoder = AirDataDecoder()
    val airDataDecoder = AirDataDecoder.instance
    val dataPackageDecoder = DataPackageDecoderImpl()
    @PostConstruct
@@ -41,21 +40,10 @@
    fun dealStringMsg(msg: String, ctx: ChannelHandlerContext?) {
        //解包
        val packageData = vehicleDataDecoder.decode(msg)
        val packageData = airDataDecoder.decode(msg)
        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)
//            saveToTxt(msg)
@@ -76,9 +64,9 @@
    /**
     * ä¿å­˜è‡³æ•°æ®åº“
     */
    fun saveToDataBase(packageData: AirPackageData) {
        when (packageData.commandUnit) {
            AirCommandUnit.AirData.value -> instance.airDataRepository.saveAirData(packageData)
    fun saveToDataBase(dataPackage: AirDataPackage) {
        when (dataPackage.commandUnit) {
            AirCommandUnit.AirData.value -> instance.airDataRepository.saveAirData(dataPackage)
        }
    }
@@ -88,15 +76,13 @@
    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)
        val oldBcc = "${list[list.lastIndex - 1]}${list[list.lastIndex]}".toInt(16)
        //去除校验结果
        list.removeAt(list.size-1)
        list.removeAt(list.lastIndex)
        list.removeAt(list.lastIndex)
        //计算bcc校验结果
        var newBcc = 0x00
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
@@ -18,7 +18,6 @@
        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>?) {
@@ -44,7 +43,7 @@
                    // è¯»åˆ°äº†åè®®çš„开始标志,结束while循环
                    val b = ByteArray(2)
                    it.readBytes(b)
                    if (b[0] == HEAD1 && b[1] == HEAD2) {
                    if (b[0] == HEAD1) {
                        dataList.add(b[0])
                        dataList.add(b[1])
                        break
@@ -61,11 +60,11 @@
                    }
                }
                ByteArray(1).apply {
                    it.readBytes(this)
                }.forEach {b ->
                    dataList.add(b)
                }
//                ByteArray(1).apply {
//                    it.readBytes(this)
//                }.forEach {b ->
//                    dataList.add(b)
//                }
                //数据单元的长度
                val length = getDataUnitLength(it, dataList)
src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt
@@ -1,7 +1,5 @@
package com.flightfeather.uav.socket.bean
import java.util.*
/**
 * @author riku
 * Date: 2020/6/10
@@ -10,5 +8,8 @@
    var factorId: String? = null
    var factorName: String? = null
    var sensorId: String? = null
    //监测因子实际值
    var factorData: Double? = null
    //监测因子物理量(电压)
    var physicalQuantity: Double? = null
}
src/main/kotlin/com/flightfeather/uav/socket/bean/AirDataPackage.kt
ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/socket/bean/AirPackageData.kt ÐÞ¸Ä
@@ -11,7 +11,7 @@
 * èµ·å§‹å­—节                     å®šä¹‰                  æ•°æ®ç±»åž‹                        æè¿°åŠè¦æ±‚
 *
 */
data class AirPackageData constructor(
data class AirDataPackage constructor(
        //起始符
        var head: String? = null,
        //命令单元
@@ -28,4 +28,15 @@
        var dataUnit: List<DataUnit>,
        //校验码
        var checkCode: Int? = null
)
){
    companion object {
        //数据中的保留字节数
        const val RESERVED_DATA_COUNT = 12
        //一个保留监测因子的属性所占字节数
        const val FACTOR_BIT_LENGTH_2 = 3
        //一个动态监测因子的属性所占字节数
        const val FACTOR_BIT_LENGTH_1 = 6
    }
}
src/main/kotlin/com/flightfeather/uav/socket/decoder/AirDataDecoder.kt
@@ -1,6 +1,6 @@
package com.flightfeather.uav.socket.decoder
import com.flightfeather.uav.socket.bean.AirPackageData
import com.flightfeather.uav.socket.bean.AirDataPackage
import com.flightfeather.uav.socket.decoder.impl.DataPackageDecoderImpl
/**
@@ -8,14 +8,33 @@
 * @author riku
 * Date: 2019/9/12
 */
class AirDataDecoder {
class AirDataDecoder private constructor(){
    companion object{
        @Volatile
        private var decoder: AirDataDecoder? = null
        @JvmStatic
        val instance: AirDataDecoder
            get() {
                if (decoder == null) {
                    synchronized(AirDataDecoder::class) {
                        if (decoder == null) {
                            decoder = AirDataDecoder()
                        }
                    }
                }
                return this.decoder!!
            }
    }
    private val dataPackageDecoder: DataPackageDecoder = DataPackageDecoderImpl()
    fun decode(msg: String): AirPackageData {
    fun decode(msg: String): AirDataPackage {
        val list = dataPackageDecoder.toStringList(msg)
        dataPackageDecoder.run {
            return AirPackageData(
            return AirDataPackage(
                    getHead(list),
                    getCommandUnit(list),
                    getDeviceCode(list),
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
@@ -1,6 +1,7 @@
package com.flightfeather.uav.socket.decoder.impl
import com.flightfeather.uav.socket.bean.AirData
import com.flightfeather.uav.socket.bean.AirDataPackage
import com.flightfeather.uav.socket.bean.AirTypeData
import com.flightfeather.uav.socket.decoder.DataUnitDecoder
import com.flightfeather.uav.socket.eunm.FactorType
@@ -14,6 +15,7 @@
    private val logger = LoggerFactory.getLogger(javaClass.name)
    private val types = mutableListOf<AirTypeData>()
    override fun getAirConfirmData(b: List<String>): List<AirTypeData> {
        val resultList = mutableListOf<AirTypeData>()
@@ -22,23 +24,61 @@
                resultList.add(AirTypeData(f))
            }
        }
        types.clear()
        types.addAll(resultList)
        return resultList
    }
    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)
        types.forEach {
            if (i > b.size - it.factorType.byteLength) {
                return@forEach
            }
            when (it.factorType.byteLength) {
                AirDataPackage.FACTOR_BIT_LENGTH_2 -> {
                    val a1 = "${b[i]}${b[i + 1]}".toInt(16)
            var b1 = b[i + 2].toInt(16).toDouble()
            while (b1 >= 1) {
                b1 /= 10
            }
            val data = a + b1
                    val data1 = a1 + b1
            resultList.add(AirData().apply {
                factorData = data
                        factorId = it.factorType.value?.toString()
                        factorName = it.factorType.des
                        factorData = data1
            })
            i += 3
                }
                AirDataPackage.FACTOR_BIT_LENGTH_1 -> {
                    //数据实际值(3位字节表示)
                    val a1 = "${b[i]}${b[i + 1]}".toInt(16)
                    var b1 = b[i + 2].toInt(16).toDouble()
                    while (b1 >= 1) {
                        b1 /= 10
                    }
                    val data1 = a1 + b1
                    //数据物理量(3位字节表示)
                    val a2 = "${b[i]}${b[i + 1]}".toInt(16)
                    var b2 = b[i + 2].toInt(16).toDouble()
                    while (b2 >= 1) {
                        b2 /= 10
                    }
                    val data2 = a2 + b2
                    resultList.add(AirData().apply {
                        factorId = it.factorType.value?.toString()
                        factorName = it.factorType.des
                        factorData = data1
                        physicalQuantity = data2
                    })
                }
            }
            i += it.factorType.byteLength
        }
        return resultList
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
@@ -4,16 +4,20 @@
 * @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");
enum class  FactorType(val value: Int, val des: String, val byteLength: Int){
    NO2(1, "NO2", 6),
    CO(2,"CO", 6),
    H2S(3,"H2S",6),
    SO2(4,"SO2",6),
    O3(5,"O3",6),
    PM25(6,"PM25",3),
    PM10(7, "PM10",3),
    TEMPERATURE(8,"TEMPERATURE",3),
    HUMIDITY(9, "HUMIDITY",3),
    VOC(10, "VOC",3),
    NOI(11, "NOI",3),//负氧离子
    LNG(12,"LNG",3),//经度
    LAT(13,"LAT",3);//纬度
    companion object {
@@ -27,6 +31,10 @@
            PM10.value -> PM10
            TEMPERATURE.value -> TEMPERATURE
            HUMIDITY.value -> HUMIDITY
            VOC.value -> VOC
            NOI.value -> NOI
            LNG.value -> LNG
            LAT.value -> LAT
            else -> null
        }
    }
src/main/resources/application.yml
@@ -8,6 +8,8 @@
    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
  jmx:
    enabled: false
src/main/resources/log4j2.xml
@@ -1,67 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
    6个优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
    å¦‚果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出
    è®¾ç½®ä¸ºOFF è¡¨ç¤ºä¸è®°å½•log4j2本身的日志,
 -->
<!--<?xml version="1.0" encoding="UTF-8"?>-->
<!--&lt;!&ndash;-->
    <!--6个优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。-->
    <!--如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出-->
    <!--设置为OFF è¡¨ç¤ºä¸è®°å½•log4j2本身的日志,-->
 <!--&ndash;&gt;-->
<!-- status:用来指定log4j本身的打印日志级别,monitorInterval:指定log4j自动重新配置的监测间隔时间 -->
<configuration status="INFO" monitorInterval="30">
    <!-- è‡ªå·±è®¾ç½®å±žæ€§ï¼ŒåŽé¢é€šè¿‡${}来访问 -->
    <properties>
        <property name="LOG_HOME">../obdLogs</property>
    </properties>
<!--&lt;!&ndash; status:用来指定log4j本身的打印日志级别,monitorInterval:指定log4j自动重新配置的监测间隔时间 &ndash;&gt;-->
<!--<configuration status="INFO" monitorInterval="30">-->
    <!--&lt;!&ndash; è‡ªå·±è®¾ç½®å±žæ€§ï¼ŒåŽé¢é€šè¿‡${}来访问 &ndash;&gt;-->
    <!--<properties>-->
        <!--<property name="LOG_HOME">../obdLogs</property>-->
    <!--</properties>-->
    <appenders>
        <!--Appender 1. è¾“出到Console控制台,指定输出格式和过滤器等级为INFO -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--ThresholdFilter指定日志消息的输出最低层次-->
            <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
    <!--<appenders>-->
        <!--&lt;!&ndash;Appender 1. è¾“出到Console控制台,指定输出格式和过滤器等级为INFO &ndash;&gt;-->
        <!--<Console name="Console" target="SYSTEM_OUT">-->
            <!--&lt;!&ndash;ThresholdFilter指定日志消息的输出最低层次&ndash;&gt;-->
            <!--<ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
        <!--</Console>-->
        <!--Appender 2. è¾“出到滚动保存的文件, è§¦å‘保存日志文件的条件是日志文件大于3KB,只保存最新的10个日志-->
        <File name="allLog" fileName="${LOG_HOME}/all.log">
            <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!--&lt;!&ndash;Appender 2. è¾“出到滚动保存的文件, è§¦å‘保存日志文件的条件是日志文件大于3KB,只保存最新的10个日志&ndash;&gt;-->
        <!--<File name="allLog" fileName="${LOG_HOME}/all.log">-->
            <!--<ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--<PatternLayout charset="UTF-8" pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
        <!--</File>-->
        <!--Appender 3. è¾“出到滚动保存的文件, è§¦å‘保存日志文件的条件是日志文件大于3KB,只保存最新的10个日志-->
        <RollingFile name="debugLog" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug-%i.log">
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%F:%L] - %m%n"/>
            <SizeBasedTriggeringPolicy size="3KB"/>
            <!-- DefaultRolloverStrategy ä¸­çš„参数max,可以限制 SizeBasedTriggeringPolicy中size超出后,只保留max个存档-->
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <!--&lt;!&ndash;Appender 3. è¾“出到滚动保存的文件, è§¦å‘保存日志文件的条件是日志文件大于3KB,只保存最新的10个日志&ndash;&gt;-->
        <!--<RollingFile name="debugLog" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug-%i.log">-->
            <!--<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--<PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%F:%L] - %m%n"/>-->
            <!--<SizeBasedTriggeringPolicy size="3KB"/>-->
            <!--&lt;!&ndash; DefaultRolloverStrategy ä¸­çš„参数max,可以限制 SizeBasedTriggeringPolicy中size超出后,只保留max个存档&ndash;&gt;-->
            <!--<DefaultRolloverStrategy max="10"/>-->
        <!--</RollingFile>-->
        <!--Appender 4. è¾“出到滚动保存的文件, è§¦å‘保存日志文件的条件是每分钟第一次的日志事件。ERROR日志是按分钟产生日志 -->
        <RollingFile name="errorLog" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd_HH-mm}.log">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%C:%F:%L] - %m%n"/>
            <TimeBasedTriggeringPolicy/>
        </RollingFile>
        <!--&lt;!&ndash;Appender 4. è¾“出到滚动保存的文件, è§¦å‘保存日志文件的条件是每分钟第一次的日志事件。ERROR日志是按分钟产生日志 &ndash;&gt;-->
        <!--<RollingFile name="errorLog" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd_HH-mm}.log">-->
            <!--<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--<PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%C:%F:%L] - %m%n"/>-->
            <!--<TimeBasedTriggeringPolicy/>-->
        <!--</RollingFile>-->
        <RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <!--日志文件最大值 ç¬¬äºŒå¤©åŽ‹ç¼©-->
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
        </RollingFile>
        <!--<RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz">-->
            <!--<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
            <!--&lt;!&ndash;日志文件最大值 ç¬¬äºŒå¤©åŽ‹ç¼©&ndash;&gt;-->
            <!--<Policies>-->
                <!--<TimeBasedTriggeringPolicy/>-->
                <!--<SizeBasedTriggeringPolicy size="10 MB"/>-->
            <!--</Policies>-->
        <!--</RollingFile>-->
    </appenders>
    <!--root é»˜è®¤åŠ è½½-->
    <loggers>
        <root level="INFO">
            <appender-ref ref="Console"/>
            <!--<appender-ref ref="allLog"/>-->
            <appender-ref ref="debugLog"/>
            <appender-ref ref="errorLog"/>
            <appender-ref ref="RollingFile"/>
        </root>
    </loggers>
</configuration>
    <!--</appenders>-->
    <!--&lt;!&ndash;root é»˜è®¤åŠ è½½&ndash;&gt;-->
    <!--<loggers>-->
        <!--<root level="INFO">-->
            <!--<appender-ref ref="Console"/>-->
            <!--&lt;!&ndash;<appender-ref ref="allLog"/>&ndash;&gt;-->
            <!--<appender-ref ref="debugLog"/>-->
            <!--<appender-ref ref="errorLog"/>-->
            <!--<appender-ref ref="RollingFile"/>-->
        <!--</root>-->
    <!--</loggers>-->
<!--</configuration>-->
src/main/resources/mapper/RealTimeDataMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.flightfeather.uav.domain.mapper.RealTimeDataMapper">
  <resultMap id="BaseResultMap" type="com.flightfeather.uav.domain.entity.RealTimeData">
    <!--
      WARNING - @mbg.generated
    -->
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="device_code" jdbcType="VARCHAR" property="deviceCode" />
    <result column="latitude" jdbcType="DECIMAL" property="latitude" />
    <result column="longitude" jdbcType="DECIMAL" property="longitude" />
    <result column="altitude" jdbcType="REAL" property="altitude" />
    <result column="height" jdbcType="REAL" property="height" />
    <result column="data_time" jdbcType="TIMESTAMP" property="dataTime" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
  </resultMap>
  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.flightfeather.uav.domain.entity.RealTimeData">
    <!--
      WARNING - @mbg.generated
    -->
    <result column="factors" jdbcType="LONGVARCHAR" property="factors" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--
      WARNING - @mbg.generated
    -->
    id, device_code, latitude, longitude, altitude, height, data_time, create_time
  </sql>
  <sql id="Blob_Column_List">
    <!--
      WARNING - @mbg.generated
    -->
    factors
  </sql>
</mapper>