riku
2020-12-11 4cb662daa3d2760cc4c892e58f73cbf10b265f6f
新增经纬度、和时间的解析逻辑
已修改4个文件
168 ■■■■ 文件已修改
src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/repository/impl/AirDataRepositoryImpl.kt
@@ -3,9 +3,12 @@
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.AirData
import com.flightfeather.uav.socket.bean.AirDataPackage
import com.flightfeather.uav.socket.eunm.FactorType
import com.google.gson.Gson
import org.springframework.stereotype.Repository
import java.util.*
/**
 * @author riku
@@ -15,7 +18,6 @@
class AirDataRepositoryImpl(private val realTimeDataMapper: RealTimeDataMapper): AirDataRepository {
    override fun saveAirData(dataPackage: AirDataPackage): Int {
        val data = RealTimeData().apply {
            deviceCode = dataPackage.deviceCode
            latitude
@@ -25,6 +27,25 @@
            factors = Gson().toJson(dataPackage.dataUnit)
            dataTime = dataPackage.dataTime
        }
        dataPackage.dataUnit.forEach {
            if (it is AirData) {
                when (it.factorId?.toInt()) {
                    FactorType.LAT.value -> {
                        data.latitude = it.factorData?.toBigDecimal()
                    }
                    FactorType.LNG.value -> {
                        data.longitude = it.factorData?.toBigDecimal()
                    }
                    FactorType.TIME.value -> {
                        it.factorData?.let { f-> Date(f)}?.let {d ->
                            data.dataTime = d
                        }
                    }
                }
            }
        }
        realTimeDataMapper.insert(data)
        return 0
src/main/kotlin/com/flightfeather/uav/socket/bean/AirData.kt
@@ -4,12 +4,17 @@
 * @author riku
 * Date: 2020/6/10
 */
class AirData:DataUnit(){
class AirData : DataUnit() {
    var factorId: String? = null
    var factorName: String? = null
    var sensorId: String? = null
    //监测因子实际值
    var factorData: Double? = null
    var factorData: Long? = null
    //监测因子物理量(电压)
    var physicalQuantity: Double? = null
    var physicalQuantity: Long? = null
    //状态位
    var statusList: List<String>? = null
}
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataUnitDecoderImpl.kt
@@ -6,6 +6,7 @@
import com.flightfeather.uav.socket.decoder.DataUnitDecoder
import com.flightfeather.uav.socket.eunm.FactorType
import org.slf4j.LoggerFactory
import java.text.SimpleDateFormat
/**
 * @author riku
@@ -38,49 +39,112 @@
            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 data1 = a1 + b1
                    resultList.add(AirData().apply {
                        factorId = it.factorType.value?.toString()
                        factorName = it.factorType.des
                        factorData = data1
                    })
                }
                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()
            when (it.factorType) {
                FactorType.LNG -> {
                    val valid = b[i].toInt(16).toChar()//经纬度是否有效(有效: A; 无效: V)
                    val a1 = b[i + 1].toInt(16)
                    val b1 = b[i + 2].toInt(16)
                    var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toLong()
                    while (b2 >= 1) {
                        b2 /= 10
                    }
                    val data2 = a2 + b2
                    val lng = a1 + (b1 + b2) / 60
                    val s = b[i + 5].toInt(16).toChar()
                    resultList.add(AirData().apply {
                        factorId = it.factorType.value?.toString()
                        factorName = it.factorType.des
                        factorData = data1
                        physicalQuantity = data2
                        factorData = lng
                        statusList = listOf(valid.toString(), s.toString())
                    })
                }
                FactorType.LAT -> {
                    val a1 = b[i].toInt(16)
                    val b1 = b[i + 1].toInt(16)
                    var b2 = "${b[i + 2]}${b[i + 3]}".toInt(16).toLong()
                    while (b2 >= 1) {
                        b2 /= 10
                    }
                    val lat = a1 + (b1 + b2) / 60
                    val s = b[i + 4].toInt(16).toChar()
                    resultList.add(AirData().apply {
                        factorId = it.factorType.value.toString()
                        factorName = it.factorType.des
                        factorData = lat
                        statusList = listOf(s.toString())
                    })
                }
                FactorType.TIME -> {
                    val year = b[i].toInt(16).toString().run { numberFormat(this) }
                    val month = b[i+1].toInt(16).toString().run { numberFormat(this) }
                    val day = b[i+2].toInt(16).toString().run { numberFormat(this) }
                    val hour = b[i+3].toInt(16).toString().run { numberFormat(this) }
                    val minute = b[i+4].toInt(16).toString().run { numberFormat(this) }
                    val second = b[i + 5].toInt(16).toString().run { numberFormat(this) }
                    val date = "20$year-$month-$day $hour:$minute:$second"
                    val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).time
                    resultList.add(AirData().apply {
                        factorId = it.factorType.value.toString()
                        factorName = it.factorType.des
                        factorData = time
                        statusList = listOf(date)
                    })
                }
                else -> {
                    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).toLong()
                            while (b1 >= 1) {
                                b1 /= 10
                            }
                            val data1 = a1 + b1
                            resultList.add(AirData().apply {
                                factorId = it.factorType.value?.toString()
                                factorName = it.factorType.des
                                factorData = data1
                            })
                        }
                        AirDataPackage.FACTOR_BIT_LENGTH_1 -> {
                            //数据实际值(3位字节表示)
                            val a1 = "${b[i]}${b[i + 1]}".toInt(16)
                            var b1 = b[i + 2].toInt(16).toLong()
                            while (b1 >= 1) {
                                b1 /= 10
                            }
                            val data1 = a1 + b1
                            //数据物理量(3位字节表示)
                            val a2 = "${b[i+3]}${b[i + 4]}".toInt(16)
                            var b2 = b[i + 5].toInt(16).toLong()
                            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
    }
    private fun numberFormat(num: String) =
            if (num.length < 2) {
                "0$num"
            } else {
                num
            }
}
src/main/kotlin/com/flightfeather/uav/socket/eunm/FactorType.kt
@@ -14,10 +14,12 @@
    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);//纬度
    VOC(10, "VOC",6),
    NOI(11, "NOI",6),//负氧离子
    LNG(12,"LNG",6),//经度
    LAT(13,"LAT",5),//纬度
    VELOCITY(14, "VELOCITY", 3),//速度
    TIME(15, "TIME", 6);//时间
    companion object {
@@ -35,6 +37,8 @@
            NOI.value -> NOI
            LNG.value -> LNG
            LAT.value -> LAT
            VELOCITY.value -> VELOCITY
            TIME.value -> TIME
            else -> null
        }
    }