1、增加断点续传统计
2、增加消息按类型查询
This commit is contained in:
parent
0206d6c097
commit
d47958546f
@ -29,7 +29,8 @@ public interface BeidouClient {
|
|||||||
@PostMapping("/gnss_upload")
|
@PostMapping("/gnss_upload")
|
||||||
String onGnssUpload(@RequestParam(name = "deviceId") String deviceId,
|
String onGnssUpload(@RequestParam(name = "deviceId") String deviceId,
|
||||||
@RequestParam(name = "tenantId") Integer tenantId,
|
@RequestParam(name = "tenantId") Integer tenantId,
|
||||||
@RequestParam(name = "uploadTime") LocalDateTime uploadTime);
|
@RequestParam(name = "uploadTime") LocalDateTime uploadTime,
|
||||||
|
@RequestParam(name = "info") String info);
|
||||||
|
|
||||||
@PostMapping("/gnss_upload_pause")
|
@PostMapping("/gnss_upload_pause")
|
||||||
String onGnssUploadPause(@RequestParam(name = "deviceId") String deviceId,
|
String onGnssUploadPause(@RequestParam(name = "deviceId") String deviceId,
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import com.imdroid.sideslope.message.D342LocationMessage;
|
|||||||
import com.imdroid.sideslope.sal.Device;
|
import com.imdroid.sideslope.sal.Device;
|
||||||
import com.imdroid.sideslope.sal.DeviceService;
|
import com.imdroid.sideslope.sal.DeviceService;
|
||||||
import com.imdroid.common.util.ThreadManager;
|
import com.imdroid.common.util.ThreadManager;
|
||||||
|
import com.imdroid.sideslope.service.DataPersistService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -21,6 +22,8 @@ public class D342LocationMessageExecutor implements Executor<D342LocationMessage
|
|||||||
private MultiLineGNSSCalcService gnssCalcService;
|
private MultiLineGNSSCalcService gnssCalcService;
|
||||||
@Resource(name = "local")
|
@Resource(name = "local")
|
||||||
private DeviceService deviceService;
|
private DeviceService deviceService;
|
||||||
|
@Autowired
|
||||||
|
private DataPersistService dataPersistService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void execute(D342LocationMessage message) {
|
public Void execute(D342LocationMessage message) {
|
||||||
@ -31,9 +34,14 @@ public class D342LocationMessageExecutor implements Executor<D342LocationMessage
|
|||||||
message.setTenantId(device.getTenantId());
|
message.setTenantId(device.getTenantId());
|
||||||
message.setProjectId(device.getProjectId());
|
message.setProjectId(device.getProjectId());
|
||||||
message.setFwdId(device.getFwdId());
|
message.setFwdId(device.getFwdId());
|
||||||
|
device.updateD342Bytes(message.getLen(),message.getMessageList().size());
|
||||||
|
|
||||||
ThreadManager.getFixedThreadPool().submit(() -> {
|
ThreadManager.getFixedThreadPool().submit(() -> {
|
||||||
gnssCalcService.calc(message);
|
gnssCalcService.calc(message);
|
||||||
|
if(message.getMessageList().size()==0){
|
||||||
|
dataPersistService.saveD342Stat(message, device);
|
||||||
|
device.clearD342Stat();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -62,7 +62,10 @@ public class D3F2StopIndicationMessageExecutor implements Executor<D3F2StopIndic
|
|||||||
// 通知beidou服务设备休眠
|
// 通知beidou服务设备休眠
|
||||||
beidouClient.onDeviceStop(deviceId,device.getTenantId());
|
beidouClient.onDeviceStop(deviceId,device.getTenantId());
|
||||||
if(uploadTime!=null){
|
if(uploadTime!=null){
|
||||||
beidouClient.onGnssUpload(deviceId,device.getTenantId(),uploadTime);
|
String info = "d342 num:"+device.getD342Count()+
|
||||||
|
", bytes:"+device.getD342Bytes()+
|
||||||
|
", d341 included:"+device.getD341In42Count();
|
||||||
|
beidouClient.onGnssUpload(deviceId,device.getTenantId(),uploadTime,info);
|
||||||
}
|
}
|
||||||
// 检查告警
|
// 检查告警
|
||||||
if(device.getDeviceType() == Device.DEVICE_BASE_STATION) {
|
if(device.getDeviceType() == Device.DEVICE_BASE_STATION) {
|
||||||
|
|||||||
@ -22,13 +22,13 @@ public class D342LocationMessage extends BaseMessage {
|
|||||||
@Override
|
@Override
|
||||||
public void decodeBody(ByteBuf src) {
|
public void decodeBody(ByteBuf src) {
|
||||||
// d3 51 length(2048+6) device_id(4bytes) seq(2bytes) data
|
// d3 51 length(2048+6) device_id(4bytes) seq(2bytes) data
|
||||||
|
this.len = src.readableBytes(); // total length
|
||||||
this.header = src.readUnsignedShort();// flag
|
this.header = src.readUnsignedShort();// flag
|
||||||
this.len = src.readUnsignedShort();
|
src.readUnsignedShort();// d342 length
|
||||||
this.id = String.valueOf(src.readUnsignedInt());//id
|
this.id = String.valueOf(src.readUnsignedInt());//id
|
||||||
this.seq = src.readUnsignedShort();
|
this.seq = src.readUnsignedShort();
|
||||||
|
|
||||||
if(this.len<=15) return;
|
if(this.len<=15) return;
|
||||||
|
|
||||||
short year = src.readUnsignedByte();
|
short year = src.readUnsignedByte();
|
||||||
short month = src.readUnsignedByte();
|
short month = src.readUnsignedByte();
|
||||||
short day = src.readUnsignedByte();
|
short day = src.readUnsignedByte();
|
||||||
@ -37,33 +37,30 @@ public class D342LocationMessage extends BaseMessage {
|
|||||||
originalTime = LocalDateTime.of(2000+year,month,day,hour,minute,0);
|
originalTime = LocalDateTime.of(2000+year,month,day,hour,minute,0);
|
||||||
|
|
||||||
// 拆分D341,指针已移动到d341了
|
// 拆分D341,指针已移动到d341了
|
||||||
int totalLen = src.readableBytes();
|
int pos = 15; // head 10,date 5
|
||||||
int begin = 15; // d341 head: 10, date: 5
|
|
||||||
if(totalLen + begin - 4 > this.len) totalLen = this.len + 4 - begin;
|
|
||||||
|
|
||||||
int msgLen = 0;
|
int msgLen = 0;
|
||||||
while(begin+2 < totalLen){
|
while(pos+2 < this.len){
|
||||||
int flag = src.getUnsignedShort(begin);
|
int flag = src.getUnsignedShort(pos);
|
||||||
// 有时候两个d341会多一些字节,原因未明
|
// 有时候两个d341会多一些字节,原因未明
|
||||||
if(flag != 0xD341){
|
if(flag != 0xD341){
|
||||||
if(begin+msgLen > totalLen) break;
|
if(pos+msgLen > this.len) break;
|
||||||
else {
|
else {
|
||||||
begin++;
|
pos++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msgLen = src.getUnsignedShort(begin+2);
|
msgLen = src.getUnsignedShort(pos+2);
|
||||||
msgLen = (msgLen&0x07FF) + 4;
|
msgLen = (msgLen&0x07FF) + 4;
|
||||||
if(begin+msgLen > totalLen) break; //error
|
if(pos+msgLen > this.len) break; //error
|
||||||
|
|
||||||
ByteBuf msgBuf = src.slice(begin,msgLen);
|
ByteBuf msgBuf = src.slice(pos,msgLen);
|
||||||
BaseMessage message = new D341LocationMessage();
|
BaseMessage message = new D341LocationMessage();
|
||||||
message.decode(msgBuf);
|
message.decode(msgBuf);
|
||||||
message.setCreateTime(originalTime);
|
message.setCreateTime(originalTime);
|
||||||
messageList.add(message);
|
messageList.add(message);
|
||||||
|
|
||||||
// next data
|
// next data
|
||||||
begin += msgLen;
|
pos += msgLen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,9 @@ public class Device {
|
|||||||
int d3xxbytes = 0;
|
int d3xxbytes = 0;
|
||||||
int d341Count = 0;
|
int d341Count = 0;
|
||||||
int d341bytes = 0;
|
int d341bytes = 0;
|
||||||
|
int d342Bytes = 0;
|
||||||
|
int d342Count = 0;
|
||||||
|
int d341In42Count = 0;
|
||||||
int satelitesInUse = 0;//平均卫星数
|
int satelitesInUse = 0;//平均卫星数
|
||||||
int sataStatCount = 0;
|
int sataStatCount = 0;
|
||||||
|
|
||||||
@ -56,6 +59,12 @@ public class Device {
|
|||||||
d341bytes += bytes;
|
d341bytes += bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateD342Bytes(int bytes, int d341Num){
|
||||||
|
d342Count ++;
|
||||||
|
d342Bytes += bytes;
|
||||||
|
d341In42Count += d341Num;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateSatelitesNum(int num){
|
public void updateSatelitesNum(int num){
|
||||||
if(num>0) {
|
if(num>0) {
|
||||||
sataStatCount++;
|
sataStatCount++;
|
||||||
@ -72,4 +81,9 @@ public class Device {
|
|||||||
satelitesInUse = 0;
|
satelitesInUse = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void clearD342Stat(){
|
||||||
|
d342Count = 0;
|
||||||
|
d342Bytes = 0;
|
||||||
|
d341In42Count = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package com.imdroid.sideslope.service;
|
package com.imdroid.sideslope.service;
|
||||||
|
|
||||||
import com.imdroid.secapi.dto.GnssStatus;
|
import com.imdroid.secapi.dto.GnssStatus;
|
||||||
|
import com.imdroid.sideslope.message.D342LocationMessage;
|
||||||
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
|
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
|
||||||
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
|
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
|
||||||
import com.imdroid.sideslope.sal.Device;
|
import com.imdroid.sideslope.sal.Device;
|
||||||
@ -20,4 +21,5 @@ public interface DataPersistService {
|
|||||||
void saveDeviceState(D3F0SelfCheckMessage d3F0SelfCheckMessage);
|
void saveDeviceState(D3F0SelfCheckMessage d3F0SelfCheckMessage);
|
||||||
void saveDeviceTrxStat(D3F2StopIndicationMessage d3F2StopIndicationMessage, boolean isUploading, Device device);
|
void saveDeviceTrxStat(D3F2StopIndicationMessage d3F2StopIndicationMessage, boolean isUploading, Device device);
|
||||||
|
|
||||||
|
void saveD342Stat(D342LocationMessage message, Device device);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package com.imdroid.sideslope.service;
|
|||||||
|
|
||||||
import com.imdroid.secapi.dto.*;
|
import com.imdroid.secapi.dto.*;
|
||||||
import com.imdroid.sideslope.message.BaseMessage;
|
import com.imdroid.sideslope.message.BaseMessage;
|
||||||
|
import com.imdroid.sideslope.message.D342LocationMessage;
|
||||||
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
|
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
|
||||||
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
|
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
|
||||||
import com.imdroid.sideslope.sal.Device;
|
import com.imdroid.sideslope.sal.Device;
|
||||||
@ -92,7 +93,6 @@ public class DataPersistServiceImpl implements DataPersistService {
|
|||||||
// 添加到trxmsg里
|
// 添加到trxmsg里
|
||||||
GnssTrxMsg trxMsg = message.getTrxMsg();
|
GnssTrxMsg trxMsg = message.getTrxMsg();
|
||||||
trxMsgMapper.insert(trxMsg);
|
trxMsgMapper.insert(trxMsg);
|
||||||
// 保存消息摘要
|
|
||||||
if(device.getDeviceType() == GnssDevice.TYPE_ROVER) {
|
if(device.getDeviceType() == GnssDevice.TYPE_ROVER) {
|
||||||
saveMsg(message, "d341 num: "+device.getD341Count()+","+message.getOtherInfo());
|
saveMsg(message, "d341 num: "+device.getD341Count()+","+message.getOtherInfo());
|
||||||
}
|
}
|
||||||
@ -135,4 +135,10 @@ public class DataPersistServiceImpl implements DataPersistService {
|
|||||||
msgMapper.insert(gnssMsg);
|
msgMapper.insert(gnssMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveD342Stat(D342LocationMessage message, Device device){
|
||||||
|
saveMsg(message, "d342 num:"+device.getD342Count()+
|
||||||
|
", bytes:"+device.getD342Bytes()+
|
||||||
|
", total d341 num:"+device.getD341In42Count()+"session done");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -131,8 +131,9 @@ public class APIController extends BasicController{
|
|||||||
/****** gnss upload *******/
|
/****** gnss upload *******/
|
||||||
@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,String info) {
|
||||||
saveMsg(deviceId, tenantId,0xd342, "gnss data upload from "+uploadTime,false);
|
saveMsg(deviceId, tenantId,0xd342,
|
||||||
|
"gnss data upload from "+uploadTime+", "+info,false);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,9 +10,12 @@ import org.springframework.ui.Model;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
import javax.servlet.http.HttpSession;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 消息摘要 控制器
|
* 消息摘要 控制器
|
||||||
@ -23,10 +26,24 @@ public class GnssMsgController extends BasicController implements CommonExcelSer
|
|||||||
|
|
||||||
private final GnssMsgMapper msgMapper;
|
private final GnssMsgMapper msgMapper;
|
||||||
|
|
||||||
|
public static final Map<Integer, String> msgTypeMap = new HashMap<>();
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public static void init() {
|
||||||
|
msgTypeMap.put(0xd3f0,"自检消息");
|
||||||
|
msgTypeMap.put(0xd3f2,"休眠消息");
|
||||||
|
msgTypeMap.put(0xd310,"GNSS配置");
|
||||||
|
msgTypeMap.put(0xd311,"工作时间配置");
|
||||||
|
msgTypeMap.put(0xd312,"单片机配置");
|
||||||
|
msgTypeMap.put(0xd313,"DEBUG");
|
||||||
|
msgTypeMap.put(0xd31A,"DTU配置");
|
||||||
|
msgTypeMap.put(0xd342,"断点续传");
|
||||||
|
}
|
||||||
/**** 推送页面 *****/
|
/**** 推送页面 *****/
|
||||||
@RequestMapping("/page/gnss_msg")
|
@RequestMapping("/page/gnss_msg")
|
||||||
public String gnssMsg(Model m, HttpSession session) {
|
public String gnssMsg(Model m, HttpSession session) {
|
||||||
initModel(m, session);
|
initModel(m, session);
|
||||||
|
m.addAttribute("type_map", msgTypeMap);
|
||||||
return "/page/gnss_msg";
|
return "/page/gnss_msg";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-inline">
|
<div class="layui-inline">
|
||||||
|
<label class="layui-form-label">消息类型</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<select name="n_msgtype" id="msg_type" lay-search="">
|
||||||
|
<option value="">全部</option>
|
||||||
|
<option th:each="item : ${type_map}" th:text="${item.value}" th:value="${item.key}"></option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div><div class="layui-inline">
|
||||||
<label class="layui-form-label">范围</label>
|
<label class="layui-form-label">范围</label>
|
||||||
<div class="layui-input-inline">
|
<div class="layui-input-inline">
|
||||||
<input type="text" name="dgt_createtime" autocomplete="off" id="ID-laydate-start-date" class="layui-input" placeholder="开始日期">
|
<input type="text" name="dgt_createtime" autocomplete="off" id="ID-laydate-start-date" class="layui-input" placeholder="开始日期">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user