From 86fd226c84f10f5aa4216e1600f924750766faad Mon Sep 17 00:00:00 2001 From: limqhz <540344226@qq.com> Date: Tue, 22 Aug 2023 09:48:23 +0800 Subject: [PATCH] =?UTF-8?q?netty-=E7=A1=AE=E5=AE=9A=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E5=92=8C=E6=9C=8D=E5=8A=A1=E7=AB=AF=E7=BC=96=E8=A7=A3?= =?UTF-8?q?=E7=A0=81=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/pom.xml | 11 +- .../api/task/MemberLessonTickerOrderTask.java | 4 +- .../java/com/sv/netty/config/Constant.java | 2 - .../netty/controller/QREnterController.java | 143 ++-- .../java/com/sv/netty/netty/BootService.java | 3 +- .../com/sv/netty/netty/MessageEncoder.java | 34 - .../com/sv/netty/netty/ServerHandler.java | 16 +- .../netty/ServerProtocolInitializer.java | 8 +- .../sv/netty/netty/message/ChannelParam.java | 16 - .../com/sv/netty/netty/message/HeartBeat.java | 9 - .../netty/netty/service/MessageService.java | 7 +- .../impl/AppMessageHandlerAdapter.java | 50 +- .../java/com/sv/netty/utils/CommonUtils.java | 76 --- .../java/com/sv/netty/utils/EncodeUtils.java | 77 --- .../java/com/sv/netty/utils/JsonMapper.java | 204 ------ .../java/com/sv/netty/utils/JsonUtils.java | 94 --- .../src/main/java/com/enums/DeviceType.java | 33 - .../src/main/java/com/sv/entity/Device.java | 20 +- netty-client/pom.xml | 9 +- .../main/java/com/sv/netty/ClientHandler.java | 133 ++-- .../java/com/sv/netty/ClientInitializer.java | 15 +- .../main/java/com/sv/netty/ClientThread.java | 6 +- .../java/com/sv/netty/MessageDecoder.java | 48 -- .../java/com/sv/netty/MessageEncoder.java | 24 - .../java/com/sv/netty/config/Constant.java | 15 - .../main/java/com/sv/utils/JsonMapper.java | 204 ------ .../java/test/netty/nio/net/ClientTest.java | 13 - .../netty/nio/net/client/ClientHandler.java | 90 --- .../nio/net/client/ClientInitializer.java | 38 -- .../netty/nio/net/client/ClientThread.java | 124 ---- .../java/test/netty/nio/net/client/Cmd.java | 45 -- .../netty/nio/net/client/CustomDecoder.java | 40 -- .../test/netty/nio/net/client/DataConfig.java | 14 - .../netty/nio/net/client/MessageDecoder.java | 48 -- .../netty/nio/net/client/MessageEncoder.java | 24 - .../netty/nio/net/dto/AddFaceResponse.java | 142 ---- .../java/test/netty/nio/net/dto/BaseDto.java | 86 --- .../test/netty/nio/net/dto/FaceImageDto.java | 52 -- .../nio/net/dto/FaceRecognizeResponse.java | 639 ------------------ .../test/netty/nio/net/dto/HeartBeat.java | 44 -- .../test/netty/nio/net/dto/JsonMapper.java | 62 -- .../test/netty/nio/net/dto/MemberDto.java | 148 ---- .../java/test/netty/nio/net/dto/Message.java | 68 -- pom.xml | 15 +- .../main/java/com/sv/mapper/DeviceMapper.java | 16 +- .../com/sv/service/api/QRCodeService.java | 24 +- .../java/com/sv/service/api/VenueService.java | 2 +- .../com/sv/service/oms/DeviceService.java | 26 +- 48 files changed, 235 insertions(+), 2786 deletions(-) delete mode 100644 api/src/main/java/com/sv/netty/netty/MessageEncoder.java delete mode 100644 api/src/main/java/com/sv/netty/utils/CommonUtils.java delete mode 100644 api/src/main/java/com/sv/netty/utils/EncodeUtils.java delete mode 100644 api/src/main/java/com/sv/netty/utils/JsonMapper.java delete mode 100644 api/src/main/java/com/sv/netty/utils/JsonUtils.java delete mode 100644 entity/src/main/java/com/enums/DeviceType.java delete mode 100644 netty-client/src/main/java/com/sv/netty/MessageDecoder.java delete mode 100644 netty-client/src/main/java/com/sv/netty/MessageEncoder.java delete mode 100644 netty-client/src/main/java/com/sv/netty/config/Constant.java delete mode 100644 netty-client/src/main/java/com/sv/utils/JsonMapper.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/ClientTest.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/ClientHandler.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/ClientInitializer.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/ClientThread.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/Cmd.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/CustomDecoder.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/DataConfig.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/MessageDecoder.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/client/MessageEncoder.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/AddFaceResponse.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/BaseDto.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/FaceImageDto.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/FaceRecognizeResponse.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/HeartBeat.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/JsonMapper.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/MemberDto.java delete mode 100644 netty-client/src/main/test/java/test/netty/nio/net/dto/Message.java diff --git a/api/pom.xml b/api/pom.xml index 82ef66a..792e30a 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -18,20 +18,15 @@ - io.netty - netty-all - 4.1.10.Final + smartvenue + netty-model + mysql mysql-connector-java 6.0.6 - - - org.springframework.boot - spring-boot-starter-web - org.springframework.boot spring-boot-starter-test diff --git a/api/src/main/java/com/sv/api/task/MemberLessonTickerOrderTask.java b/api/src/main/java/com/sv/api/task/MemberLessonTickerOrderTask.java index bb71944..0acdb3b 100644 --- a/api/src/main/java/com/sv/api/task/MemberLessonTickerOrderTask.java +++ b/api/src/main/java/com/sv/api/task/MemberLessonTickerOrderTask.java @@ -39,8 +39,8 @@ public class MemberLessonTickerOrderTask { /** * 每30秒执行一次订单查看 */ - @Scheduled(fixedDelay = 30000) - @Transactional(rollbackFor = Exception.class) +// @Scheduled(fixedDelay = 30000) +// @Transactional(rollbackFor = Exception.class) public void execute(){ // 查询所有未支付订单 List memberLessonTickets = memberLessonTicketService.findOrders(); diff --git a/api/src/main/java/com/sv/netty/config/Constant.java b/api/src/main/java/com/sv/netty/config/Constant.java index 4b7ac6a..95cce85 100644 --- a/api/src/main/java/com/sv/netty/config/Constant.java +++ b/api/src/main/java/com/sv/netty/config/Constant.java @@ -27,8 +27,6 @@ public class Constant { */ public static AttributeKey CHANNEL_PARAM = AttributeKey.newInstance("CHANNEL_PARAM"); - public final static String DELIMITER_WORD = "$_$"; - public final static String SPIT_WORD = "#"; /** diff --git a/api/src/main/java/com/sv/netty/controller/QREnterController.java b/api/src/main/java/com/sv/netty/controller/QREnterController.java index 3a5afc4..e473a66 100644 --- a/api/src/main/java/com/sv/netty/controller/QREnterController.java +++ b/api/src/main/java/com/sv/netty/controller/QREnterController.java @@ -1,16 +1,12 @@ package com.sv.netty.controller; -import com.enums.DeviceType; import com.sv.entity.Venue; import com.sv.netty.config.Constant; -import com.sv.netty.netty.message.MessageDTO; -import com.sv.netty.netty.message.MessageType; import com.sv.netty.netty.service.MessageService; import com.sv.service.api.QRCodeService; import com.ydd.framework.core.common.dto.ResponseDTO; import com.ydd.framework.core.controller.BaseApiController; import com.ydd.framework.core.exception.ServiceException; -import io.netty.channel.Channel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; @@ -20,56 +16,54 @@ import javax.annotation.Resource; /** * 小程序二维码进场Controller */ -//@RestController +@RestController public class QREnterController extends BaseApiController { private final Logger logger = LoggerFactory.getLogger(QREnterController.class); -// @Resource + @Resource private QRCodeService qrCodeService; -// @Resource + @Resource private MessageService messageService; /** * 进场指令发布 */ -// @RequestMapping(value = "/qrCode/enter", method = RequestMethod.GET) -// public ResponseDTO enter(@RequestParam("deviceId") String deviceId) { -// Integer memberId = getMemberIdByAccessToken(); -// Integer venueId = getVenueId(deviceId); -// String deviceName = getDeviceName(deviceId); -// DeviceType enterOrOut = getEnterOrOut(deviceId); -// Venue venue = qrCodeService.initEnter(venueId, deviceName,enterOrOut,memberId); -// qrCodeService.unBindMember(venueId, deviceName, enterOrOut); -// if (venue!=null){ -// if (DeviceType.OUT == enterOrOut){ -// // 出场 -// messageService.outVenue(deviceName,venueId,memberId,venue); -// }else{ -// // 进场 -// messageService.enterVenue(deviceName,venueId,memberId,venue); -// } -// } -// return ResponseDTO.ok(); -// } + @RequestMapping(value = "/qrCode/enter", method = RequestMethod.GET) + public ResponseDTO enter(@RequestParam("deviceId") String deviceId) { + Integer memberId = getMemberIdByAccessToken(); + Integer venueId = getVenueId(deviceId); + String deviceName = getDeviceName(deviceId); + Venue venue = qrCodeService.initEnter(venueId, deviceName,memberId); + qrCodeService.unBindMember(venueId, deviceName); + if (venue!=null){ + if (true){ + // 出场 + messageService.outVenue(deviceName,venueId,memberId,venue); + }else{ + // 进场 + messageService.enterVenue(deviceName,venueId,memberId,venue); + } + } + return ResponseDTO.ok(); + } /** * 扫码结果页初始化 * 需要进场的场馆信息 */ -// @RequestMapping(value = "/qrCode/init", method = RequestMethod.GET) -// public ResponseDTO initEnter(@RequestParam("deviceId")String deviceId) { -// try { -// Integer memberId = getMemberIdByAccessToken(); -// Integer venueId = getVenueId(deviceId); -// String deviceName = getDeviceName(deviceId); -// DeviceType enterOrOut = getEnterOrOut(deviceId); -// Venue venue = qrCodeService.initEnter(venueId, deviceName, enterOrOut,memberId); -// qrCodeService.bindMember(venueId, deviceName, enterOrOut,memberId); -// messageService.sendLoading(deviceName, venueId, enterOrOut, memberId); -// return ResponseDTO.ok().addAttribute("venueInit", venue); -// }catch(ServiceException e){ -// return ResponseDTO.ok().addAttribute("InitError",e.getMessage()); -// } -// } + @RequestMapping(value = "/qrCode/init", method = RequestMethod.GET) + public ResponseDTO initEnter(@RequestParam("deviceId")String deviceId) { + try { + Integer memberId = getMemberIdByAccessToken(); + Integer venueId = getVenueId(deviceId); + String deviceName = getDeviceName(deviceId); + Venue venue = qrCodeService.initEnter(venueId, deviceName,memberId); + qrCodeService.bindMember(venueId, deviceName,memberId); + messageService.sendLoading(deviceName, venueId, memberId); + return ResponseDTO.ok().addAttribute("venueInit", venue); + }catch(ServiceException e){ + return ResponseDTO.ok().addAttribute("InitError",e.getMessage()); + } + } /** @@ -77,58 +71,41 @@ public class QREnterController extends BaseApiController { * @param deviceId * @return */ -// private Integer getVenueId(String deviceId){ -// String venueId = "0"; -// if (deviceId!=null && deviceId.contains(Constant.SPIT_WORD)){ -// venueId = deviceId.split(Constant.SPIT_WORD)[1]; -// } -// try { -// return Integer.parseInt(venueId); -// }catch (Exception e){ -// return 0; -// } -// } + private Integer getVenueId(String deviceId){ + String venueId = "0"; + if (deviceId!=null && deviceId.contains(Constant.SPIT_WORD)){ + venueId = deviceId.split(Constant.SPIT_WORD)[1]; + } + try { + return Integer.parseInt(venueId); + }catch (Exception e){ + return 0; + } + } /** * 根据字符串获取设备号 * @param deviceId * @return */ -// private String getDeviceName(String deviceId){ -// if (deviceId!=null){ -// return deviceId.split(Constant.SPIT_WORD)[0]; -// } -// return null; -// } - - /** - * 根据字符串获取门禁类型 - * @param deviceId - * @return - */ -// private DeviceType getEnterOrOut(String deviceId){ -// DeviceType returnType = DeviceType.ENTER; -// if (deviceId!=null && deviceId.contains(Constant.SPIT_WORD)){ -// String temp = deviceId.split(Constant.SPIT_WORD)[1]; -// if (temp!=null && temp.contains(Constant.SPIT_WORD)){ -// returnType = DeviceType.valueOf(temp.split(Constant.SPIT_WORD)[1]); -// } -// } -// return returnType; -// } + private String getDeviceName(String deviceId){ + if (deviceId!=null){ + return deviceId.split(Constant.SPIT_WORD)[0]; + } + return null; + } /** * 检验客户端读取能力 * @return */ -// @RequestMapping("/checkAlive") -// public ResponseDTO checkAlive(@RequestParam String id) { -// Integer venueId = getVenueId(id); -// String deviceName = getDeviceName(id); -// DeviceType enterOrOut = getEnterOrOut(id); -// logger.info("验证设备"+ id + "通讯情况"); -// messageService.testLoad(deviceName,venueId,enterOrOut); -// return ResponseDTO.ok(); -// } + @RequestMapping("/checkAlive") + public ResponseDTO checkAlive(@RequestParam String id) { + Integer venueId = getVenueId(id); + String deviceName = getDeviceName(id); + logger.info("验证设备"+ id + "通讯情况"); + messageService.testLoad(deviceName,venueId); + return ResponseDTO.ok(); + } } diff --git a/api/src/main/java/com/sv/netty/netty/BootService.java b/api/src/main/java/com/sv/netty/netty/BootService.java index 513c74f..8a3b2b1 100644 --- a/api/src/main/java/com/sv/netty/netty/BootService.java +++ b/api/src/main/java/com/sv/netty/netty/BootService.java @@ -5,6 +5,7 @@ import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LoggingHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -74,9 +75,7 @@ public class BootService { bossGroup = new NioEventLoopGroup(); channelOptions = Maps.newHashMap(); try { -// channelOptions.put(ChannelOption.SO_KEEPALIVE,keepalive); channelOptions.put(ChannelOption.SO_BACKLOG,backlog); -// channelOptions.put(ChannelOption.TCP_NODELAY,TCP_NODELAY); channelOptions.put(ChannelOption.SO_REUSEADDR,reuseaddr); bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // 设置服务器的通道是NIOServerSocketChannel diff --git a/api/src/main/java/com/sv/netty/netty/MessageEncoder.java b/api/src/main/java/com/sv/netty/netty/MessageEncoder.java deleted file mode 100644 index af5616c..0000000 --- a/api/src/main/java/com/sv/netty/netty/MessageEncoder.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sv.netty.netty; - -import com.sv.netty.config.Constant; -import com.sv.netty.utils.JsonUtils; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.nio.charset.Charset; - - -/** - * 自定义消息编码器 - * - * @Author peakren - * @Date 07/05/2017 10:43 PM - */ -public class MessageEncoder extends MessageToByteEncoder { - - private static Logger logger = LoggerFactory.getLogger(MessageEncoder.class); - - Charset charset = Charset.forName("UTF-8"); - - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - String message = JsonUtils.encode(msg); - logger.info("send message content:" + msg); - message = message + Constant.DELIMITER_WORD; - byte[] content = message.getBytes(charset.name()); - out.writeBytes(content); //发送消息内容 - } -} diff --git a/api/src/main/java/com/sv/netty/netty/ServerHandler.java b/api/src/main/java/com/sv/netty/netty/ServerHandler.java index b1dd34a..c663158 100644 --- a/api/src/main/java/com/sv/netty/netty/ServerHandler.java +++ b/api/src/main/java/com/sv/netty/netty/ServerHandler.java @@ -1,6 +1,5 @@ package com.sv.netty.netty; -import com.enums.DeviceType; import com.sv.netty.config.Constant; import com.sv.netty.config.SpringContextHolder; import com.sv.netty.netty.message.ChannelParam; @@ -48,13 +47,13 @@ public class ServerHandler extends SimpleChannelInboundHandler { */ @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) { + System.err.println("发送的数据========" + msg); String clientIp = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getClientIp(); try { HeartBeat hb = JsonUtils.decode(msg,HeartBeat.class); - logger.info("客户端" + hb.getDeviceName() + "&" + hb.getVenueId() + "【" + clientIp + "】上报心跳..."); + logger.info("客户端【" + clientIp + "】上报心跳..."); ctx.channel().attr(Constant.CHANNEL_PARAM).get().setVenueId(hb.getVenueId()); ctx.channel().attr(Constant.CHANNEL_PARAM).get().setDeviceName(hb.getDeviceName()); - ctx.channel().attr(Constant.CHANNEL_PARAM).get().setDeviceType(DeviceType.valueOf(hb.getDeviceType())); messageService.online(clientIp,ctx.channel(), hb); } catch (Exception e) { logger.error("[" + clientIp + "] host unknown error",e); @@ -85,8 +84,7 @@ public class ServerHandler extends SimpleChannelInboundHandler { logger.error("Client ip [" + clientIP + "] has inactive"); Integer venueId = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getVenueId(); String deviceName = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getDeviceName(); - DeviceType deviceType = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getDeviceType(); - messageService.Offline(deviceName,venueId,deviceType); + messageService.Offline(deviceName,venueId); } /** @@ -99,10 +97,10 @@ public class ServerHandler extends SimpleChannelInboundHandler { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { logger.error("ServerHandler exceptionCaught",cause); Channel channel = ctx.channel(); - Integer venueId = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getVenueId(); - String deviceName = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getDeviceName(); - DeviceType deviceType = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getDeviceType(); - messageService.Offline(deviceName,venueId,deviceType); +// Integer venueId = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getVenueId(); +// String deviceName = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getDeviceName(); +// DeviceType deviceType = ctx.channel().attr(Constant.CHANNEL_PARAM).get().getDeviceType(); +// messageService.Offline(deviceName,venueId,deviceType); if(channel.isActive()) { // 错误产生,关闭连接 ctx.close(); diff --git a/api/src/main/java/com/sv/netty/netty/ServerProtocolInitializer.java b/api/src/main/java/com/sv/netty/netty/ServerProtocolInitializer.java index 2fbe780..d7fb0ee 100644 --- a/api/src/main/java/com/sv/netty/netty/ServerProtocolInitializer.java +++ b/api/src/main/java/com/sv/netty/netty/ServerProtocolInitializer.java @@ -6,7 +6,9 @@ import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.timeout.IdleStateHandler; import io.netty.handler.timeout.ReadTimeoutHandler; import org.springframework.stereotype.Component; @@ -29,10 +31,10 @@ public class ServerProtocolInitializer extends ChannelInitializer // 超时设置(如果客户端频繁有人操作,则不会报心跳,这样就会触发超时,关闭链接) // pipeline.addLast(new ReadTimeoutHandler(READ_TIMEOUT)); // 通过指定的长度来标识整包的信息,这样就可以自动的处理粘包和半包的问题 - pipeline.addLast(new DelimiterBasedFrameDecoder(2048, - Unpooled.wrappedBuffer(Constant.DELIMITER_WORD.getBytes()))); + pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); pipeline.addLast(new StringDecoder()); - pipeline.addLast(new MessageEncoder()); + pipeline.addLast(new StringEncoder()); +// pipeline.addLast(new MessageEncoder()); // 心跳检测机制,通过调用触发下一个handler userEventTriggered 方法 pipeline.addLast(new IdleStateHandler(IDLE_TIME, IDLE_TIME,IDLE_TIME)); pipeline.addLast(new ServerHandler()); diff --git a/api/src/main/java/com/sv/netty/netty/message/ChannelParam.java b/api/src/main/java/com/sv/netty/netty/message/ChannelParam.java index 5028a4a..dbf1c2f 100644 --- a/api/src/main/java/com/sv/netty/netty/message/ChannelParam.java +++ b/api/src/main/java/com/sv/netty/netty/message/ChannelParam.java @@ -1,7 +1,5 @@ package com.sv.netty.netty.message; -import com.enums.DeviceType; - /** * 会话中存储的客户端对象 * @@ -25,12 +23,6 @@ public class ChannelParam { */ private Integer venueId; - /** - * 设备进场出场类型 - * @param clientIP - */ - private DeviceType deviceType; - public ChannelParam(String clientIP) { this.clientIp = clientIP; } @@ -58,12 +50,4 @@ public class ChannelParam { public void setVenueId(Integer venueId) { this.venueId = venueId; } - - public DeviceType getDeviceType() { - return deviceType; - } - - public void setDeviceType(DeviceType deviceType) { - this.deviceType = deviceType; - } } diff --git a/api/src/main/java/com/sv/netty/netty/message/HeartBeat.java b/api/src/main/java/com/sv/netty/netty/message/HeartBeat.java index 4179955..a6c69ef 100644 --- a/api/src/main/java/com/sv/netty/netty/message/HeartBeat.java +++ b/api/src/main/java/com/sv/netty/netty/message/HeartBeat.java @@ -14,8 +14,6 @@ public class HeartBeat implements Serializable { private String deviceName; //设备号 - private String deviceType; //出入标志 - public Integer getVenueId() { return venueId; } @@ -32,11 +30,4 @@ public class HeartBeat implements Serializable { this.deviceName = deviceName; } - public String getDeviceType() { - return deviceType; - } - - public void setDeviceType(String deviceType) { - this.deviceType = deviceType; - } } diff --git a/api/src/main/java/com/sv/netty/netty/service/MessageService.java b/api/src/main/java/com/sv/netty/netty/service/MessageService.java index 10b0f31..00c2fc8 100644 --- a/api/src/main/java/com/sv/netty/netty/service/MessageService.java +++ b/api/src/main/java/com/sv/netty/netty/service/MessageService.java @@ -1,6 +1,5 @@ package com.sv.netty.netty.service; -import com.enums.DeviceType; import com.sv.entity.Venue; import com.sv.netty.netty.message.HeartBeat; import io.netty.channel.Channel; @@ -29,7 +28,7 @@ public interface MessageService { * @param deviceName * @param venueId */ - void Offline(String deviceName, Integer venueId,DeviceType deviceType); + void Offline(String deviceName, Integer venueId); /** * 统计目前的链接数 @@ -37,7 +36,7 @@ public interface MessageService { */ Set countConnection(); - boolean sendLoading(String deviceName, Integer venueId,DeviceType deviceType, Integer memberId); + boolean sendLoading(String deviceName, Integer venueId, Integer memberId); /** * 出场 @@ -57,5 +56,5 @@ public interface MessageService { */ void enterVenue(String deviceName, Integer venueId, Integer memberId, Venue venue); - void testLoad(String deviceName, Integer venueId,DeviceType deviceType); + void testLoad(String deviceName, Integer venueId); } diff --git a/api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java b/api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java index d5863ee..df3feb1 100644 --- a/api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java +++ b/api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java @@ -1,6 +1,5 @@ package com.sv.netty.netty.service.impl; -import com.enums.DeviceType; import com.sv.entity.Member; import com.sv.entity.MemberEnterVenueLog; import com.sv.entity.Venue; @@ -10,6 +9,7 @@ import com.sv.netty.netty.message.HeartBeat; import com.sv.netty.netty.message.MessageDTO; import com.sv.netty.netty.message.MessageType; import com.sv.netty.netty.service.MessageService; +import com.sv.netty.utils.JsonUtils; import com.sv.service.api.MemberEnterVenueLogService; import com.sv.service.api.MemberService; import com.sv.service.api.VenueService; @@ -52,7 +52,7 @@ public class AppMessageHandlerAdapter implements MessageService { // @Resource private MemberService memberService; -// @Resource + @Resource private VenueService venueService; // @Resource @@ -78,16 +78,16 @@ public class AppMessageHandlerAdapter implements MessageService { */ @Override public void online(String clientId, Channel channel, HeartBeat heartBeat) { - DeviceType deviceType = DeviceType.valueOf(heartBeat.getDeviceType()); + logger.error("=========" + JsonUtils.encode(heartBeat) + clientId); // 处理心跳信息 - if (!contains(heartBeat.getDeviceName(),heartBeat.getVenueId(),deviceType)){ + if (!contains(heartBeat.getDeviceName(),heartBeat.getVenueId())){ // 此处存储客户端的channel 信息key 为 deviceId + venueId Venue thisVenue = venueService.findById(heartBeat.getVenueId()); if (thisVenue == null ){ logger.error("this client choose venue Error! venueId == " + heartBeat.getVenueId()); } else { - deviceService.online(heartBeat.getDeviceName(),heartBeat.getVenueId(),deviceType,thisVenue.getType(),clientId); - putChannelType(heartBeat.getDeviceName(),heartBeat.getVenueId(),deviceType,channel); + deviceService.online(heartBeat.getDeviceName(),heartBeat.getVenueId(),thisVenue.getType(),clientId); + putChannelType(heartBeat.getDeviceName(),heartBeat.getVenueId(),channel); MessageDTO messageDTO = new MessageDTO(MessageType.LINK,"欢迎扫码进场!"); channel.writeAndFlush(messageDTO); } @@ -100,10 +100,10 @@ public class AppMessageHandlerAdapter implements MessageService { * @param venueId */ @Override - public void Offline(String deviceName, Integer venueId,DeviceType deviceType) { + public void Offline(String deviceName, Integer venueId) { if (deviceName != null && venueId != null){ - removeChannelType(deviceName,venueId,deviceType); - deviceService.offline(deviceName,venueId,deviceType); + removeChannelType(deviceName,venueId); + deviceService.offline(deviceName,venueId); } } @@ -113,12 +113,12 @@ public class AppMessageHandlerAdapter implements MessageService { * @return */ @Override - public boolean sendLoading(String deviceName, Integer venueId,DeviceType deviceType, Integer memberId) { + public boolean sendLoading(String deviceName, Integer venueId,Integer memberId) { Member thisMember = memberService.findByMember(memberId); if (thisMember!=null){ String nickname = thisMember.getNickname(); MessageDTO messageDTO = new MessageDTO(MessageType.LOAD,"欢迎光临!" + nickname + ",请您60s内操作进场。"); - Channel currentChannel = getCurrentChannel(deviceName, venueId, deviceType); + Channel currentChannel = getCurrentChannel(deviceName, venueId); sendMessage(currentChannel,messageDTO); return true; } @@ -130,15 +130,15 @@ public class AppMessageHandlerAdapter implements MessageService { * @return */ @Override - public void testLoad(String deviceName, Integer venueId,DeviceType deviceType) { - Channel currentChannel = getCurrentChannel(deviceName, venueId, deviceType); - currentChannel.writeAndFlush("Test Links" + deviceName + venueId + deviceType); + public void testLoad(String deviceName, Integer venueId) { + Channel currentChannel = getCurrentChannel(deviceName, venueId); + currentChannel.writeAndFlush("Test Links" + deviceName + venueId); } @Override public void outVenue(String deviceName, Integer venueId, Integer memberId, Venue venue) { - Channel channel = getCurrentChannel(deviceName,venueId,DeviceType.OUT); + Channel channel = getCurrentChannel(deviceName,venueId); Member member = memberService.findByMember(memberId); if (member != null) { //出场 不用判断直接出 @@ -181,7 +181,7 @@ public class AppMessageHandlerAdapter implements MessageService { @Override public void enterVenue(String deviceName, Integer venueId, Integer memberId, Venue venue) { Member member = memberService.findByMember(memberId); - Channel channel = getCurrentChannel(deviceName, venueId, DeviceType.ENTER); + Channel channel = getCurrentChannel(deviceName, venueId); // 校验入场时间是否正常 if (checkInterval(member,venueId)) { if(venueService.qrCodeEnterVenue(memberId,deviceName,venueId,venue)){ @@ -208,7 +208,7 @@ public class AppMessageHandlerAdapter implements MessageService { MemberEnterVenueLog enterVenueLog = memberEnterVenueLogService.findMemberLastLogNoType(member.getId(), venueId); if (enterVenueLog != null) { //有记录 查看 最后一次是否是出场 - if (enterVenueLog.getType().intValue() == DeviceType.OUT.getCode()) { + if (true) {// TODO return true; } else { //是进场 @@ -272,32 +272,32 @@ public class AppMessageHandlerAdapter implements MessageService { /** * 缓存通道 */ - public void putChannelType(String deviceName, Integer venueId, DeviceType deviceType, Channel channel) { - String clientId = deviceName + Constant.SPIT_WORD + venueId + Constant.SPIT_WORD + deviceType; + public void putChannelType(String deviceName, Integer venueId, Channel channel) { + String clientId = deviceName + Constant.SPIT_WORD + venueId; links.put(clientId, channel); } /** * 获取当前通道 */ - public Channel getCurrentChannel(String deviceName, Integer venueId, DeviceType deviceType){ - String clientId = deviceName + Constant.SPIT_WORD + venueId + Constant.SPIT_WORD + deviceType; + public Channel getCurrentChannel(String deviceName, Integer venueId){ + String clientId = deviceName + Constant.SPIT_WORD + venueId + Constant.SPIT_WORD; return links.get(clientId); } /** * 获取通道 */ - public boolean contains(String deviceName, Integer venueId, DeviceType deviceType) { - String clientId = deviceName + Constant.SPIT_WORD + venueId + Constant.SPIT_WORD + deviceType; + public boolean contains(String deviceName, Integer venueId) { + String clientId = deviceName + Constant.SPIT_WORD + venueId + Constant.SPIT_WORD; return links.containsKey(clientId); } /** * 移除通道 */ - public void removeChannelType(String deviceName, Integer venueId, DeviceType deviceType) { - String clientId = deviceName + Constant.SPIT_WORD + venueId + Constant.SPIT_WORD + deviceType; + public void removeChannelType(String deviceName, Integer venueId) { + String clientId = deviceName + Constant.SPIT_WORD + venueId ; links.remove(clientId); } diff --git a/api/src/main/java/com/sv/netty/utils/CommonUtils.java b/api/src/main/java/com/sv/netty/utils/CommonUtils.java deleted file mode 100644 index 7d72218..0000000 --- a/api/src/main/java/com/sv/netty/utils/CommonUtils.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.sv.netty.utils; - -import java.nio.charset.Charset; - -/** - * USER: douya - * DATE: 2017-08-28 - */ -public class CommonUtils { - - - - public static byte[] intToBytes2(int n){ - byte[] b = new byte[4]; - - for(int i = 0;i < 4;i++) - { - b[i]=(byte)(n>>(24-i*8)); - - } - return b; - } - - /** - * byte数组转换成16进制字符串 - * @param src - * @return - */ - public static String bytesToHexString(byte[] src){ - StringBuilder stringBuilder = new StringBuilder(); - if (src == null || src.length <= 0) { - return null; - } - for (int i = 0; i < src.length; i++) { - int v = src[i] & 0xFF; - String hv = Integer.toHexString(v); - if (hv.length() < 2) { - stringBuilder.append(0); - } - stringBuilder.append(hv); - } - return stringBuilder.toString(); - } - - /** - * byte数组转换成16进制字符数组 - * @param src - * @return - */ - public static String[] bytesToHexStrings(byte[] src){ - if (src == null || src.length <= 0) { - return null; - } - String[] str = new String[src.length]; - - for (int i = 0; i < src.length; i++) { - int v = src[i] & 0xFF; - String hv = Integer.toHexString(v); - if (hv.length() < 2) { - str[i] = "0"; - } - str[i] = hv; - } - return str; - } - - - public static void main(String[] arg){ - String message = "{\"cmd\":\"text_message\",\"content\":\"开心开心\",\"member_count\":0,\"system\":0,\"vmc_no\":\"322af403825a\""; - byte[] bodys = message.getBytes(Charset.forName("UTF-8")); - String magic = bytesToHexString("doll".getBytes(Charset.forName("UTF-8"))); - String length = bytesToHexString(intToBytes2(bodys.length+8)); - System.out.println(magic+length+bytesToHexString(bodys)); - } - -} diff --git a/api/src/main/java/com/sv/netty/utils/EncodeUtils.java b/api/src/main/java/com/sv/netty/utils/EncodeUtils.java deleted file mode 100644 index 7507d59..0000000 --- a/api/src/main/java/com/sv/netty/utils/EncodeUtils.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2005-2009 springside.org.cn - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * - * $Id: EncodeUtils.java 984 2010-03-21 13:02:44Z calvinxiu $ - */ -package com.sv.netty.utils; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.codec.binary.Hex; - -/** - * 各种格式的编码加码工具类. - * - * 集成Commons-Codec,Commons-Lang及JDK提供的编解码方法. - * - * @author ranfi - */ -public class EncodeUtils { - - private static final String DEFAULT_URL_ENCODING = "UTF-8"; - private static final char[] BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); - - /** - * Hex编码. - */ - public static String encodeHex(byte[] input) { - return Hex.encodeHexString(input); - } - - /** - * Hex解码. - */ - public static byte[] decodeHex(String input) { - try { - return Hex.decodeHex(input.toCharArray()); - } catch (DecoderException e) { - return null; - } - } - - /** - * Base64编码. - */ - public static String encodeBase64(byte[] input) { - return Base64.encodeBase64String(input); - } - - /** - * Base64编码, URL安全(将Base64中的URL非法字符'+'和'/'转为'-'和'_', 见RFC3548). - */ - public static String encodeUrlSafeBase64(byte[] input) { - return Base64.encodeBase64URLSafeString(input); - } - - /** - * Base64解码. - */ - public static byte[] decodeBase64(String input) { - return Base64.decodeBase64(input); - } - - /** - * Base62编码。 - */ - public static String encodeBase62(byte[] input) { - char[] chars = new char[input.length]; - for (int i = 0; i < input.length; i++) { - chars[i] = BASE62[(input[i] & 0xFF) % BASE62.length]; - } - return new String(chars); - } - - -} diff --git a/api/src/main/java/com/sv/netty/utils/JsonMapper.java b/api/src/main/java/com/sv/netty/utils/JsonMapper.java deleted file mode 100644 index b4d736d..0000000 --- a/api/src/main/java/com/sv/netty/utils/JsonMapper.java +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Copyright (c) 2005-2012 springside.org.cn - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - */ -package com.sv.netty.utils; - -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.JSONPObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; - -import java.io.IOException; -import java.util.Collection; -import java.util.Map; - -/** - * 简单封装Jackson,实现JSON String<->Java Object的Mapper. - *

- * 封装不同的输出风格, 使用不同的builder函数创建实例. - * - * @author calvin - */ -public class JsonMapper { - - private static Logger logger = LoggerFactory.getLogger(JsonMapper.class); - - private final ObjectMapper mapper; - - public JsonMapper() { - this(null); - } - - public JsonMapper(Include include) { - mapper = new ObjectMapper(); - // 设置输出时包含属性的风格 - if (include != null) { - mapper.setSerializationInclusion(include); - } - // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - } - - /** - * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用. - */ - public static JsonMapper nonEmptyMapper() { - return new JsonMapper(Include.NON_EMPTY); - } - - /** - * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。 - */ - public static JsonMapper nonDefaultMapper() { - return new JsonMapper(Include.NON_DEFAULT); - } - - public static JsonMapper nonNullMapper() { - return new JsonMapper(Include.NON_NULL); - } - - /** - * Object可以是POJO,也可以是Collection或数组。 如果对象为Null, 返回"null". 如果集合为空集合, 返回"[]". - */ - public String toJson(Object object) { - - try { - return mapper.writeValueAsString(object); - } catch (IOException e) { - logger.warn("write to json string error:" + object, e); - return null; - } - } - - /** - * 反序列化POJO或简单Collection如List. - *

- * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合. - *

- * 如需反序列化复杂Collection如List, 请使用fromJson(String, JavaType) - * - * @see #fromJson(String, JavaType) - */ - public T fromJson(String jsonString, Class clazz) { - if (StringUtils.isEmpty(jsonString)) { - return null; - } - - try { - return mapper.readValue(jsonString, clazz); - } catch (IOException e) { - logger.warn("parse json string error:" + jsonString, e); - return null; - } - } - - /** - * 反序列化复杂Collection如List, - * 先使用createCollectionType()或contructMapType()构造类型, 然后调用本函数. - * - * @see #createCollectionType(Class, Class...) - */ - public T fromJson(String jsonString, JavaType javaType) { - if (StringUtils.isEmpty(jsonString)) { - return null; - } - - try { - return (T) mapper.readValue(jsonString, javaType); - } catch (IOException e) { - logger.warn("parse json string error:" + jsonString, e); - return null; - } - } - - /** - * 构造Collection类型. - */ - public JavaType contructCollectionType(Class collectionClass, Class elementClass) { - return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass); - } - - /** - * 构造Map类型. - */ - public JavaType contructMapType(Class mapClass, Class keyClass, Class valueClass) { - return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); - } - - /** - * map 转 bean - * - * @param map - * @param beanClass - * @return - */ - public T convertMapToBean(Map map, Class beanClass) { - try { - return mapper.convertValue(map, beanClass); - } catch (Exception e) { - logger.warn("convertMapToBean error! ", e); - } - return null; - } - - /** - * map 转 bean - * - * @param bean - * @param objectClass - * @return - */ - public T convertBeanToOther(Object bean, Class objectClass) { - try { - return mapper.convertValue(bean, objectClass); - } catch (Exception e) { - logger.warn("convertMapToBean error! ", e); - } - return null; - } - - /** - * 当JSON里只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性. - */ - public void update(String jsonString, Object object) { - try { - mapper.readerForUpdating(object).readValue(jsonString); - } catch (JsonProcessingException e) { - logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); - } catch (IOException e) { - logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); - } - } - - /** - * 輸出JSONP格式數據. - */ - public String toJsonP(String functionName, Object object) { - return toJson(new JSONPObject(functionName, object)); - } - - /** - * 設定是否使用Enum的toString函數來讀寫Enum, 為False時時使用Enum的name()函數來讀寫Enum, 默認為False. - * 注意本函數一定要在Mapper創建後, 所有的讀寫動作之前調用. - */ - public void enableEnumUseToString() { - mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); - mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); - } - - /** - * 取出Mapper做进一步的设置或使用其他序列化API. - */ - public ObjectMapper getMapper() { - return mapper; - } - -} diff --git a/api/src/main/java/com/sv/netty/utils/JsonUtils.java b/api/src/main/java/com/sv/netty/utils/JsonUtils.java deleted file mode 100644 index 250c659..0000000 --- a/api/src/main/java/com/sv/netty/utils/JsonUtils.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.sv.netty.utils; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; - -/** - * USER: douya - * DATE: 2017-11-01 - */ -public class JsonUtils { - - - /** - * Logger for this class - */ - private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class); - - private final static ObjectMapper objectMapper = new ObjectMapper(); - - static { - objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); - objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); - objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); - objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } - - private JsonUtils() { - } - - public static String encode(Object obj) { - try { - return objectMapper.writeValueAsString(obj); - } catch (JsonGenerationException e) { - logger.error("encode(Object)", e); //$NON-NLS-1$ - } catch (JsonMappingException e) { - logger.error("encode(Object)", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("encode(Object)", e); //$NON-NLS-1$ - } - return null; - } - - /** - * 将json string反序列化成对象 - * - * @param json - * @param valueType - * @return - */ - public static T decode(String json, Class valueType) { - try { - return objectMapper.readValue(json, valueType); - } catch (JsonParseException e) { - logger.error("decode(String, Class)", e); - } catch (JsonMappingException e) { - logger.error("decode(String, Class)", e); - } catch (IOException e) { - logger.error("decode(String, Class)", e); - } - return null; - } - - /** - * 将json array反序列化为对象 - * - * @param json - * @param typeReference - * @return - */ - @SuppressWarnings("unchecked") - public static T decode(String json, TypeReference typeReference) { - try { - return (T) objectMapper.readValue(json, typeReference); - } catch (JsonParseException e) { - logger.error("decode(String, JsonTypeReference)", e); - } catch (JsonMappingException e) { - logger.error("decode(String, JsonTypeReference)", e); - } catch (IOException e) { - logger.error("decode(String, JsonTypeReference)", e); - } - return null; - } - -} diff --git a/entity/src/main/java/com/enums/DeviceType.java b/entity/src/main/java/com/enums/DeviceType.java deleted file mode 100644 index 44a5e76..0000000 --- a/entity/src/main/java/com/enums/DeviceType.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.enums; - -/** - * 设备属性,控制入场还是控制出场 - */ -public enum DeviceType { - - ENTER(0,"进场"), - OUT(1,"出场"); - private int code; - private String name; - - DeviceType(int code, String name) { - this.code = code; - this.name = name; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/entity/src/main/java/com/sv/entity/Device.java b/entity/src/main/java/com/sv/entity/Device.java index 0267515..2e7c295 100644 --- a/entity/src/main/java/com/sv/entity/Device.java +++ b/entity/src/main/java/com/sv/entity/Device.java @@ -1,7 +1,5 @@ package com.sv.entity; -import com.enums.DeviceType; - import java.io.Serializable; import java.util.Date; @@ -15,7 +13,7 @@ public class Device implements Serializable { /** - * + * */ private Integer id; @@ -38,8 +36,6 @@ public class Device implements Serializable { private Integer venueType; - private DeviceType deviceType; - private Integer bindMember; private Date bindTime; @@ -75,7 +71,7 @@ public class Device implements Serializable { /** * 设置 * - * @param id + * @param id */ public void setId(Integer id){ this.id = id; @@ -84,7 +80,7 @@ public class Device implements Serializable { /** * 获取 * - * @return + * @return */ public Integer getId(){ return id; @@ -249,14 +245,6 @@ public class Device implements Serializable { this.venueType = venueType; } - public DeviceType getDeviceType() { - return deviceType; - } - - public void setDeviceType(DeviceType deviceType) { - this.deviceType = deviceType; - } - public Integer getBindMember() { return bindMember; } @@ -272,4 +260,4 @@ public class Device implements Serializable { public void setBindTime(Date bindTime) { this.bindTime = bindTime; } -} \ No newline at end of file +} diff --git a/netty-client/pom.xml b/netty-client/pom.xml index 678ae87..516c21c 100644 --- a/netty-client/pom.xml +++ b/netty-client/pom.xml @@ -13,13 +13,8 @@ - io.netty - netty-all - 4.1.10.Final - - - org.springframework.boot - spring-boot-starter-web + smartvenue + netty-model diff --git a/netty-client/src/main/java/com/sv/netty/ClientHandler.java b/netty-client/src/main/java/com/sv/netty/ClientHandler.java index 49796eb..29ab9b5 100644 --- a/netty-client/src/main/java/com/sv/netty/ClientHandler.java +++ b/netty-client/src/main/java/com/sv/netty/ClientHandler.java @@ -1,14 +1,16 @@ package com.sv.netty; import com.sv.netty.message.HeartBeat; -import com.sv.netty.message.MessageType; -import com.sv.netty.message.VenueMessage; +import com.sv.netty.utils.EncodeMsg; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; +import java.net.UnknownHostException; + /** * 通讯服务器请求处理 * @@ -16,77 +18,82 @@ import io.netty.handler.timeout.IdleStateEvent; * @date 05/12/2017 10:27 PM */ @ChannelHandler.Sharable -public class ClientHandler extends ChannelInboundHandlerAdapter { - - private final static String TAG = "ClientHandler"; - - private boolean hasRead = false; - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); -// ClientTcpSession.getInstance().setContext(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - //服务器连上以后立即模拟心跳返回 - ctx.writeAndFlush(getHbMessage()); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - super.channelInactive(ctx); - ClientThread.getInstance().clearFuture(); - ClientThread.getInstance().restart(); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// Message message = JsonMapper.fromJson(msg.toString(), Message.class); -// MessageService.getInstance().execute(message); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - System.err.println("错了Error"); - System.err.println("Error"); -// GlobalConfig.isConnected = false; - ctx.close(); - } +public class ClientHandler extends SimpleChannelInboundHandler { /** - * 获取心跳返回消息 - * - * @return - */ - private VenueMessage getHbMessage() { - HeartBeat hb = new HeartBeat(); -// hb.setVersionCode(AppUtil.getVersionCode(StartApplication.getAppContext())); - VenueMessage message = new VenueMessage(); - message.setMessageType(MessageType.HB); -// message.setDeviceId(DeviceIdUtil.generateDeviceId(mContext)); - return message; - } - - /** - * 心跳处理 - * + * 当通道就绪就会触发 * @param ctx - * @param evt * @throws Exception */ @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + } + + /** + * 当通道失效就会触发 + * @param ctx + * @throws Exception + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + } + + /** + * 当通道有读取事件时触发 + * @param ctx + * @param msg + * @throws Exception + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + System.out.println("接收服务器响应msg:[" + msg + "]"); +// MessageDTO message = JsonMapper.fromJson(msg, MessageDTO.class); +// MessageService.getInstance().execute(message); + } + + /** + * 心跳 + * @param ctx + * @param evt + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws UnknownHostException { if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.ALL_IDLE) { - ctx.writeAndFlush(getHbMessage()); + ctx.write(EncodeMsg.INSTANCE.encode(getHbMessage())); + ctx.flush(); } } } + /** + * 封装心跳请求包 + * @throws Exception + */ + private HeartBeat getHbMessage() { + HeartBeat hb = new HeartBeat(); + hb.setDeviceName("dsadasdasd"); + hb.setVenueId(123); + return hb; + } + + /** + * 处理异常 + * @param ctx + * @param cause + * @throws Exception + */ + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + System.out.println("ClientHandler exceptionCaught"); + cause.printStackTrace(); + Channel channel = ctx.channel(); + if(channel.isActive()) { + ctx.close(); + } + } + } diff --git a/netty-client/src/main/java/com/sv/netty/ClientInitializer.java b/netty-client/src/main/java/com/sv/netty/ClientInitializer.java index b6e8e32..b1d9ba1 100644 --- a/netty-client/src/main/java/com/sv/netty/ClientInitializer.java +++ b/netty-client/src/main/java/com/sv/netty/ClientInitializer.java @@ -1,19 +1,18 @@ package com.sv.netty; -import com.sv.netty.config.Constant; -import io.netty.buffer.Unpooled; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.timeout.IdleStateHandler; public class ClientInitializer extends ChannelInitializer { - private final static int TIME_HEART_BEAT = 20; + private final static int TIME_HEART_BEAT = 5; public ClientThread.ReConnectHandler reConnectHandler; public ClientHandler dmClientHandler; @@ -28,10 +27,10 @@ public class ClientInitializer extends ChannelInitializer { protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("reconnect", reConnectHandler); - pipeline.addLast("idleStateHandler", new IdleStateHandler(TIME_HEART_BEAT, TIME_HEART_BEAT, TIME_HEART_BEAT)); - pipeline.addLast(new MessageEncoder()); - pipeline.addFirst(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 4, 4, 0, 0)); - pipeline.addLast(new MessageDecoder()); + pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); + pipeline.addLast(new StringDecoder()); + pipeline.addLast(new StringEncoder()); + pipeline.addLast(new IdleStateHandler(TIME_HEART_BEAT, TIME_HEART_BEAT,TIME_HEART_BEAT)); pipeline.addLast(dmClientHandler); } diff --git a/netty-client/src/main/java/com/sv/netty/ClientThread.java b/netty-client/src/main/java/com/sv/netty/ClientThread.java index 87ba1cd..f6c2abc 100644 --- a/netty-client/src/main/java/com/sv/netty/ClientThread.java +++ b/netty-client/src/main/java/com/sv/netty/ClientThread.java @@ -1,10 +1,11 @@ package com.sv.netty; -import com.sv.netty.config.Constant; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.logging.LoggingHandler; + import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; @@ -51,6 +52,7 @@ public class ClientThread extends Thread{ bootstrap = new Bootstrap(); bootstrap.group(workerGroup); bootstrap.channel(NioSocketChannel.class); + bootstrap.handler(new LoggingHandler()); bootstrap.option(ChannelOption.TCP_NODELAY, true); bootstrap.option(ChannelOption.SO_KEEPALIVE, true); @@ -114,7 +116,7 @@ public class ClientThread extends Thread{ public void run() { doConnect(); } - }, 1, TimeUnit.SECONDS); + }, 2, TimeUnit.SECONDS); } } diff --git a/netty-client/src/main/java/com/sv/netty/MessageDecoder.java b/netty-client/src/main/java/com/sv/netty/MessageDecoder.java deleted file mode 100644 index 6c79def..0000000 --- a/netty-client/src/main/java/com/sv/netty/MessageDecoder.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sv.netty; - -import com.sv.netty.config.Constant; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; - -import java.io.UnsupportedEncodingException; -import java.util.List; - -/** - * Created by hehelt on 16/2/26. - *

- * 解码器 - */ -public class MessageDecoder extends ByteToMessageDecoder { - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - if (in.capacity() >= Constant.LENGTH_INDEX) { - int magicWord = in.readInt(); - if (magicWord == Constant.MAGIC_WORD) { - int length = in.readInt(); - byte[] msg = new byte[length]; - in.readBytes(msg); - String message = new String(msg, "utf-8"); - out.add(message); - } - } - } - - /** - * 解析从服务器接受的消息 - * - * @param buf - * @return - */ - private String getMessage(ByteBuf buf) { - byte[] con = new byte[buf.readableBytes()]; - buf.readBytes(con); - try { - return new String(con, "utf-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/netty-client/src/main/java/com/sv/netty/MessageEncoder.java b/netty-client/src/main/java/com/sv/netty/MessageEncoder.java deleted file mode 100644 index 5fba209..0000000 --- a/netty-client/src/main/java/com/sv/netty/MessageEncoder.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sv.netty; - -import com.sv.netty.config.Constant; -import com.sv.netty.message.VenueMessage; -import com.sv.utils.JsonMapper; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; - -/** - * 自定义编码器, 1个字节固定头+4个字节长度+内容 - */ -public class MessageEncoder extends MessageToByteEncoder { - - private String charset = "utf-8"; - - @Override - protected void encode(ChannelHandlerContext ctx, VenueMessage message, ByteBuf out) throws Exception { - out.writeInt(Constant.MAGIC_WORD); - String msg = JsonMapper.toJson(message); - out.writeInt(msg.getBytes(charset).length); - out.writeBytes(msg.getBytes(charset)); - } -} diff --git a/netty-client/src/main/java/com/sv/netty/config/Constant.java b/netty-client/src/main/java/com/sv/netty/config/Constant.java deleted file mode 100644 index fedab34..0000000 --- a/netty-client/src/main/java/com/sv/netty/config/Constant.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sv.netty.config; - -public interface Constant { - - String DELIMITER_WORD = "$_$"; - - int MAGIC_WORD = 0x9DDD; - int LENGTH_INDEX = 4; - - String SERVER_IP = "120.27.209.4"; - Integer SERVER_PORT = 56791; - Integer VENUE_ID = 39; - String DEVICE_NAME = "SN2020382013"; - -} diff --git a/netty-client/src/main/java/com/sv/utils/JsonMapper.java b/netty-client/src/main/java/com/sv/utils/JsonMapper.java deleted file mode 100644 index 08e8a10..0000000 --- a/netty-client/src/main/java/com/sv/utils/JsonMapper.java +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Copyright (c) 2005-2012 springside.org.cn - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - */ -package com.sv.utils; - -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.JSONPObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; - -import java.io.IOException; -import java.util.Collection; -import java.util.Map; - -/** - * 简单封装Jackson,实现JSON String<->Java Object的Mapper. - *

- * 封装不同的输出风格, 使用不同的builder函数创建实例. - * - * @author calvin - */ -public class JsonMapper { - - private static Logger logger = LoggerFactory.getLogger(JsonMapper.class); - - private static ObjectMapper mapper; - - public JsonMapper() { - this(null); - } - - public JsonMapper(Include include) { - mapper = new ObjectMapper(); - // 设置输出时包含属性的风格 - if (include != null) { - mapper.setSerializationInclusion(include); - } - // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - } - - /** - * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用. - */ - public static JsonMapper nonEmptyMapper() { - return new JsonMapper(Include.NON_EMPTY); - } - - /** - * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。 - */ - public static JsonMapper nonDefaultMapper() { - return new JsonMapper(Include.NON_DEFAULT); - } - - public static JsonMapper nonNullMapper() { - return new JsonMapper(Include.NON_NULL); - } - - /** - * Object可以是POJO,也可以是Collection或数组。 如果对象为Null, 返回"null". 如果集合为空集合, 返回"[]". - */ - public static String toJson(Object object) { - - try { - return mapper.writeValueAsString(object); - } catch (IOException e) { - logger.warn("write to json string error:" + object, e); - return null; - } - } - - /** - * 反序列化POJO或简单Collection如List. - *

- * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合. - *

- * 如需反序列化复杂Collection如List, 请使用fromJson(String, JavaType) - * - * @see #fromJson(String, JavaType) - */ - public static T fromJson(String jsonString, Class clazz) { - if (StringUtils.isEmpty(jsonString)) { - return null; - } - - try { - return mapper.readValue(jsonString, clazz); - } catch (IOException e) { - logger.warn("parse json string error:" + jsonString, e); - return null; - } - } - - /** - * 反序列化复杂Collection如List, - * 先使用createCollectionType()或contructMapType()构造类型, 然后调用本函数. - * - * @see #createCollectionType(Class, Class...) - */ - public T fromJson(String jsonString, JavaType javaType) { - if (StringUtils.isEmpty(jsonString)) { - return null; - } - - try { - return (T) mapper.readValue(jsonString, javaType); - } catch (IOException e) { - logger.warn("parse json string error:" + jsonString, e); - return null; - } - } - - /** - * 构造Collection类型. - */ - public JavaType contructCollectionType(Class collectionClass, Class elementClass) { - return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass); - } - - /** - * 构造Map类型. - */ - public JavaType contructMapType(Class mapClass, Class keyClass, Class valueClass) { - return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); - } - - /** - * map 转 bean - * - * @param map - * @param beanClass - * @return - */ - public T convertMapToBean(Map map, Class beanClass) { - try { - return mapper.convertValue(map, beanClass); - } catch (Exception e) { - logger.warn("convertMapToBean error! ", e); - } - return null; - } - - /** - * map 转 bean - * - * @param bean - * @param objectClass - * @return - */ - public T convertBeanToOther(Object bean, Class objectClass) { - try { - return mapper.convertValue(bean, objectClass); - } catch (Exception e) { - logger.warn("convertMapToBean error! ", e); - } - return null; - } - - /** - * 当JSON里只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性. - */ - public void update(String jsonString, Object object) { - try { - mapper.readerForUpdating(object).readValue(jsonString); - } catch (JsonProcessingException e) { - logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); - } catch (IOException e) { - logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); - } - } - - /** - * 輸出JSONP格式數據. - */ - public String toJsonP(String functionName, Object object) { - return toJson(new JSONPObject(functionName, object)); - } - - /** - * 設定是否使用Enum的toString函數來讀寫Enum, 為False時時使用Enum的name()函數來讀寫Enum, 默認為False. - * 注意本函數一定要在Mapper創建後, 所有的讀寫動作之前調用. - */ - public void enableEnumUseToString() { - mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); - mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); - } - - /** - * 取出Mapper做进一步的设置或使用其他序列化API. - */ - public ObjectMapper getMapper() { - return mapper; - } - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/ClientTest.java b/netty-client/src/main/test/java/test/netty/nio/net/ClientTest.java deleted file mode 100644 index a280080..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/ClientTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package test.netty.nio.net; - -import test.netty.nio.net.client.ClientThread; - -/** - * 开启一个客户端, - */ -public class ClientTest { - public static void main(String[] args) { - ClientThread instance = ClientThread.getInstance(); - instance.start(); - } -} \ No newline at end of file diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/ClientHandler.java b/netty-client/src/main/test/java/test/netty/nio/net/client/ClientHandler.java deleted file mode 100644 index fa584f6..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/ClientHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package test.netty.nio.net.client; - -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import test.netty.nio.net.dto.HeartBeat; -import test.netty.nio.net.dto.Message; - -/** - * 通讯服务器请求处理 - * - * @author peakren - * @date 05/12/2017 10:27 PM - */ -@ChannelHandler.Sharable -public class ClientHandler extends ChannelInboundHandlerAdapter { - - private final static String TAG = "ClientHandler"; - - private boolean hasRead = false; - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); -// ClientTcpSession.getInstance().setContext(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - //服务器连上以后立即模拟心跳返回 - ctx.writeAndFlush(getHbMessage()); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - super.channelInactive(ctx); -// GlobalConfig.isConnected =false; - ClientThread.getInstance().clearFuture(); - ClientThread.getInstance().restart(); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// Message message = JsonMapper.fromJson(msg.toString(), Message.class); -// MessageService.getInstance().execute(message); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); -// GlobalConfig.isConnected = false; - ctx.close(); - } - - /** - * 获取心跳返回消息 - * - * @return - */ - private Message getHbMessage() { - HeartBeat hb = new HeartBeat(); -// hb.setVersionCode(AppUtil.getVersionCode(StartApplication.getAppContext())); - Message message = new Message(); - message.setCmdId(Cmd.HB.id); -// message.setDeviceId(DeviceIdUtil.generateDeviceId(mContext)); - return message; - } - - /** - * 心跳处理 - * - * @param ctx - * @param evt - * @throws Exception - */ - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { - IdleStateEvent event = (IdleStateEvent) evt; - if (event.state() == IdleState.ALL_IDLE) { - ctx.writeAndFlush(getHbMessage()); - } - } - } - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/ClientInitializer.java b/netty-client/src/main/test/java/test/netty/nio/net/client/ClientInitializer.java deleted file mode 100644 index 0f345b2..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/ClientInitializer.java +++ /dev/null @@ -1,38 +0,0 @@ -package test.netty.nio.net.client; - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.timeout.IdleStateHandler; - - -public class ClientInitializer extends ChannelInitializer { - - private final static int TIME_HEART_BEAT = 20; - - public ClientThread.ReConnectHandler reConnectHandler; - public ClientHandler dmClientHandler; - - public ClientInitializer(ClientThread.ReConnectHandler handler) { - reConnectHandler = handler; - } - - public ClientInitializer(ClientThread.ReConnectHandler handler, ClientHandler dmClientHandler) { - reConnectHandler = handler; - this.dmClientHandler = dmClientHandler; - } - - - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - pipeline.addLast("reconnect", reConnectHandler); - pipeline.addLast("idleStateHandler", new IdleStateHandler(TIME_HEART_BEAT, TIME_HEART_BEAT, TIME_HEART_BEAT)); - pipeline.addLast(new MessageEncoder()); - pipeline.addFirst(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 4, 4, 0, 0)); - pipeline.addLast(new MessageDecoder()); - pipeline.addLast(dmClientHandler); - } - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/ClientThread.java b/netty-client/src/main/test/java/test/netty/nio/net/client/ClientThread.java deleted file mode 100644 index 483b6e3..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/ClientThread.java +++ /dev/null @@ -1,124 +0,0 @@ -package test.netty.nio.net.client; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; - -import java.net.InetSocketAddress; -import java.util.concurrent.TimeUnit; - - -/** - * 客户端通讯 - * - * @author peakren - * @date 07/12/2017 10:12 PM - */ -public class ClientThread extends Thread{ - - private static ClientThread instance; - - private volatile EventLoopGroup workerGroup; - private volatile Bootstrap bootstrap; - private volatile boolean closed = false; - private String remoteHost; - private int remotePort; - - private ChannelFuture future; - - - public static ClientThread getInstance() { - if (instance == null) { - synchronized (ClientThread.class) { - if (instance == null) { - instance = new ClientThread("127.0.0.1", 56791); - } - } - } - return instance; - } - - private ClientThread(String remoteHost, int remotePort) { - this.remoteHost = remoteHost; - this.remotePort = remotePort; - } - - public void run() { - - closed = false; - workerGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(workerGroup); - bootstrap.channel(NioSocketChannel.class); - bootstrap.option(ChannelOption.TCP_NODELAY, true); - bootstrap.option(ChannelOption.SO_KEEPALIVE, true); - - ReConnectHandler reConnectHandler = new ReConnectHandler(); - ClientHandler dmClientHandler = new ClientHandler(); - ClientInitializer channelInitializer = new ClientInitializer(reConnectHandler, dmClientHandler); - - bootstrap.handler(channelInitializer); - doConnect(); - } - - public void clearFuture(){ - future = null; - } - - public void doConnect() { - System.out.println("现在开始链接了"); - if (closed) { - return; - } - System.out.println("连接 = " + remoteHost + " " + remotePort); - future = bootstrap.connect(new InetSocketAddress(remoteHost, remotePort)); - future.addListener(new ChannelFutureListener() { - public void operationComplete(ChannelFuture f) throws Exception { - f.channel().eventLoop().schedule(new Runnable() { - @Override - public void run() { - if (!f.isSuccess()) { - doConnect(); - System.out.println("等待连接"); - } else { - System.out.println("已连接"); - } - } - }, 2, TimeUnit.SECONDS); - - - } - }); - - } - - public void close() { - closed = true; - workerGroup.shutdownGracefully(); - } - - public void restart() { - close(); - run(); - } - - @ChannelHandler.Sharable - public class ReConnectHandler extends ChannelInboundHandlerAdapter { - - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - super.channelInactive(ctx); - System.out.println("inactive"); - ctx.channel().eventLoop().schedule(new Runnable() { - @Override - public void run() { - doConnect(); - } - }, 1, TimeUnit.SECONDS); - } - } - - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/Cmd.java b/netty-client/src/main/test/java/test/netty/nio/net/client/Cmd.java deleted file mode 100644 index c4509f8..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/Cmd.java +++ /dev/null @@ -1,45 +0,0 @@ -package test.netty.nio.net.client; - -/** - * 消息协议指令定义 - * - * @Author peakren - * @Date 08/12/2017 11:51 AM - */ -public enum Cmd { - - - HB("hb", "心跳"), - - FACEID("faceid", "人脸识别"), - - FACEID_RESPONSE("faceid_response_upload", "识别结果"), - - RECEV_FACE_IMAGE("recev_face_image", "接收人脸照片"), - - RECEV_FACE_IMAGE_R("recev_face_image_r", "返回上传图片结果"), - - OPEN_DOOR("open_door", "开门禁"); - - - public String id; - - public String text; - - Cmd(String id, String text) { - this.id = id; - this.text = text; - - } - - public static Cmd getCmd(String id) { - for (Cmd cmd : Cmd.values()) { - if (cmd.id.equalsIgnoreCase(id)) { - return cmd; - } - } - return Cmd.HB; - } - -} - diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/CustomDecoder.java b/netty-client/src/main/test/java/test/netty/nio/net/client/CustomDecoder.java deleted file mode 100644 index 5354b20..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/CustomDecoder.java +++ /dev/null @@ -1,40 +0,0 @@ -package test.netty.nio.net.client; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; - -import java.nio.ByteOrder; - - -/** - * 自定义解码器,解决粘包和分包问题 - * - * @author peakren - * @date 07/12/2017 10:03 PM - */ -public class CustomDecoder extends LengthFieldBasedFrameDecoder { - - public CustomDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength); - } - - public CustomDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip); - } - - public CustomDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip, boolean failFast) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip, failFast); - } - - public CustomDecoder(ByteOrder byteOrder, int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip, boolean failFast) { - super(byteOrder, maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip, failFast); - } - - - @Override - protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { - return super.decode(ctx, in); - } - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/DataConfig.java b/netty-client/src/main/test/java/test/netty/nio/net/client/DataConfig.java deleted file mode 100644 index 95c2880..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/DataConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package test.netty.nio.net.client; - -/** - * Created by hehelt on 16/2/26. - */ -public class DataConfig { - - public static final int MAGIC_WORD = 0x9DDD; - public static final int MAGIC_WORD_INDEX = 0; - public static final int LENGTH_INDEX = 4; - public static final int DATA_INDEX = 8; - - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/MessageDecoder.java b/netty-client/src/main/test/java/test/netty/nio/net/client/MessageDecoder.java deleted file mode 100644 index 331abf6..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/MessageDecoder.java +++ /dev/null @@ -1,48 +0,0 @@ -package test.netty.nio.net.client; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; - -import java.io.UnsupportedEncodingException; -import java.util.List; - -/** - * Created by hehelt on 16/2/26. - *

- * 解码器 - */ -public class MessageDecoder extends ByteToMessageDecoder { - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - if (in.capacity() >= DataConfig.LENGTH_INDEX) { - int magicWord = in.readInt(); - if (magicWord == DataConfig.MAGIC_WORD) { - int length = in.readInt(); - byte[] msg = new byte[length]; - in.readBytes(msg); - String message = new String(msg, "utf-8"); - out.add(message); - } - } - } - - /** - * 解析从服务器接受的消息 - * - * @param buf - * @return - */ - private String getMessage(ByteBuf buf) { - - byte[] con = new byte[buf.readableBytes()]; - buf.readBytes(con); - try { - return new String(con, "utf-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/client/MessageEncoder.java b/netty-client/src/main/test/java/test/netty/nio/net/client/MessageEncoder.java deleted file mode 100644 index 086bf81..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/client/MessageEncoder.java +++ /dev/null @@ -1,24 +0,0 @@ -package test.netty.nio.net.client; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import test.netty.nio.net.dto.JsonMapper; -import test.netty.nio.net.dto.Message; - -/** - * 自定义编码器, 1个字节固定头+4个字节长度+内容 - */ -public class MessageEncoder extends MessageToByteEncoder { - - private String charset = "utf-8"; - private final static String TAG = "MessageEncoder"; - - @Override - protected void encode(ChannelHandlerContext ctx, Message message, ByteBuf out) throws Exception { - out.writeInt(DataConfig.MAGIC_WORD); - String msg = JsonMapper.toJson(message); - out.writeInt(msg.getBytes(charset).length); - out.writeBytes(msg.getBytes(charset)); - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/AddFaceResponse.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/AddFaceResponse.java deleted file mode 100644 index bd46e11..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/AddFaceResponse.java +++ /dev/null @@ -1,142 +0,0 @@ -package test.netty.nio.net.dto; - -import com.google.gson.annotations.Expose; - -public class AddFaceResponse { - - /** - * code : 0 - * data : {"company_id":1,"id":4,"origin_url":"/static/upload/origin/2018-08-09/v2_1ea4b7847d1ea56b773aec99441af52dcbf9ca7d.jpg","quality":0.992649,"subject_id":null,"url":"/static/upload/photo/2018-08-09/v2_fa9dcfd045ff5232aa446f5645cbb031eef7ac74.jpg","version":7} - * page : {} - */ - - @Expose - private int code; - - @Expose - private DataBean data; - - @Expose - private PageBean page; - - @Expose - private String desc; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public DataBean getData() { - return data; - } - - public void setData(DataBean data) { - this.data = data; - } - - public PageBean getPage() { - return page; - } - - public void setPage(PageBean page) { - this.page = page; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public static class DataBean { - /** - * company_id : 1 - * id : 4 - * origin_url : /static/upload/origin/2018-08-09/v2_1ea4b7847d1ea56b773aec99441af52dcbf9ca7d.jpg - * quality : 0.992649 - * subject_id : null - * url : /static/upload/photo/2018-08-09/v2_fa9dcfd045ff5232aa446f5645cbb031eef7ac74.jpg - * version : 7 - */ - - @Expose - private int company_id; - @Expose - private int id; - @Expose - private String origin_url; - @Expose - private double quality; - @Expose - private Object subject_id; - @Expose - private String url; - @Expose - private int version; - - public int getCompany_id() { - return company_id; - } - - public void setCompany_id(int company_id) { - this.company_id = company_id; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getOrigin_url() { - return origin_url; - } - - public void setOrigin_url(String origin_url) { - this.origin_url = origin_url; - } - - public double getQuality() { - return quality; - } - - public void setQuality(double quality) { - this.quality = quality; - } - - public Object getSubject_id() { - return subject_id; - } - - public void setSubject_id(Object subject_id) { - this.subject_id = subject_id; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public int getVersion() { - return version; - } - - public void setVersion(int version) { - this.version = version; - } - } - - public static class PageBean { - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/BaseDto.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/BaseDto.java deleted file mode 100644 index 074552f..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/BaseDto.java +++ /dev/null @@ -1,86 +0,0 @@ -package test.netty.nio.net.dto; - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; - -/** - * Created by peakren on 19/01/2018. - */ - -public class BaseDto implements Serializable { - - private static final long serialVersionUID = 3139438146199448677L; - - @Expose - private String cmdId; //指令 - - @Expose - private String deviceId; //设备ID - - /** - * 客户端IP - */ - @Expose - private String clientIp; - - /** - * 状态码 0正常 1错误 - */ - @Expose - private int errorCode = 0; - - /** - * 错误返回信息 - */ - @Expose - private String errorMsg; - - - public String getCmdId() { - return cmdId; - } - - public void setCmdId(String cmdId) { - this.cmdId = cmdId; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - /** - * 客户端IP,获取的内网IP - * - * @return - */ - public String getClientIp() { - return clientIp; - } - - public void setClientIp(String clientIp) { - this.clientIp = clientIp; - } - - public int getErrorCode() { - return errorCode; - } - - public void setErrorCode(int errorCode) { - this.errorCode = errorCode; - } - - public String getErrorMsg() { - return errorMsg; - } - - public void setErrorMsg(String errorMsg) { - this.errorMsg = errorMsg; - } - - -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/FaceImageDto.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/FaceImageDto.java deleted file mode 100644 index 1efb244..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/FaceImageDto.java +++ /dev/null @@ -1,52 +0,0 @@ -package test.netty.nio.net.dto; - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; - - -/** - * 会员基本信息 - * MemberDto.java - * - * @author peakren - * @date 2018/12/20 8:39 PM - */ -public class FaceImageDto implements Serializable { - - - @Expose - private Integer faceId; - - @Expose - private Integer memberId; - - - @Expose - private String faceImage; - - - public Integer getFaceId() { - return faceId; - } - - public void setFaceId(Integer faceId) { - this.faceId = faceId; - } - - public Integer getMemberId() { - return memberId; - } - - public void setMemberId(Integer memberId) { - this.memberId = memberId; - } - - public String getFaceImage() { - return faceImage; - } - - public void setFaceImage(String faceImage) { - this.faceImage = faceImage; - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/FaceRecognizeResponse.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/FaceRecognizeResponse.java deleted file mode 100644 index 658bec8..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/FaceRecognizeResponse.java +++ /dev/null @@ -1,639 +0,0 @@ -package test.netty.nio.net.dto; - -import java.io.Serializable; -import java.util.List; - -public class FaceRecognizeResponse implements Serializable { - - /** - * data : {"status":"recognized","track":6,"timestamp":1533808724,"face":{"image":"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","rect":{"top":918,"right":872,"bottom":990,"left":798}},"person":{"feature_id":0,"confidence":78.397995,"tag":"{\"description\": \"\", \"remark\": \"\", \"subject_type\": 0, \"name\": \"ndy\", \"inviter_id\": null, \"start_time\": 0, \"title\": \"\", \"interviewee\": \"\", \"avatar\": \"/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg\", \"origin_photo_id\": 3, \"birthday\": null, \"id\": 5, \"entry_date\": null, \"department\": \"\", \"interviewee_pinyin\": \"\", \"job_number\": \"\", \"end_time\": 0}","id":"5"},"quality":0.9968518905807287} - * screen : {"camera_address":"rtsp://192.168.1.160:8554/0/0/0","allowed_subject_ids":[],"network_switcher_status":null,"box_token":"95a0f5b6-924d-4323-9296-39d258f2b3f9","description":null,"allow_all_subjects":true,"box_heartbeat":1533806262,"network_switcher":"","camera_name":"","camera_status":0,"allow_visitor":true,"screen_token":"3c566c3f-6d7f-437a-af56-8ba4a7852745","network_switcher_token":null,"box_status":"0","network_switcher_drive":0,"type":1,"id":1,"camera_position":"测试","box_address":"192.168.1.50"} - * person : {"src":"data:image/jpeg;base64,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","remark":"","subject_type":0,"description":"","inviter_id":null,"timestamp":1533808724,"start_time":0,"title":"","interviewee":"","job_number":"","entry_date":null,"origin_photo_id":3,"birthday":null,"avatar":"/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg","department":"","end_time":0,"interviewee_pinyin":"","id":5,"name":"ndy"} - * error : 允许进入 - * open_door : true - * type : recognized - */ - - private DataBean data; - private ScreenBean screen; - private PersonBeanX person; - private String error; - private boolean open_door; - private String type; - - public DataBean getData() { - return data; - } - - public void setData(DataBean data) { - this.data = data; - } - - public ScreenBean getScreen() { - return screen; - } - - public void setScreen(ScreenBean screen) { - this.screen = screen; - } - - public PersonBeanX getPerson() { - return person; - } - - public void setPerson(PersonBeanX person) { - this.person = person; - } - - public String getError() { - return error; - } - - public void setError(String error) { - this.error = error; - } - - public boolean isOpen_door() { - return open_door; - } - - public void setOpen_door(boolean open_door) { - this.open_door = open_door; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public static class DataBean { - /** - * status : recognized - * track : 6 - * timestamp : 1533808724 - * face : {"image":"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","rect":{"top":918,"right":872,"bottom":990,"left":798}} - * person : {"feature_id":0,"confidence":78.397995,"tag":"{\"description\": \"\", \"remark\": \"\", \"subject_type\": 0, \"name\": \"ndy\", \"inviter_id\": null, \"start_time\": 0, \"title\": \"\", \"interviewee\": \"\", \"avatar\": \"/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg\", \"origin_photo_id\": 3, \"birthday\": null, \"id\": 5, \"entry_date\": null, \"department\": \"\", \"interviewee_pinyin\": \"\", \"job_number\": \"\", \"end_time\": 0}","id":"5"} - * quality : 0.9968518905807287 - */ - - private String status; - private int track; - private FaceBean face; - private PersonBean person; - private double quality; - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public int getTrack() { - return track; - } - - public void setTrack(int track) { - this.track = track; - } - - - public FaceBean getFace() { - return face; - } - - public void setFace(FaceBean face) { - this.face = face; - } - - public PersonBean getPerson() { - return person; - } - - public void setPerson(PersonBean person) { - this.person = person; - } - - public double getQuality() { - return quality; - } - - public void setQuality(double quality) { - this.quality = quality; - } - - public static class FaceBean { - /** - * image : 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 - * rect : {"top":918,"right":872,"bottom":990,"left":798} - */ - - private String image; - private RectBean rect; - - public String getImage() { - return image; - } - - public void setImage(String image) { - this.image = image; - } - - public RectBean getRect() { - return rect; - } - - public void setRect(RectBean rect) { - this.rect = rect; - } - - public static class RectBean { - /** - * top : 918 - * right : 872 - * bottom : 990 - * left : 798 - */ - - private int top; - private int right; - private int bottom; - private int left; - - public int getTop() { - return top; - } - - public void setTop(int top) { - this.top = top; - } - - public int getRight() { - return right; - } - - public void setRight(int right) { - this.right = right; - } - - public int getBottom() { - return bottom; - } - - public void setBottom(int bottom) { - this.bottom = bottom; - } - - public int getLeft() { - return left; - } - - public void setLeft(int left) { - this.left = left; - } - } - } - - public static class PersonBean { - /** - * feature_id : 0 - * confidence : 78.397995 - * tag : {"description": "", "remark": "", "subject_type": 0, "name": "ndy", "inviter_id": null, "start_time": 0, "title": "", "interviewee": "", "avatar": "/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg", "origin_photo_id": 3, "birthday": null, "id": 5, "entry_date": null, "department": "", "interviewee_pinyin": "", "job_number": "", "end_time": 0} - * id : 5 - */ - - private int feature_id; - private double confidence; - private String tag; - private String id; - - public int getFeature_id() { - return feature_id; - } - - public void setFeature_id(int feature_id) { - this.feature_id = feature_id; - } - - public double getConfidence() { - return confidence; - } - - public void setConfidence(double confidence) { - this.confidence = confidence; - } - - public String getTag() { - return tag; - } - - public void setTag(String tag) { - this.tag = tag; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - } - } - - public static class ScreenBean { - /** - * camera_address : rtsp://192.168.1.160:8554/0/0/0 - * allowed_subject_ids : [] - * network_switcher_status : null - * box_token : 95a0f5b6-924d-4323-9296-39d258f2b3f9 - * description : null - * allow_all_subjects : true - * box_heartbeat : 1533806262 - * network_switcher : - * camera_name : - * camera_status : 0 - * allow_visitor : true - * screen_token : 3c566c3f-6d7f-437a-af56-8ba4a7852745 - * network_switcher_token : null - * box_status : 0 - * network_switcher_drive : 0 - * type : 1 - * id : 1 - * camera_position : 测试 - * box_address : 192.168.1.50 - */ - - private String camera_address; - private Object network_switcher_status; - private String box_token; - private Object description; - private boolean allow_all_subjects; - private int box_heartbeat; - private String network_switcher; - private String camera_name; - private int camera_status; - private boolean allow_visitor; - private String screen_token; - private Object network_switcher_token; - private String box_status; - private int network_switcher_drive; - private int type; - private int id; - private String camera_position; - private String box_address; - private List allowed_subject_ids; - - public String getCamera_address() { - return camera_address; - } - - public void setCamera_address(String camera_address) { - this.camera_address = camera_address; - } - - public Object getNetwork_switcher_status() { - return network_switcher_status; - } - - public void setNetwork_switcher_status(Object network_switcher_status) { - this.network_switcher_status = network_switcher_status; - } - - public String getBox_token() { - return box_token; - } - - public void setBox_token(String box_token) { - this.box_token = box_token; - } - - public Object getDescription() { - return description; - } - - public void setDescription(Object description) { - this.description = description; - } - - public boolean isAllow_all_subjects() { - return allow_all_subjects; - } - - public void setAllow_all_subjects(boolean allow_all_subjects) { - this.allow_all_subjects = allow_all_subjects; - } - - public int getBox_heartbeat() { - return box_heartbeat; - } - - public void setBox_heartbeat(int box_heartbeat) { - this.box_heartbeat = box_heartbeat; - } - - public String getNetwork_switcher() { - return network_switcher; - } - - public void setNetwork_switcher(String network_switcher) { - this.network_switcher = network_switcher; - } - - public String getCamera_name() { - return camera_name; - } - - public void setCamera_name(String camera_name) { - this.camera_name = camera_name; - } - - public int getCamera_status() { - return camera_status; - } - - public void setCamera_status(int camera_status) { - this.camera_status = camera_status; - } - - public boolean isAllow_visitor() { - return allow_visitor; - } - - public void setAllow_visitor(boolean allow_visitor) { - this.allow_visitor = allow_visitor; - } - - public String getScreen_token() { - return screen_token; - } - - public void setScreen_token(String screen_token) { - this.screen_token = screen_token; - } - - public Object getNetwork_switcher_token() { - return network_switcher_token; - } - - public void setNetwork_switcher_token(Object network_switcher_token) { - this.network_switcher_token = network_switcher_token; - } - - public String getBox_status() { - return box_status; - } - - public void setBox_status(String box_status) { - this.box_status = box_status; - } - - public int getNetwork_switcher_drive() { - return network_switcher_drive; - } - - public void setNetwork_switcher_drive(int network_switcher_drive) { - this.network_switcher_drive = network_switcher_drive; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getCamera_position() { - return camera_position; - } - - public void setCamera_position(String camera_position) { - this.camera_position = camera_position; - } - - public String getBox_address() { - return box_address; - } - - public void setBox_address(String box_address) { - this.box_address = box_address; - } - - public List getAllowed_subject_ids() { - return allowed_subject_ids; - } - - public void setAllowed_subject_ids(List allowed_subject_ids) { - this.allowed_subject_ids = allowed_subject_ids; - } - } - - public static class PersonBeanX { - /** - * src : data:image/jpeg;base64,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 - * remark : - * subject_type : 0 - * description : - * inviter_id : null - * timestamp : 1533808724 - * start_time : 0 - * title : - * interviewee : - * job_number : - * entry_date : null - * origin_photo_id : 3 - * birthday : null - * avatar : /static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg - * department : - * end_time : 0 - * interviewee_pinyin : - * id : 5 - * name : ndy - */ - - private String src; - private String remark; - private int subject_type; - private String description; - private Object inviter_id; - private int timestamp; - private int start_time; - private String title; - private String interviewee; - private String job_number; - private Object entry_date; - private int origin_photo_id; - private Object birthday; - private String avatar; - private String department; - private int end_time; - private String interviewee_pinyin; - private int id; - private String name; - - public String getSrc() { - return src; - } - - public void setSrc(String src) { - this.src = src; - } - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - public int getSubject_type() { - return subject_type; - } - - public void setSubject_type(int subject_type) { - this.subject_type = subject_type; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Object getInviter_id() { - return inviter_id; - } - - public void setInviter_id(Object inviter_id) { - this.inviter_id = inviter_id; - } - - public int getTimestamp() { - return timestamp; - } - - public void setTimestamp(int timestamp) { - this.timestamp = timestamp; - } - - public int getStart_time() { - return start_time; - } - - public void setStart_time(int start_time) { - this.start_time = start_time; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getInterviewee() { - return interviewee; - } - - public void setInterviewee(String interviewee) { - this.interviewee = interviewee; - } - - public String getJob_number() { - return job_number; - } - - public void setJob_number(String job_number) { - this.job_number = job_number; - } - - public Object getEntry_date() { - return entry_date; - } - - public void setEntry_date(Object entry_date) { - this.entry_date = entry_date; - } - - public int getOrigin_photo_id() { - return origin_photo_id; - } - - public void setOrigin_photo_id(int origin_photo_id) { - this.origin_photo_id = origin_photo_id; - } - - public Object getBirthday() { - return birthday; - } - - public void setBirthday(Object birthday) { - this.birthday = birthday; - } - - public String getAvatar() { - return avatar; - } - - public void setAvatar(String avatar) { - this.avatar = avatar; - } - - public String getDepartment() { - return department; - } - - public void setDepartment(String department) { - this.department = department; - } - - public int getEnd_time() { - return end_time; - } - - public void setEnd_time(int end_time) { - this.end_time = end_time; - } - - public String getInterviewee_pinyin() { - return interviewee_pinyin; - } - - public void setInterviewee_pinyin(String interviewee_pinyin) { - this.interviewee_pinyin = interviewee_pinyin; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/HeartBeat.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/HeartBeat.java deleted file mode 100644 index d460272..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/HeartBeat.java +++ /dev/null @@ -1,44 +0,0 @@ -package test.netty.nio.net.dto; - - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; - -/** - * 客户端心跳数据包 - * HeartBeat.java - * - * @author peakren - * @date 07/12/2017 10:23 PM - */ -public class HeartBeat implements Serializable { - - @Expose - private String versionCode; //客户端版本号 - - @Expose - private String apkUrl; //升级的软件下载地址 - - - public String getVersionCode() { - return versionCode; - } - - /** - * 客户端版本号 - * - * @param versionCode - */ - public void setVersionCode(String versionCode) { - this.versionCode = versionCode; - } - - public String getApkUrl() { - return apkUrl; - } - - public void setApkUrl(String apkUrl) { - this.apkUrl = apkUrl; - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/JsonMapper.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/JsonMapper.java deleted file mode 100644 index 4761ddb..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/JsonMapper.java +++ /dev/null @@ -1,62 +0,0 @@ -package test.netty.nio.net.dto; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; - -import java.lang.reflect.Type; -import java.util.List; - -/** - * Created by ranfi on 12/9/14. - */ -public class JsonMapper { - - private final static Gson gson; - - static { - GsonBuilder builder = new GsonBuilder(); - builder.setDateFormat("yyyy-MM-dd HH:mm:ss"); - builder.excludeFieldsWithoutExposeAnnotation(); - gson = builder.create(); - } - - private JsonMapper() { - - } - - /** - * Object可以是POJO,也可以是Collection或数组。 如果对象为Null, 返回"null". 如果集合为空集合, 返回"[]". - * - * @param obj - * @return - */ - public static String toJson(Object obj) { - return gson.toJson(obj); - } - - - public static String toJson(Object obj, Type type) { - return gson.toJson(obj, type); - } - - /** - * 反序列化POJO或简单Collection如List. - *

- * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合. - *

- * 如需反序列化复杂Collection如List, 请使用fromJson(String, JavaType) - */ - public static T fromJson(String jsonValue, Class clazz) { - return gson.fromJson(jsonValue, clazz); - } - - public static T fromJson(String jsonValue, Type type) { - return gson.fromJson(jsonValue, type); - } - - public static List fromJson(String jsonValue) { - return gson.fromJson(jsonValue, new TypeToken>() { - }.getType()); - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/MemberDto.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/MemberDto.java deleted file mode 100644 index 97044af..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/MemberDto.java +++ /dev/null @@ -1,148 +0,0 @@ -package test.netty.nio.net.dto; - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; -import java.math.BigDecimal; - - -/** - * 会员基本信息 - * MemberDto.java - * - * @author peakren - * @date 2018/12/20 8:39 PM - */ -public class MemberDto implements Serializable { - - /** - * 头像 - */ - @Expose - private String avatar; - - /** - * 姓名 - */ - @Expose - private String name; - - /** - * 手机号码 - */ - @Expose - private String mobile; - - /** - * 余额 - */ - @Expose - private BigDecimal amount; - - /** - * 场地名称 - */ - @Expose - private String placeName; - - /** - * 会员卡名称 - */ - @Expose - private String cardName; - - @Expose - private String message; - - /** - * 1成功进场 0不允许进场 - */ - @Expose - private int code; - - @Expose - private BigDecimal placePrice; - - @Expose - private boolean first; - - public BigDecimal getPlacePrice() { - return placePrice; - } - - public void setPlacePrice(BigDecimal placePrice) { - this.placePrice = placePrice; - } - - public boolean isFirst() { - return first; - } - - public void setFirst(boolean first) { - this.first = first; - } - - public String getAvatar() { - return avatar; - } - - public void setAvatar(String avatar) { - this.avatar = avatar; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public BigDecimal getAmount() { - return amount; - } - - public void setAmount(BigDecimal amount) { - this.amount = amount; - } - - public String getPlaceName() { - return placeName; - } - - public void setPlaceName(String placeName) { - this.placeName = placeName; - } - - public String getCardName() { - return cardName; - } - - public void setCardName(String cardName) { - this.cardName = cardName; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } -} diff --git a/netty-client/src/main/test/java/test/netty/nio/net/dto/Message.java b/netty-client/src/main/test/java/test/netty/nio/net/dto/Message.java deleted file mode 100644 index 351ffaf..0000000 --- a/netty-client/src/main/test/java/test/netty/nio/net/dto/Message.java +++ /dev/null @@ -1,68 +0,0 @@ -package test.netty.nio.net.dto; - -import com.google.gson.annotations.Expose; - -/** - *

上位机与通讯服务器的数据协议格式
- * - * @author peakren - * @date 07/12/2017 9:57 PM - */ -public class Message extends BaseDto { - - private static final long serialVersionUID = -7944124768291562453L; - - /** - * 消息内容 - */ - @Expose - private MemberDto result; - - - @Expose - private FaceImageDto faceImage; - - /** - * 机器识别返回字符串 - */ - @Expose - private String content; - - - public int getDoor() { - return door; - } - - public void setDoor(int door) { - this.door = door; - } - - @Expose - private int door; - - - public MemberDto getResult() { - return result; - } - - public void setResult(MemberDto result) { - this.result = result; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public FaceImageDto getFaceImage() { - return faceImage; - } - - public void setFaceImage(FaceImageDto faceImage) { - this.faceImage = faceImage; - } - -} diff --git a/pom.xml b/pom.xml index b25d5ac..1ded398 100644 --- a/pom.xml +++ b/pom.xml @@ -26,15 +26,21 @@ ${smartvenue.version} - smartvenue - sv-api + smartvenue + sv-api ${smartvenue.version} - smartvenue - netty-client + smartvenue + netty-client ${smartvenue.version} + + smartvenue + netty-model + ${smartvenue.version} + + smartvenue sv-oms @@ -98,6 +104,7 @@ oms service netty-client + netty-model diff --git a/service/src/main/java/com/sv/mapper/DeviceMapper.java b/service/src/main/java/com/sv/mapper/DeviceMapper.java index 6d725fb..587c8bf 100644 --- a/service/src/main/java/com/sv/mapper/DeviceMapper.java +++ b/service/src/main/java/com/sv/mapper/DeviceMapper.java @@ -1,6 +1,5 @@ package com.sv.mapper; import com.common.DeviceDTO; -import com.enums.DeviceType; import com.sv.entity.Device; import org.apache.ibatis.annotations.Param; @@ -67,34 +66,33 @@ public interface DeviceMapper { /** * 更新设备状态为 0 - 未连接 */ - void offline(@Param("venueId") Integer venueId,@Param("deviceName") String deviceName,@Param("deviceType")DeviceType deviceType); + void offline(@Param("venueId") Integer venueId,@Param("deviceName") String deviceName); /** * 更新设备状态为 2 - 连接成功 */ - void online(@Param("venueId") Integer venueId, @Param("deviceName") String deviceName, @Param("deviceType")DeviceType deviceType); + void online(@Param("venueId") Integer venueId, @Param("deviceName") String deviceName); - Integer checkDevice(@Param("deviceName") String deviceName,@Param("venueId") Integer venueId, @Param("deviceType") DeviceType deviceType); + Integer checkDevice(@Param("deviceName") String deviceName,@Param("venueId") Integer venueId); /** * 根据记录找设备 * @param deviceName * @param venueId - * @param deviceType * @return */ - Device findByDevice(@Param("deviceName") String deviceName,@Param("venueId") Integer venueId,@Param("deviceType") DeviceType deviceType); + Device findByDevice(@Param("deviceName") String deviceName,@Param("venueId") Integer venueId); /** * 设备绑定正在扫码的用户 */ - void bindMember(@Param("bindMember") Integer bindMember,@Param("venueId") Integer venueId,@Param("deviceName") String deviceName,@Param("deviceType")DeviceType deviceType); + void bindMember(@Param("bindMember") Integer bindMember,@Param("venueId") Integer venueId,@Param("deviceName") String deviceName); /** * 更新设备状态为 2 - 连接成功 */ - void unBindMember(@Param("venueId") Integer venueId, @Param("deviceName") String deviceName, @Param("deviceType")DeviceType deviceType); + void unBindMember(@Param("venueId") Integer venueId, @Param("deviceName") String deviceName); -} \ No newline at end of file +} diff --git a/service/src/main/java/com/sv/service/api/QRCodeService.java b/service/src/main/java/com/sv/service/api/QRCodeService.java index 60c319f..c623114 100644 --- a/service/src/main/java/com/sv/service/api/QRCodeService.java +++ b/service/src/main/java/com/sv/service/api/QRCodeService.java @@ -1,12 +1,10 @@ package com.sv.service.api; -import com.enums.DeviceType; import com.enums.VenueTypeEnum; import com.sv.entity.Device; import com.sv.entity.Venue; import com.sv.mapper.DeviceMapper; import com.sv.mapper.VenueMapper; -import com.sv.service.api.util.DateUtilCard; import com.ydd.framework.core.exception.ServiceException; import org.apache.commons.lang.time.DateUtils; import org.slf4j.Logger; @@ -20,22 +18,22 @@ import java.util.Date; /** * 小程序扫二维码处理 */ -//@Service("qrCodeService") -//@Transactional(readOnly = true) +@Service("qrCodeService") +@Transactional(readOnly = true) public class QRCodeService { private final Logger logger = LoggerFactory.getLogger(ProtocolService.class); -// @Resource + @Resource private VenueMapper venueMapper; -// @Resource + @Resource private DeviceMapper deviceMapper; - public Venue initEnter(Integer venueId,String deviceName,DeviceType deviceType,Integer memberId) throws ServiceException{ - Integer integer = deviceMapper.checkDevice(deviceName, venueId,deviceType); + public Venue initEnter(Integer venueId,String deviceName,Integer memberId) throws ServiceException{ + Integer integer = deviceMapper.checkDevice(deviceName, venueId); if (integer != 1){ throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.DEVICE_ERROR); } - Device device = deviceMapper.findByDevice(deviceName, venueId, deviceType); + Device device = deviceMapper.findByDevice(deviceName, venueId); if (device == null){ throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.DEVICE_ERROR); }else { @@ -64,13 +62,13 @@ public class QRCodeService { } @Transactional - public void bindMember(Integer venueId,String deviceName,DeviceType deviceType,Integer memberId){ - deviceMapper.bindMember(memberId, venueId, deviceName, deviceType); + public void bindMember(Integer venueId,String deviceName,Integer memberId){ + deviceMapper.bindMember(memberId, venueId, deviceName); } @Transactional - public void unBindMember(Integer venueId,String deviceName,DeviceType deviceType){ - deviceMapper.unBindMember(venueId, deviceName, deviceType); + public void unBindMember(Integer venueId,String deviceName){ + deviceMapper.unBindMember(venueId, deviceName); } } diff --git a/service/src/main/java/com/sv/service/api/VenueService.java b/service/src/main/java/com/sv/service/api/VenueService.java index 1ae72f3..88bfff6 100644 --- a/service/src/main/java/com/sv/service/api/VenueService.java +++ b/service/src/main/java/com/sv/service/api/VenueService.java @@ -409,7 +409,7 @@ public class VenueService extends BaseServiceImpl { @Transactional public synchronized boolean qrCodeEnterVenue(Integer memberId, String deviceName,Integer venueId,Venue venue) { synchronized (("enter" + memberId).intern()) { - Device device = deviceService.findByDevice(deviceName,venueId, DeviceType.ENTER); + Device device = deviceService.findByDevice(deviceName,venueId); // 查询当前时间内,场馆对应的价格(健身房没有价格) if (venue.getStatus().intValue() == 1) { logger.info(venue.getName() + "被禁用,入场失败"); diff --git a/service/src/main/java/com/sv/service/oms/DeviceService.java b/service/src/main/java/com/sv/service/oms/DeviceService.java index ac958f1..abd2fcf 100644 --- a/service/src/main/java/com/sv/service/oms/DeviceService.java +++ b/service/src/main/java/com/sv/service/oms/DeviceService.java @@ -2,7 +2,6 @@ package com.sv.service.oms; import com.common.DeviceDTO; import com.enums.DeviceStatusEnum; -import com.enums.DeviceType; import com.github.pagehelper.PageHelper; import com.sv.entity.Device; import com.sv.exception.oms.OmsException; @@ -48,7 +47,7 @@ public class DeviceService extends BaseServiceImpl { * * @param device 门禁设备 */ - + @Transactional public void save(Device device) { if(deviceMapper.countByStream(device.getStream(),device.getId()) > 0){ @@ -68,7 +67,7 @@ public class DeviceService extends BaseServiceImpl { * * @param device 门禁设备 */ - + @Transactional public void update(Device device) { deviceMapper.update(device); @@ -80,7 +79,7 @@ public class DeviceService extends BaseServiceImpl { * @param id 编号 * @return 删除数量 */ - + @Transactional public Integer delete(Integer id) { if (id == null || id <= 0) { @@ -95,7 +94,7 @@ public class DeviceService extends BaseServiceImpl { * @param ids 编号数组 * @return 删除数量 */ - + @Transactional public Integer deleteByIds(Integer[] ids) { if (ids == null || ids.length == 0) { @@ -120,7 +119,7 @@ public class DeviceService extends BaseServiceImpl { * @param pagination 分页信息 * @return 分页结果 */ - + public Pagination findPage(Pagination pagination) { PageHelper.startPage(pagination.getPage(), pagination.getPageSize()); pagination.setQueryResult(deviceMapper.findAllDTO()); @@ -135,25 +134,24 @@ public class DeviceService extends BaseServiceImpl { * 设备连接断开 */ @Transactional - public void offline(String deviceName, Integer venueId,DeviceType deviceType){ - deviceMapper.offline(venueId,deviceName,deviceType); + public void offline(String deviceName, Integer venueId){ + deviceMapper.offline(venueId,deviceName); } /** * 新的设备注册的逻辑 */ @Transactional - public void online(String deviceName,Integer venueId,DeviceType deviceType,Integer venueType,String deviceIp){ + public void online(String deviceName,Integer venueId,Integer venueType,String deviceIp){ Device device = new Device(); device.setVenueId(venueId); device.setVenueType(venueType); device.setName(deviceName); device.setStatus(DeviceStatusEnum.ONLINE.value); device.setStream(deviceIp); - device.setDeviceType(deviceType); - if(deviceMapper.checkDevice(deviceName,venueId,deviceType) > 0){ + if(deviceMapper.checkDevice(deviceName,venueId) > 0){ logger.info(deviceName + venueId + "设备已存在"); - deviceMapper.online(venueId, deviceName,deviceType); + deviceMapper.online(venueId, deviceName); }else { logger.info("落地客户端信息clientId = " + deviceIp + "&deviceName = " + deviceName + "&venueId = " + venueId); deviceMapper.insert(device); @@ -192,8 +190,8 @@ public class DeviceService extends BaseServiceImpl { /** * find by DeviceName */ - public Device findByDevice(String deviceName, Integer venueId, DeviceType deviceType){ - return deviceMapper.findByDevice(deviceName,venueId,deviceType); + public Device findByDevice(String deviceName, Integer venueId){ + return deviceMapper.findByDevice(deviceName,venueId); } }