diff --git a/sec-api/pom.xml b/sec-api/pom.xml index 582f4f80..e94378fe 100644 --- a/sec-api/pom.xml +++ b/sec-api/pom.xml @@ -56,6 +56,17 @@ spring-boot-starter-test test + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + com.google.code.findbugs + jsr305 + + + diff --git a/sec-api/src/main/java/com/imdroid/secapi/client/BeidouClient.java b/sec-api/src/main/java/com/imdroid/secapi/client/BeidouClient.java new file mode 100644 index 00000000..11f0ea22 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/client/BeidouClient.java @@ -0,0 +1,18 @@ +package com.imdroid.secapi.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name="BeidouClient",url = "http://localhost:8668/api") +public interface BeidouClient { + @PostMapping("/config_ack") + String onConfigAck(@RequestParam(name = "deviceId") String deviceId, @RequestParam(name = "configAck") String configAck); + + @PostMapping("/device_active") + String onDeviceActive(@RequestParam(name = "deviceId") String deviceId); + + @PostMapping("/device_stop") + String onDeviceStop(@RequestParam(name = "deviceId") String deviceId); + +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/client/HttpResp.java b/sec-api/src/main/java/com/imdroid/secapi/client/HttpResp.java new file mode 100644 index 00000000..c25bc5c4 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/client/HttpResp.java @@ -0,0 +1,15 @@ +package com.imdroid.secapi.client; + +import lombok.Data; + +@Data +public class HttpResp { + public static int HTTP_RSP_OK = 0; + public static int HTTP_RSP_FAILED = -1; + private int code = HTTP_RSP_OK; + private String responseMessage; + private String responseType; + private int rows; + private T responseObject; + +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java b/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java new file mode 100644 index 00000000..20f989dc --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java @@ -0,0 +1,11 @@ +package com.imdroid.secapi.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name="RtcmClient",url = "http://localhost:9904/gnss") +public interface RtcmClient { + @PostMapping("/config") + HttpResp config(@RequestParam(name = "deviceId") String deviceId, @RequestParam(name = "configuration") String configData); +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java index 333460cc..a1033b00 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java @@ -15,6 +15,9 @@ import java.sql.Timestamp; @Data @TableName(value = "gnssdevices") public class GnssDevice { + public static final short TYPE_ROVER = 0; + public static final short TYPE_REFERENCE_STATION = 1; + @TableId(value = "id", type = IdType.AUTO) private Long id; private Short opmode; @@ -28,12 +31,11 @@ public class GnssDevice { private Integer devicetype; private Integer tenantid; private String tenantname; - private String gnssconfiguration; private Integer project_id = 0; - private Integer group_id = 1; + private Integer group_id = 1; //组参数,缓存自动下发 private Integer calc_group_id = 1; private Integer fwd_group_id = 0; - private Boolean syn; + private Boolean syn; //组参数是否同步 private String pictures; public String getObjectName(){ diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java index 1868b7fc..923122c8 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java @@ -1,6 +1,7 @@ package com.imdroid.secapi.dto; import com.baomidou.mybatisplus.annotation.TableName; +import com.imdroid.secapi.utils.HexUtil; import lombok.Data; import java.io.Serializable; @@ -13,11 +14,24 @@ import java.io.Serializable; @Data @TableName(value = "gnssgroup") public class GnssGroup implements Serializable { + public final static short LOW_POWER_MODE = 0; + public final static short NORMAL_POWER_MODE = 1; Integer id; int work_cycle; int active_time; int active_offset; - short sample; + short rs_adv; // reference station only short power_mode; int device_num; + + public String getConfigCmd(GnssDevice device){ + String cmd = "D3110009"; + cmd += HexUtil.Int2HexString(Integer.parseInt(device.getDeviceid())) + +HexUtil.Byte2HexString((byte) work_cycle) + +HexUtil.Byte2HexString((byte) active_time) + +HexUtil.Byte2HexString((byte) active_offset) + +((device.getDevicetype() == GnssDevice.TYPE_ROVER)?"00":HexUtil.Byte2HexString((byte) rs_adv)) + +HexUtil.Byte2HexString((byte) power_mode); + return cmd; + } } diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssMsg.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssMsg.java new file mode 100644 index 00000000..243f21df --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssMsg.java @@ -0,0 +1,25 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.sql.Timestamp; + +/** + * GNSS收发统计消息,每个工作周期结束的时候统计一次 + * + * @author LiGang + */ +@Data +@TableName(value = "gnssmsg") +public class GnssMsg { + @TableId(value = "id", type = IdType.AUTO) + Long id; + Timestamp createtime; + String deviceid; + int msgtype; + int msglen; + String content;//只记录部分 +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssMsgMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssMsgMapper.java new file mode 100644 index 00000000..08a877d2 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssMsgMapper.java @@ -0,0 +1,10 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + + +@Mapper +public interface GnssMsgMapper extends BaseMapper { + +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMsgMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMsgMapper.java index 0029e32b..9507d02d 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMsgMapper.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMsgMapper.java @@ -1,10 +1,10 @@ package com.imdroid.secapi.dto; -import com.github.yulichang.base.MPJBaseMapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface GnssStatusMsgMapper extends MPJBaseMapper { +public interface GnssStatusMsgMapper extends BaseMapper { } diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsgMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsgMapper.java index 9debbcb3..1c9523d8 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsgMapper.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsgMapper.java @@ -1,10 +1,10 @@ package com.imdroid.secapi.dto; -import com.github.yulichang.base.MPJBaseMapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface GnssTrxMsgMapper extends MPJBaseMapper { +public interface GnssTrxMsgMapper extends BaseMapper { } diff --git a/sec-api/src/main/java/com/imdroid/secapi/utils/HexUtil.java b/sec-api/src/main/java/com/imdroid/secapi/utils/HexUtil.java new file mode 100644 index 00000000..9b94d8a6 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/utils/HexUtil.java @@ -0,0 +1,69 @@ +package com.imdroid.secapi.utils; + +public class HexUtil { + static public String Byte2HexString(byte value){ + String sv = ""; + byte bv = (byte) ((value >> 4)&0x0F); + if(bv<10) sv+=bv; + else sv+=(char) ('A'+bv-10); + + bv = (byte) (value & 0x0F); + if(bv<10) sv+=bv; + else sv+=(char) ('A'+bv-10); + + return sv; + } + + static public String Short2HexString(short value){ + String sv = ""; + sv += Byte2HexString((byte) (value>>8)); + sv += Byte2HexString((byte) (value)); + return sv; + } + + static public String Int2HexString(int value){ + String sv = ""; + sv += Byte2HexString((byte) (value>>24)); + sv += Byte2HexString((byte) (value>>16)); + sv += Byte2HexString((byte) (value>>8)); + sv += Byte2HexString((byte) (value)); + return sv; + } + + static public String String2HexString(String value){ + byte[] data = value.getBytes(); + String sv = ""; + for(int i=0; i< data.length; i++) sv += Byte2HexString(data[i]); + return sv; + } + + static public String HexString2String(String value){ + String sv =""; + int pos=0; + int trans=0; + short bv = 0; + while(pos='0'){ + bv = (short) (bv*16 + ch - '0'); + trans++; + } + else if(ch<='F' && ch>='A'){ + bv = (short) (bv*16 + ch - 'A' + 10); + trans++; + } + else if(ch<='f' && ch>='a'){ + bv = (short) (bv*16 + ch - 'a' + 10); + trans++; + } + if(trans==2) { + sv += (char) bv; + bv = 0; + trans = 0; + } + pos++; + } + return sv; + } + +} diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/SideSlopeRtcmApp.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/SideSlopeRtcmApp.java index c6ab4f16..46090a1c 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/SideSlopeRtcmApp.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/SideSlopeRtcmApp.java @@ -4,6 +4,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -17,7 +18,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @ComponentScan({"io.dt20.*", "com.imdroid.*"}) @EntityScan({"io.dt20.common.persistence", "com.imdroid.*"}) @EnableJpaRepositories({"io.dt20.common.repo", "com.imdroid.*"}) - +@EnableFeignClients(basePackages = "com.imdroid.*") public class SideSlopeRtcmApp { public static void main(String[] args) { diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D31xConfigAckMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D31xConfigAckMessageExecutor.java index 52ef6685..71945d18 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D31xConfigAckMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D31xConfigAckMessageExecutor.java @@ -1,7 +1,9 @@ package com.imdroid.sideslope.executor; +import com.imdroid.secapi.client.BeidouClient; +import com.imdroid.sideslope.bd.ByteUtil; import com.imdroid.sideslope.message.D31xConfigAckMessage; -import com.imdroid.sideslope.message.D3F0SelfCheckMessage; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -10,14 +12,18 @@ import org.springframework.stereotype.Component; */ @Component public class D31xConfigAckMessageExecutor implements Executor { + @Autowired + private BeidouClient beidouClient; @Override public Void execute(D31xConfigAckMessage message) { + // 转发应答 + beidouClient.onConfigAck(message.getId(), ByteUtil.bytesToHexString(message.getSrcData())); return null; } @Override public Class getMessageType() { - return D3F0SelfCheckMessage.class; + return D31xConfigAckMessage.class; } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java index a0856e3f..36a70a0c 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java @@ -1,5 +1,6 @@ package com.imdroid.sideslope.executor; +import com.imdroid.secapi.client.BeidouClient; import com.imdroid.sideslope.message.D3F0SelfCheckMessage; import com.imdroid.sideslope.service.DataPersistService; import com.imdroid.sideslope.util.ThreadManager; @@ -15,9 +16,13 @@ public class D3F0SelfCheckMessageExecutor implements Executor { dataPersistService.saveDeviceState(message); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java index f52fa116..7ddff108 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java @@ -1,5 +1,6 @@ package com.imdroid.sideslope.executor; +import com.imdroid.secapi.client.BeidouClient; import com.imdroid.sideslope.message.D3F2StopIndicationMessage; import com.imdroid.sideslope.sal.DeviceService; import com.imdroid.sideslope.service.DataPersistService; @@ -23,6 +24,8 @@ public class D3F2StopIndicationMessageExecutor implements Executor { deviceService.updateLatestDataTime(message.getId(), now); }); + + // 通知beidou服务 + beidouClient.onDeviceStop(message.getId()); + return null; } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/BaseMessage.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/BaseMessage.java index 1ff53010..b2753ad4 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/BaseMessage.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/BaseMessage.java @@ -8,7 +8,7 @@ import io.netty.buffer.ByteBuf; * @date 2023/2/2 20:32 */ public abstract class BaseMessage { - protected byte[] header; + protected short header; protected String id; protected int len; protected int pps; @@ -19,8 +19,7 @@ public abstract class BaseMessage { if (shouldDecodeHeader()) { // read操作会移动ByteBuf内部指针,除D331外,其他都用read来读 int packetLen = src.readableBytes(); - this.header = new byte[2]; - src.readBytes(header); + this.header = src.readShort(); this.len = src.readUnsignedShort(); this.id = String.valueOf(src.readUnsignedInt()); @@ -39,11 +38,11 @@ public abstract class BaseMessage { return true; } - public byte[] getHeader() { + public short getHeader() { return header; } - public void setHeader(byte[] header) { + public void setHeader(short header) { this.header = header; } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D31xConfigAckMessage.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D31xConfigAckMessage.java index 49a6b412..a0da51c4 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D31xConfigAckMessage.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D31xConfigAckMessage.java @@ -12,8 +12,7 @@ public class D31xConfigAckMessage extends BaseMessage { @Override public void decodeBody(ByteBuf src) { // get操作不会移动指针,这样可以确保整个全转发出去 - this.header = new byte[2]; - src.getBytes(0, header); // flag + this.header = src.getShort(0); // flag this.len = src.getUnsignedShort(2); // length this.id = String.valueOf(src.getUnsignedInt(4)); //id if (src.readableBytes() - 4 != this.len) { diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java index 8fe2cf85..ad029d3b 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D331RtcmMessage.java @@ -12,8 +12,7 @@ public class D331RtcmMessage extends BaseMessage { @Override public void decodeBody(ByteBuf src) { // get操作不会移动指针,这样可以确保整个全转发出去 - this.header = new byte[2]; - src.getBytes(0, header); // flag + this.header = src.getShort(0); // flag this.len = src.getUnsignedShort(2); // length this.id = String.valueOf(src.getUnsignedInt(4)); //id if (src.readableBytes() - 4 != this.len) { diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/server/DeviceChannel.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/server/DeviceChannel.java index f78328d1..a206d0fd 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/server/DeviceChannel.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/server/DeviceChannel.java @@ -52,10 +52,9 @@ public class DeviceChannel { } } - public void updateRxBytes(int bytes, byte[] header){ + public void updateRxBytes(int bytes, short header){ rxbytes += bytes; - int gnss_bytes = header[0]<<8 | header[1]; - if(gnss_bytes == 0xd331) d3xxbytes += bytes; - else if(gnss_bytes == 0xd341) b562bytes += bytes; + if(header == (short) 0xd331) d3xxbytes += bytes; + else if(header == (short)0xd341) b562bytes += bytes; } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java index c9eb2c41..b8869ef7 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java @@ -4,7 +4,10 @@ import com.imdroid.sideslope.message.D3F0SelfCheckMessage; import com.imdroid.sideslope.message.D3F2StopIndicationMessage; /** - * 设备数据持久化接口 + * 设备数据持久化接口,保存: + * 1)消息内容:自检消息、停止消息、配置消息和应答 + * 2)设备状态:解析自检消息 + * 3)收发统计:解析停止消息,以及channel收发统计 * * @author LiGang */ @@ -13,4 +16,5 @@ public interface DataPersistService { void saveDeviceState(D3F0SelfCheckMessage d3F0SelfCheckMessage); void saveDeviceTrxStat(D3F2StopIndicationMessage d3F2StopIndicationMessage); + } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java index 9f3afe39..24ad9178 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java @@ -1,11 +1,14 @@ package com.imdroid.sideslope.service; import com.imdroid.secapi.dto.*; +import com.imdroid.sideslope.message.BaseMessage; import com.imdroid.sideslope.message.D3F0SelfCheckMessage; import com.imdroid.sideslope.message.D3F2StopIndicationMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.sql.Timestamp; + /** * 设备数据持久化实现 * @@ -22,6 +25,8 @@ public class DataPersistServiceImpl implements DataPersistService { @Autowired private GnssTrxMsgMapper trxMsgMapper; + @Autowired + private GnssMsgMapper msgMapper; @Override public void saveDeviceState(D3F0SelfCheckMessage message) { @@ -54,6 +59,9 @@ public class DataPersistServiceImpl implements DataPersistService { if(new_flag) deviceStateRepository.insert(deviceState); else deviceStateRepository.updateById(deviceState); + // 保存消息摘要 + saveMsg(message); + } catch (Exception e) { e.printStackTrace(); } @@ -64,6 +72,8 @@ public class DataPersistServiceImpl implements DataPersistService { try { // 添加到trxmsg里 trxMsgMapper.insert(message.getTrxMsg()); + // 保存消息摘要 + saveMsg(message); // 检测该对象是否已存在 GnssStatus deviceState = deviceStateRepository.getByDeviceId(message.getId()); @@ -77,10 +87,18 @@ public class DataPersistServiceImpl implements DataPersistService { deviceState.setState(GnssStatus.STATE_IDLE); deviceStateRepository.updateById(deviceState); } - } catch (Exception e) { e.printStackTrace(); } } + void saveMsg(BaseMessage message){ + GnssMsg gnssMsg = new GnssMsg(); + gnssMsg.setCreatetime(new Timestamp(System.currentTimeMillis())); + gnssMsg.setDeviceid(message.getId()); + gnssMsg.setMsgtype(((int)message.getHeader())&0xFFFF); + gnssMsg.setMsglen(message.getLen()); + msgMapper.insert(gnssMsg); + } + } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java index 7f79acb7..077942c3 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java @@ -1,5 +1,6 @@ package com.imdroid.sideslope.web; +import com.imdroid.secapi.client.HttpResp; import com.imdroid.sideslope.calc.GNSSCalcService; import com.imdroid.sideslope.server.DeviceChannel; import com.imdroid.sideslope.server.OnlineChannels; @@ -9,6 +10,7 @@ import io.netty.buffer.Unpooled; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,39 +31,12 @@ public class ApiController { @Autowired private GNSSCalcService gnssCalcService; - @RequestMapping(value = "/config") + @PostMapping(value = "/config") public HttpResp config(String deviceId, String configuration) { Map status = new HashMap<>(); HttpResp resp = new HttpResp(); - OnlineChannels.INSTANCE - .get(deviceId) - .filter(DeviceChannel::isOnline) - .ifPresent(x -> { - status.put("status", "Online"); - status.put("lastUpdate", x.getLastTime()); - // send command - ByteBuf buf = Unpooled.buffer(); - byte[] data = getBinaryData(ConfigDataTypeEnum.JSON, configuration); - logger.info("send command:{}", configuration); - buf.writeBytes(data); - x.writeAndFlush(buf); - }); - if (status.isEmpty()) { - status.put("status", "Offline"); - resp.setResponseCode("-10001"); - resp.setResponseMessage("Offline."); - } else { - resp.setResponseMessage("Command sent."); - } - resp.setResponseObject(status); - return resp; - } - - @RequestMapping(value = "/gnssconfig") - public HttpResp gnssConfig(String deviceId, String configuration) { - Map status = new HashMap<>(); - HttpResp resp = new HttpResp(); - OnlineChannels.INSTANCE + OnlineChannels onlineChannels = OnlineChannels.INSTANCE; + onlineChannels .get(deviceId) .filter(DeviceChannel::isOnline) .ifPresent(x -> { @@ -76,7 +51,7 @@ public class ApiController { }); if (status.isEmpty()) { status.put("status", "Offline"); - resp.setResponseCode("-10001"); + resp.setCode(HttpResp.HTTP_RSP_FAILED); resp.setResponseMessage("Offline."); } else { resp.setResponseMessage("Command sent."); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/HttpResp.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/HttpResp.java deleted file mode 100644 index 4cbeb83c..00000000 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/HttpResp.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.imdroid.sideslope.web; - -public class HttpResp { - private String responseCode = "10000"; - private String responseMessage; - private String responseType; - private int rows; - private T responseObject; - - public String getResponseCode() { - return responseCode; - } - - public void setResponseCode(String responseCode) { - this.responseCode = responseCode; - } - - public String getResponseMessage() { - return responseMessage; - } - - public void setResponseMessage(String responseMessage) { - this.responseMessage = responseMessage; - } - - public String getResponseType() { - return responseType; - } - - public void setResponseType(String responseType) { - this.responseType = responseType; - } - - public int getRows() { - return rows; - } - - public void setRows(int rows) { - this.rows = rows; - } - - public T getResponseObject() { - return responseObject; - } - - public void setResponseObject(T responseObject) { - this.responseObject = responseObject; - } -} diff --git a/sec-beidou/pom.xml b/sec-beidou/pom.xml index 31b1d2c0..d74013ac 100644 --- a/sec-beidou/pom.xml +++ b/sec-beidou/pom.xml @@ -9,7 +9,6 @@ 1.0-SNAPSHOT - com.imdroid sec-beidou 0.0.1-SNAPSHOT beidou @@ -123,12 +122,16 @@ 1.0-SNAPSHOT - com.imdroid sec-beidou-rtcm-api + + org.springframework.boot + spring-boot-starter-websocket + + diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/auth/WebMvcConfig.java b/sec-beidou/src/main/java/com/imdroid/beidou/auth/WebMvcConfig.java index 000515aa..8dab760a 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/auth/WebMvcConfig.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/auth/WebMvcConfig.java @@ -21,6 +21,6 @@ public class WebMvcConfig implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor) .addPathPatterns("/**") - .excludePathPatterns("/**/*.js","/**/*.css","/**/*.jpg","/**/*.png", "/do_login", "/mini-register", "/login", "/test/**"); + .excludePathPatterns("/**/*.js","/**/*.css","/**/*.jpg","/**/*.png", "/do_login", "/mini-register", "/login", "/test/**", "/api/**"); } } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java b/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java new file mode 100644 index 00000000..6b76a052 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java @@ -0,0 +1,13 @@ +package com.imdroid.beidou.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + @Bean + public ServerEndpointExporter serverEndpointExporter(){ + return new ServerEndpointExporter(); + } +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/APIController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/APIController.java new file mode 100644 index 00000000..269f4204 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/APIController.java @@ -0,0 +1,107 @@ +package com.imdroid.beidou.controller; + +import com.imdroid.secapi.client.RtcmClient; +import com.imdroid.secapi.dto.*; +import com.imdroid.secapi.utils.HexUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; + +@Controller +public class APIController extends BasicController{ + SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); + @Autowired + RtcmClient rtcmClient; + @Autowired + GnssDeviceMapper deviceMapper; + @Autowired + GnssGroupMapper groupMapper; + @Autowired + GnssMsgMapper msgMapper; + + /****** config ack *******/ + @PostMapping(value = "/api/config_ack") + @ResponseBody + public String onConfigAck(String deviceId, String configAck) { + int msgType = Integer.parseInt(configAck.substring(0,4),16); + // 配置是否成功 + if(msgType == 0xd311){ + //最后一个字节为1表示配置成功,0表示配置失败 + if(configAck.endsWith("01")){ + GnssDevice device = deviceMapper.queryByDeviceId(deviceId); + if(device!=null){ + device.setSyn(true); + deviceMapper.updateById(device); + } + } + } + + // 保存 + saveMsg(deviceId, msgType, configAck); + + // 命令行显示 + String rxInfo = "RX "+ dateFormat.format(System.currentTimeMillis())+ + " "+deviceId+" "; + if(msgType == 0xd31a){ + //转成字符串 + String dtuAck = configAck.substring(9*2); + rxInfo += configAck+"("+HexUtil.HexString2String(dtuAck)+")"; + } + else{ + rxInfo += configAck; + } + + WebSocketServer.sendMessageToAll(rxInfo); + return null; + } + + /****** device active *******/ + @PostMapping(value = "/api/device_active") + @ResponseBody + public String onDeviceActive(String deviceId) { + + // 检查有没有待配置的参数 + GnssDevice device = deviceMapper.queryByDeviceId(deviceId); + if(device!=null && !device.getSyn()){ + GnssGroup gnssGroup = groupMapper.selectById(device.getGroup_id()); + if(gnssGroup != null){ + String config = gnssGroup.getConfigCmd(device); + if(config != null){ + rtcmClient.config(deviceId, config); + // 保存 + saveMsg(deviceId, 0xd311, config); + } + } + } + + return null; + } + + /****** device stop *******/ + @PostMapping(value = "/api/device_stop") + @ResponseBody + public String onDeviceStop(String deviceId) { + + return null; + } + + void saveMsg(String deviceId, int msgType, String content){ + GnssMsg gnssMsg = new GnssMsg(); + gnssMsg.setCreatetime(new Timestamp(System.currentTimeMillis())); + gnssMsg.setDeviceid(deviceId); + gnssMsg.setMsgtype(msgType); + if(content==null) content=""; + gnssMsg.setMsglen(content.length()/2); + int saveContentLen = content.length(); + if(saveContentLen<=128) + gnssMsg.setContent(content); + else + gnssMsg.setContent(content.substring(0,128)); + msgMapper.insert(gnssMsg); + } + +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java new file mode 100644 index 00000000..9a1ceb90 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java @@ -0,0 +1,86 @@ +package com.imdroid.beidou.controller; + +import com.imdroid.beidou.common.HttpResult; +import com.imdroid.secapi.client.HttpResp; +import com.imdroid.secapi.client.RtcmClient; +import com.imdroid.secapi.dto.GnssMsg; +import com.imdroid.secapi.dto.GnssMsgMapper; +import com.imdroid.secapi.utils.HexUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpSession; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.HashMap; + +@Controller +public class CmdLineController extends BasicController{ + SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); + @Autowired + RtcmClient rtcmClient; + @Autowired + GnssMsgMapper msgMapper; + + /**** 推送页面 *****/ + @RequestMapping("/page/cmd_line") + public String gnssDevCfg(Model m, HttpSession session) { + initModel(m, session); + + return "/page/cmd_line"; + } + + /****** 发送指令 *******/ + @PostMapping(value = "/gnss/config_cmd") + @ResponseBody + public HttpResult configCmd(@RequestParam("tx_win") String cmd, + @RequestParam("device_id") String deviceId, + @RequestParam("cmd_type") int cmdType) { + String sendCmd = cmd.replaceAll(" +",""); + short len = (short) (sendCmd.length()/2); + int msgType; + if(cmdType == 0){ // GNSS + msgType = 0xD310; + len += 4; + sendCmd = "D310"+ HexUtil.Short2HexString(len)+ + HexUtil.Int2HexString(Integer.parseInt(deviceId))+sendCmd; + } + else if(cmdType == 1){ // DTU + msgType = 0xD31A; + len += 5; + sendCmd = "D31A"+ HexUtil.Short2HexString(len)+ + HexUtil.Int2HexString(Integer.parseInt(deviceId))+ + "01"+HexUtil.String2HexString(sendCmd); + } + else { + msgType = 0xD311; + len += 4; + sendCmd = "D311"+ HexUtil.Short2HexString(len)+ + HexUtil.Int2HexString(Integer.parseInt(deviceId))+sendCmd; + } + HttpResp> rsp = rtcmClient.config(deviceId,sendCmd); + + String txInfo = "TX "+ dateFormat.format(System.currentTimeMillis())+ + " "+deviceId+" "+sendCmd; + if(cmdType == 1) txInfo += "("+cmd+")"; + if(rsp.getCode() != HttpResp.HTTP_RSP_OK){ + txInfo += "\r\n" + rsp.getResponseMessage(); + } + + // 保存 + GnssMsg gnssMsg = new GnssMsg(); + gnssMsg.setCreatetime(new Timestamp(System.currentTimeMillis())); + gnssMsg.setDeviceid(deviceId); + gnssMsg.setMsgtype(msgType); + gnssMsg.setMsglen(len); + gnssMsg.setContent(cmd); + msgMapper.insert(gnssMsg); + + return HttpResult.success(txInfo); + } +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java index 652b5d9d..a92920e9 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java @@ -1,5 +1,6 @@ package com.imdroid.beidou.controller; +import com.imdroid.secapi.client.RtcmClient; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -37,6 +38,9 @@ public class GnssDeviceController extends BasicController{ @Autowired private GnssStatusMapper gnssStatusMapper; + @Autowired + RtcmClient rtcmClient; + /**** 推送页面 *****/ @RequestMapping("/page/gnss_dev_cfg") public String gnssDevCfg(Model m, HttpSession session) { @@ -118,6 +122,9 @@ public class GnssDeviceController extends BasicController{ //新增或更新 int num = 0; if(null != old_device) { + if(old_device.getGroup_id()!=device.getGroup_id()){ + device.setSyn(false); + } device.setId(old_device.getId()); device.setCreateuser(old_device.getCreateuser()); device.setCreatetime(old_device.getCreatetime()); @@ -126,11 +133,14 @@ public class GnssDeviceController extends BasicController{ else{ device.setCreatetime(new Timestamp(System.currentTimeMillis())); device.setCreateuser((String) session.getAttribute("login_user")); + device.setSyn(false); num = gnssDeviceMapper.insert(device); //id自增 } if (num == 0) { return HttpResult.failed(); - } else return HttpResult.ok(); + } else { + return HttpResult.ok(); + } } @PostMapping("/gnss/device/delete") @@ -236,4 +246,5 @@ public class GnssDeviceController extends BasicController{ jsonObject.put("data", deviceListVOList); return jsonObject; } + } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssMsgController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssMsgController.java new file mode 100644 index 00000000..31abffa9 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssMsgController.java @@ -0,0 +1,81 @@ +package com.imdroid.beidou.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.imdroid.secapi.dto.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class GnssMsgController extends BasicController{ + @Autowired + GnssMsgMapper msgMapper; + @Autowired + GnssStatusMsgMapper statusMsgMapper; + @Autowired + GnssTrxMsgMapper trxMsgMapper; + + /**** 推送页面 *****/ + @RequestMapping("/page/gnss_msg") + public String gnssMsg(){ + return "/page/gnss_msg"; + } + + @RequestMapping("/page/gnss_msg_status") + public String gnssStatusMsg() { + return "/page/gnss_msg_status"; + } + + @RequestMapping("/page/gnss_msg_trx") + public String gnssTrxMsg(){ + return "/page/gnss_msg_trx"; + } + + + /**** 推送数据 *****/ + @RequestMapping("/gnss/msg/list_all") + @ResponseBody + public JSONObject listMsg(int page, int limit) { + Page pageable = new Page<>(page, limit); + IPage cs = msgMapper.selectPage(pageable, null); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", 0); + jsonObject.put("msg", ""); + jsonObject.put("count", cs.getTotal()); + jsonObject.put("data", cs.getRecords()); + return jsonObject; + } + + @RequestMapping("/gnss/msg/list_status") + @ResponseBody + public JSONObject listStatusMsg(int page, int limit) { + Page pageable = new Page<>(page, limit); + IPage cs = statusMsgMapper.selectPage(pageable, null); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", 0); + jsonObject.put("msg", ""); + jsonObject.put("count", cs.getTotal()); + jsonObject.put("data", cs.getRecords()); + return jsonObject; + } + + @RequestMapping("/gnss/msg/list_trx") + @ResponseBody + public JSONObject listTrxMsg(int page, int limit) { + Page pageable = new Page<>(page, limit); + IPage cs = trxMsgMapper.selectPage(pageable, null); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", 0); + jsonObject.put("msg", ""); + jsonObject.put("count", cs.getTotal()); + jsonObject.put("data", cs.getRecords()); + return jsonObject; + } + +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/LayuiController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/LayuiController.java index a36413a3..242a586a 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/LayuiController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/LayuiController.java @@ -40,22 +40,6 @@ public class LayuiController extends BasicController{ return "/page/gnss_data_tools"; } - - @RequestMapping("/page/gnss_msg") - public String gnssMsg()throws Exception { - return "/page/gnss_msg"; - } - - @RequestMapping("/page/gnss_msg_status") - public String gnssMsgStatus()throws Exception { - return "/page/gnss_msg_status"; - } - - @RequestMapping("/page/gnss_msg_trx") - public String gnssMsgTrx()throws Exception { - return "/page/gnss_msg_trx"; - } - @RequestMapping("/page/warning") public String warning()throws Exception { return "/page/warning"; diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java new file mode 100644 index 00000000..84d0303f --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java @@ -0,0 +1,52 @@ +package com.imdroid.beidou.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.ServerEndpoint; +import java.util.concurrent.CopyOnWriteArraySet; + +//单例 +@ServerEndpoint("/websocket") +@Component +@Slf4j +public class WebSocketServer { + // thread safety counter + // thread safety set to hold websocket objects + private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); + + @OnOpen + public void onOpen(Session session){ + webSocketSet.add(session); + log.info("new websocket opened, total socket num: "+ webSocketSet.size()); + + } + + @OnClose + public void onClose(Session session){ + webSocketSet.remove(session); + log.info("websocket closed, total socket num: "+ webSocketSet.size()); + } + + @OnMessage + public void onMessage(String msg, Session session){ + log.info("received msg from "+session.getBasicRemote()); + } + + @OnError + public void onError(Session session, Throwable error){ + error.printStackTrace(); + } + + public static void sendMessageToAll(String msg){ + try { + for (Session item : webSocketSet) { + item.getBasicRemote().sendText(msg); + } + } + catch (Exception e){ + log.error("websocket send msg error:", e); + } + } +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/entity/GnssGroupFwd.java b/sec-beidou/src/main/java/com/imdroid/beidou/entity/GnssGroupFwd.java index e8302a8e..4e7c38f8 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/entity/GnssGroupFwd.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/entity/GnssGroupFwd.java @@ -6,9 +6,18 @@ import lombok.Data; @Data @TableName(value = "gnssgroupfwd") public class GnssGroupFwd { + public static final short FWD_TYPE_NONE = 0; //不转发 + public static final short FWD_TYPE_CALC = 1; //按模板转发解算结果 + public static final short FWD_TYPE_RAW = 2; //转发原始数据(D331/D341) + public static final short FWD_TYPE_NTRIP = 3; //按ntrip协议转发 int id; String description; - String addr; - int port; + short type1; + String addr1; + int port1; String fwd_template; + short type2; + String addr2; + int port2; + int device_num; } diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index 7eb0d011..eca2b34f 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -34,7 +34,6 @@ CREATE TABLE IF NOT EXISTS `gnssdevices` ( `devicetype` smallint DEFAULT 0, `tenantid` int NOT NULL, `tenantname` varchar(100) NOT NULL, - `gnssconfiguration` varchar(100) NOT NULL, `project_id` int NOT NULL DEFAULT 0 COMMENT '项目id', `group_id` int DEFAULT 1, `calc_group_id` int DEFAULT 1, @@ -49,7 +48,7 @@ CREATE TABLE IF NOT EXISTS `gnssgroup` ( `work_cycle` int DEFAULT 0, `active_time` int DEFAULT 0, `active_offset` int DEFAULT 0, - `sample` smallint DEFAULT 0, + `rs_adv` smallint DEFAULT 0, `power_mode` smallint DEFAULT 0, `device_num` int DEFAULT 0, PRIMARY KEY (`id`) @@ -69,11 +68,16 @@ CREATE TABLE IF NOT EXISTS `gnssgroupcalc` ( CREATE TABLE IF NOT EXISTS `gnssgroupfwd` ( `id` int NOT NULL, `description` varchar(128) DEFAULT NULL, - `addr` varchar(128) DEFAULT NULL, - `port` int DEFAULT 0, + `type1` smallint DEFAULT 0, + `addr1` varchar(128) DEFAULT NULL, + `port1` int DEFAULT 0, + `type2` smallint DEFAULT 0, + `addr2` varchar(128) DEFAULT NULL, + `port2` int DEFAULT 0, `fwd_template` longtext, + `device_num` int DEFAULT 0, PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `gnssstatus` ( `id` bigint AUTO_INCREMENT, @@ -97,7 +101,7 @@ CREATE TABLE IF NOT EXISTS `gnssstatus` ( `state` smallint DEFAULT 0, `warning` smallint DEFAULT 0, PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `gnssdevicelocationrecords` ( `id` bigint AUTO_INCREMENT, @@ -138,6 +142,16 @@ CREATE TABLE IF NOT EXISTS `gnsssinglecalcdata` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +CREATE TABLE IF NOT EXISTS `gnssmsg` ( + `id` bigint AUTO_INCREMENT, + `createtime` datetime DEFAULT NULL, + `deviceid` varchar(20) NOT NULL, + `msgtype` int default 0, + `msglen` int default 0, + `content` varchar(128) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + CREATE TABLE IF NOT EXISTS `gnssstatusmsg` ( `id` bigint AUTO_INCREMENT, `updatetime` datetime DEFAULT NULL, diff --git a/sec-beidou/src/main/resources/static/api/init.json b/sec-beidou/src/main/resources/static/api/init.json index 0f2d7cf0..ea7d6255 100644 --- a/sec-beidou/src/main/resources/static/api/init.json +++ b/sec-beidou/src/main/resources/static/api/init.json @@ -56,7 +56,13 @@ "href": "page/gnss_dev_cfg", "icon": "fa fa-minus", "target": "_self" - } + }, + { + "title": "命令行", + "href": "page/cmd_line", + "icon": "fa fa-minus", + "target": "_self" + } ] }, { diff --git a/sec-beidou/src/main/resources/templates/page/cmd_line.html b/sec-beidou/src/main/resources/templates/page/cmd_line.html index 8820c223..34f665f7 100644 --- a/sec-beidou/src/main/resources/templates/page/cmd_line.html +++ b/sec-beidou/src/main/resources/templates/page/cmd_line.html @@ -1,351 +1,145 @@ + +
-
-
接收窗口
-
-
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+
+
+
- -
-
解算参数
-
-
-
-
- -
-
推送参数
-
-
-
-
-
- - - - + +
- - diff --git a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html index 08f293e0..b3c69157 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html @@ -47,14 +47,14 @@ **/ table.render({ elem: '#baseParaTableId', - url: '/gnss/group/list',//假数据 + url: '/gnss/group/list', toolbar: '#toolbarTable', cols: [[ {field: 'id', title: '组号', sort: true}, {field: 'work_cycle', title: '工作周期(分钟)'}, {field: 'active_time', title: '激活时长(分钟)'}, {field: 'active_offset', title: '偏置(分钟)'}, - {field: 'sample', title: '采样周期(秒)'}, + {field: 'rs_adv', title: '基准站提前时间(分钟)'}, {field: 'power_mode', title: '功耗模式',templet: '#modeTrans'}, {field: 'device_num', title: '关联设备数'}, {title: '操作', toolbar: '#currentTableBar', align: "center"} @@ -109,7 +109,7 @@ layero.find('#work_cycle').val(data.work_cycle); layero.find('#active_time').val(data.active_time); layero.find('#active_offset').val(data.active_offset); - layero.find('#sample').val(data.sample); + layero.find('#rs_adv').val(data.rs_adv); layero.find('#power_mode').val(data.power_mode); } }); @@ -244,10 +244,11 @@ cols: [[ {field: 'id', title: '组号', sort: true}, {field: 'description', title: '名称'}, - {field: 'addr', title: '地址'}, - {field: 'port', title: '端口号'}, - {field: 'fwd_template', title: '模板'}, - {field: 'device_num', title: '关联设备数'}, + {field: 'type1', title: '目标1类型', templet: '#type1Trans'}, + {field: 'addr1', title: '目标1地址', templet: '
{{d.addr1}}:{{d.port1}}
'}, + {field: 'type2', title: '目标2类型', templet: '#type2Trans'}, + {field: 'addr2', title: '目标2地址', templet: '
{{d.addr2}}:{{d.port2}}
'}, + {field: 'device_num', title: '关联设备数'}, {title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"} ]], limit: 10, @@ -297,8 +298,12 @@ group_id.val(data.id); group_id.attr('readonly',true); layero.find('#description').val(data.description); - layero.find('#addr').val(data.addr); - layero.find('#port').val(data.port); + layero.find('#type1').val(data.type1); + layero.find('#addr1').val(data.addr1); + layero.find('#port1').val(data.port1); + layero.find('#type2').val(data.type2); + layero.find('#addr2').val(data.addr2); + layero.find('#port2').val(data.port2); layero.find('#fwd_template').val(data.fwd_template); } }); @@ -342,10 +347,31 @@ + + + diff --git a/sec-beidou/src/main/resources/templates/page/gnss_msg.html b/sec-beidou/src/main/resources/templates/page/gnss_msg.html index c9087a50..a07cb674 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_msg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_msg.html @@ -48,12 +48,13 @@ table.render({ elem: '#currentTableId', - url: 'api/gnss_msg.json',//假数据 + url: '/gnss/msg/list_all', cols: [[ - {field: 'device_id', title: '设备号'}, - {field: 'report_time', title: '时间', sort: true}, - {field: 'type', title: '消息类型', sort: true}, - {field: 'content', title: '内容摘要', minWidth: 150} + {field: 'deviceid', title: '设备号'}, + {field: 'createtime', title: '上报时间', templet: "
{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'msgtype', title: '消息类型', templet: "
{{d.msgtype.toString(16)}}
"}, + {field: 'msglen', title: '消息长度'}, + {field: 'content', title: '内容', width: '50%'} ]], limits: [10, 15, 20, 25, 50, 100], limit: 15, diff --git a/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html b/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html index 8b702ae6..0e6edf1b 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html @@ -38,11 +38,11 @@ table.render({ elem: '#currentTableId', - url: 'api/gnss_msg_status.json',//假数据 + url: '/gnss/msg/list_status', cols: [[ - {field: 'device_id', title: '设备号'}, - {field: 'report_time', title: '时间'}, - {field: 'local_time', title: '设备时间'}, + {field: 'deviceid', title: '设备号'}, + {field: 'updatetime', title: '上报时间', templet: "
{{layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'devicetime', title: '设备时间', templet: "
{{layui.util.toDateString(d.devicetime, 'HH:mm:ss')}}
"}, {field: 'roll', title: 'roll'}, {field: 'pitch', title: 'pitch'}, {field: 'yaw', title: 'yaw'}, diff --git a/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html b/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html index f969138c..7055a101 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html @@ -48,19 +48,21 @@ table.render({ elem: '#currentTableId', - url: 'api/gnss_msg_trx.json',//假数据 + url: '/gnss/msg/list_trx', cols: [[ - {field: 'device_id', title: '设备号'}, - {field: 'report_time', title: '时间'}, - {field: 'local_time', title: '设备时间'}, - {field: 'server_rx', title: '服务端收'}, - {field: 'server_tx', title: '服务端发'}, - {field: 'uart1_rx', title: '串口1收'}, - {field: 'uart1_tx', title: '串口1发'}, - {field: 'uart1_unknown', title: '串口1未知'}, - {field: 'uart2_rx', title: '串口2收'}, - {field: 'uart2_tx', title: '串口2发'}, - {field: 'uart2_unknown', title: '串口2未知'} + {field: 'deviceid', title: '设备号'}, + {field: 'updatetime', title: '上报时间', templet: "
{{layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'devicetime', title: '设备时间', templet: "
{{layui.util.toDateString(d.devicetime, 'HH:mm:ss')}}
"}, + {field: 'd3xxbytes', title: 'D3XX'}, + {field: 'b562bytes', title: 'B562'}, + {field: 'servertxbytes', title: '服务端发'}, + {field: 'serverrxbytes', title: '服务端收'}, + {field: 'uart1txbytes', title: '串口1发'}, + {field: 'uart1rxbytes', title: '串口1收'}, + {field: 'uart1unknown', title: '串口1未知'}, + {field: 'uart2txbytes', title: '串口1发'}, + {field: 'uart2rxbytes', title: '串口1收'}, + {field: 'uart2unknown', title: '串口1未知'} ]], limits: [10, 15, 20, 25, 50, 100], limit: 15, diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html index aa2a8acf..eca91242 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html @@ -26,18 +26,17 @@
- +
- +
diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_fwd.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_fwd.html index 76f414a7..2238c166 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_fwd.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_fwd.html @@ -14,19 +14,53 @@
- -
- + +
+
- +
- +
- + +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+