Browse Source

/*

* 1. 灵州站准备接入省测上级系统所作的代码修改和测试;
* 2. 将工程中一些文件名和接口进行规范化命名;
* 3. 打印日志方式改成lombok提供的@Slf4j注解。
*/
master
htjcAdmin 4 months ago
parent
commit
eb6ad842e6
16 changed files with 215 additions and 240 deletions
  1. +6
    -0
      pom.xml
  2. +4
    -5
      src/main/java/com/inspect/tcpserver/TcpserverApplication.java
  3. +3
    -3
      src/main/java/com/inspect/tcpserver/cofiguration/ClientStart.java
  4. +1
    -5
      src/main/java/com/inspect/tcpserver/cofiguration/StartNettyServer.java
  5. +0
    -65
      src/main/java/com/inspect/tcpserver/controller/ClientController.java
  6. +6
    -14
      src/main/java/com/inspect/tcpserver/controller/DeviceServerController.java
  7. +62
    -0
      src/main/java/com/inspect/tcpserver/controller/UpstreamClientController.java
  8. +1
    -1
      src/main/java/com/inspect/tcpserver/tcp/ChannelCache.java
  9. +1
    -1
      src/main/java/com/inspect/tcpserver/tcp/ConnectionListener.java
  10. +4
    -3
      src/main/java/com/inspect/tcpserver/tcp/DownXml2Json.java
  11. +3
    -7
      src/main/java/com/inspect/tcpserver/tcp/MyDecoder.java
  12. +57
    -57
      src/main/java/com/inspect/tcpserver/tcp/NettyClient.java
  13. +11
    -18
      src/main/java/com/inspect/tcpserver/tcp/NettyClientHandler.java
  14. +42
    -48
      src/main/java/com/inspect/tcpserver/tcp/NettyServer.java
  15. +11
    -10
      src/main/java/com/inspect/tcpserver/tcp/NettyServerHandler.java
  16. +3
    -3
      src/main/java/com/inspect/tcpserver/tcp/UpJson2Xml.java

+ 6
- 0
pom.xml View File

@ -93,6 +93,12 @@
<artifactId>javolution</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
<dependencyManagement>


+ 4
- 5
src/main/java/com/inspect/tcpserver/TcpserverApplication.java View File

