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"?>--> <!--<!–--> <!--6个ä¼å 级ä»é«å°ä½ä¾æ¬¡ä¸ºï¼OFFãFATALãERRORãWARNãINFOãDEBUGãTRACEã ALLã--> <!--å¦æè®¾ç½®ä¼å 级为WARNï¼é£ä¹OFFãFATALãERRORãWARN 4个级å«çlogè½æ£å¸¸è¾åº--> <!--设置为OFF 表示ä¸è®°å½log4j2æ¬èº«çæ¥å¿ï¼--> <!--–>--> <!-- statusï¼ç¨æ¥æå®log4jæ¬èº«çæå°æ¥å¿çº§å«,monitorInterval:æå®log4jèªå¨éæ°é ç½®ççæµé´éæ¶é´ --> <configuration status="INFO" monitorInterval="30"> <!-- èªå·±è®¾ç½®å±æ§ï¼åé¢éè¿${}æ¥è®¿é® --> <properties> <property name="LOG_HOME">../obdLogs</property> </properties> <!--<!– statusï¼ç¨æ¥æå®log4jæ¬èº«çæå°æ¥å¿çº§å«,monitorInterval:æå®log4jèªå¨éæ°é ç½®ççæµé´éæ¶é´ –>--> <!--<configuration status="INFO" monitorInterval="30">--> <!--<!– èªå·±è®¾ç½®å±æ§ï¼åé¢éè¿${}æ¥è®¿é® –>--> <!--<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>--> <!--<!–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>--> <!--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> <!--<!–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>--> <!--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> <!--<!–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>--> <!--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> <!--<!–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>--> <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"/>--> <!--<!–æ¥å¿æä»¶æå¤§å¼ 第äºå¤©å缩–>--> <!--<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>--> <!--<!–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>--> 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>