1、修改发送GNSS指令保存时的bug

2、增加消息发送方向
3、增加是否自动补传的配置
This commit is contained in:
weidong 2023-12-29 14:04:59 +08:00
parent 789440e221
commit 4c2ec4d0a2
12 changed files with 69 additions and 18 deletions

View File

@ -14,4 +14,5 @@ public class GnssGroupCalc {
Integer filter_min_hour; Integer filter_min_hour;
Float auto_threshold; Float auto_threshold;
Integer device_num; Integer device_num;
Boolean auto_upload;
} }

View File

@ -22,5 +22,6 @@ public class GnssMsg {
String deviceid; String deviceid;
Integer msgtype; Integer msgtype;
Integer msglen; Integer msglen;
Boolean tx;
String content;//只记录部分 String content;//只记录部分
} }

View File

@ -6,7 +6,6 @@ import com.imdroid.sideslope.executor.MessageParser;
import com.imdroid.sideslope.message.BaseMessage; import com.imdroid.sideslope.message.BaseMessage;
import com.imdroid.sideslope.server.OnlineChannels; import com.imdroid.sideslope.server.OnlineChannels;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
@ -25,14 +24,20 @@ public class RtcmTcpHandler extends SimpleChannelInboundHandler<ByteBuf> {
src.getBytes(0, data); src.getBytes(0, data);
logger.debug("receive message:" + DataTypeUtil.getHexString(data)); logger.debug("receive message:" + DataTypeUtil.getHexString(data));
} }
try {
BaseMessage message = MessageParser.instance.parse(src); BaseMessage message = MessageParser.instance.parse(src);
OnlineChannels.INSTANCE.updateConfigChannel(message.getId(), ctx.channel(), null); OnlineChannels.INSTANCE.updateConfigChannel(message.getId(), ctx.channel(), null);
BizExecutors.execute(message); BizExecutors.execute(message);
} }
catch (Exception e){
}
}
@Override @Override
public void channelInactive(ChannelHandlerContext ctx) public void channelInactive(ChannelHandlerContext ctx)
throws Exception { throws Exception {
logger.info("channel inactive");
} }
@Override @Override

View File

@ -115,6 +115,7 @@ public class DataPersistServiceImpl implements DataPersistService {
gnssMsg.setDeviceid(message.getId()); gnssMsg.setDeviceid(message.getId());
gnssMsg.setMsgtype(message.getHeader()); gnssMsg.setMsgtype(message.getHeader());
gnssMsg.setMsglen(message.getLen()); gnssMsg.setMsglen(message.getLen());
gnssMsg.setTx(false);
msgMapper.insert(gnssMsg); msgMapper.insert(gnssMsg);
} }

View File

