1、增加断点续传统计

2、增加消息按类型查询
This commit is contained in:
weidong 2024-02-15 20:48:25 +08:00
parent 0206d6c097
commit d47958546f
10 changed files with 79 additions and 22 deletions

View File

@ -29,7 +29,8 @@ public interface BeidouClient {
@PostMapping("/gnss_upload")
String onGnssUpload(@RequestParam(name = "deviceId") String deviceId,
@RequestParam(name = "tenantId") Integer tenantId,
@RequestParam(name = "uploadTime") LocalDateTime uploadTime);
@RequestParam(name = "uploadTime") LocalDateTime uploadTime,
@RequestParam(name = "info") String info);
@PostMapping("/gnss_upload_pause")
String onGnssUploadPause(@RequestParam(name = "deviceId") String deviceId,

View File

@ -5,6 +5,7 @@ import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.common.util.ThreadManager;
import com.imdroid.sideslope.service.DataPersistService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@ -21,6 +22,8 @@ public class D342LocationMessageExecutor implements Executor<D342LocationMessage
private MultiLineGNSSCalcService gnssCalcService;
@Resource(name = "local")
private DeviceService deviceService;
@Autowired
private DataPersistService dataPersistService;
@Override
public Void execute(D342LocationMessage message) {
@ -31,9 +34,14 @@ public class D342LocationMessageExecutor implements Executor<D342LocationMessage
message.setTenantId(device.getTenantId());
message.setProjectId(device.getProjectId());
message.setFwdId(device.getFwdId());
device.updateD342Bytes(message.getLen(),message.getMessageList().size());
ThreadManager.getFixedThreadPool().submit(() -> {
gnssCalcService.calc(message);
if(message.getMessageList().size()==0){
dataPersistService.saveD342Stat(message, device);
device.clearD342Stat();
}
});
return null;

View File

@ -62,7 +62,10 @@ public class D3F2StopIndicationMessageExecutor implements Executor<D3F2StopIndic
// 通知beidou服务设备休眠
beidouClient.onDeviceStop(deviceId,device.getTenantId());
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) {

View File

@ -22,13 +22,13 @@ public class D342LocationMessage extends BaseMessage {
@Override
public void decodeBody(ByteBuf src) {
// d3 51 length(2048+6) device_id(4bytes) seq(2bytes) data
this.len = src.readableBytes(); // total length
this.header = src.readUnsignedShort();// flag
this.len = src.readUnsignedShort();
src.readUnsignedShort();// d342 length
this.id = String.valueOf(src.readUnsignedInt());//id
this.seq = src.readUnsignedShort();
if(this.len<=15) return;
short year = src.readUnsignedByte();
short month = 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);
// 拆分D341指针已移动到d341了
int totalLen = src.readableBytes();
int begin = 15; // d341 head: 10, date: 5
if(totalLen + begin - 4 > this.len) totalLen = this.len + 4 - begin;
int pos = 15; // head 10,date 5
int msgLen = 0;
while(begin+2 < totalLen){
int flag = src.getUnsignedShort(begin);
while(pos+2 < this.len){
int flag = src.getUnsignedShort(pos);
// 有时候两个d341会多一些字节原因未明
if(flag != 0xD341){
if(begin+msgLen > totalLen) break;
if(pos+msgLen > this.len) break;
else {
begin++;
pos++;
continue;
}
}
msgLen = src.getUnsignedShort(begin+2);
msgLen = src.getUnsignedShort(pos+2);
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();
message.decode(msgBuf);
message.setCreateTime(originalTime);
messageList.add(message);
// next data
begin += msgLen;
pos += msgLen;
}
}

View File

@ -39,6 +39,9 @@ public class Device {
int d3xxbytes = 0;
int d341Count = 0;
int d341bytes = 0;
int d342Bytes = 0;
int d342Count = 0;
int d341In42Count = 0;
int satelitesInUse = 0;//平均卫星数
int sataStatCount = 0;
@ -56,6 +59,12 @@ public class Device {
d341bytes += bytes;
}
public void updateD342Bytes(int bytes, int d341Num){
d342Count ++;
d342Bytes += bytes;
d341In42Count += d341Num;
}
public void updateSatelitesNum(int num){
if(num>0) {
sataStatCount++;
@ -72,4 +81,9 @@ public class Device {
satelitesInUse = 0;
}
public void clearD342Stat(){
d342Count = 0;
d342Bytes = 0;
d341In42Count = 0;
}
}

View File

@ -1,6 +1,7 @@
package com.imdroid.sideslope.service;
import com.imdroid.secapi.dto.GnssStatus;
import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
import com.imdroid.sideslope.sal.Device;
@ -20,4 +21,5 @@ public interface DataPersistService {
void saveDeviceState(D3F0SelfCheckMessage d3F0SelfCheckMessage);
void saveDeviceTrxStat(D3F2StopIndicationMessage d3F2StopIndicationMessage, boolean isUploading, Device device);
void saveD342Stat(D342LocationMessage message, Device device);
}

View File

@ -2,6 +2,7 @@ package com.imdroid.sideslope.service;
import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.message.BaseMessage;
import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
import com.imdroid.sideslope.sal.Device;
@ -92,7 +93,6 @@ public class DataPersistServiceImpl implements DataPersistService {
// 添加到trxmsg里
GnssTrxMsg trxMsg = message.getTrxMsg();
trxMsgMapper.insert(trxMsg);
// 保存消息摘要
if(device.getDeviceType() == GnssDevice.TYPE_ROVER) {
saveMsg(message, "d341 num: "+device.getD341Count()+","+message.getOtherInfo());
}
@ -135,4 +135,10 @@ public class DataPersistServiceImpl implements DataPersistService {
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");
}
}

View File

@ -131,8 +131,9 @@ public class APIController extends BasicController{
/****** gnss upload *******/
@PostMapping(value = "/api/gnss_upload")
@ResponseBody
public String onGnssUpload(String deviceId, Integer tenantId,LocalDateTime uploadTime) {
saveMsg(deviceId, tenantId,0xd342, "gnss data upload from "+uploadTime,false);
public String onGnssUpload(String deviceId, Integer tenantId,LocalDateTime uploadTime,String info) {
saveMsg(deviceId, tenantId,0xd342,
"gnss data upload from "+uploadTime+", "+info,false);
return null;
}

View File

@ -10,9 +10,12 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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;
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")
public String gnssMsg(Model m, HttpSession session) {
initModel(m, session);
m.addAttribute("type_map", msgTypeMap);
return "/page/gnss_msg";
}

View File

@ -25,6 +25,14 @@
</div>
</div>
<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>
<div class="layui-input-inline">
<input type="text" name="dgt_createtime" autocomplete="off" id="ID-laydate-start-date" class="layui-input" placeholder="开始日期">