nnnjjj123
2021-01-28 71b6b716361c52af290493d365a328fc1a3467e2
src/main/java/org/springblade/modules/nettyServer/ServerHandler.java
@@ -4,28 +4,54 @@
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelId;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.ChannelMatcher;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.CharsetUtil;
import io.netty.util.concurrent.GlobalEventExecutor;
import org.springblade.modules.Netty.entitly.Netty;
import org.springblade.modules.Netty.service.nettyService;
import org.springblade.modules.alarm.entity.Alarm;
import org.springblade.modules.alarm.service.IAlarmService;
import org.springblade.modules.alarm.vo.AlarmVO;
import org.springblade.modules.catalog.service.catalogService;
import org.springblade.modules.equipment.entity.Equipment;
import org.springblade.modules.equipment.service.IEquipmentService;
import org.springblade.modules.equipment.vo.EquipmentVOS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import javax.annotation.PostConstruct;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@Component
public class ServerHandler extends ChannelInboundHandlerAdapter {
   private  String reg_LA ="LA[d]{8}[d|A-F]{12}[d|A-F]{8}[d|A-Z]{2}[d|A-F]{4}[x2A][d|A-F]{6}[#@]";
   private String reg_LB = "LB[\\d|A-F]{12}[\\x2A].*[#@]";
   private String reg_LB2 = "LB[\\d|A-F]{6}[\\x2A].*[#@]";
   private String reg_LD = "LD[d]{8}[d|A-F]{12}:[A-Z]{4}[\\x2A].*[#@]";
   private ConcurrentHashMap<String, Channel> sessionChannelMap = new ConcurrentHashMap<String, Channel>();
   @Autowired
   private catalogService catalogService;
   @Autowired
   private nettyService nettyService;
   @Autowired
   private  IEquipmentService equipmentService;
   @Autowired
   private  IAlarmService alarmService;
   private static ServerHandler serverHandler;
@@ -38,9 +64,11 @@
    */
   @Override
   public void channelActive(ChannelHandlerContext ctx) throws Exception {
      System.out.println("CTX:"+ctx.channel());
      System.out.println("客户端与服务端连接开始...");
      System.out.println("Channel:"+ctx.channel());
      NettyConfig.group.add(ctx.channel());
//      ChannelId id = ctx.channel().id();
//      String s = id.toString();
      //NettyConfig.group.add(ctx.channel());
   }
   /**
@@ -80,27 +108,159 @@
      byte[] req = new byte[buf.readableBytes()];
      buf.readBytes(req);
      String body = new String(req, "UTF-8");
      String content = body;
      System.out.println("接收客户端数据:" + body);
      channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("LEOK#@!", CharsetUtil.UTF_8));
      List<Map<String, Object>> list = serverHandler.catalogService.selectCatalogList();
      System.out.println(list);
//      ByteBuf pingMessage = Unpooled.buffer();
//      pingMessage.writeBytes(req);
//      channelHandlerContext.writeAndFlush(pingMessage);
      String ChannelName = content.substring(10, 22);//设备编码
      String sub = content.substring(23, 27);
      ConcurrentHashMap<String, Channel> channelHashMap = ChannelMap.getChannelHashMap();
      if (channelHashMap==null){
         if (!sub.equals("VIMO")){
            // 保存当前连接
            ChannelMap.addChannel(ChannelName,channelHandlerContext.channel());
         }
      }
      else {
         Channel channel = ChannelMap.getChannelByName(ChannelName);
         if (channel!=channelHandlerContext.channel()|| channel==null){
            if (!sub.equals("VIMO")){
               // 保存当前连接
               ChannelMap.addChannel(ChannelName,channelHandlerContext.channel());
            }
         }
      }
      List<String> outData = new ArrayList<>();
      switch (content.substring(0, 2))
      {
         case "LA":
         {
            String devId = content.substring(10, 22);
            String fqbm = content.substring(24, 26);
            List<Map<String, Object>> list = serverHandler.equipmentService.selectInfos(devId);
            Alarm alarm= new Alarm();
            alarm.setAlarmType("一键报警");
            Date day = new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            alarm.setAlarmTime(df.format(day));
            alarm.setPlace((String) list.get(0).get("streeName"));//事发地址
            alarm.setDeviceNumber((String) list.get(0).get("deviceNumber"));//设备编号
            alarm.setDistrict((String) list.get(0).get("addvcd"));//行政区编码
            alarm.setJd((String) list.get(0).get("jd"));//经度
            alarm.setWd((String) list.get(0).get("wd"));//纬度
            alarm.setJtype("0");
            if (fqbm.equals("00")){
                 alarm.setWaringType("旁路");
            }
            else if(fqbm.equals("01")){
               alarm.setWaringType("火警");
            }
            else if(fqbm.equals("02")){
               alarm.setWaringType("挟持");
            }
            else if(fqbm.equals("03")){
               alarm.setWaringType("紧急");
            }
            else if(fqbm.equals("04")){
               alarm.setWaringType("救护");
            }
            else if(fqbm.equals("05")){
               alarm.setWaringType("内部");
            }
            else if(fqbm.equals("06")){
               alarm.setWaringType("出入");
            }
            else if(fqbm.equals("07")){
               alarm.setWaringType("周边");
            }
            else {
               alarm.setWaringType("防拆");
            }
            serverHandler.alarmService.s(alarm);
            outData.add("LEOK#@");
            break;
         }
         case "LD":
         {
//            if (Pattern.matches(content, reg_LD))
               String deviceNumber = content.substring(10, 22);
               String keyword = content.substring(23, 27);
               System.out.println(keyword);
               switch(keyword)
               {
                  case "IMEI":
                  {
                     Date d = new Date();
                     SimpleDateFormat sbf = new SimpleDateFormat("MMddHHmm");
                     outData.add("LC8C0470" + sbf.format(d) + "#@" + "LEOK#@");
                     outData.add("LEOK#@");
                     break;
                  }
                  case "SRTC":
                  {
                     Date d = new Date();
                     SimpleDateFormat sbf = new SimpleDateFormat("yyyyMMddHHmmss");
                     outData.add("LEOK#@");
                     outData.add("LC8C0700" + sbf.format(d) + "#@");
                     break;
                  }
                  case "STAS":
                  {
                     outData.add("LEOK#@");
                     outData.add("LC8100001E"+ "#@");
                     break;
                  }
                  case "TEST":
                  {
                     Date d = new Date();
                     SimpleDateFormat sbf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                     String format = sbf.format(d);
                     serverHandler.equipmentService.updateChannel(format,deviceNumber);
                     outData.add("LEOK#@");
                     outData.add("LEON#@");
                     break;
                  }
                  case "COMM":
                  {
                     outData.add("LEOK#@");
                     break;
                  }
                  default:
                  {
                     outData.add("LEOK#@");
                     break;
                  }
               }
            break;
         }
         case "LB":
         {
               outData.add("LEOK#@");
            break;
         }
      }
      if(outData.size() == 0)
      {
         outData.add("LERR#@");
      }
      for (int i = 0; i < outData.size(); i++)
      {
         channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(outData.get(i), CharsetUtil.UTF_8));
      }
//      channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("LEOK#@!", CharsetUtil.UTF_8));
      //服务端使用这个就能向 每个连接上来的客户端群发消息
      //NettyConfig.group.writeAndFlush(info);
      Iterator<Channel> iterator = NettyConfig.group.iterator();
      System.out.println("iterator:"+iterator);
        while(iterator.hasNext()){
          //打印出所有客户端的远程地址
           System.out.println((iterator.next()).remoteAddress());
      }
//      Iterator<Channel> iterator = NettyConfig.group.iterator();
//      System.out.println("iterator:"+iterator);
//        while(iterator.hasNext()){
//          //打印出所有客户端的远程地址
//           System.out.println((iterator.next()).remoteAddress());
//
//      }
   }
}