@ -31,7 +31,8 @@ public class ApiController {
HttpResp resp = new HttpResp(); HttpResp resp = new HttpResp();
DeviceChannel deviceChannel = OnlineChannels.INSTANCE.getConfigChannel(deviceId); DeviceChannel deviceChannel = OnlineChannels.INSTANCE.getConfigChannel(deviceId);
if(deviceChannel == null) deviceChannel = OnlineChannels.INSTANCE.getDataChannel(deviceId); if(deviceChannel == null) deviceChannel = OnlineChannels.INSTANCE.getDataChannel(deviceId);
if(deviceChannel!=null && deviceChannel.isOnline()){ //if(deviceChannel!=null && deviceChannel.isOnline()){
if(deviceChannel!=null){
status.put("status", "Online"); status.put("status", "Online");
// send command // send command
ByteBuf buf = Unpooled.buffer(); ByteBuf buf = Unpooled.buffer();

View File

@ -21,6 +21,8 @@ public class APIController extends BasicController{
@Autowired @Autowired
GnssGroupMapper groupMapper; GnssGroupMapper groupMapper;
@Autowired @Autowired
GnssGroupCalcMapper groupCalcMapper;
@Autowired
GnssMsgMapper msgMapper; GnssMsgMapper msgMapper;
@Autowired @Autowired
GnssStatusMapper gnssStatusMapper; GnssStatusMapper gnssStatusMapper;
@ -43,7 +45,7 @@ public class APIController extends BasicController{
} }
// 保存 // 保存
saveMsg(deviceId, tenantId,msgType, configAck); saveMsg(deviceId, tenantId,msgType, configAck, false);
// 命令行显示 // 命令行显示
String rxInfo = "RX "+ dateFormat.format(System.currentTimeMillis())+ String rxInfo = "RX "+ dateFormat.format(System.currentTimeMillis())+
@ -65,9 +67,14 @@ public class APIController extends BasicController{
@PostMapping(value = "/api/device_online") @PostMapping(value = "/api/device_online")
@ResponseBody @ResponseBody
public String onLine(String deviceId, Integer tenantId, LocalDateTime lastOnlineTime) { public String onLine(String deviceId, Integer tenantId, LocalDateTime lastOnlineTime) {
onDeviceActive(deviceId,tenantId); onDeviceActive(deviceId,tenantId);
// 检查是否自动补传
GnssDevice device = deviceMapper.queryByDeviceId(deviceId);
if(device == null) return null;
GnssGroupCalc groupCalc = groupCalcMapper.selectById(device.getCalc_group_id());
if(groupCalc==null || groupCalc.getAuto_upload()) return null;
// 检查上次是否离线如果是则启动补传 // 检查上次是否离线如果是则启动补传
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
Short len = 15; Short len = 15;
@ -86,7 +93,7 @@ public class APIController extends BasicController{
+ HexUtil.Byte2HexString((byte) (now.getMinute())); + HexUtil.Byte2HexString((byte) (now.getMinute()));
rtcmClient.config(deviceId, uploadCmd); rtcmClient.config(deviceId, uploadCmd);
// 保存 // 保存
saveMsg(deviceId, tenantId,0xD31A, uploadCmd); saveMsg(deviceId, tenantId,0xD31A, uploadCmd, true);
return null; return null;
} }
@ -105,7 +112,7 @@ public class APIController extends BasicController{
if(config != null){ if(config != null){
rtcmClient.config(deviceId, config); rtcmClient.config(deviceId, config);
// 保存 // 保存
saveMsg(deviceId, tenantId,0xd311, config); saveMsg(deviceId, tenantId,0xd311, config, true);
} }
} }
} }
@ -125,30 +132,31 @@ public class APIController extends BasicController{
@PostMapping(value = "/api/gnss_upload") @PostMapping(value = "/api/gnss_upload")
@ResponseBody @ResponseBody
public String onGnssUpload(String deviceId, Integer tenantId,LocalDateTime uploadTime) { public String onGnssUpload(String deviceId, Integer tenantId,LocalDateTime uploadTime) {
saveMsg(deviceId, tenantId,0xd342, "gnss data upload from "+uploadTime); saveMsg(deviceId, tenantId,0xd342, "gnss data upload from "+uploadTime,false);
return null; return null;
} }
@PostMapping(value = "/api/gnss_upload_pause") @PostMapping(value = "/api/gnss_upload_pause")
@ResponseBody @ResponseBody
public String onGnssUploadPause(String deviceId, Integer tenantId) { public String onGnssUploadPause(String deviceId, Integer tenantId) {
saveMsg(deviceId, tenantId,0xd342, "gnss data upload pause"); saveMsg(deviceId, tenantId,0xd342, "gnss data upload pause",false);
return null; return null;
} }
@PostMapping(value = "/api/gnss_upload_complete") @PostMapping(value = "/api/gnss_upload_complete")
@ResponseBody @ResponseBody
public String onGnssUploadComplete(String deviceId, Integer tenantId) { public String onGnssUploadComplete(String deviceId, Integer tenantId) {
saveMsg(deviceId, tenantId,0xd342, "gnss data upload completely"); saveMsg(deviceId, tenantId,0xd342, "gnss data upload completely",false);
return null; return null;
} }
void saveMsg(String deviceId, int tenantId, int msgType, String content){ void saveMsg(String deviceId, int tenantId, int msgType, String content,boolean isTx){
GnssMsg gnssMsg = new GnssMsg(); GnssMsg gnssMsg = new GnssMsg();
gnssMsg.setCreatetime(LocalDateTime.now()); gnssMsg.setCreatetime(LocalDateTime.now());
gnssMsg.setTenantid(tenantId); gnssMsg.setTenantid(tenantId);
gnssMsg.setDeviceid(deviceId); gnssMsg.setDeviceid(deviceId);
gnssMsg.setMsgtype(msgType); gnssMsg.setMsgtype(msgType);
gnssMsg.setTx(isTx);
if(content==null) content=""; if(content==null) content="";
gnssMsg.setMsglen(content.length()/2); gnssMsg.setMsglen(content.length()/2);
int saveContentLen = content.length(); int saveContentLen = content.length();

View File

@ -74,6 +74,10 @@ public class CmdLineController extends BasicController{
gnssMsg.setDeviceid(deviceId); gnssMsg.setDeviceid(deviceId);
gnssMsg.setMsgtype(msgType); gnssMsg.setMsgtype(msgType);
gnssMsg.setMsglen((int) len); gnssMsg.setMsglen((int) len);
gnssMsg.setTx(true);
if(cmd.length() >= 100) {
cmd = cmd.substring(0, 100)+"...";
}
gnssMsg.setContent(cmd); gnssMsg.setContent(cmd);
msgMapper.insert(gnssMsg); msgMapper.insert(gnssMsg);

View File

@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS `gnssgroupcalc` (
`filter_min_hour` int DEFAULT NULL COMMENT '最小平滑窗口', `filter_min_hour` int DEFAULT NULL COMMENT '最小平滑窗口',
`auto_threshold` float DEFAULT NULL, `auto_threshold` float DEFAULT NULL,
`device_num` int DEFAULT 0, `device_num` int DEFAULT 0,
`auto_upload` bit(1) DEFAULT 0,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@ -170,6 +171,7 @@ CREATE TABLE IF NOT EXISTS `gnssmsg` (
`deviceid` varchar(20) NOT NULL, `deviceid` varchar(20) NOT NULL,
`msgtype` int default 0, `msgtype` int default 0,
`msglen` int default 0, `msglen` int default 0,
`tx` bit(1) DEFAULT 0,
`content` varchar(128) DEFAULT NULL, `content` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@ -153,6 +153,7 @@
{field: 'auto_filter', title: '自适应滤波', templet: '#autoFilterTrans'}, {field: 'auto_filter', title: '自适应滤波', templet: '#autoFilterTrans'},
{field: 'filter_min_hour', title: '最小滤波周期'}, {field: 'filter_min_hour', title: '最小滤波周期'},
{field: 'auto_threshold', title: '触发门限(mm)'}, {field: 'auto_threshold', title: '触发门限(mm)'},
{field: 'auto_upload', title: '自动补传', templet: '#autoUploadTrans'},
{field: 'device_num', title: '关联设备数'}, {field: 'device_num', title: '关联设备数'},
{title: '操作', toolbar: '#currentTableBar', align: "center"} {title: '操作', toolbar: '#currentTableBar', align: "center"}
]], ]],
@ -209,6 +210,7 @@
layero.find('#auto_filter').val(data.auto_filter); layero.find('#auto_filter').val(data.auto_filter);
layero.find('#filter_min_hour').val(data.filter_min_hour); layero.find('#filter_min_hour').val(data.filter_min_hour);
layero.find('#auto_threshold').val(data.auto_threshold); layero.find('#auto_threshold').val(data.auto_threshold);
layero.find('#auto_upload').val(data.auto_upload);
} }
}); });
$(window).on("resize", function () { $(window).on("resize", function () {
@ -358,6 +360,14 @@
{{# } }} {{# } }}
</script> </script>
<script type="text/html" id="autoUploadTrans">
{{# if(d.auto_upload == 1){ }}
<span>启用</span>
{{# } else { }}
<span>禁用</span>
{{# } }}
</script>
<script type="text/html" id="modeTrans"> <script type="text/html" id="modeTrans">
{{# if(d.power_mode == 0){ }} {{# if(d.power_mode == 0){ }}
<span>低功耗</span> <span>低功耗</span>

View File

@ -60,6 +60,7 @@
{field: 'createtime', title: '上报时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"}, {field: 'createtime', title: '上报时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'msgtype', title: '消息类型', templet: "<div>{{d.msgtype.toString(16)}}</div>"}, {field: 'msgtype', title: '消息类型', templet: "<div>{{d.msgtype.toString(16)}}</div>"},
{field: 'msglen', title: '消息长度'}, {field: 'msglen', title: '消息长度'},
{field: 'tx', title: '收发', templet: '#trxTrans'},
{field: 'content', title: '内容', width: '50%'} {field: 'content', title: '内容', width: '50%'}
]], ]],
limits: [10, 15, 20, 25, 50, 100], limits: [10, 15, 20, 25, 50, 100],
@ -87,3 +88,11 @@
}); });
</script> </script>
<script type="text/html" id="trxTrans">
{{# if(d.tx == 1){ }}
<span></span>
{{# } else { }}
<span></span>
{{# } }}
</script>

View File

@ -66,9 +66,9 @@
{field: 'uart1txbytes', title: '串口1发'}, {field: 'uart1txbytes', title: '串口1发'},
{field: 'uart1rxbytes', title: '串口1收'}, {field: 'uart1rxbytes', title: '串口1收'},
{field: 'uart1unknown', title: '串口1未知'}, {field: 'uart1unknown', title: '串口1未知'},
{field: 'uart2txbytes', title: '串口1发'}, {field: 'uart2txbytes', title: '串口2发'},
{field: 'uart2rxbytes', title: '串口1收'}, {field: 'uart2rxbytes', title: '串口2收'},
{field: 'uart2unknown', title: '串口1未知'} {field: 'uart2unknown', title: '串口2未知'}
]], ]],
limits: [10, 15, 20, 25, 50, 100], limits: [10, 15, 20, 25, 50, 100],
limit: 15, limit: 15,

View File

@ -29,8 +29,8 @@
<label class="layui-form-label">自适应滤波</label> <label class="layui-form-label">自适应滤波</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<select name="auto_filter" id="auto_filter" lay-filter="type1"> <select name="auto_filter" id="auto_filter" lay-filter="type1">
<option value="false">禁用</option> <option value=0>禁用</option>
<option value="true">启用</option> <option value=1>启用</option>
</select> </select>
</div> </div>
</div> </div>
@ -46,6 +46,15 @@
<input type="number" name="auto_threshold" id="auto_threshold" class="layui-input"> <input type="number" name="auto_threshold" id="auto_threshold" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item">
<label class="layui-form-label">自动补传</label>
<div class="layui-input-inline">
<select name="auto_upload" id="auto_upload" lay-filter="type1">
<option value=0>禁用</option>
<option value=1>启用</option>
</select>
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">