package org.springblade.modules.nettyServer; import io.netty.buffer.ByteBuf; 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.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 sessionChannelMap = new ConcurrentHashMap(); @Autowired private catalogService catalogService; @Autowired private nettyService nettyService; @Autowired private IEquipmentService equipmentService; @Autowired private IAlarmService alarmService; private static ServerHandler serverHandler; @PostConstruct public void init() { serverHandler = this; } /** * 客户端与服务端创建连接的时候调用 */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("CTX:"+ctx.channel()); System.out.println("客户端与服务端连接开始..."); // ChannelId id = ctx.channel().id(); // String s = id.toString(); //NettyConfig.group.add(ctx.channel()); } /** * 客户端与服务端断开连接时调用 */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { System.out.println("客户端与服务端连接关闭..."); NettyConfig.group.remove(ctx.channel()); } /** * 服务端接收客户端发送过来的数据结束之后调用 */ @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); System.out.println("信息接收完毕..."); } /** * 工程出现异常的时候调用 */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } /** * 服务端处理客户端websocket请求的核心方法,这里接收了客户端发来的信息 */ @Override public void channelRead(ChannelHandlerContext channelHandlerContext, Object info) throws Exception { System.out.println("接收到了:"+info); ByteBuf buf = (ByteBuf) info; byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req, "UTF-8"); String content = body; System.out.println("接收客户端数据:" + body); String ChannelName = content.substring(10, 22);//设备编码 String sub = content.substring(23, 27); ConcurrentHashMap 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 outData = new ArrayList<>(); switch (content.substring(0, 2)) { case "LA": { String devId = content.substring(10, 22); String fqbm = content.substring(24, 26); List> 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.setAddvcd((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 iterator = NettyConfig.group.iterator(); // System.out.println("iterator:"+iterator); // while(iterator.hasNext()){ // //打印出所有客户端的远程地址 // System.out.println((iterator.next()).remoteAddress()); // // } } }