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<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;
|
|
@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<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());
|
//
|
// }
|
}
|
|
|
}
|