Browse Source

摄像头

985653680@qq.com 1 year ago
parent
commit
db4a7c7f18

+ 5 - 0
src/main/java/com/gzlh/camera/CameraServer.java

@@ -0,0 +1,5 @@
+package com.gzlh.camera;
+
+public class CameraServer {
+
+}

+ 8 - 0
src/main/java/com/gzlh/camera/action/CameraCommonAction.java

@@ -0,0 +1,8 @@
+package com.gzlh.camera.action;
+
+/**
+ * led共同
+ */
+public interface CameraCommonAction {
+
+}

+ 17 - 0
src/main/java/com/gzlh/camera/brand/CameraBrandType.java

@@ -0,0 +1,17 @@
+package com.gzlh.camera.brand;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum CameraBrandType {
+
+    HIKVISION(1000,"海康威视")
+
+    ;
+
+
+    private int code;
+    private String brand;
+}

+ 37 - 0
src/main/java/com/gzlh/camera/client/CameraClientHandler.java

@@ -0,0 +1,37 @@
+package com.gzlh.camera.client;
+
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@ChannelHandler.Sharable
+public class CameraClientHandler extends SimpleChannelInboundHandler<String> {
+
+    private CameraNettyConfig cameraNettyConfig;
+
+    public CameraClientHandler(CameraNettyConfig cameraNettyConfig) {
+        this.cameraNettyConfig = cameraNettyConfig;
+    }
+
+    @Override
+    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
+        log.info("Camera 客户端收到消息:" + msg);
+
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        log.error("Camera 客户端 连接断开,进行重连");
+        cameraNettyConfig.connect();
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+        cause.printStackTrace();
+        ctx.close();
+    }
+
+}
+

+ 98 - 0
src/main/java/com/gzlh/camera/client/CameraNettyConfig.java

