diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTCircleArea.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTCircleArea.java index 1cc43d08a..c471d46b6 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTCircleArea.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTCircleArea.java @@ -45,7 +45,7 @@ public class JTCircleArea implements JTAreaOrRoute{ @Schema(description = "区域的名称") private String name; - public ByteBuf encode(){ + public ByteBuf encode(){ ByteBuf byteBuf = Unpooled.buffer(); byteBuf.writeInt((int) (id & 0xffffffffL)); byteBuf.writeBytes(attribute.encode()); @@ -62,6 +62,31 @@ public class JTCircleArea implements JTAreaOrRoute{ return byteBuf; } + public static JTCircleArea decode(ByteBuf buf) { + + JTCircleArea area = new JTCircleArea(); + area.setId(buf.readUnsignedInt()); + int attributeInt = buf.readUnsignedShort(); + JTAreaAttribute areaAttribute = JTAreaAttribute.decode(attributeInt); + area.setAttribute(areaAttribute); + + area.setLatitude(buf.readUnsignedInt()/1000000D); + area.setLongitude(buf.readUnsignedInt()/1000000D); + area.setRadius(buf.readUnsignedInt()); + byte[] startTimeBytes = new byte[6]; + buf.readBytes(startTimeBytes); + area.setStartTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(BCDUtil.transform(startTimeBytes))); + byte[] endTimeBytes = new byte[6]; + buf.readBytes(endTimeBytes); + area.setEndTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(BCDUtil.transform(endTimeBytes))); + area.setMaxSpeed(buf.readUnsignedShort()); + area.setOverSpeedDuration(buf.readUnsignedByte()); + area.setNighttimeMaxSpeed(buf.readUnsignedShort()); + int nameLength = buf.readUnsignedShort(); + area.setName(buf.readCharSequence(nameLength, Charset.forName("GBK")).toString().trim()); + return area; + } + public long getId() { return id; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTPolygonArea.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTPolygonArea.java index 84a2d54e5..5d3ec204b 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTPolygonArea.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTPolygonArea.java @@ -7,6 +7,7 @@ import io.netty.buffer.Unpooled; import io.swagger.v3.oas.annotations.media.Schema; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.List; @Schema(description = "多边形区域") @@ -39,7 +40,7 @@ public class JTPolygonArea implements JTAreaOrRoute{ @Schema(description = "区域的名称") private String name; - public ByteBuf encode(){ + public ByteBuf encode(){ ByteBuf byteBuf = Unpooled.buffer(); byteBuf.writeInt((int) (id & 0xffffffffL)); byteBuf.writeBytes(attribute.encode()); @@ -60,6 +61,35 @@ public class JTPolygonArea implements JTAreaOrRoute{ return byteBuf; } + public static JTPolygonArea decode(ByteBuf buf) { + JTPolygonArea area = new JTPolygonArea(); + area.setId(buf.readUnsignedInt()); + int attributeInt = buf.readUnsignedShort(); + JTAreaAttribute areaAttribute = JTAreaAttribute.decode(attributeInt); + area.setAttribute(areaAttribute); + byte[] startTimeBytes = new byte[6]; + buf.readBytes(startTimeBytes); + area.setStartTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(BCDUtil.transform(startTimeBytes))); + byte[] endTimeBytes = new byte[6]; + buf.readBytes(endTimeBytes); + area.setEndTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(BCDUtil.transform(endTimeBytes))); + area.setMaxSpeed(buf.readUnsignedShort()); + area.setOverSpeedDuration(buf.readUnsignedByte()); + int polygonPointsSize = buf.readUnsignedShort(); + List polygonPointList = new ArrayList<>(polygonPointsSize); + for (int i = 0; i < polygonPointsSize; i++) { + JTPolygonPoint polygonPoint = new JTPolygonPoint(); + polygonPoint.setLatitude(buf.readUnsignedInt()/1000000D); + polygonPoint.setLongitude(buf.readUnsignedInt()/1000000D); + polygonPointList.add(polygonPoint); + } + area.setPolygonPoints(polygonPointList); + area.setNighttimeMaxSpeed(buf.readUnsignedShort()); + int nameLength = buf.readUnsignedShort(); + area.setName(buf.readCharSequence(nameLength, Charset.forName("GBK")).toString().trim()); + return area; + } + public long getId() { return id; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoute.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoute.java index 33b5ce79d..4723994f5 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoute.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoute.java @@ -7,6 +7,7 @@ import io.netty.buffer.Unpooled; import io.swagger.v3.oas.annotations.media.Schema; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.List; @Schema(description = "路线") @@ -30,7 +31,7 @@ public class JTRoute implements JTAreaOrRoute{ @Schema(description = "区域的名称") private String name; - public ByteBuf encode(){ + public ByteBuf encode(){ ByteBuf byteBuf = Unpooled.buffer(); byteBuf.writeInt((int) (id & 0xffffffffL)); byteBuf.writeBytes(attribute.encode()); @@ -47,6 +48,30 @@ public class JTRoute implements JTAreaOrRoute{ return byteBuf; } + public static JTRoute decode(ByteBuf buf) { + JTRoute route = new JTRoute(); + route.setId(buf.readUnsignedInt()); + int attributeInt = buf.readUnsignedShort(); + JTRouteAttribute routeAttribute = JTRouteAttribute.decode(attributeInt); + route.setAttribute(routeAttribute); + byte[] startTimeBytes = new byte[6]; + buf.readBytes(startTimeBytes); + route.setStartTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(BCDUtil.transform(startTimeBytes))); + byte[] endTimeBytes = new byte[6]; + buf.readBytes(endTimeBytes); + route.setEndTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(BCDUtil.transform(endTimeBytes))); + + int routePointsSize = buf.readUnsignedShort(); + List jtRoutePoints = new ArrayList<>(routePointsSize); + for (int i = 0; i < routePointsSize; i++) { + jtRoutePoints.add(JTRoutePoint.decode(buf)); + } + route.setRoutePointList(jtRoutePoints); + int nameLength = buf.readUnsignedShort(); + route.setName(buf.readCharSequence(nameLength, Charset.forName("GBK")).toString().trim()); + return route; + } + public long getId() { return id; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteAttribute.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteAttribute.java index 6f0068d5d..207ae7cb5 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteAttribute.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteAttribute.java @@ -43,6 +43,17 @@ public class JTRouteAttribute { byteBuf.writeShort((short)(content & 0xffff)); return byteBuf; } + + public static JTRouteAttribute decode(int attributeInt) { + JTRouteAttribute attribute = new JTRouteAttribute(); + attribute.setRuleForTimeLimit((attributeInt & 1) == 1); + attribute.setRuleForAlarmToDriverWhenEnter((attributeInt >> 2 & 1) == 1); + attribute.setRuleForAlarmToPlatformWhenEnter((attributeInt >> 3 & 1) == 1); + attribute.setRuleForAlarmToDriverWhenExit((attributeInt >> 4 & 1) == 1); + attribute.setRuleForAlarmToPlatformWhenExit((attributeInt >> 5 & 1) == 1); + return attribute; + } + public boolean isRuleForTimeLimit() { return ruleForTimeLimit; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoutePoint.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoutePoint.java index 124b39fea..cecbd8152 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoutePoint.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRoutePoint.java @@ -1,17 +1,21 @@ package com.genersoft.iot.vmp.jt1078.bean; +import com.genersoft.iot.vmp.jt1078.util.BCDUtil; +import com.genersoft.iot.vmp.utils.DateUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.swagger.v3.oas.annotations.media.Schema; +import java.nio.charset.Charset; + @Schema(description = "路线拐点") public class JTRoutePoint { @Schema(description = "拐点 ID") - private int id; + private long id; @Schema(description = "路段 ID") - private int routeSectionId; + private long routeSectionId; @Schema(description = "拐点纬度") private Double latitude; @@ -56,6 +60,25 @@ public class JTRoutePoint { return byteBuf; } + public static JTRoutePoint decode(ByteBuf buf) { + JTRoutePoint point = new JTRoutePoint(); + point.setId(buf.readUnsignedInt()); + point.setRouteSectionId(buf.readUnsignedInt()); + point.setLatitude(buf.readUnsignedInt()/1000000D); + point.setLongitude(buf.readUnsignedInt()/1000000D); + point.setRouteSectionAttributeWidth(buf.readUnsignedByte()); + + JTRouteSectionAttribute areaAttribute = JTRouteSectionAttribute.decode(buf.readUnsignedByte()); + point.setRouteSectionAttribute(areaAttribute); + + point.setRouteSectionMaxLength(buf.readUnsignedShort()); + point.setRouteSectionMinLength(buf.readUnsignedShort()); + point.setRouteSectionMaxSpeed(buf.readUnsignedShort()); + point.setRouteSectionOverSpeedDuration(buf.readUnsignedByte()); + point.setRouteSectionNighttimeMaxSpeed(buf.readUnsignedShort()); + return point; + } + public Double getLatitude() { return latitude; } @@ -72,19 +95,19 @@ public class JTRoutePoint { this.longitude = longitude; } - public int getId() { + public long getId() { return id; } - public void setId(int id) { + public void setId(long id) { this.id = id; } - public int getRouteSectionId() { + public long getRouteSectionId() { return routeSectionId; } - public void setRouteSectionId(int routeSectionId) { + public void setRouteSectionId(long routeSectionId) { this.routeSectionId = routeSectionId; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteSectionAttribute.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteSectionAttribute.java index 0fb561adb..0f5db2466 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteSectionAttribute.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRouteSectionAttribute.java @@ -18,7 +18,7 @@ public class JTRouteSectionAttribute { @Schema(description = "false:东经;true:西经") private boolean westLongitude; - + public byte encode(){ byte attributeByte = 0; if (ruleForTimeLimit) { @@ -36,6 +36,15 @@ public class JTRouteSectionAttribute { return attributeByte; } + public static JTRouteSectionAttribute decode(short attributeShort) { + JTRouteSectionAttribute attribute = new JTRouteSectionAttribute(); + attribute.setRuleForTimeLimit((attributeShort & 1) == 1); + attribute.setRuleForSpeedLimit((attributeShort >> 1 & 1) == 1); + attribute.setSouthLatitude((attributeShort >> 2 & 1) == 1); + attribute.setWestLongitude((attributeShort >> 3 & 1) == 1); + return attribute; + } + public boolean isRuleForTimeLimit() { return ruleForTimeLimit; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java b/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java index 7ad4af625..991056039 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java @@ -538,7 +538,7 @@ public class JT1078Template { .setDevId(devId) .setPackageNo(randomInt()) .setMsgId(H8607) - .setRespId(H0608) + .setRespId(H0001) .setRs(j8607) .build(); return SessionManager.INSTANCE.request(cmd, timeOut); @@ -549,7 +549,7 @@ public class JT1078Template { .setDevId(devId) .setPackageNo(randomInt()) .setMsgId(H8608) - .setRespId(H0001) + .setRespId(H0608) .setRs(j8608) .build(); return SessionManager.INSTANCE.request(cmd, timeOut); diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java index f3256da74..47f7ca8e2 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java @@ -546,6 +546,20 @@ public class JT1078Controller { } } + @Operation(summary = "1078-查询圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "设备编号", required = true) + @GetMapping("/area/circle/query") + public WVPResult> queryAreaForCircle(String deviceId, @RequestParam(value = "ids", required = false) List ids){ + + logger.info("[1078-查询圆形区域] deviceId: {}, ids:{}", deviceId, ids); + List result = service.queryAreaForCircle(deviceId, ids); + if (result != null) { + return WVPResult.success(result); + }else { + return WVPResult.fail(ErrorCode.ERROR100); + } + } + @Operation(summary = "1078-更新矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "areaParam", description = "设置区域参数", required = true) @@ -612,6 +626,20 @@ public class JT1078Controller { } } + @Operation(summary = "1078-查询矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "设备编号", required = true) + @GetMapping("/area/rectangle/query") + public WVPResult> queryAreaForRectangle(String deviceId, @RequestParam(value = "ids", required = false) List ids){ + + logger.info("[1078-查询矩形区域] deviceId: {}, ids:{}", deviceId, ids); + List result = service.queryAreaForRectangle(deviceId, ids); + if (result != null) { + return WVPResult.success(result); + }else { + return WVPResult.fail(ErrorCode.ERROR100); + } + } + @Operation(summary = "1078-设置多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "areaParam", description = "设置区域参数", required = true) @PostMapping("/area/polygon/set") @@ -645,6 +673,20 @@ public class JT1078Controller { } } + @Operation(summary = "1078-查询多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "设备编号", required = true) + @GetMapping("/area/polygon/query") + public WVPResult> queryAreaForPolygon(String deviceId, @RequestParam(value = "ids", required = false) List ids){ + + logger.info("[1078-查询多边形区域] deviceId: {}, ids:{}", deviceId, ids); + List result = service.queryAreaForPolygon(deviceId, ids); + if (result != null) { + return WVPResult.success(result); + }else { + return WVPResult.fail(ErrorCode.ERROR100); + } + } + @Operation(summary = "1078-设置路线", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "areaParam", description = "设置区域参数", required = true) @PostMapping("/route/set") @@ -681,18 +723,15 @@ public class JT1078Controller { @Operation(summary = "1078-查询路线", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备编号", required = true) @GetMapping("/route/query") - public WVPResult queryRoute(String deviceId, @RequestParam(value = "ids", required = false) List ids){ + public WVPResult> queryRoute(String deviceId, @RequestParam(value = "ids", required = false) List ids){ logger.info("[1078-查询路线] deviceId: {}, ids:{}", deviceId, ids); - int result = service.queryRoute(deviceId, ids); - if (result == 0) { + List result = service.queryRoute(deviceId, ids); + if (result != null) { return WVPResult.success(result); }else { - WVPResult fail = WVPResult.fail(ErrorCode.ERROR100); - fail.setData(result); - return fail; + return WVPResult.fail(ErrorCode.ERROR100); } } - } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0608.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0608.java index 74d670efe..953a0cfb9 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0608.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0608.java @@ -38,8 +38,10 @@ public class J0608 extends Re { } switch (type) { case 1: + buf.readUnsignedByte(); + int areaLengthForCircleArea = buf.readUnsignedByte(); List jtCircleAreas = new ArrayList<>(); - for (int i = 0; i < dataLength; i++) { + for (int i = 0; i < areaLengthForCircleArea; i++) { // 查询圆形区域数据 JTCircleArea jtCircleArea = JTCircleArea.decode(buf); jtCircleAreas.add(jtCircleArea); @@ -47,9 +49,11 @@ public class J0608 extends Re { SessionManager.INSTANCE.response(header.getTerminalId(), "0608", null, jtCircleAreas); break; case 2: + buf.readUnsignedByte(); + int areaLengthForRectangleArea = buf.readUnsignedByte(); // 查询矩形区域数据 List jtRectangleAreas = new ArrayList<>(); - for (int i = 0; i < dataLength; i++) { + for (int i = 0; i < areaLengthForRectangleArea; i++) { // 查询圆形区域数据 JTRectangleArea jtRectangleArea = JTRectangleArea.decode(buf); jtRectangleAreas.add(jtRectangleArea); @@ -68,9 +72,13 @@ public class J0608 extends Re { break; case 4: // 查询线路数据 - // 查询多 边形区域数据 - JTPolygonArea jtPolygonArea = JTPolygonArea.decode(buf); - SessionManager.INSTANCE.response(header.getTerminalId(), "0608", null, jtPolygonArea); + List jtRoutes = new ArrayList<>(); + for (int i = 0; i < dataLength; i++) { + // 查询圆形区域数据 + JTRoute jtRoute = JTRoute.decode(buf); + jtRoutes.add(jtRoute); + } + SessionManager.INSTANCE.response(header.getTerminalId(), "0608", null, jtRoutes); break; default: break; @@ -81,19 +89,9 @@ public class J0608 extends Re { @Override protected Rs handler(Header header, Session session, Ijt1078Service service) { - JTDevice deviceInDb = service.getDevice(header.getTerminalId()); J8001 j8001 = new J8001(); j8001.setRespNo(header.getSn()); j8001.setRespId(header.getMsgId()); - if (deviceInDb == null) { - j8001.setResult(J8001.FAIL); - }else { - // TODO 优化为发送异步事件,定时读取队列写入数据库 - deviceInDb.setLongitude(positionInfo.getLongitude()); - deviceInDb.setLatitude(positionInfo.getLatitude()); - service.updateDevice(deviceInDb); - j8001.setResult(J8001.SUCCESS); - } return j8001; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java index 159f5d163..4a2fb5096 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java @@ -74,23 +74,23 @@ public interface Ijt1078Service { int deleteAreaForCircle(String deviceId, List ids); - int queryAreaForCircle(String deviceId, List ids); + List queryAreaForCircle(String deviceId, List ids); int setAreaForRectangle(int i, String deviceId, List rectangleAreas); int deleteAreaForRectangle(String deviceId, List ids); - int queryAreaForRectangle(String deviceId, List ids); + List queryAreaForRectangle(String deviceId, List ids); int setAreaForPolygon(String deviceId, JTPolygonArea polygonArea); int deleteAreaForPolygon(String deviceId, List ids); - int queryAreaForPolygon(String deviceId, List ids); + List queryAreaForPolygon(String deviceId, List ids); int setRoute(String deviceId, JTRoute route); int deleteRoute(String deviceId, List ids); - int queryRoute(String deviceId, List ids); + List queryRoute(String deviceId, List ids); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index d2f2e1436..60da13e9a 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -626,11 +626,11 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public int queryAreaForCircle(String deviceId, List ids) { + public List queryAreaForCircle(String deviceId, List ids) { J8608 j8608 = new J8608(); j8608.setType(1); j8608.setIdList(ids); - return (int)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override @@ -649,11 +649,11 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public int queryAreaForRectangle(String deviceId, List ids) { + public List queryAreaForRectangle(String deviceId, List ids) { J8608 j8608 = new J8608(); j8608.setType(2); j8608.setIdList(ids); - return (int)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override @@ -671,11 +671,11 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public int queryAreaForPolygon(String deviceId, List ids) { + public List queryAreaForPolygon(String deviceId, List ids) { J8608 j8608 = new J8608(); j8608.setType(3); j8608.setIdList(ids); - return (int)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override @@ -693,10 +693,10 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public int queryRoute(String deviceId, List ids) { + public List queryRoute(String deviceId, List ids) { J8608 j8608 = new J8608(); j8608.setType(4); j8608.setIdList(ids); - return (int)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } }