Browse Source

String组装改为StringBuilder

Handler内组装启用CompositionBuffer
tags/v1.0.0^2
林万龙 3 years ago
parent
commit
36e4faf9bd
6 changed files with 127 additions and 71 deletions
  1. +34
    -0
      src/main/java/com/telpo/dipperposition/common/HexConvert.java
  2. +42
    -19
      src/main/java/com/telpo/dipperposition/handler/NettyServerHandler.java
  3. +4
    -15
      src/main/java/com/telpo/dipperposition/server/DipperPositionServer.java
  4. +17
    -16
      src/main/java/com/telpo/dipperposition/service/impl/DipperAstPosAsyncTaskServiceImpl.java
  5. +21
    -20
      src/main/java/com/telpo/dipperposition/service/impl/DipperAstTimeAsyncTaskServiceImpl.java
  6. +9
    -1
      src/main/java/com/telpo/dipperposition/service/impl/DipperDataAsyncTaskServiceImpl.java

+ 34
- 0
src/main/java/com/telpo/dipperposition/common/HexConvert.java View File

@@ -118,6 +118,40 @@ public class HexConvert {
} }
return hex; return hex;
} }


/**
* 生成校验码的int值
* */
public static String makeChecksumForBytes(byte[] byteDatas) {
if (byteDatas == null || byteDatas.length == 0) {
return "";
}
int total = 0;
int len = byteDatas.length;

final String HEX = "0123456789abcdef";
StringBuilder sb = null;
for (byte b : byteDatas) {
sb = new StringBuilder(2);
// 取出这个字节的高4位,然后与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
sb.append(HEX.charAt((b >> 4) & 0x0f));
// 取出这个字节的低位,与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
sb.append(HEX.charAt(b & 0x0f));
total += Integer.parseInt(sb.toString(), 16);
}
/**
* 用256求余最大是255,即16进制的FF
*/
int mod = total % 256;
String hex = Integer.toHexString(mod);
len = hex.length();
// 如果不够校验位的长度,补0,这里用的是两位校验
if (len < 2) {
hex = "0" + hex;
}
return hex;
}
// //
// public static void main(String[] args) { // public static void main(String[] args) {
// //


+ 42
- 19
src/main/java/com/telpo/dipperposition/handler/NettyServerHandler.java View File

@@ -5,10 +5,12 @@ import com.telpo.dipperposition.service.IDipperAstPosAsyncTaskService;
import com.telpo.dipperposition.service.IDipperAstTimeAsyncTaskService; import com.telpo.dipperposition.service.IDipperAstTimeAsyncTaskService;
import com.telpo.dipperposition.service.IDipperDataAsyncTaskService; import com.telpo.dipperposition.service.IDipperDataAsyncTaskService;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -87,7 +89,7 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
//String str = "通知客户端链接建立成功" + " " + LocalDateTime.now() + " " + channel.localAddress().getHostString() + //String str = "通知客户端链接建立成功" + " " + LocalDateTime.now() + " " + channel.localAddress().getHostString() +
// "\r\n"; // "\r\n";
ByteBuf buf = Unpooled.buffer(ackAckCheckRef.getBytes().length); ByteBuf buf = Unpooled.buffer(ackAckCheckRef.getBytes().length);
buf.writeBytes(ackAckCheckRef.getBytes("GBK"));
buf.writeBytes(ackAckCheckRef.getBytes(CharsetUtil.UTF_8));
ctx.writeAndFlush(buf); ctx.writeAndFlush(buf);
} }