@@ -0,0 +1,98 @@
+package com.gzlh.camera.client;
+
+import com.gzlh.camera.properties.CameraPropertiesConfig;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+@Slf4j
+public class CameraNettyConfig {
+
+    @Resource
+    private CameraPropertiesConfig cameraConfig;
+
+    @Autowired
+    private CameraClientHandler cameraClientHandler;
+
+    private Channel channel;
+
+    @Bean("cameraBootstrap")
+    public Bootstrap bootstrap() {
+        String host = cameraConfig.getHost();
+        int port = cameraConfig.getPort();
+        if (cameraConfig.isEnable()) {
+            log.info("初始化 led:{},{}", host, port);
+        }
+        EventLoopGroup group = new NioEventLoopGroup();
+        return new Bootstrap()
+                .group(group)
+                .channel(NioSocketChannel.class)
+                .remoteAddress(host, port)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .handler(new ChannelInitializer<SocketChannel>() {
+                    @Override
+                    protected void initChannel(SocketChannel ch) {
+                        try {
+                            ChannelPipeline pipeline = ch.pipeline();
+                            pipeline.addLast("decoder", new StringDecoder());
+                            pipeline.addLast("encoder", new StringEncoder());
+                            pipeline.addLast("handler", cameraClientHandler);
+                        } catch (Exception e) {
+                            log.info("error connect:{}", e.getMessage());
+                        }
+                    }
+                });
+    }
+
+    @Bean("cameraClientHandler")
+    public CameraClientHandler cameraClientHandler() {
+        return new CameraClientHandler(this);
+    }
+
+    public void connect() {
+        String host = cameraConfig.getHost();
+        int port = cameraConfig.getPort();
+        ChannelFuture future = bootstrap().connect();
+        future.addListener((ChannelFutureListener) future1 -> {
+            if (future1.isSuccess()) {
+                channel = future1.channel();
+                log.info("Camera 串口服务器连接成功,{},{}", host, port);
+            } else {
+                log.error("-------------Camera 连接服务器失败,{},{}-----------,进行重连", host, port);
+                future1.channel().eventLoop().schedule(this::connect, 5, TimeUnit.SECONDS);
+            }
+        });
+        try {
+            future.channel().closeFuture().sync();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void send(String message) {
+        if (channel != null && channel.isActive()) {
+            channel.writeAndFlush(message);
+        } else {
+            log.error("未建立连接,无法发送消息");
+        }
+    }
+
+    public void close() {
+        if (channel != null) {
+            channel.close();
+        }
+    }
+}
+

+ 82 - 0
src/main/java/com/gzlh/camera/controller/CameraController.java

@@ -0,0 +1,82 @@
+package com.gzlh.camera.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.XmlUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.gzlh.camera.factory.CameraFactory;
+import com.gzlh.camera.properties.CameraPropertiesConfig;
+import com.gzlh.event.EventBus;
+import com.gzlh.utils.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
+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;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@RestController
+@RequestMapping("/Camera")
+public class CameraController {
+    @Value("${file.root-path}")
+    private String path;
+    @Value("${application.channel-name}")
+    private String channel;
+    @Resource
+    private CameraFactory cameraFactory;
+    @Resource
+    private CameraPropertiesConfig cameraPropertiesConfig;
+
+
+    @PostMapping("/recv")
+    public void recv(
+            @RequestBody String xmlStr
+//            HttpServletRequest request
+    ) throws IOException {
+//        String xmlStr = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
+
+        Map<String, Object> StringObjectMap = new HashMap<>();
+
+        XmlUtil.xmlToMap(xmlStr, StringObjectMap);
+
+        Map<String, Object> ic = BeanUtil.beanToMap(StringObjectMap.get("IC"));
+        Map<String, Object> weight =BeanUtil.beanToMap(StringObjectMap.get("WEIGHT"));
+        Map<String, Object> car = BeanUtil.beanToMap(StringObjectMap.get("CAR"));
+        Map<String, Object> conta =BeanUtil.beanToMap(StringObjectMap.get("CONTA"));
+        Map<String, Object> seal = BeanUtil.beanToMap(StringObjectMap.get("SEAL"));
+
+
+        Map<String, String> cacheMap = new HashMap<>();
+        cacheMap.put("carEcNo", (String) car.get("CAR_EC_NO"));
+        cacheMap.put("contaIdF", !StringUtils.isEmpty((String) car.get("CONTA_ID_F"))?(String) car.get("CONTA_ID_F"):"");
+        cacheMap.put("contaIdB", !StringUtils.isEmpty((String) car.get("CONTA_ID_B"))?(String) car.get("CONTA_ID_B"):"");
+
+
+        Calendar calendar = Calendar.getInstance();
+        String savePath=path+"/"+ calendar.get(Calendar.YEAR)+"-" + (calendar.get(Calendar.MONTH)+1);
+
+        Map<String, String> picMap = new HashMap<>();
+        for (Map.Entry<String, Object> entry : conta.entrySet()) {
+            if(entry.getKey().contains("PIC")&& !StringUtils.isEmpty((String) entry.getValue())){
+                String filePath = FileUtils.downLoad((String) entry.getValue(),savePath);
+                String base64 = FileUtils.getBase64FromImg(filePath);
+                picMap.put(entry.getKey(),base64);
+            }
+        }
+
+        // TODO: 2023/11/10
+        cameraFactory.handler(cameraPropertiesConfig.getBrand()).handlerAction("");
+
+
+
+    }
+
+
+}

+ 12 - 0
src/main/java/com/gzlh/camera/event/CameraDefaultEvent.java

@@ -0,0 +1,12 @@
+package com.gzlh.camera.event;
+
+/**
+ * led内置事件
+ */
+public interface CameraDefaultEvent {
+    /**
+     * 超时事件
+     */
+    String TIMEOUT = "TIMEOUT";
+    String READ = "READ";
+}

+ 21 - 0
src/main/java/com/gzlh/camera/factory/CameraFactory.java

@@ -0,0 +1,21 @@
+package com.gzlh.camera.factory;
+
+
+
+import com.gzlh.camera.handler.ICameraHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CameraFactory {
+    @Autowired
+    private List<ICameraHandler>handlers;
+
+    public ICameraHandler handler(int code){
+       return handlers.stream().filter(h->h.brandType().getCode()==code)
+                .findAny().orElseThrow(()->new IllegalArgumentException("不支持交互"));
+    }
+
+}

+ 12 - 0
src/main/java/com/gzlh/camera/handler/ICameraHandler.java

@@ -0,0 +1,12 @@
+package com.gzlh.camera.handler;
+
+import com.gzlh.camera.brand.CameraBrandType;
+
+public interface ICameraHandler {
+
+    CameraBrandType brandType();
+
+    void sendMsg( String content);
+
+    void handlerAction(String action);
+}

+ 36 - 0
src/main/java/com/gzlh/camera/handler/impl/CameraHandlerHikvision.java

@@ -0,0 +1,36 @@
+package com.gzlh.camera.handler.impl;
+
+import com.gzlh.camera.brand.CameraBrandType;
+import com.gzlh.camera.client.CameraNettyConfig;
+import com.gzlh.camera.handler.ICameraHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 上海仰邦科技股份有限公司BX-5(M)K/6K(YY)-V4.2 led发送处理器
+ */
+@Service
+@Slf4j
+public class CameraHandlerHikvision implements ICameraHandler {
+
+    @Resource
+    private CameraNettyConfig cameraNettyConfig;
+
+    @Override
+    public CameraBrandType brandType() {
+        return CameraBrandType.HIKVISION;
+    }
+
+    @Override
+    public void sendMsg(String content) {
+        log.info(CameraBrandType.HIKVISION.getBrand() + "发送消息:{}", content);
+        cameraNettyConfig.send(content);
+    }
+
+    @Override
+    public void handlerAction(String action) {
+        log.info("action:{}",action);
+    }
+}

+ 15 - 0
src/main/java/com/gzlh/camera/properties/CameraPropertiesConfig.java

@@ -0,0 +1,15 @@
+package com.gzlh.camera.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@ConfigurationProperties(prefix = "led")
+@Configuration
+@Data
+public class CameraPropertiesConfig {
+    private String host;
+    private int port;
+    private int brand;
+    private boolean enable;
+}