|
@@ -36,235 +36,237 @@ import java.util.Date;
|
|
|
@Scope("prototype")
|
|
|
public class GK309GpsServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
|
|
|
- /**
|
|
|
- * 协议信息数据
|
|
|
- * [ 起始位|包长度|协议号|信息内容|信息序列号|错误校验|停止位 ]
|
|
|
- */
|
|
|
- private static final Logger logger = LoggerFactory.getLogger(GK309GpsServerHandler.class);
|
|
|
+ /**
|
|
|
+ * 协议信息数据
|
|
|
+ * [ 起始位|包长度|协议号|信息内容|信息序列号|错误校验|停止位 ]
|
|
|
+ */
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(GK309GpsServerHandler.class);
|
|
|
|
|
|
- // 起始位
|
|
|
- private static final Integer START_BITS = 2;// 起始位长度
|
|
|
- private static final Byte START_BIT = 0x78; //单字节长度数据包
|
|
|
- private static final Byte START_BIT2 = 0X79;// 双字节长度数据包
|
|
|
+ // 起始位
|
|
|
+ private static final Integer START_BITS = 2;// 起始位长度
|
|
|
+ private static final Byte START_BIT = 0x78; //单字节长度数据包
|
|
|
+ private static final Byte START_BIT2 = 0X79;// 双字节长度数据包
|
|
|
|
|
|
// private static final int START_BIT = 120; //单字节长度数据包
|
|
|
// private static final int START_BIT2 = 121;// 双字节长度数据包
|
|
|
|
|
|
- // 协议号
|
|
|
- private static final byte LOGIN_MSG = 0x01;// 登录 (必须回复)
|
|
|
- private static final byte STATUS_MSG = 0x13;// 心跳,状态信息包 (必须回复)
|
|
|
- private static final byte LOCATION_MSG = 0x10;// 一般GPS 位置信息上传
|
|
|
- private static final byte CORRECT_TIME_MSG = 0x1F;// 校验时间
|
|
|
+ // 协议号
|
|
|
+ private static final byte LOGIN_MSG = 0x01;// 登录 (必须回复)
|
|
|
+ private static final byte STATUS_MSG = 0x13;// 心跳,状态信息包 (必须回复)
|
|
|
+ private static final byte LOCATION_MSG = 0x10;// 一般GPS 位置信息上传
|
|
|
+ private static final byte CORRECT_TIME_MSG = 0x1F;// 校验时间
|
|
|
|
|
|
- private static final Integer DATA_SIZE = 6;
|
|
|
+ private static final Integer DATA_SIZE = 6;
|
|
|
|
|
|
- @Override
|
|
|
- protected void handle(ByteBuf in, Channel channel) throws Exception {
|
|
|
- if (in.isReadable()) {
|
|
|
- in.markReaderIndex();
|
|
|
- try {
|
|
|
- byte b = 0;
|
|
|
- int index = 0;
|
|
|
- while (index < START_BITS) {
|
|
|
- b = in.readByte();
|
|
|
- if (START_BIT2 != b && START_BIT != b) {
|
|
|
- channel.close();
|
|
|
- }
|
|
|
- index++;
|
|
|
- }
|
|
|
- /* 单字节长度或者双字节长度 */
|
|
|
- int length = 0;
|
|
|
- if (START_BIT == b) {
|
|
|
- length = in.readByte() & 0xff; // 一个字节
|
|
|
- } else {
|
|
|
- length = in.readShort() & 0xffff;// 两个字节
|
|
|
- }
|
|
|
- handle(in, length, channel);
|
|
|
- } catch (Exception e) {
|
|
|
- logger.error(e.getMessage(), e);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ protected void handle(ByteBuf in, Channel channel) throws Exception {
|
|
|
+ if (in.isReadable()) {
|
|
|
+ in.markReaderIndex();
|
|
|
+ try {
|
|
|
+ byte b = 0;
|
|
|
+ int index = 0;
|
|
|
+ while (index < START_BITS) {
|
|
|
+ b = in.readByte();
|
|
|
+ if (START_BIT2 != b && START_BIT != b) {
|
|
|
+ channel.close();
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ /* 单字节长度或者双字节长度 */
|
|
|
+ int length = 0;
|
|
|
+ if (START_BIT == b) {
|
|
|
+ length = in.readByte() & 0xff; // 一个字节
|
|
|
+ } else {
|
|
|
+ length = in.readShort() & 0xffff;// 两个字节
|
|
|
+ }
|
|
|
+ handle(in, length, channel);
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
+ } finally {
|
|
|
+ in.release();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- private void handle(ByteBuf in, int length, Channel channel) throws Exception {
|
|
|
- if (in.isReadable()) {
|
|
|
- byte msgType = in.readByte();// 协议号 1个字节
|
|
|
- String deviceId = channelDeviceMap.get(channel);
|
|
|
- if (deviceId != null) {
|
|
|
- MDC.put(MDC_DEVICEID, deviceId);
|
|
|
- } else {
|
|
|
- if (LOGIN_MSG != msgType) {
|
|
|
- channel.close();
|
|
|
- }
|
|
|
- }
|
|
|
- if (LOGIN_MSG == msgType) {
|
|
|
- resolveLoginMSG(in, channel);
|
|
|
- } else if (STATUS_MSG == msgType) {
|
|
|
- reply(channel, STATUS_MSG, "心跳包");
|
|
|
- byte[] bytes = byteMerger(getOriginalData(in, deviceId), DateUtil.formatDate2String(new Date()).getBytes());
|
|
|
- sendMsg2Kafka(bytes, deviceId, channel);// 心跳数据对接
|
|
|
- } else if (LOCATION_MSG == msgType) {
|
|
|
- logger.info("GPS 定位包");
|
|
|
- // resolveLocationMSG(in,deviceId);
|
|
|
- byte[] bytes = byteMerger(getOriginalData(in, deviceId), DateUtil.formatDate2String(new Date()).getBytes());
|
|
|
- sendMsg2Kafka(bytes, deviceId, channel);
|
|
|
- } else if (CORRECT_TIME_MSG == msgType) {
|
|
|
- reply(channel, CORRECT_TIME_MSG, "校时包");
|
|
|
- } else {
|
|
|
- logger.info("client send data without handle type ...");
|
|
|
- }
|
|
|
- }
|
|
|
+ private void handle(ByteBuf in, int length, Channel channel) throws Exception {
|
|
|
+ if (in.isReadable()) {
|
|
|
+ byte msgType = in.readByte();// 协议号 1个字节
|
|
|
+ String deviceId = channelDeviceMap.get(channel);
|
|
|
+ if (deviceId != null) {
|
|
|
+ MDC.put(MDC_DEVICEID, deviceId);
|
|
|
+ } else {
|
|
|
+ if (LOGIN_MSG != msgType) {
|
|
|
+ channel.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (LOGIN_MSG == msgType) {
|
|
|
+ resolveLoginMSG(in, channel);
|
|
|
+ } else if (STATUS_MSG == msgType) {
|
|
|
+ reply(channel, STATUS_MSG, "心跳包");
|
|
|
+ byte[] bytes = byteMerger(getOriginalData(in, deviceId), DateUtil.formatDate2String(new Date()).getBytes());
|
|
|
+ sendMsg2Kafka(bytes, deviceId, channel);// 心跳数据对接
|
|
|
+ } else if (LOCATION_MSG == msgType) {
|
|
|
+ logger.info("GPS 定位包");
|
|
|
+ // resolveLocationMSG(in,deviceId);
|
|
|
+ byte[] bytes = byteMerger(getOriginalData(in, deviceId), DateUtil.formatDate2String(new Date()).getBytes());
|
|
|
+ sendMsg2Kafka(bytes, deviceId, channel);
|
|
|
+ } else if (CORRECT_TIME_MSG == msgType) {
|
|
|
+ reply(channel, CORRECT_TIME_MSG, "校时包");
|
|
|
+ } else {
|
|
|
+ logger.info("client send data without handle type ...");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- /**
|
|
|
- * 登录管理
|
|
|
- *
|
|
|
- * @param in
|
|
|
- * @param channel
|
|
|
- */
|
|
|
- private void resolveLoginMSG(ByteBuf in, Channel channel) {
|
|
|
- /** 终端ID|类型识别码|扩展位*/
|
|
|
- byte[] deviceIdBytes = new byte[8];// 终端ID [8位]
|
|
|
- in.readBytes(deviceIdBytes);
|
|
|
- String deviceId = DatatypeConverter.printHexBinary(deviceIdBytes);
|
|
|
- String deviceIdInMap = channelDeviceMap.get(channel);
|
|
|
- MDC.put(MDC_DEVICEID, deviceId);
|
|
|
- if (!deviceId.equals(deviceIdInMap)) {
|
|
|
- manageChannel(channel, deviceId);
|
|
|
- }
|
|
|
- reply(channel, LOGIN_MSG, "登录包");
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 登录管理
|
|
|
+ *
|
|
|
+ * @param in
|
|
|
+ * @param channel
|
|
|
+ */
|
|
|
+ private void resolveLoginMSG(ByteBuf in, Channel channel) {
|
|
|
+ /** 终端ID|类型识别码|扩展位*/
|
|
|
+ byte[] deviceIdBytes = new byte[8];// 终端ID [8位]
|
|
|
+ in.readBytes(deviceIdBytes);
|
|
|
+ String deviceId = DatatypeConverter.printHexBinary(deviceIdBytes);
|
|
|
+ String deviceIdInMap = channelDeviceMap.get(channel);
|
|
|
+ MDC.put(MDC_DEVICEID, deviceId);
|
|
|
+ if (!deviceId.equals(deviceIdInMap)) {
|
|
|
+ manageChannel(channel, deviceId);
|
|
|
+ }
|
|
|
+ reply(channel, LOGIN_MSG, "登录包");
|
|
|
+ }
|
|
|
|
|
|
- public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
|
|
|
- byte[] byte_3 = new byte[byte_1.length + byte_2.length];
|
|
|
- System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
|
|
|
- System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
|
|
|
- return byte_3;
|
|
|
- }
|
|
|
+ public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
|
|
|
+ byte[] byte_3 = new byte[byte_1.length + byte_2.length];
|
|
|
+ System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
|
|
|
+ System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
|
|
|
+ return byte_3;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- /**
|
|
|
- * 回复包
|
|
|
- *
|
|
|
- * @param channel
|
|
|
- * @param msgType
|
|
|
- */
|
|
|
- private void reply(Channel channel, byte msgType, String msg) {
|
|
|
+ /**
|
|
|
+ * 回复包
|
|
|
+ *
|
|
|
+ * @param channel
|
|
|
+ * @param msgType
|
|
|
+ */
|
|
|
+ private void reply(Channel channel, byte msgType, String msg) {
|
|
|
|
|
|
- /**
|
|
|
- * 起始位[]长度[] 协议号[] 序列号[]CRC校验[]停止位[2]
|
|
|
- */
|
|
|
- ByteBuf buffer = Unpooled.buffer();
|
|
|
- byte[] crcBytes = new byte[]{0x05, msgType, 0x00, 0x05}; // CRC校验数据
|
|
|
- int doCrc = CRCUtil.do_crc(65535, crcBytes);//CRC-ITU
|
|
|
- byte[] intToByte = NumUtil.intToByte(doCrc, 2);
|
|
|
- byte[] bytes = new byte[]{0x78, 0x78, 0x05, msgType, 0x00, 0x05, intToByte[0], intToByte[1], 0x0D, 0x0A};
|
|
|
- buffer.writeBytes(bytes);
|
|
|
- ChannelFuture channelFuture = channel.write(buffer);
|
|
|
- channelFuture.addListener(future -> {
|
|
|
- String deviceId = channelDeviceMap.get(channel);
|
|
|
- logger.info("server reply [{}] to client device [{}] success:[{}] ", msg, deviceId, DatatypeConverter.printHexBinary(bytes));
|
|
|
- });
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 起始位[]长度[] 协议号[] 序列号[]CRC校验[]停止位[2]
|
|
|
+ */
|
|
|
+ ByteBuf buffer = Unpooled.buffer();
|
|
|
+ byte[] crcBytes = new byte[]{0x05, msgType, 0x00, 0x05}; // CRC校验数据
|
|
|
+ int doCrc = CRCUtil.do_crc(65535, crcBytes);//CRC-ITU
|
|
|
+ byte[] intToByte = NumUtil.intToByte(doCrc, 2);
|
|
|
+ byte[] bytes = new byte[]{0x78, 0x78, 0x05, msgType, 0x00, 0x05, intToByte[0], intToByte[1], 0x0D, 0x0A};
|
|
|
+ buffer.writeBytes(bytes);
|
|
|
+ ChannelFuture channelFuture = channel.write(buffer);
|
|
|
+ channelFuture.addListener(future -> {
|
|
|
+ String deviceId = channelDeviceMap.get(channel);
|
|
|
+ logger.info("server reply [{}] to client device [{}] success:[{}] ", msg, deviceId, DatatypeConverter.printHexBinary(bytes));
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- /**
|
|
|
- * 原始数据重新组装
|
|
|
- *
|
|
|
- * @param in
|
|
|
- * @param deviceId
|
|
|
- * @return
|
|
|
- */
|
|
|
- private byte[] getOriginalData(ByteBuf in, String deviceId) {
|
|
|
- if (StringUtils.isNotBlank(deviceId)) {
|
|
|
- in.resetReaderIndex();
|
|
|
- byte[] deviceArr = deviceId.getBytes();
|
|
|
- int length = in.readableBytes();
|
|
|
- byte[] dataByteArray = new byte[length + deviceArr.length];
|
|
|
- in.readBytes(dataByteArray, 0, in.readableBytes());
|
|
|
- System.arraycopy(deviceArr, 0, dataByteArray, length, deviceArr.length);
|
|
|
- return dataByteArray;
|
|
|
- } else
|
|
|
- return null;
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 原始数据重新组装
|
|
|
+ *
|
|
|
+ * @param in
|
|
|
+ * @param deviceId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private byte[] getOriginalData(ByteBuf in, String deviceId) {
|
|
|
+ if (StringUtils.isNotBlank(deviceId)) {
|
|
|
+ in.resetReaderIndex();
|
|
|
+ byte[] deviceArr = deviceId.getBytes();
|
|
|
+ int length = in.readableBytes();
|
|
|
+ byte[] dataByteArray = new byte[length + deviceArr.length];
|
|
|
+ in.readBytes(dataByteArray, 0, in.readableBytes());
|
|
|
+ System.arraycopy(deviceArr, 0, dataByteArray, length, deviceArr.length);
|
|
|
+ return dataByteArray;
|
|
|
+ } else
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
- private void resolveLocationMSG(ByteBuf in, String deviceId) throws Exception {
|
|
|
- YiTongGPSDevice yiTongGPSDevice = new YiTongGPSDevice();
|
|
|
- StringBuffer dateTimeStrBuf = new StringBuffer();
|
|
|
- int indexOfDateTime = 0;
|
|
|
- while (indexOfDateTime < DATA_SIZE) {
|
|
|
- byte b = in.readByte();
|
|
|
- dateTimeStrBuf.append(NumUtil.byte2String(b));
|
|
|
- indexOfDateTime++;
|
|
|
- }
|
|
|
- // 日期
|
|
|
- yiTongGPSDevice.setDate(dateTimeStrBuf.toString());
|
|
|
- // gps信息卫星数
|
|
|
- yiTongGPSDevice.setGpsCount(in.readByte());
|
|
|
- // 维度
|
|
|
- yiTongGPSDevice.setLat(in.readInt());
|
|
|
- // 经度
|
|
|
- yiTongGPSDevice.setLng(in.readInt());
|
|
|
- // 速度
|
|
|
- yiTongGPSDevice.setSpeedbyte(in.readByte());
|
|
|
- // 航向
|
|
|
- yiTongGPSDevice.setCourseStatus(in.readShort());
|
|
|
- // 国家代号
|
|
|
- yiTongGPSDevice.setMcc(in.readShort());
|
|
|
- // 移动网号码
|
|
|
- yiTongGPSDevice.setMnc(in.readByte());
|
|
|
- // 位置区码
|
|
|
- yiTongGPSDevice.setLac(in.readShort());
|
|
|
- // 移动基站Cell Tower ID
|
|
|
- yiTongGPSDevice.setCellId(in.readMedium());
|
|
|
- yiTongGPSDevice.setAcc(in.readByte());
|
|
|
- // 数据上报模式 0x00:定时上报,0x01:定距上报,0x02:拐点上传,0x03:ACC状态改变上传,0X08:开机上报位置信息
|
|
|
- yiTongGPSDevice.setReportModel(in.readByte());
|
|
|
- // 0x01:实时 0x00:补传
|
|
|
- yiTongGPSDevice.setIsmendMsg(in.readByte());
|
|
|
- double mileage = NumUtil.toFixed2Place((double) in.readInt() / 1000);
|
|
|
- // 里程设备默认是关闭的,需要指令,设备端才发送
|
|
|
- yiTongGPSDevice.setDeviceId(deviceId);
|
|
|
- yiTongGPSDevice.setMileage(mileage);
|
|
|
- yiTongGPSDevice.setDataType(1);
|
|
|
- // 写文件操作
|
|
|
- String deviceStr = YiTongGPSDevice.buildDeviceStr(yiTongGPSDevice);
|
|
|
- FileUtils.dataStorage(deviceStr.getBytes(), dataPath, prefixName);
|
|
|
- }
|
|
|
+ private void resolveLocationMSG(ByteBuf in, String deviceId) throws Exception {
|
|
|
+ YiTongGPSDevice yiTongGPSDevice = new YiTongGPSDevice();
|
|
|
+ StringBuffer dateTimeStrBuf = new StringBuffer();
|
|
|
+ int indexOfDateTime = 0;
|
|
|
+ while (indexOfDateTime < DATA_SIZE) {
|
|
|
+ byte b = in.readByte();
|
|
|
+ dateTimeStrBuf.append(NumUtil.byte2String(b));
|
|
|
+ indexOfDateTime++;
|
|
|
+ }
|
|
|
+ // 日期
|
|
|
+ yiTongGPSDevice.setDate(dateTimeStrBuf.toString());
|
|
|
+ // gps信息卫星数
|
|
|
+ yiTongGPSDevice.setGpsCount(in.readByte());
|
|
|
+ // 维度
|
|
|
+ yiTongGPSDevice.setLat(in.readInt());
|
|
|
+ // 经度
|
|
|
+ yiTongGPSDevice.setLng(in.readInt());
|
|
|
+ // 速度
|
|
|
+ yiTongGPSDevice.setSpeedbyte(in.readByte());
|
|
|
+ // 航向
|
|
|
+ yiTongGPSDevice.setCourseStatus(in.readShort());
|
|
|
+ // 国家代号
|
|
|
+ yiTongGPSDevice.setMcc(in.readShort());
|
|
|
+ // 移动网号码
|
|
|
+ yiTongGPSDevice.setMnc(in.readByte());
|
|
|
+ // 位置区码
|
|
|
+ yiTongGPSDevice.setLac(in.readShort());
|
|
|
+ // 移动基站Cell Tower ID
|
|
|
+ yiTongGPSDevice.setCellId(in.readMedium());
|
|
|
+ yiTongGPSDevice.setAcc(in.readByte());
|
|
|
+ // 数据上报模式 0x00:定时上报,0x01:定距上报,0x02:拐点上传,0x03:ACC状态改变上传,0X08:开机上报位置信息
|
|
|
+ yiTongGPSDevice.setReportModel(in.readByte());
|
|
|
+ // 0x01:实时 0x00:补传
|
|
|
+ yiTongGPSDevice.setIsmendMsg(in.readByte());
|
|
|
+ double mileage = NumUtil.toFixed2Place((double) in.readInt() / 1000);
|
|
|
+ // 里程设备默认是关闭的,需要指令,设备端才发送
|
|
|
+ yiTongGPSDevice.setDeviceId(deviceId);
|
|
|
+ yiTongGPSDevice.setMileage(mileage);
|
|
|
+ yiTongGPSDevice.setDataType(1);
|
|
|
+ // 写文件操作
|
|
|
+ String deviceStr = YiTongGPSDevice.buildDeviceStr(yiTongGPSDevice);
|
|
|
+ FileUtils.dataStorage(deviceStr.getBytes(), dataPath, prefixName);
|
|
|
+ }
|
|
|
|
|
|
- /**
|
|
|
- * 按照开始,结束标记位读取数据
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void startAcceptor() {
|
|
|
- EventLoopGroup bossGroup = new NioEventLoopGroup();
|
|
|
- EventLoopGroup workerGroup = new NioEventLoopGroup();
|
|
|
- byte[] tailSplitBytes = new byte[]{0x0D, 0x0A};
|
|
|
- byte[] headerSplitBytes = new byte[]{0x78, 0x78};
|
|
|
- byte[] headerSplitBytes1 = new byte[]{0x79, 0x79};
|
|
|
- try {
|
|
|
- ServerBootstrap b = new ServerBootstrap();
|
|
|
- b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
|
|
|
- .childHandler(new ChannelInitializer<SocketChannel>() {
|
|
|
- @Override
|
|
|
- protected void initChannel(SocketChannel ch) throws Exception {
|
|
|
- ch.pipeline().addLast(new HeaderTailDelimiterFrameDecoder(65535, false,
|
|
|
- Unpooled.copiedBuffer(tailSplitBytes), Unpooled.copiedBuffer(headerSplitBytes),
|
|
|
- Unpooled.copiedBuffer(headerSplitBytes1)));
|
|
|
- ch.pipeline().addLast(GK309GpsServerHandler.this);
|
|
|
- }
|
|
|
- }).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);
|
|
|
- ChannelFuture f = b.bind(port).sync();
|
|
|
- f.channel().closeFuture().sync();
|
|
|
- logger.info("start accept service for {}, bind address {}:{}", this.getPrefixName(), this.getIp(),
|
|
|
- this.getPort());
|
|
|
- } catch (InterruptedException e) {
|
|
|
- logger.error(e.getMessage());
|
|
|
- } finally {
|
|
|
- cleanRedisLinkData();
|
|
|
- workerGroup.shutdownGracefully();
|
|
|
- bossGroup.shutdownGracefully();
|
|
|
- }
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 按照开始,结束标记位读取数据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void startAcceptor() {
|
|
|
+ EventLoopGroup bossGroup = new NioEventLoopGroup();
|
|
|
+ EventLoopGroup workerGroup = new NioEventLoopGroup();
|
|
|
+ byte[] tailSplitBytes = new byte[]{0x0D, 0x0A};
|
|
|
+ byte[] headerSplitBytes = new byte[]{0x78, 0x78};
|
|
|
+ byte[] headerSplitBytes1 = new byte[]{0x79, 0x79};
|
|
|
+ try {
|
|
|
+ ServerBootstrap b = new ServerBootstrap();
|
|
|
+ b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
|
|
|
+ .childHandler(new ChannelInitializer<SocketChannel>() {
|
|
|
+ @Override
|
|
|
+ protected void initChannel(SocketChannel ch) throws Exception {
|
|
|
+ ch.pipeline().addLast(new HeaderTailDelimiterFrameDecoder(65535, false,
|
|
|
+ Unpooled.copiedBuffer(tailSplitBytes), Unpooled.copiedBuffer(headerSplitBytes),
|
|
|
+ Unpooled.copiedBuffer(headerSplitBytes1)));
|
|
|
+ ch.pipeline().addLast(GK309GpsServerHandler.this);
|
|
|
+ }
|
|
|
+ }).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);
|
|
|
+ ChannelFuture f = b.bind(port).sync();
|
|
|
+ f.channel().closeFuture().sync();
|
|
|
+ logger.info("start accept service for {}, bind address {}:{}", this.getPrefixName(), this.getIp(),
|
|
|
+ this.getPort());
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ logger.error(e.getMessage());
|
|
|
+ } finally {
|
|
|
+ cleanRedisLinkData();
|
|
|
+ workerGroup.shutdownGracefully();
|
|
|
+ bossGroup.shutdownGracefully();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|