diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java new file mode 100644 index 000000000..f394a9577 --- /dev/null +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java @@ -0,0 +1,47 @@ +package com.jsowell.web.controller.thirdparty.camera; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.jsowell.common.annotation.Anonymous; +import com.jsowell.common.core.controller.BaseController; +import com.jsowell.pile.dto.camera.CameraHeartBeatDTO; +import com.jsowell.pile.dto.camera.CameraIdentifyResultsDTO; +import com.jsowell.thirdparty.camera.common.CameraCommonResult; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 充电相机 controller + * + * @author Lemon + * @Date 2023/12/5 9:06:53 + */ +@Anonymous +@RestController +@RequestMapping("/camera") +public class CameraController extends BaseController { + + /** + * 心跳 + * @param dto + */ + @PostMapping("/v1/receiveHeartBeat") + public CameraCommonResult receiveHeartBeat(@RequestBody CameraHeartBeatDTO dto) { + logger.info("接收相机系统心跳包 params:{}", JSON.toJSONString(dto)); + CameraCommonResult result = new CameraCommonResult(); + logger.info("接收相机系统心跳包 result:{}", JSON.toJSONString(result.successResponse())); + return result.successResponse(); + } + + /** + * 识别结果 + * @param jsonObject + */ + @PostMapping("/v1/receiveIdentifyResults") + public void receiveIdentifyResults(@RequestBody JSONObject jsonObject) { + logger.info("相机系统接收识别结果 params:{}", jsonObject); + + } +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/CameraHeartBeatDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/CameraHeartBeatDTO.java new file mode 100644 index 000000000..f5b88c817 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/CameraHeartBeatDTO.java @@ -0,0 +1,47 @@ +package com.jsowell.pile.dto.camera; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +/** + * 相机心跳对象 + * + * @author Lemon + * @Date 2023/12/5 10:29:49 + */ +@Data +public class CameraHeartBeatDTO { + /** + * 设备名称 + */ + @JSONField(name = "dev_name") + private String devName; + + /** + * 产品类型 + */ + private String product; + + /** + * 设备ip地址 + * (有线网络地址) + */ + private String ip; + + /** + * 设备序列号 + */ + private String sn; + + /** + * 回复状态 + */ + private State state; + + + @Data + public static class State{ + @JSONField(name = "parking_number") + private String[] parkingNumber; + } +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/CameraIdentifyResultsDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/CameraIdentifyResultsDTO.java new file mode 100644 index 000000000..ebdf84caa --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/CameraIdentifyResultsDTO.java @@ -0,0 +1,422 @@ +package com.jsowell.pile.dto.camera; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +import java.util.List; + +/** + * 识别结果推送 + * + * @author Lemon + * @Date 2023/12/5 11:08:07 + */ +@Data +public class CameraIdentifyResultsDTO { + /** + * 识别id + */ + @JSONField(name = "reco_id") + private Integer recoId; + + /** + * 结果序列号 + */ + private String serial; + + /** + * UTC时间 + */ + @JSONField(name = "time_s") + private Integer times; + + /** + * 触发类型 + * + * 5:虚拟线圈触发; + * 6:稳定触发; + * 7:IO强制触发; + * 8:手动触发; + * 9:SDK抓拍; + * 10:实时结果(车辆实时入场事件) + * 12:单帧识别结果; + * 13:定时触发; + */ + @JSONField(name = "trigger_type") + private Integer triggerType; + + /** + * 适配通道 + */ + @JSONField(name = "chnlid") + private Integer chnlId; + + /** + * 设备信息对象 + */ + @JSONField(name = "device_info") + private DeviceInfo deviceInfo; + + /** + * 报警信息对象 + */ + @JSONField(name = "alarm_info") + private AlarmInfo alarmInfo; + + /** + * 背景图信息对象(数组) + */ + @JSONField(name = "bg_img") + private List bgImgList; + + /** + * 特征图信息对象(数组) + */ + @JSONField(name = "feture_img") + private List fetureImgList; + + /** + * 路内产品信息 + */ + @JSONField(name = "product_h") + private ProductH productH; + + /** + * 车位信息对象 + */ + private Parking parking; + + /** + * 车牌信息对象 + */ + private Plate plate; + + /** + * 识别信息对象 + */ + private Reco reco; + + + @Data + public static class DeviceInfo{ + /** + * 设备名 + * UTF8+BASE64编码 + */ + @JSONField(name = "dev_name") + private String devName; + + /** + * 设备ip地址 + */ + private String ip; + + /** + * 设备sn编号 + */ + private String sn; + } + + @Data + public static class AlarmInfo{ + /** + * 报警状态 + * + * 0:无报警,默认值(取消报警) + * 1:视频遮挡 + * 3:占用双车位/压线停车 + * 4:非机动车/摩托车 + * 5:车头/车尾方向不一致 + * 7:无牌车 + * 9:行人滞留(预留) + * (10-99:保留) + * ==“占用双车位/压线停车”和“车头/车尾方向不一致”,报警属于证据链== + */ + @JSONField(name = "alarm_status") + private Integer alarmStatus; + + /** + * 白名单/准入车型状态 + * 1:在白名单/准入车型内,且有效 + * + * 2:不在白名单/准入车型内,或验证未通过 + * ==启用白名单后,优先判断白名单== + * + */ + @JSONField(name = "alarm_whitelist") + private Integer alarmWhiteList; + } + + @Data + public static class BgImg{ + /** + * 图片数据 + * base64格式的数据 + */ + private String image; + + /** + * 图片原始大小 + * 字节数 + */ + @JSONField(name = "image_length") + private Integer imageLength; + + /** + * 图片发送标志 + */ + @JSONField(name = "image_send_flag") + private Integer imageSendFlag; + + /** + * 图片的索引id + */ + private String key; + + /** + * 图片缓存的路径名 + */ + private String path; + + /** + * 图片分辨率 + */ + private Resolution resolution; + } + + @Data + public static class FetureImg{ + private Integer type; + private String image; + + @JSONField(name = "image_length") + private Integer imageLength; + + @JSONField(name = "image_send_flag") + private Integer imageSendFlag; + private String key; + private String path; + private Resolution resolution; + } + + @Data + public static class ProductH{ + + /** + * 车辆信息对象 + */ + @JSONField(name = "car_pos") + private CarPos carPos; + + @Data + private static class CarPos{ + /** + * 位置坐标对象 + * 按照背景图的分辨率 + */ + private Loc loc; + + /** + * 车头车尾信息 + * 0:无效; + * 1:车头; + * 2:车尾 + */ + private Integer pos; + } + } + + @Data + public static class Parking{ + private Loc loc; + + @Data + private static class Loc{ + + /** + * 坐标点 + */ + @JSONField(name = "point") + private List pointList; + + /** + * 坐标点个数 + */ + @JSONField(name = "point_num") + private Integer pointNum; + + /** + * 标点坐标系尺寸 + */ + @JSONField(name = "reco_zone_size_factor") + private RecoZoneSizeFactor recoZoneSizeFactor; + + /** + * 车位状态 + * + * 0x01:入场; + * 0x02:在场; + * 0x04:出场; + * 0x08:空场; + * 0x10:车位异常(=="跨车位报警"和"视频遮挡"时==); + * 0x20:延迟上报出场(预留); + * 0x40:合并出入场(预留); + * 0x80:预入场(预留); + * 0x100:预出场(预留); + * 0x200:入场修正(预留) + */ + @JSONField(name = "parking_state") + private Integer parkingState; + + /** + * 车位id + */ + @JSONField(name = "zone_id") + private Integer zoneId; + + /** + * 车位名 + */ + @JSONField(name = "zone_name") + private String zoneName; + + + @Data + private static class Point{ + // 点x坐标 + private Integer x; + // 点y坐标 + private Integer y; + } + + @Data + private static class RecoZoneSizeFactor{ + /** + * 坐标点坐标系尺寸高度 + */ + @JSONField(name = "factor_h") + private Integer factorH; + + /** + * 坐标点坐标系尺寸宽度 + */ + @JSONField(name = "factor_w") + private Integer factorW; + } + } + } + + @Data + public static class Plate{ + /** + * 车牌颜色 + * + * 0:未知; + * 1:蓝色; + * 2:黄色; + * 3:白色; + * 4:黑色; + * 5:绿色; + */ + private Integer color; + + // 车牌置信度 + private Integer confidence; + private Loc loc; + + /** + * 车牌 + * UTF8后再BASE64编码 + * 如果有车牌:真实车牌号 + * 如果有车无牌:无牌车 + * 如果无车无牌:__无__ + * 非机动车:非机动车 + */ + private String plate; + + /** + * 车牌类型 + * + * 0:未知车牌 + * 1:蓝牌小汽车 + * 2:黑牌小汽车 + * 3:单排黄牌 + * 4:双排黄牌(大车尾牌,农用车) + * 5:警车车牌 + * 6:武警车牌 + * 7:个性化车牌 + * 8:单排军车牌 + * 9:双排军车牌 + * 10:使馆车牌 + * 11:香港进出中国大陆车牌 + * 12:农用车牌 + * 13:教练车牌 + * 14:澳门进出中国大陆车牌 + * 15:双层武警车牌 + * 16:武警总队车牌 + * 17:双层武警总队车牌 + * 18:民航车牌 + * 19:新能源车牌 + * 20:新能源车牌大 + * 21:应急 + * 22:领馆 + */ + private Integer type; + } + + @Data + public static class Reco{ + + /** + * 识别组id + */ + @JSONField(name = "group_id") + private Integer groupId; + + /** + * 识别标志 + */ + @JSONField(name = "reco_flag") + private Integer recoFlag; + + /** + * 识别id + */ + @JSONField(name = "reco_id") + private Integer recoId; + + /** + * 识别时间(字符串格式时间) + */ + @JSONField(name = "reco_time") + private String recoTime; + } + + + + @Data + private static class Resolution{ + /** + * 图片高 + */ + private Integer height; + + /** + * 图片宽 + */ + private Integer width; + } + + @Data + private static class Loc{ + // 下 + private Integer bottom; + // 左 + private Integer left; + // 右 + private Integer right; + // 上 + private Integer top; + } + +} diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/camera/common/CameraCommonResult.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/camera/common/CameraCommonResult.java new file mode 100644 index 000000000..6218ba0fa --- /dev/null +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/camera/common/CameraCommonResult.java @@ -0,0 +1,39 @@ +package com.jsowell.thirdparty.camera.common; + + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 相机系统通用回复 + * + * @author Lemon + * @Date 2023/12/5 11:12:11 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CameraCommonResult { + + /** + * 回复状态 + */ + private Integer state; + + /** + * 错误信息 + */ + @JSONField(name = "err_msg") + private String errMsg; + + /** + * 无指令成功响应 + * @param + * @return + */ + public CameraCommonResult successResponse() { + return new CameraCommonResult(200, "all done"); + } +} diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/camera/service/CameraService.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/camera/service/CameraService.java new file mode 100644 index 000000000..b30f5467b --- /dev/null +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/camera/service/CameraService.java @@ -0,0 +1,11 @@ +package com.jsowell.thirdparty.camera.service; + +/** + * TODO + * + * @author Lemon + * @Date 2023/12/5 11:11:32 + */ +public class CameraService { + +}