1. 根据新的协议,扩展了设备编号的位数从1位至6位;
2. 新增监测因子无人机高度;
| | |
| | | package com.flightfeather.uav |
| | | |
| | | import com.flightfeather.uav.socket.SocketServerClient |
| | | import com.flightfeather.uav.socket.UnderwaySocketServer |
| | | import org.springframework.boot.ApplicationRunner |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication |
| | | import org.springframework.boot.runApplication |
| | |
| | | |
| | | @Bean |
| | | fun runner() = ApplicationRunner{ |
| | | SocketServerClient().startServer(9030) |
| | | UnderwaySocketServer().startServer(9030) |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | @GetMapping("/sec") |
| | | fun getSecondData( |
| | | @RequestParam(value = "deviceCode", required = false) deviceCode: String?, |
| | | @RequestParam(value = "startTime", required = false) startTime: String?, |
| | | @RequestParam(value = "endTime", required = false) endTime: String?, |
| | | @RequestParam(value = "page", required = false) page: Int?, |
| | | @RequestParam(value = "perPage", required = false) perPage: Int? |
| | | @RequestParam(value = "deviceCode", required = false) deviceCode: String?, |
| | | @RequestParam(value = "startTime", required = false) startTime: String?, |
| | | @RequestParam(value = "endTime", required = false) endTime: String?, |
| | | @RequestParam(value = "page", required = false) page: Int?, |
| | | @RequestParam(value = "perPage", required = false) perPage: Int? |
| | | ) = realTimeDataService.getSecondData(deviceCode, startTime, endTime, page, perPage) |
| | | |
| | | @GetMapping("/sec/next") |
ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/socket/SocketServerClient.kt ÐÞ¸Ä |
| | |
| | | import io.netty.handler.codec.string.StringEncoder |
| | | import java.nio.charset.Charset |
| | | |
| | | /** |
| | | * socketé¿è¿æ¥æå¡ç«¯ |
| | | * 2019.8.26 |
| | | * @author riku |
| | | */ |
| | | class SocketServerClient { |
| | | /********************************************************************************* |
| | | * èµ°èªçæµæ°æ®socketé¿è¿æ¥æå¡ç«¯ |
| | | * ç¨äºæ¥æ¶è§£æèµ°èªçæµæ°æ®ï¼åç«¯çæµè®¾å¤ç®åå
æ¬è½¦è½½èµ°èªãæ 人æºèµ°èªä»¥åæ 人è¹èµ°èªä¸ç§ç±»å |
| | | * *******************************************************************************/ |
| | | class UnderwaySocketServer { |
| | | |
| | | private val bossGroup = NioEventLoopGroup() |
| | | private val workerGroup = NioEventLoopGroup() |
| | |
| | | //æ°æ®ä¸çä¿çåèæ° |
| | | const val RESERVED_DATA_COUNT = 12 |
| | | |
| | | //ä¸ä¸ªå¨æçæµå åç屿§æå åèæ° |
| | | //å¨æçæµå åæå åèæ°,ä¸å使°å¯¹åºä¸åçç»åçç¥ |
| | | const val FACTOR_BIT_LENGTH_1 = 6 |
| | | |
| | | //ä¸ä¸ªä¿ççæµå åç屿§æå åèæ° |
| | | const val FACTOR_BIT_LENGTH_2 = 3 |
| | | |
| | | const val FACTOR_BIT_LENGTH_3 = 2 |
| | | } |
| | | } |
| | |
| | | * |
| | | * æ°æ®åå
æç
§å½ä»¤åå
çç±»åå
±æä»¥ä¸å ç§ç±»åï¼ |
| | | * å½ä»¤åå
@see [AirCommandUnit] |
| | | * ç¼ç (byte) å®ä¹ |
| | | * 0x01 车è¾ç»å
¥ |
| | | * 0x02 宿¶ä¿¡æ¯ä¸æ¥ |
| | | * 0x03 è¡¥åä¿¡æ¯ä¸æ¥ |
| | | * 0x04 车è¾ç»åº |
| | | * 0x05 ç»ç«¯æ ¡æ¶ |
| | | * 0x06~0x7f ä¸è¡æ°æ®ç³»ç»é¢ç |
| | | */ |
| | | interface DataUnitDecoder { |
| | | |
| | |
| | | class DataPackageDecoderImpl : DataPackageDecoder { |
| | | |
| | | companion object { |
| | | // æ°æ®å¤´ |
| | | const val HEAD_BYTES = 1 |
| | | // çæµåæ°ç¡®è®¤æä»¤ä½ |
| | | const val COMMAND_UNIT_BYTES = 1 |
| | | const val DEVICE_CODE_BYTES = 1 |
| | | // 设å¤ç±»å |
| | | const val DEVICE_CODE_BYTES = 6 |
| | | // æ¬æ¬¡çæµç空æ°å åæ°é |
| | | const val DATA_LENGTH = 1 |
| | | // æ ¡éª |
| | | const val BCC_BYTES = 2 |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | override fun getDeviceCode(b: List<String>): String? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES)) { |
| | | //2021/1/7 '0A'代表车载设å¤ï¼'0B'代表æ 人æºè®¾å¤ |
| | | //2021/1/7 '0A'代表车载设å¤ï¼'0B'代表æ 人æºè®¾å¤ï¼'0C'ä¸ºç½æ ¼åçæµ |
| | | val s = StringBuilder() |
| | | repeat(DEVICE_CODE_BYTES) { |
| | | s.append(b[HEAD_BYTES + COMMAND_UNIT_BYTES + it]) |
| | |
| | | } |
| | | |
| | | override fun getCheckCode(b: List<String>): Int? { |
| | | return if (b.size >= 5) { |
| | | return if (b.size >= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + BCC_BYTES) { |
| | | val hexNum = "${b[b.size - 2]}${b[b.size - 1]}" |
| | | |
| | | hexNum.toIntOrNull(16) |
| | |
| | | } |
| | | 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 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 |
| | |
| | | VELOCITY(14, "VELOCITY", 3),//é度 |
| | | TIME(15, "TIME", 6),//æ¶é´ |
| | | WIND_SPEED(16, "WIND_SPEED", 3), |
| | | WIND_DIRECTION(17, "WIND_DIRECTION", 2); |
| | | WIND_DIRECTION(17, "WIND_DIRECTION", 2), |
| | | HEIGHT(18, "HEIGHT", 3); |
| | | |
| | | companion object { |
| | | |
| | |
| | | TIME.value -> TIME |
| | | WIND_SPEED.value -> WIND_SPEED |
| | | WIND_DIRECTION.value -> WIND_DIRECTION |
| | | HEIGHT.value -> HEIGHT |
| | | else -> null |
| | | } |
| | | } |