@ -1,20 +1,19 @@
package com.inspect.tcpserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.scheduling.annotation.EnableAsync;
@Slf4j
@SpringBootApplication
@EnableAsync
public class TcpserverApplication {
private final static Logger log = LoggerFactory.getLogger(TcpserverApplication.class);
public static class CustomGenerator implements BeanNameGenerator {


+ 3
- 3
src/main/java/com/inspect/tcpserver/cofiguration/ClientStart.java View File

@ -1,6 +1,7 @@
package com.inspect.tcpserver.cofiguration;
import com.inspect.tcpserver.tcp.NettyClient;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
@ -9,18 +10,17 @@ import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
@Slf4j
@Configuration
@ConditionalOnProperty(name = "boot.client", havingValue = "true")
public class ClientStart implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(ClientStart.class);
@Resource
NettyClient nettyClient;
@Override
public void run(String... args) {
nettyClient.ConnectServer();
nettyClient.connectUpperSystemServer();
}
}

src/main/java/com/inspect/tcpserver/cofiguration/ServerStart.java → src/main/java/com/inspect/tcpserver/cofiguration/StartNettyServer.java View File


+ 0
- 65
src/main/java/com/inspect/tcpserver/controller/ClientController.java View File

@ -1,65 +0,0 @@
package com.inspect.tcpserver.controller;
import com.alibaba.fastjson.JSONObject;
import com.inspect.tcpserver.domain.AjaxResult;
import com.inspect.tcpserver.tcp.NettyClient;
import com.inspect.tcpserver.util.Color;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.UUID;
@RestController
@RequestMapping("/client")
public class ClientController {
private final Logger logger = LoggerFactory.getLogger(ClientController.class);
@Resource
NettyClient nettyClient;
@GetMapping("gray")
public String gray() {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
MDC.put("traceId", uuid);
logger.info("这是一个来自springboot,logback的info级别的日志");
logger.warn("这是一条来自springboot,logback的warn级别的日志");
logger.warn("这是一条来自springboot,logback的warn级别的日志2");
logger.error("这是一条来自springboot,logback的error级别的日志", new Exception("系统错误"));
return "success";
}
/**
* 调用客户端发送消息
*/
@PostMapping("sendMsg")
public AjaxResult sendMsg(String uuid, @RequestBody String msg) {
try {
if (StringUtils.isBlank(msg)) {
return AjaxResult.fail("500", "消息为空");
}
JSONObject jsonObject = JSONObject.parseObject(msg);
if (null == jsonObject) {
return AjaxResult.fail("500", "消息JSON解析失败");
}
msg = msg.replaceAll("sendCode", "SendCode");
msg = msg.replaceAll("receiveCode", "ReceiveCode");
msg = msg.replaceAll("type", "Type");
//logger.info("###### 会话:{}, 巡视主机客户端接收到消息, 发送到上级 ######\n{}", uuid, msg);
//nettyClient.sendJsonMessage(uuid, msg);
return AjaxResult.success();
} catch (Exception e) {
logger.error(Color.RED + "###### 会话:{}, 客户端发送消息捕获异常:{} ######" + Color.END, uuid, e.getMessage());
return AjaxResult.fail(500, "数据格式不正确");
}
}
}

+ 6
- 14
src/main/java/com/inspect/tcpserver/controller/DeviceServerController.java View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.inspect.tcpserver.domain.AjaxResult;
import com.inspect.tcpserver.domain.DeviceServerProperties;
import com.inspect.tcpserver.tcp.NettyServer;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -14,14 +15,12 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Slf4j
@RestController
@RequestMapping("/deviceServer")
public class DeviceServerController {
@Resource
NettyServer server;
private Logger logger = LoggerFactory.getLogger(DeviceServerController.class);
private NettyServer server;
@Resource
DeviceServerProperties deviceServerProperties;
@ -31,19 +30,14 @@ public class DeviceServerController {
*/
@PostMapping("/sendCommand")
public AjaxResult sendCommand(@RequestBody String json) {
try {
logger.info("设备接入层server-接口,接到命令:{}", json);
log.info("设备接入层server-接口,接到命令:{}", json);
// 调用设备接入层下发命令到设备
JSONObject jsonObject = JSONObject.parseObject(json);
String sendCode = jsonObject.getString("SendCode");
String receiveCode = jsonObject.getString("ReceiveCode");
if (StringUtils.isEmpty(sendCode) || StringUtils.isEmpty(receiveCode)) {
logger.error("SendCoded或ReceiveCode为空");
log.error("SendCoded或ReceiveCode为空");
return AjaxResult.fail(500, "SendCoded或ReceiveCode为空");
} else {
server.sendXmlMessage(jsonObject);// to device
@ -51,11 +45,9 @@ public class DeviceServerController {
}
} catch (Exception e) {
logger.error("设备接入服务,处理命令下发捕获异常", e);
log.error("设备接入服务,处理命令下发捕获异常", e);
return AjaxResult.fail(500);
}
}
}

+ 62
- 0
src/main/java/com/inspect/tcpserver/controller/UpstreamClientController.java View File

@ -0,0 +1,62 @@
package com.inspect.tcpserver.controller;
import com.alibaba.fastjson.JSONObject;
import com.inspect.tcpserver.domain.AjaxResult;
import com.inspect.tcpserver.tcp.NettyClient;
import com.inspect.tcpserver.util.Color;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.UUID;
@Slf4j
@RestController
@RequestMapping("/client")
public class UpstreamClientController {
@Resource
private NettyClient nettyClient;
@GetMapping("gray")
public String gray() {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
MDC.put("traceId", uuid);
log.info("这是一个来自springboot,logback的info级别的日志");
log.warn("这是一条来自springboot,logback的warn级别的日志");
log.warn("这是一条来自springboot,logback的warn级别的日志2");
log.error("这是一条来自springboot,logback的error级别的日志", new Exception("系统错误"));
return "success";
}
/**
* 调用客户端发送消息
*/
@PostMapping("sendMsg")
public AjaxResult sendMsg(String uuid, @RequestBody String data) {
if (StringUtils.isBlank(data)) {
return AjaxResult.fail("500", "消息为空");
}
try {
JSONObject.parseObject(data);
} catch (Exception e) {
return AjaxResult.fail("500", "消息体解析失败");
}
try {
data = data.replaceAll("sendCode", "SendCode");
data = data.replaceAll("receiveCode", "ReceiveCode");
data = data.replaceAll("type", "Type");
log.info("###### 会话:{}, 巡视主机客户端接收到消息, 发送到上级 ######\n{}", uuid, data);
nettyClient.sendJsonMessage(uuid, data);
return AjaxResult.success();
} catch (Exception e) {
log.error(Color.RED + "###### 会话:{}, 客户端发送消息捕获异常:{} ######" + Color.END, uuid, e.getMessage());
return AjaxResult.fail(500, "发送消息异常");
}
}
}

+ 1
- 1
src/main/java/com/inspect/tcpserver/tcp/ChannelCache.java View File

@ -7,7 +7,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class ChannelCache {
private static Map<String, ChannelHandlerContext> channelPool = new ConcurrentHashMap<>();
private static final Map<String, ChannelHandlerContext> channelPool = new ConcurrentHashMap<>();
public int size() {
return channelPool.size();


+ 1
- 1
src/main/java/com/inspect/tcpserver/tcp/ConnectionListener.java View File

@ -21,7 +21,7 @@ public class ConnectionListener implements ChannelFutureListener {
loop.schedule(new Runnable() {
@Override
public void run() {
nettyClient.ConnectServer();
nettyClient.connectUpperSystemServer();
}
}, 3L, TimeUnit.SECONDS);
}


+ 4
- 3
src/main/java/com/inspect/tcpserver/tcp/DownXml2Json.java View File

@ -6,11 +6,12 @@ import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.Xpp3Driver;
import com.thoughtworks.xstream.security.AnyTypePermission;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class DownXml2Json {
private final Logger logger = LoggerFactory.getLogger(DownXml2Json.class);
/**
* 默认为对上级的客户端的别名
@ -46,7 +47,7 @@ public class DownXml2Json {
T obj = (T) xStream.fromXML(xml);
return JSON.toJSONString(obj);
} catch (com.thoughtworks.xstream.XStreamException ex) {
logger.error(Color.RED + "###### 客户:{}, DownStreamJson2Xml解析失败:{} ######" + Color.END, id, e.getMessage());
log.error(Color.RED + "###### 客户:{}, DownStreamJson2Xml解析失败:{} ######" + Color.END, id, e.getMessage());
return null;
}
}
@ -224,7 +225,7 @@ public class DownXml2Json {
public String AlarmControlXml2Json(String xml) {
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
//xStream.alias(alias, AlarmControl.class);
logger.info("[XML] AlarmControlXml2Json alias:{}", alias);
log.info("[XML] AlarmControlXml2Json alias:{}", alias);
xStream.alias(alias, AlarmControl.class);
xStream.autodetectAnnotations(true);
xStream.ignoreUnknownElements();


+ 3
- 7
src/main/java/com/inspect/tcpserver/tcp/MyDecoder.java View File

@ -1,23 +1,18 @@
package com.inspect.tcpserver.tcp;
import com.inspect.tcpserver.util.Color;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.tomcat.util.buf.HexUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import java.util.List;
@Slf4j
public class MyDecoder extends ByteToMessageDecoder {
private static final Logger log = LoggerFactory.getLogger(MyDecoder.class);
private final int BASE_LENGTH = 2 + 8 + 8 + 1 + 4 + 2;
private Integer printRecvData = 0;
@ -64,6 +59,7 @@ public class MyDecoder extends ByteToMessageDecoder {
binaryModel.dataLength = xmlLength;
binaryModel.dataBuf = Unpooled.copiedBuffer(payload);
binaryModel.uuid = uuid;
binaryModel.id = ctx.channel().id().asShortText();
out.add(binaryModel);
break;
} else {


+ 57
- 57
src/main/java/com/inspect/tcpserver/tcp/NettyClient.java View File

@ -17,13 +17,12 @@ import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.util.CharsetUtil;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
@ -35,15 +34,14 @@ import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.TimerTask;
import java.util.concurrent.*;
@Slf4j
@Component
public class NettyClient {
private Logger logger = LoggerFactory.getLogger(NettyClient.class);
// 客户端只需要一个 时间循环组 , NioEventLoopGroup 线程池
private static final EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
@ -74,7 +72,7 @@ public class NettyClient {
@Value("${up_time_interval_setting}")
String upTimeIntervalSetting;
@Value("${print_recv_data:0}")
@Value("${print_recv_data:1}")
Integer printRecvData;
/**
@ -93,15 +91,13 @@ public class NettyClient {
//释放资源
public void Close() {
if (eventLoopGroup != null) {
eventLoopGroup.shutdownGracefully();
}
eventLoopGroup.shutdownGracefully();
scheduledExecutor.shutdown();
}
//连接服务器
@Async
public void ConnectServer() {
public void connectUpperSystemServer() {
this.serverIP = upSystemServerProperties.ip;
this.serverPort = upSystemServerProperties.port;
this.sendCode = upSystemServerProperties.iipCode;
@ -129,7 +125,7 @@ public class NettyClient {
// ChannelFuture 类分析 , Netty 异步模型
// sync 作用是该方法不会再次阻塞
ChannelFuture channelFuture = bootstrap.connect(serverIP, serverPort).addListener(new ConnectionListener(this)).sync();
logger.info("nettyClient连接服务器成功");
log.info("nettyClient连接服务器成功");
// 关闭通道, 开始监听
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
@ -156,10 +152,10 @@ public class NettyClient {
// 存入缓存
redisTemplate.opsForValue().set(String.valueOf(this.sendIndex), allBuf.toString(CharsetUtil.US_ASCII), 60L, TimeUnit.SECONDS);
client.sendMsg(allBuf);
client.sendProtoBuffer(allBuf);
this.sendIndex++;
} else {
logger.warn("###### 会话:{}, 与上级系统连接失败 ######", uuid);
log.warn("###### 会话:{}, 与上级系统连接失败 ######", uuid);
}
}
@ -171,25 +167,25 @@ public class NettyClient {
if (!StringUtil.isNullOrEmpty(msg)) {
ByteBuf allBuf = Unpooled.copiedBuffer(msg, CharsetUtil.US_ASCII);
client.sendMsg(allBuf);
client.sendProtoBuffer(allBuf);
}
}
}
//线程处理接收函数
public void ReceiveMsg(BinaryModel binaryModel) {
public void receiveUpstreamData(BinaryModel binaryModel) {
// executorService.execute(() ->
// {
try {
threadDealMsg(binaryModel);
parseUpstreamData(binaryModel);
} catch (Exception e) {
logger.error("error", e);
log.error("error", e);
}
// });
}
//处理接收消息
private void threadDealMsg(BinaryModel binaryModel) throws DocumentException {
private void parseUpstreamData(BinaryModel binaryModel) throws DocumentException {
String xml = binaryModel.dataBuf.toString(CharsetUtil.UTF_8);
this.receiveIndex = binaryModel.sendIndex;
SAXReader saxReader = new SAXReader();
@ -206,7 +202,7 @@ public class NettyClient {
if (type == SystemType.system) {
if (command == SystemType.no_response || command == SystemType.has_response) {
if (null != root.element("Code")) {
if (root.element("Code").getText() == ResponseType.retry) {
if (Objects.equals(root.element("Code").getText(), ResponseType.retry)) {
resetSendMsg(binaryModel.receiveIndex);
}
}
@ -216,7 +212,7 @@ public class NettyClient {
String response = "";
String json = null;
logger.info("###### 收到上级系统消息:{}, 类型:{} ######\n{}", binaryModel.id, type, xml);
log.info("###### 解析上级系统消息, 通道: {}, 类型:{} ######\n{}", binaryModel.id, type, xml);
switch (type) {
case SystemType.system:
switch (command) {
@ -270,7 +266,7 @@ public class NettyClient {
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, xml, ResultControl.class);
break;
default:
logger.warn("ClienHandler接收到的type:{}不在处理范围内, 不予处理", type);
log.warn("ClienHandler接收到的type:{}不在处理范围内, 不予处理", type);
}
// 将上级下发的指令转发到业务端处理接收业务端处理后的结果上报给上级系统
@ -285,7 +281,7 @@ public class NettyClient {
Result body = ajaxResultResponseEntity.getBody();
if (null == body) {
logger.error("接收上级系统下发的指令,转发到应用业务端处理后,返回的响应体为空");
log.error("接收上级系统下发的指令,转发到应用业务端处理后,返回的响应体为空");
return;
}
@ -293,7 +289,7 @@ public class NettyClient {
String msg = body.getMsg();
String data = body.getData();
logger.info("接收到上级系统下发指令,转发到巡视主机,成功,返回code:{},msg:{},data:{}", bodyCode, msg, data);
log.info("接收到上级系统下发指令,转发到巡视主机,成功,返回code:{},msg:{},data:{}", bodyCode, msg, data);
// 响应巡视主机
JSONObject item = JSONObject.parseObject(data);
@ -301,7 +297,7 @@ public class NettyClient {
} else {
// 调用业务端处理失败
logger.warn("下发指令,失败,httpCode:{}", statusCode);
log.warn("下发指令,失败,httpCode:{}", statusCode);
response = createDownFailResponse();
}
@ -338,34 +334,38 @@ public class NettyClient {
xStream.addPermission(AnyTypePermission.ANY);
obj = (RegisterResponseControl) xStream.fromXML(xml);
} catch (com.thoughtworks.xstream.XStreamException e2) {
logger.error("###### dealRegister解析失败:{} ######", e2.getMessage());
log.error("###### dealRegister解析失败:{} ######", e2.getMessage());
}
}
TimerSendControl(obj);
timerSendControl(obj);
logger.info("###### 客户端接收到服务端注册回馈, 服务注册完成 ######");
log.info("###### 客户端接收到服务端注册回馈, 服务注册完成 ######");
}
//处理心跳
public void TimerSendControl(RegisterResponseControl response) {
public void timerSendControl(RegisterResponseControl response) {
try {
if (response.Code.equals(ResponseType.succeed)) {
int heart = Integer.parseInt(response.Items.get(0).heart_beat_interval);
int patroldevice = Integer.parseInt(response.Items.get(0).patroldevice_run_interval);
int nest = Integer.parseInt(response.Items.get(0).nest_run_interval);
int weather = Integer.parseInt(response.Items.get(0).weather_interval);
sendHeartToUpper();
int heart = StringUtils.isEmpty(response.Items.get(0).heart_beat_interval) ? 0 :
Integer.parseInt(response.Items.get(0).heart_beat_interval);
int patrolDevice = StringUtils.isEmpty(response.Items.get(0).patroldevice_run_interval) ? 0 :
Integer.parseInt(response.Items.get(0).patroldevice_run_interval);
int nest = StringUtils.isEmpty(response.Items.get(0).nest_run_interval) ? 0 :
Integer.parseInt(response.Items.get(0).nest_run_interval);
int weather = StringUtils.isEmpty(response.Items.get(0).weather_interval) ? 0 :
Integer.parseInt(response.Items.get(0).weather_interval);
sendHeartbeatToUpper();
// 定时心跳报活
scheduledExecutor.scheduleWithFixedDelay(new TimerTask() {
@Override
public void run() {
sendHeartToUpper();
sendHeartbeatToUpper();
}
}, 0, heart, TimeUnit.SECONDS);
// 上级系统返回的定时信息存入redis
cacheTimeInterval(heart, patroldevice, nest, weather);
cacheTimeInterval(heart, patrolDevice, nest, weather);
}
} catch (Exception e) {
e.printStackTrace();
@ -376,21 +376,21 @@ public class NettyClient {
* 缓存上级系统返回的定时任务间隔
*
* @param heart
* @param patroldevice
* @param patrolDevice
* @param nest
* @param weather
*/
private void cacheTimeInterval(int heart, int patroldevice, int nest, int weather) {
private void cacheTimeInterval(int heart, int patrolDevice, int nest, int weather) {
JSONObject json = new JSONObject();
json.put("heart", heart);
json.put("patroldevice", patroldevice);
json.put("patroldevice", patrolDevice);
json.put("nest", nest);
json.put("weather", weather);
redisTemplate.opsForValue().set(upTimeIntervalSetting, json.toJSONString());
}
private String createRegHeart(boolean isheart) {
private String createRegHeart(boolean isHeart) {
ResponseControl obj = new ResponseControl();
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
xStream.autodetectAnnotations(true);
@ -399,7 +399,7 @@ public class NettyClient {
obj.ReceiveCode = receiveCode;
obj.Type = String.valueOf(SystemType.system);
obj.Code = "";
obj.Command = String.valueOf(isheart ? SystemType.heart_request : SystemType.register_request);
obj.Command = String.valueOf(isHeart ? SystemType.heart_request : SystemType.register_request);
obj.Time = CommonUtils.GetNowDateString();
obj.Items = "";
String resultXML = xStream.toXML(obj);
@ -457,7 +457,7 @@ public class NettyClient {
sendMsgToUpper(true, "", xml);
}
public void sendHeartToUpper() {
public void sendHeartbeatToUpper() {
String xml = createRegHeart(true);
sendMsgToUpper(true, "", xml);
}
@ -495,81 +495,81 @@ public class NettyClient {
case PushType.environment:
// xml = upJson2Xml.EnvironmentControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, EnvironmentControl.class);
logger.info("###### 会话:{}, 向上级系统发送环境数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送环境数据 ######\n{}", uuid, xml);
break;
case PushType.alarm:
// xml = upJson2Xml.AlarmControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, AlarmControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视设备异常告警数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视设备异常告警数据 ######\n{}", uuid, xml);
break;
case PushType.analysisAlarm:
// xml = upJson2Xml.AnalysisControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, AnalysisControl.class);
logger.info("###### 会话:{}, 向上级系统发送告警数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送告警数据 ######\n{}", uuid, xml);
break;
case PushType.location:
// xml = upJson2Xml.LocationControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, LocationControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视设备坐标 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视设备坐标 ######\n{}", uuid, xml);
break;
case PushType.monitor:
// xml = upJson2Xml.MonitorControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, MonitorControl.class);
logger.info("###### 会话:{}, 向上级系统发送静默监视告警数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送静默监视告警数据 ######\n{}", uuid, xml);
break;
case PushType.nestRunning:
// xml = upJson2Xml.NestRunningJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, NestRunningControl.class);
logger.info("###### 会话:{}, 向上级系统发送无人机机巢运行数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送无人机机巢运行数据 ######\n{}", uuid, xml);
break;
case PushType.nestState:
// xml = upJson2Xml.NestStateJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, NestStateControl.class);
logger.info("###### 会话:{}, 向上级系统发送无人机机巢状态数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送无人机机巢状态数据 ######\n{}", uuid, xml);
break;
case PushType.patrolDeviceState:
// xml = upJson2Xml.PatrolDeviceStateControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, PatrolDeviceStateControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视设备状态数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视设备状态数据 ######\n{}", uuid, xml);
break;
case PushType.patrolDeviceRunning:
// xml = upJson2Xml.PatrolDeviceRunningControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, PatrolDeviceRunningControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视设备运行数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视设备运行数据 ######\n{}", uuid, xml);
break;
case PushType.result:
// xml = upJson2Xml.TaskResultControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, TaskResultControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视结果 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视结果 ######\n{}", uuid, xml);
break;
case PushType.taskState:
// xml = upJson2Xml.TaskStateControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, TaskStateControl.class);
logger.info("###### 会话:{}, 向上级系统发送任务状态数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送任务状态数据 ######\n{}", uuid, xml);
break;
case PushType.total:
// xml = upJson2Xml.ReportControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, ReportControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视设备统计信息上报 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视设备统计信息上报 ######\n{}", uuid, xml);
break;
case PushType.route:
// xml = upJson2Xml.RouteControlJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, RouteControl.class);
logger.info("###### 会话:{}, 向上级系统发送巡视路线 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送巡视路线 ######\n{}", uuid, xml);
break;
case SystemType.system:
// xml = upJson2Xml.ModelJson2Xml(json);
xml = upJson2Xml.UpStreamJson2Xml(json, ModelControl.class);
logger.info("###### 会话:{}, 向上级系统发送系统数据 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送系统数据 ######\n{}", uuid, xml);
break;
case ModelType.modelUpdate:
// xml = upJson2Xml.UpdateModelJson2Xml(json);
//xml = up.ModelJson2Xml(json, UpdateModelControl.class);
xml = upJson2Xml.UpStreamJson2Xml(json, UpdateModelControl.class);
logger.info("###### 会话:{}, 向上级系统发送模型更新上报指令 ######\n{}", uuid, xml);
log.info("###### 会话:{}, 向上级系统发送模型更新上报指令 ######\n{}", uuid, xml);
break;
default:
logger.warn("###### 会话:{}, 应用向上级系统发送消息, 类型: [{}] 不在处理范围内, 不予处理 ######", uuid, type);
log.warn("###### 会话:{}, 应用向上级系统发送消息, 类型: [{}] 不在处理范围内, 不予处理 ######", uuid, type);
}
if (!StringUtils.isEmpty(xml)) {
// 将设备别名转换为上级别名


+ 11
- 18
src/main/java/com/inspect/tcpserver/tcp/NettyClientHandler.java View File

@ -4,8 +4,7 @@ import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.EventLoop;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;
@ -17,23 +16,23 @@ import java.util.concurrent.TimeUnit;
* <p>
* 规范 : Handler 类中需要按照业务逻辑处理规范进行开发
*/
@Slf4j
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
private Logger logger = LoggerFactory.getLogger(NettyClientHandler.class);
private NettyClient nettyClient;
public ChannelHandlerContext Context;
public ChannelHandlerContext clientChannelHandlerContext;
public NettyClientHandler(NettyClient nettyClient) {
log.info("NETTY_CLIENT_HANDLER");
this.nettyClient = nettyClient;
}
public void sendMsg(ByteBuf byteBuf) {
if (Context != null) {
Context.writeAndFlush(byteBuf);
public void sendProtoBuffer(ByteBuf byteBuf) {
if (clientChannelHandlerContext != null) {
clientChannelHandlerContext.writeAndFlush(byteBuf);
} else {
logger.info("client发送消息时,content为空,未连接服务端,取消发送");
log.info("client发送消息时,content为空,未连接服务端,取消发送");
}
}
@ -41,12 +40,7 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
final EventLoop loop = ctx.channel().eventLoop();
loop.schedule(new Runnable() {
@Override
public void run() {
nettyClient.ConnectServer();
}
}, 3L, TimeUnit.SECONDS);
loop.schedule(() -> nettyClient.connectUpperSystemServer(), 3L, TimeUnit.SECONDS);
super.channelInactive(ctx);
}
@ -58,9 +52,8 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
Context = ctx;
try {
clientChannelHandlerContext = ctx;
nettyClient.sendRegisterToUpper();
} catch (Exception e) {
e.printStackTrace();
@ -79,7 +72,7 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
nettyClient.ReceiveMsg((BinaryModel) msg);
nettyClient.receiveUpstreamData((BinaryModel) msg);
}
/**


+ 42
- 48
src/main/java/com/inspect/tcpserver/tcp/NettyServer.java View File

@ -2,7 +2,7 @@ package com.inspect.tcpserver.tcp;
import com.alibaba.fastjson.JSONObject;
import com.inspect.tcpserver.constant.Constant;
import com.inspect.tcpserver.controller.ClientController;
import com.inspect.tcpserver.controller.UpstreamClientController;
import com.inspect.tcpserver.domain.DeviceServerProperties;
import com.inspect.tcpserver.util.Color;
import com.thoughtworks.xstream.XStream;
@ -19,14 +19,12 @@ import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.util.CharsetUtil;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
@ -38,15 +36,11 @@ import java.io.ByteArrayInputStream;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.*;
@Slf4j
@Component
public class NettyServer {
private final Logger logger = LoggerFactory.getLogger(NettyServer.class);
/**
* 接收/发送报文xml外层别名
*/
@ -55,7 +49,7 @@ public class NettyServer {
private final String aliasDevice = "PatrolDevice";
@Resource
ClientController clientController;
UpstreamClientController upstreamClientController;
private EventLoopGroup bossGroup;
private EventLoopGroup workGroup;
private long sendIndex = 0; //若重启系统后还要延续之前的序列号则需要把序列号存入redis中
@ -77,17 +71,17 @@ public class NettyServer {
@Value("${iip_server.authDevice.url}")
String iipAuthDeviceUrl;
@Value("${print_recv_data:0}")
@Value("${print_recv_data:1}")
Integer printRecvData;
@Value("${seperating_packages:0}")
Integer seperatingPackages;
@Value("${separate_packages:0}")
Integer separatePackages;
private int serverPort;
public void init() {
logger.info("print_recv_data config: {}", printRecvData);
logger.info("seperatingPackages config: {}", seperatingPackages);
log.info("print_recv_data config: {}", printRecvData);
log.info("separate_packages config: {}", separatePackages);
this.serverPort = deviceServerProperties.port;
upJson2Xml = new UpJson2Xml(aliasHost);
@ -109,7 +103,7 @@ public class NettyServer {
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
if(seperatingPackages > 0) {
if(separatePackages > 0) {
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(ByteOrder.LITTLE_ENDIAN, Integer.MAX_VALUE, 19, 4, 2, 0, true));
}
ch.pipeline().addLast(new MyDecoder(printRecvData));
@ -124,7 +118,7 @@ public class NettyServer {
.childOption(ChannelOption.SO_LINGER, 10);
try {
ChannelFuture future = bootstrap.bind(serverPort).sync();
logger.info("###### TCP服务器启动 ######");
log.info("###### TCPSERVER服务器启动 ######");
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
@ -176,7 +170,7 @@ public class NettyServer {
nettyServerHandler.sendMsg(uuid, clientKey, allBuf, compact(xml), request);
sendIndex++;
} else {
logger.warn(Color.RED + "###### 客户端[{}]离线! ######" + Color.END, clientKey);
log.warn(Color.RED + "###### 客户端[{}]离线! ######" + Color.END, clientKey);
}
}
@ -216,7 +210,7 @@ public class NettyServer {
try {
dealMsgInThreadPool(binaryModel, context);
} catch (Exception e) {
logger.error("error", e);
log.error("error", e);
}
// });
}
@ -251,7 +245,7 @@ public class NettyServer {
}
String compactXml = compact(xml);
// logger.info(Color.YELLOW + "###### 会话:{}, 客户:[{}], 消息类型:{}, 命令:{}, 消息体: ######\n{}" + Color.END, binaryModel.uuid, sendCode, type, command, compactXml);
// log.info(Color.YELLOW + "###### 会话:{}, 客户:[{}], 消息类型:{}, 命令:{}, 消息体: ######\n{}" + Color.END, binaryModel.uuid, sendCode, type, command, compactXml);
//判断是否重发
if (type == SystemType.system) {
if (command == SystemType.has_response || command == SystemType.no_response) {
@ -261,15 +255,15 @@ public class NettyServer {
resetSendMsg(binaryModel.receiveIndex, sendCode);
return;
} else if (code.equals(ResponseType.succeed)) {
logger.info(Color.YELLOW + "###### 客户端[{}]响应结果为成功 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]响应结果为成功 ######" + Color.END, sendCode);
if(command == SystemType.no_response) {
return;
}
} else if (code.equals(ResponseType.fault)) {
logger.warn(Color.RED + "###### 客户端[{}]响应结果为失败 ######" + Color.END, sendCode);
log.warn(Color.RED + "###### 客户端[{}]响应结果为失败 ######" + Color.END, sendCode);
return;
} else if (code.equals(ResponseType.reject)) {
logger.warn(Color.RED + "###### 客户端[{}]响应结果为拒绝 ######" + Color.END, sendCode);
log.warn(Color.RED + "###### 客户端[{}]响应结果为拒绝 ######" + Color.END, sendCode);
return;
}
}
@ -281,12 +275,12 @@ public class NettyServer {
switch (command) {
case SystemType.register_request:
// 收到接入侧注册信息
logger.info(Color.YELLOW + "###### 客户端[{}]注册 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]注册 ######" + Color.END, sendCode);
dealRegister(binaryModel.uuid, compactXml);
break;
case SystemType.heart_request:
// 处理心跳请求响应
logger.info(Color.YELLOW + "###### 客户端[{}]上报心跳 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报心跳 ######" + Color.END, sendCode);
sendHeartBeat(binaryModel.uuid, compactXml);
break;
case SystemType.has_response:
@ -295,7 +289,7 @@ public class NettyServer {
// 处理设备上报的模型同步响应
if (null != root.element("Items").element("Item").attribute("device_file_path")) {
// 收到接入侧模型同步数据
logger.info(Color.YELLOW + "###### 模型同步收到客户端[{}]响应数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 模型同步收到客户端[{}]响应数据 ######" + Color.END, sendCode);
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, ModelControl.class);
JSONObject jsonObject = JSONObject.parseObject(json);
jsonObject.put("uuid", binaryModel.uuid);
@ -305,68 +299,68 @@ public class NettyServer {
// 任务控制响应任务执行ID
if (null != root.element("Items").element("Item").attribute("task_patrolled_id")) {
// 收到接入侧任务下发或控制回复数据
logger.info(Color.YELLOW + "###### 任务下发收到客户端[{}]响应数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 任务下发收到客户端[{}]响应数据 ######" + Color.END, sendCode);
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, ModelControl.class);
JSONObject jsonObject = JSONObject.parseObject(json);
jsonObject.put("SendCode", "");
clientController.sendMsg(binaryModel.uuid, jsonObject.toJSONString());
upstreamClientController.sendMsg(binaryModel.uuid, jsonObject.toJSONString());
}
} else {
logger.warn(Color.RED + "###### 客户端[{}]响应数据没有items ######" + Color.END, sendCode);
log.warn(Color.RED + "###### 客户端[{}]响应数据没有items ######" + Color.END, sendCode);
}
break;
default:
logger.warn(Color.RED + "###### 客户端[{}]非法的消息不予处理 ######" + Color.END, sendCode);
log.warn(Color.RED + "###### 客户端[{}]非法的消息不予处理 ######" + Color.END, sendCode);
}
break;
case PushType.patrolDeviceState:// insert into basedata_mont_patdevstadata
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, PatrolDeviceStateControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备状态数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备状态数据 ######" + Color.END, sendCode);
break;
case PushType.patrolDeviceRunning:// insert into basedata_mont_patdevrundata
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, PatrolDeviceRunningControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备运行数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备运行数据 ######" + Color.END, sendCode);
break;
case PushType.nestState:// insert into basedata_mont_neststadata
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, NestStateControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报机巢状态数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报机巢状态数据 ######" + Color.END, sendCode);
break;
case PushType.nestRunning:// insert into basedata_mont_nestrundata
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, NestRunningControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报机巢运行数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报机巢运行数据 ######" + Color.END, sendCode);
break;
case PushType.location:// insert into basedata_mont_patdevcoord
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, LocationControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备坐标 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备坐标 ######" + Color.END, sendCode);
break;
case PushType.route:// insert into basedata_mont_patdevpatroute
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, RouteControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备路线 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备路线 ######" + Color.END, sendCode);
break;
case PushType.alarm:// insert into basedata_mont_patdevalmabn
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, AlarmControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备异常告警 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备异常告警 ######" + Color.END, sendCode);
break;
case PushType.environment:// insert into basedata_mont_evndata
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, EnvironmentControl.class);
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备环境数据 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备环境数据 ######" + Color.END, sendCode);
break;
case PushType.taskState:// insert into basedata_mont_taskstadata and patrol_task_status
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, TaskStateControl.class);
//root@Linx:/home/atia/data/log/inspect-main# grep -rn "type:41, messageBody:" info.log
logger.info(Color.YELLOW + "###### 客户端[{}]上报设备任务状态 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报设备任务状态 ######" + Color.END, sendCode);
break;
case PushType.result:// insert into basedata_mont_taskresult and patrol_task_result_main
json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, TaskResultControl.class);
//root@Linx:/home/atia/data/log/inspect-main# grep -rn "type:61, messageBody:" info.log
logger.info(Color.YELLOW + "###### 客户端[{}]上报巡视结果 ######" + Color.END, sendCode);
log.info(Color.YELLOW + "###### 客户端[{}]上报巡视结果 ######" + Color.END, sendCode);
break;
default:
logger.info(Color.RED + "###### 客户端[{}]上报的非法消息不予处理 ######" + Color.END, sendCode);
log.info(Color.RED + "###### 客户端[{}]上报的非法消息不予处理 ######" + Color.END, sendCode);
}
if (type != SystemType.system && !StringUtil.isNullOrEmpty(json)) {
if ((type == NestCtlType.courseReversal && command == 3)) { // 处理用SSCOM模拟的数据, 向无人机发送控制指令
logger.info("###### 向客户端[{}]透传200001控制指令 ######", sendCode);
log.info("###### 向客户端[{}]透传200001控制指令 ######", sendCode);
flushMsgToDeviceBroadcast(binaryModel.uuid, receiveCode, false, compactXml);
} else {
JSONObject jsonObject = JSONObject.parseObject(json);
@ -382,7 +376,7 @@ public class NettyServer {
|| (type == NestCtlType.ptzPitch && command == 6)
|| (type == NestCtlType.picModelSet && command == 1)
|| (type == NestCtlType.nestSuddenStop && command == 2)) {// 处理用SSCOM模拟的数据, 向无人机发送控制指令
logger.info("###### 向客户端[{}]透传200002~20005控制指令 ######", sendCode);
log.info("###### 向客户端[{}]透传200002~20005控制指令 ######", sendCode);
flushMsgToDeviceBroadcast(binaryModel.uuid, receiveCode, false, compactXml);
}
}
@ -423,7 +417,7 @@ public class NettyServer {
xStreamEx.addPermission(AnyTypePermission.ANY);
obj = (BaseControl) xStreamEx.fromXML(xml);
} catch (com.thoughtworks.xstream.XStreamException e2) {
logger.error(Color.RED + "###### dealRegister解析失败:{} ######" + Color.END, e2.getMessage());
log.error(Color.RED + "###### dealRegister解析失败:{} ######" + Color.END, e2.getMessage());
}
}
@ -496,7 +490,7 @@ public class NettyServer {
xStream.autodetectAnnotations(true);
xml = xStream.toXML(responseControl);
} catch (com.thoughtworks.xstream.XStreamException e2) {
logger.error(Color.RED + "###### sendRegisterResponse解析失败:{} ######" + Color.END, e2.getMessage());
log.error(Color.RED + "###### sendRegisterResponse解析失败:{} ######" + Color.END, e2.getMessage());
}
}
flushMsgToDevice(uuid, sendCode, false, xml);
@ -522,7 +516,7 @@ public class NettyServer {
obj = (BaseControl) xStream.fromXML(xml);
isHost = false;
} catch (com.thoughtworks.xstream.XStreamException e2) {
logger.error(Color.RED + "###### sendHeartBeat解析失败:{} ######" + Color.END, e2.getMessage());
log.error(Color.RED + "###### sendHeartBeat解析失败:{} ######" + Color.END, e2.getMessage());
}
}
@ -577,13 +571,13 @@ public class NettyServer {
xml = upJson2Xml.UpStreamJson2Xml(json, LinkageTaskControl.class);
break;
default:
logger.error(Color.RED + "###### 向设备端下发命令, 类型:{}错误, 不予处理 ######" + Color.END, type);
log.error(Color.RED + "###### 向设备端下发命令, 类型:{}错误, 不予处理 ######" + Color.END, type);
}
if (!StringUtils.isEmpty(xml)) {
flushMsgToDevice("", receiveCode, true, xml);
} else {
logger.error(Color.RED + "###### xml is empty ######" + Color.END, type);
log.error(Color.RED + "###### xml is empty ######" + Color.END, type);
}
}
}

+ 11
- 10
src/main/java/com/inspect/tcpserver/tcp/NettyServerHandler.java View File

@ -6,11 +6,12 @@ import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
public Logger logger = LoggerFactory.getLogger(NettyServerHandler.class);
private NettyServer nettyServer;
@ -25,23 +26,23 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
(ChannelFuture future) -> {
if (future.isSuccess()) {
if(request) {
logger.info("###### 活动连接:{},向客户端[{}]下发消息成功:{}######", ChannelCache.getInstance().getClients(), clientKey, xml);
log.info("###### 活动连接:{},向客户端[{}]下发消息成功:{}######", ChannelCache.getInstance().getClients(), clientKey, xml);
} else {
logger.info(Color.CYAN + "###### 活动连接:{},向客户端[{}]响应成功######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
log.info(Color.CYAN + "###### 活动连接:{},向客户端[{}]响应成功######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
}
} else {
if(request) {
logger.error(Color.RED + "###### 活动连接:{},向客户端[{}]下发消息失败:{}######" + Color.END, ChannelCache.getInstance().getClients(), clientKey, xml);
log.error(Color.RED + "###### 活动连接:{},向客户端[{}]下发消息失败:{}######" + Color.END, ChannelCache.getInstance().getClients(), clientKey, xml);
} else {
logger.error(Color.RED + "###### 活动连接:{},向客户端[{}]响应失败######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
log.error(Color.RED + "###### 活动连接:{},向客户端[{}]响应失败######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
}
}
});
} else {
if(request) {
logger.error(Color.RED + "###### 活动连接:{},无法向客户端[{}]下发消息,ctx==null######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
log.error(Color.RED + "###### 活动连接:{},无法向客户端[{}]下发消息,ctx==null######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
} else {
logger.error(Color.RED + "###### 活动连接:{},无法向客户端[{}]响应,ctx==null######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
log.error(Color.RED + "###### 活动连接:{},无法向客户端[{}]响应,ctx==null######" + Color.END, ChannelCache.getInstance().getClients(), clientKey);
}
}
}
@ -53,7 +54,7 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
public void channelActive(ChannelHandlerContext ctx) {
String id = ctx.channel().id().asShortText();
ChannelCache.getInstance().addIfAbsent(id, ctx);
logger.info("###### 设备上线:{} ######", id);
log.info("###### 设备上线:{} ######", id);
}
/**
@ -62,7 +63,7 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelInactive(ChannelHandlerContext ctx) {
String id = ctx.channel().id().asShortText();
logger.info("###### 设备断开:{} ######", id);
log.info("###### 设备断开:{} ######", id);
ChannelCache.getInstance().remove(ctx);
}
@ -89,6 +90,6 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
logger.error( "channel ctx: " + ctx.channel() + " exception", cause);
log.error( "channel ctx: " + ctx.channel() + " exception", cause);
}
}

+ 3
- 3
src/main/java/com/inspect/tcpserver/tcp/UpJson2Xml.java View File

@ -5,12 +5,12 @@ import com.inspect.tcpserver.util.Color;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.Xpp3Driver;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class UpJson2Xml {
private final Logger logger = LoggerFactory.getLogger(DownXml2Json.class);
private String deviceAlias = "PatrolDevice";
public String getAlias() {
@ -46,7 +46,7 @@ public class UpJson2Xml {
T obj = JSON.parseObject(json, clazz);
return xStream.toXML(obj);
} catch (com.thoughtworks.xstream.XStreamException ex) {
logger.error(Color.RED + "###### UpStreamJson2Xml解析失败:{} ######" + Color.END, ex.getMessage());
log.error(Color.RED + "###### UpStreamJson2Xml解析失败:{} ######" + Color.END, ex.getMessage());
return null;
}
}


Loading…
Cancel
Save