123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package com.gzlh.device.plc.client;
- import com.gzlh.bus.EventConfig;
- import com.gzlh.config.dto.SerialSetting;
- import com.gzlh.device.plc.service.PLCService;
- import com.gzlh.utils.DeviceCache;
- import io.netty.channel.ChannelHandler;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.SimpleChannelInboundHandler;
- import lombok.extern.slf4j.Slf4j;
- import java.lang.reflect.Field;
- import java.util.*;
- @Slf4j
- @ChannelHandler.Sharable
- public class PlcClientHandler extends SimpleChannelInboundHandler<String> {
- private PlcNettyConfig ledNettyConfig;
- private PLCService plcService = new PLCService();
- public PlcClientHandler(PlcNettyConfig ledNettyConfig) {
- this.ledNettyConfig = ledNettyConfig;
- }
- @Override
- protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
- log.info("PLC 客户端收到消息:" + msg);
- DeviceCache.put("plc",1);
- String result = Integer.toBinaryString(Integer.parseInt(msg.substring(6, 8),16));
- String oldPlcInfo = DeviceCache.getPlcStatus();
- String newPlcInfo = String.format("%8s", result).replace(" ", "0");
- // 将plc的设备信息补到8存入缓存
- DeviceCache.setPlcStatus(newPlcInfo);
- // 设备信息发生变化时进入
- if (oldPlcInfo!=null&&!newPlcInfo.equals(oldPlcInfo)){
- SerialSetting.PlcDTO.StatusDTO status = EventConfig.serialSetting.getPlc().getStatus();
- String newStr = new StringBuffer(newPlcInfo).reverse().toString();
- String oldStr = new StringBuffer(oldPlcInfo).reverse().toString();
- for (int i=0;i<newStr.length();i++){
- // 第i位设备的值
- String value = String.valueOf(newStr.charAt(i));
- // 设备被触发
- if (value.equals("1")&&!value.equals(String.valueOf(oldStr.charAt(i)))){
- // 记录时间 配置的设备地址为map的key
- for (Field field:status.getClass().getDeclaredFields()){
- field.setAccessible(true);
- if (Integer.parseInt(String.valueOf(field.get(status)))==i){
- // String name = fields[i].getName();
- DeviceCache.putTime((String) field.get(status),new Date());
- break;
- }
- }
- // 前红外触发时调用方法
- if (String.valueOf(i).equals(status.getFRedPoint())){
- new Thread(()-> {
- try {
- plcService.fRedTrigger(newPlcInfo);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }).start();
- }
- // 雷达外触发时调用方法
- if (String.valueOf(i).equals(status.getRadarPoint())){
- new Thread(()-> {
- try {
- plcService.radarTrigger();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }).start();
- }
- // 上到位触发时调用方法
- if (String.valueOf(i).equals(status.getUpPoint())){
- new Thread(()-> {
- try {
- plcService.upTrigger();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }).start();
- }
- }
- }
- }
- // for (int i=0;i<result.length();i++){
- // String status = String.valueOf(result.charAt((result.length() - 1) - i));
- // if (status.equals("1")){
- // list.add(i);
- // }
- // }
- // System.out.println(list);
- // log.info("PLC 客户端收到消息:" + msg);
- }
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- log.error("PLC 客户端 连接断开,进行重连");
- ledNettyConfig.connect();
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- cause.printStackTrace();
- ctx.close();
- }
- }
|