@@ -117,46 +119,67 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {


String channelAns = ""; String channelAns = "";
// 返回时间指令 // 返回时间指令
//if (Integer.parseInt(timeAsycServerPort) == channel.localAddress().getPort()) {
//ByteBuf recvmg = (ByteBuf) msg;
ByteBuf buf = null; ByteBuf buf = null;
//String recvmgStr = recvmg.toString();
//if (AST_TIME_CMD.equals(recvmg)) {
if (AST_TIME_CMD.equals(msg)) { if (AST_TIME_CMD.equals(msg)) {
// 初始时间辅助输入; // 初始时间辅助输入;
channelAns = nettyServerHandler.dipperTimeAsyncTaskService.pushAstTime(); channelAns = nettyServerHandler.dipperTimeAsyncTaskService.pushAstTime();
// log.info("返回时间:" + channelAns);
//log.debug(channelAns);
if (channelAns != null) {
buf = Unpooled.buffer(channelAns.getBytes().length);
buf.writeBytes(channelAns.getBytes(CharsetUtil.UTF_8));
ctx.writeAndFlush(buf);
}
} }
// 发送SDBP-AST-POS获取辅助位置信息 // 发送SDBP-AST-POS获取辅助位置信息
// if (Integer.parseInt(posAsycServerPort) == channel.localAddress().getPort()) {

//if (AST_POS_CMD.equals(recvmg)) {
if (AST_POS_CMD.equals(msg)) { if (AST_POS_CMD.equals(msg)) {
channelAns = nettyServerHandler.dipperAstPosAsyncTaskService.pushAstPos(ipAddress); channelAns = nettyServerHandler.dipperAstPosAsyncTaskService.pushAstPos(ipAddress);
//log.debug(channelAns);
if (channelAns != null) {
buf = Unpooled.buffer(channelAns.getBytes().length);
buf.writeBytes(channelAns.getBytes(CharsetUtil.UTF_8));
ctx.writeAndFlush(buf);
}
} }


// 从缓存获取SDBP-AST-EPH星历数 // 从缓存获取SDBP-AST-EPH星历数
//if (Integer.parseInt(starsAsycServerPort) == channel.localAddress().getPort()) {
//if (AST_POS_CMD.equals(recvmg)) {
if (AST_EPH_CMD.equals(msg)) { if (AST_EPH_CMD.equals(msg)) {
channelAns = nettyServerHandler.dipperDataAsyncTaskService.getAstEPH(); channelAns = nettyServerHandler.dipperDataAsyncTaskService.getAstEPH();
//log.debug(channelAns);
if (channelAns != null) {
buf = Unpooled.buffer(channelAns.getBytes().length);
buf.writeBytes(channelAns.getBytes(CharsetUtil.UTF_8));
ctx.writeAndFlush(buf);
}
} }


// 最后把SDBP-AST-TIME、SDBP-AST-POS、SDBP-AST-EPH并包一起发给设备。 // 最后把SDBP-AST-TIME、SDBP-AST-POS、SDBP-AST-EPH并包一起发给设备。
// 设备采用16进制获取数据,则代理服务器也是采用16进制返回数据。 // 设备采用16进制获取数据,则代理服务器也是采用16进制返回数据。
// 通知客户端链消息发送成功 // 通知客户端链消息发送成功
if (AST_ALL_CMD.equals(msg)) { if (AST_ALL_CMD.equals(msg)) {
CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer();
channelAns = nettyServerHandler.dipperTimeAsyncTaskService.pushAstTime(); channelAns = nettyServerHandler.dipperTimeAsyncTaskService.pushAstTime();
channelAns += nettyServerHandler.dipperAstPosAsyncTaskService.pushAstPos(ipAddress);
channelAns += nettyServerHandler.dipperDataAsyncTaskService.getAstEPH();
}


log.info(channelAns);
if (channelAns != null) {
buf = Unpooled.buffer(channelAns.getBytes().length);
buf.writeBytes(channelAns.getBytes("UTF-8"));
ctx.writeAndFlush(buf);
if (channelAns != null) {
ByteBuf channelTimeAnsBuf = Unpooled.buffer(channelAns.getBytes().length);
channelTimeAnsBuf.writeBytes(channelAns.getBytes(CharsetUtil.UTF_8));
compositeByteBuf.addComponent(channelTimeAnsBuf);
}
channelAns = nettyServerHandler.dipperAstPosAsyncTaskService.pushAstPos(ipAddress);

if (channelAns != null) {
ByteBuf channelPosAnsBuf = Unpooled.buffer(channelAns.getBytes().length);
channelPosAnsBuf.writeBytes(channelAns.getBytes(CharsetUtil.UTF_8));
compositeByteBuf.addComponent(channelPosAnsBuf);
}
channelAns = nettyServerHandler.dipperDataAsyncTaskService.getAstEPH();
if (channelAns != null) {
ByteBuf channelPehAnsBuf = Unpooled.buffer(channelAns.getBytes().length);
channelPehAnsBuf.writeBytes(channelAns.getBytes(CharsetUtil.UTF_8));
compositeByteBuf.addComponent(channelPehAnsBuf);
}
ctx.writeAndFlush(compositeByteBuf);
} }

} }


/** /**


+ 4
- 15
src/main/java/com/telpo/dipperposition/server/DipperPositionServer.java View File

@@ -1,12 +1,5 @@
package com.telpo.dipperposition.server; package com.telpo.dipperposition.server;


import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import com.telpo.dipperposition.co.PositionConfigInfo;
import com.telpo.dipperposition.handler.ServerChannelInitializer; import com.telpo.dipperposition.handler.ServerChannelInitializer;
import io.netty.bootstrap.ServerBootstrap; import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFuture;
@@ -15,7 +8,6 @@ import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;


@@ -29,15 +21,12 @@ import java.net.InetSocketAddress;
*/ */
@Slf4j @Slf4j
@Component @Component
//@NacosPropertySource(dataId="dipperposition-service", autoRefreshed=true)
public class DipperPositionServer { public class DipperPositionServer {


//@NacosValue("position-server.serverAddr")
//private String myServerAddr;
private String serverAddr; private String serverAddr;
private Integer starsAsycPort; private Integer starsAsycPort;


public DipperPositionServer(ConfigurableEnvironment environment) throws NacosException {
public DipperPositionServer(ConfigurableEnvironment environment) {


this.serverAddr = environment.getProperty("position-server.serverAddr"); this.serverAddr = environment.getProperty("position-server.serverAddr");


@@ -68,17 +57,17 @@ public class DipperPositionServer {
//绑定端口,开始接收进来的连接 //绑定端口,开始接收进来的连接
try { try {


ChannelFuture channelFuture3 = bootstrap.bind(socketAddress).sync();
ChannelFuture channelFuture = bootstrap.bind(socketAddress).sync();
log.info("星历服务器启动开始监听端口: {}", starsAsycPort); log.info("星历服务器启动开始监听端口: {}", starsAsycPort);
//log.info("服务器: {}", myServerAddr); //log.info("服务器: {}", myServerAddr);
channelFuture3.addListener(future -> {
channelFuture.addListener(future -> {
if (future.isSuccess()){ if (future.isSuccess()){
System.out.println("start success"); System.out.println("start success");
}else{ }else{
System.out.println("start failed"); System.out.println("start failed");
} }
}); });
channelFuture3.channel().closeFuture().sync();
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {


+ 17
- 16
src/main/java/com/telpo/dipperposition/service/impl/DipperAstPosAsyncTaskServiceImpl.java View File

@@ -210,15 +210,16 @@ public class DipperAstPosAsyncTaskServiceImpl implements IDipperAstPosAsyncTaskS
// 00 2F 为校验和 // 00 2F 为校验和


// astPosCmd 组装 // astPosCmd 组装
String astPosCmd = "233E0401";
astPosCmd += "1000";
astPosCmd += HexConvert.encodeHEX(lanLongValue).toUpperCase();
astPosCmd += HexConvert.encodeHEX(altLongValue).toUpperCase();
astPosCmd += "70170000";
astPosCmd += "A0860100";

log.info(astPosCmd);
String checkSum = HexConvert.makeChecksum(astPosCmd).toUpperCase();
StringBuilder astPosCmdBuf = new StringBuilder();
astPosCmdBuf.append("233E0401");
astPosCmdBuf.append("1000");
astPosCmdBuf.append(HexConvert.encodeHEX(lanLongValue).toUpperCase());
astPosCmdBuf.append(HexConvert.encodeHEX(altLongValue).toUpperCase());
astPosCmdBuf.append("70170000");
astPosCmdBuf.append("A0860100");

//log.info(astPosCmd);
String checkSum = HexConvert.makeChecksum(astPosCmdBuf.toString()).toUpperCase();
StringBuffer astCheckSumBuf = new StringBuffer(); StringBuffer astCheckSumBuf = new StringBuffer();
astCheckSumBuf.append(checkSum); astCheckSumBuf.append(checkSum);
while (astCheckSumBuf.length()<4) { while (astCheckSumBuf.length()<4) {
@@ -227,17 +228,17 @@ public class DipperAstPosAsyncTaskServiceImpl implements IDipperAstPosAsyncTaskS
checkSum = astCheckSumBuf.toString(); checkSum = astCheckSumBuf.toString();
log.info(checkSum); log.info(checkSum);


byte[] astPosCmdBytes = HexConvert.hexStringToBytes(astPosCmd);
StringBuffer astPosCmdBuf = new StringBuffer();
for(int i=0; i<astPosCmdBytes.length; i++) {
String s = Integer.toHexString(astPosCmdBytes[i] & 0xff);
byte[] astPosCmdBytes = HexConvert.hexStringToBytes(astPosCmdBuf.toString());
StringBuilder astPosCmdNewBuf = new StringBuilder();
for (byte astPosCmdByte : astPosCmdBytes) {
String s = Integer.toHexString(astPosCmdByte & 0xff);
if (s.length() < 2) { if (s.length() < 2) {
astPosCmdBuf.append('0');
astPosCmdNewBuf.append('0');
} }
astPosCmdBuf.append(s + " ");
astPosCmdNewBuf.append(s + " ");
} }


return astPosCmdBuf.toString() + checkSum.substring(0,2) + " " + checkSum.substring(2,4);
return astPosCmdNewBuf.toString() + checkSum.substring(0,2) + " " + checkSum.substring(2,4);


} }
} }

+ 21
- 20
src/main/java/com/telpo/dipperposition/service/impl/DipperAstTimeAsyncTaskServiceImpl.java View File

@@ -43,25 +43,26 @@ public class DipperAstTimeAsyncTaskServiceImpl implements IDipperAstTimeAsyncTas
// 00 5E D0 B2 表示 3 秒的时间精度(十六进制 B2 D0 5E 00 转为十进制为3000000000,乘以比 例因子 10-9就是 3 秒 小端模式00 5E D0 B2) // 00 5E D0 B2 表示 3 秒的时间精度(十六进制 B2 D0 5E 00 转为十进制为3000000000,乘以比 例因子 10-9就是 3 秒 小端模式00 5E D0 B2)
// 00 2F 为校验和 // 00 2F 为校验和
// TODO astTimeCmd 组装 // TODO astTimeCmd 组装
String astTimeCmd = "233E0402";
astTimeCmd += "1000";
astTimeCmd += "20E1";
StringBuilder astTimeCmdBuf = new StringBuilder();
astTimeCmdBuf.append("233E0402");
astTimeCmdBuf.append("1000");
astTimeCmdBuf.append("20E1");
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
int year = now.getYear(); int year = now.getYear();
int month = now.getMonthValue(); int month = now.getMonthValue();
int day = now.getDayOfMonth(); int day = now.getDayOfMonth();
String hexYearString = Integer.toHexString(year); String hexYearString = Integer.toHexString(year);
hexYearString = "0" + hexYearString; hexYearString = "0" + hexYearString;
astTimeCmd += hexYearString.substring(2,3).toUpperCase() + hexYearString.substring(0,1).toUpperCase();
astTimeCmdBuf.append(hexYearString.substring(2,3).toUpperCase() + hexYearString.substring(0,1).toUpperCase());
String hexMonthString = Integer.toHexString(month); String hexMonthString = Integer.toHexString(month);
hexMonthString = "0" + hexMonthString; hexMonthString = "0" + hexMonthString;
astTimeCmd += hexMonthString.toUpperCase();
astTimeCmdBuf.append(hexMonthString.toUpperCase());


String hexDayString = Integer.toHexString(day); String hexDayString = Integer.toHexString(day);
if (day < 16) { if (day < 16) {
hexDayString = "0" + hexDayString; hexDayString = "0" + hexDayString;
} }
astTimeCmd += hexDayString.toUpperCase();
astTimeCmdBuf.append(hexDayString.toUpperCase());


int hour = now.getHour(); int hour = now.getHour();
int minitor = now.getMinute(); int minitor = now.getMinute();
@@ -70,41 +71,41 @@ public class DipperAstTimeAsyncTaskServiceImpl implements IDipperAstTimeAsyncTas
if (hour < 16) { if (hour < 16) {
hexHourString = "0" + hexHourString; hexHourString = "0" + hexHourString;
} }
astTimeCmd += hexHourString.toUpperCase();
astTimeCmdBuf.append(hexHourString.toUpperCase());
String hexMinitorString = Integer.toHexString(minitor); String hexMinitorString = Integer.toHexString(minitor);
if (minitor < 16) { if (minitor < 16) {
hexMinitorString = "0" + hexMinitorString; hexMinitorString = "0" + hexMinitorString;
} }
astTimeCmd += hexMinitorString.toUpperCase();
astTimeCmdBuf.append(hexMinitorString.toUpperCase());
String hexSecondString = Integer.toHexString(second); String hexSecondString = Integer.toHexString(second);
if (second < 16) { if (second < 16) {
hexSecondString = "0" + hexSecondString; hexSecondString = "0" + hexSecondString;
} }
astTimeCmd += hexSecondString.toUpperCase();
astTimeCmd += "0000000000";
astTimeCmd += "005ED0B2";
astTimeCmdBuf.append(hexSecondString.toUpperCase());
astTimeCmdBuf.append("0000000000");
astTimeCmdBuf.append("005ED0B2");


byte[] astTimeCmdBytes = HexConvert.hexStringToBytes(astTimeCmd);
StringBuffer astTimeCmdBuf = new StringBuffer();
byte[] astTimeCmdBytes = HexConvert.hexStringToBytes(astTimeCmdBuf.toString());
StringBuilder astTimeCmdNewBuf = new StringBuilder();
for(int i=0; i<astTimeCmdBytes.length; i++) { for(int i=0; i<astTimeCmdBytes.length; i++) {
String s = Integer.toHexString(astTimeCmdBytes[i] & 0xff); String s = Integer.toHexString(astTimeCmdBytes[i] & 0xff);
if (s.length() < 2) { if (s.length() < 2) {
astTimeCmdBuf.append('0');
astTimeCmdNewBuf.append('0');
} }
astTimeCmdBuf.append(s + " ");
astTimeCmdNewBuf.append(s + " ");
} }


log.info(astTimeCmd);
String checkSum = HexConvert.makeChecksum(astTimeCmd).toUpperCase();
StringBuffer astCheckSumBuf = new StringBuffer();
//log.info(astTimeCmd);
String checkSum = HexConvert.makeChecksum(astTimeCmdBuf.toString()).toUpperCase();
StringBuilder astCheckSumBuf = new StringBuilder();
astCheckSumBuf.append(checkSum); astCheckSumBuf.append(checkSum);
while (astCheckSumBuf.length()<4) { while (astCheckSumBuf.length()<4) {
astCheckSumBuf.insert(0,"0"); astCheckSumBuf.insert(0,"0");
} }
checkSum = astCheckSumBuf.toString(); checkSum = astCheckSumBuf.toString();
log.info(checkSum);
//log.info(checkSum);


return astTimeCmdBuf.toString() + checkSum.substring(0,2) + " " + checkSum.substring(2,4);
return astTimeCmdNewBuf.toString() + checkSum.substring(0,2) + " " + checkSum.substring(2,4);
//String hexIn = astTimeCmd + HexConvert.makeChecksum(astTimeCmd); //String hexIn = astTimeCmd + HexConvert.makeChecksum(astTimeCmd);
//log.info("DipperAstTimeAsyncTaskServiceImpl 返回时间:" + hexIn); //log.info("DipperAstTimeAsyncTaskServiceImpl 返回时间:" + hexIn);




+ 9
- 1
src/main/java/com/telpo/dipperposition/service/impl/DipperDataAsyncTaskServiceImpl.java View File

@@ -54,7 +54,15 @@ public class DipperDataAsyncTaskServiceImpl implements IDipperDataAsyncTaskServi


// astTimeCmd 组装 // astTimeCmd 组装
String astTimeCmd = DIPPER_ALL_DATA_REQ; String astTimeCmd = DIPPER_ALL_DATA_REQ;
String hexIn = astTimeCmd + HexConvert.makeChecksum(astTimeCmd);
String checkSum = HexConvert.makeChecksum(astTimeCmd.toString()).toUpperCase();
StringBuilder astCheckSumBuf = new StringBuilder();
astCheckSumBuf.append(checkSum);
while (astCheckSumBuf.length()<4) {
astCheckSumBuf.insert(0,"0");
}
checkSum = astCheckSumBuf.toString();

String hexIn = astTimeCmd + checkSum.substring(0,2) + " " + checkSum.substring(2,4);


String ackAckCheckRef = "233E010102000421293C"; String ackAckCheckRef = "233E010102000421293C";
String sendResult = client.sendCmd(hexIn, ackAckCheckRef); String sendResult = client.sendCmd(hexIn, ackAckCheckRef);


Loading…
Cancel
Save