diff --git a/pom.xml b/pom.xml
index 92e0323..8d79423 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,33 @@
fastjson2
2.0.51
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.13.4
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+ 2.13.4
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jdk8
+ 2.13.4
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ 2.13.4
+
+
+
+ io.netty
+ netty-all
+ 4.2.6.Final
+
@@ -67,28 +94,5 @@
logback-classic
1.2.11
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- 2.13.4
-
-
- com.fasterxml.jackson.dataformat
- jackson-dataformat-xml
- 2.13.4
-
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jdk8
- 2.13.4
-
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
- 2.13.4
-
-
diff --git a/src/main/java/com/njzscloud/App.java b/src/main/java/com/njzscloud/App.java
new file mode 100644
index 0000000..cf3f85c
--- /dev/null
+++ b/src/main/java/com/njzscloud/App.java
@@ -0,0 +1,21 @@
+package com.njzscloud;
+
+import com.njzscloud.server.TcpServer;
+import com.njzscloud.tuqiang.Tuqiang;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class App {
+ static Tuqiang tuqiang;
+
+ public static void main(String[] args) {
+ tuqiang = new Tuqiang();
+ TcpServer tcpServer = new TcpServer(18888, 1, 2);
+ try {
+ tcpServer.start();
+ log.info("TCP服务器已停止");
+ } catch (Exception e) {
+ log.error("TCP服务器启动失败", e);
+ }
+ }
+}
diff --git a/src/main/java/com/njzscloud/common/fastjson/Fastjson.java b/src/main/java/com/njzscloud/common/fastjson/Fastjson.java
index a6fe987..4f2fded 100644
--- a/src/main/java/com/njzscloud/common/fastjson/Fastjson.java
+++ b/src/main/java/com/njzscloud/common/fastjson/Fastjson.java
@@ -34,7 +34,7 @@ public class Fastjson {
JSON_WRITER_CONTEXT = new JSONWriter.Context(
JSONWriter.Feature.WriteNulls, // 序列化输出空值字段
JSONWriter.Feature.BrowserCompatible, // 在大范围超过JavaScript支持的整数,输出为字符串格式
- JSONWriter.Feature.WriteClassName, // 序列化时输出类型信息
+ // JSONWriter.Feature.WriteClassName, // 序列化时输出类型信息
// JSONWriter.Feature.PrettyFormat, // 格式化输出
JSONWriter.Feature.SortMapEntriesByKeys, // 对Map中的KeyValue按照Key做排序后再输出。在有些验签的场景需要使用这个Feature
JSONWriter.Feature.WriteBigDecimalAsPlain, // 序列化BigDecimal使用toPlainString,避免科学计数法
@@ -62,8 +62,8 @@ public class Fastjson {
return value;
});
JSON_READER_CONTEXT = new JSONReader.Context(
- JSONReader.Feature.IgnoreSetNullValue, // 忽略输入为null的字段
- JSONReader.Feature.SupportAutoType // 支持自动类型,要读取带"@type"类型信息的JSON数据,需要显示打开SupportAutoType
+ JSONReader.Feature.IgnoreSetNullValue// 忽略输入为null的字段
+ // JSONReader.Feature.SupportAutoType // 支持自动类型,要读取带"@type"类型信息的JSON数据,需要显示打开SupportAutoType
);
JSON_READER_CONTEXT.setZoneId(zoneId);
JSON_READER_CONTEXT.setDateFormat(DatePattern.NORM_DATETIME_PATTERN);
diff --git a/src/main/java/com/njzscloud/common/log/AnsiColor.java b/src/main/java/com/njzscloud/common/log/AnsiColor.java
new file mode 100644
index 0000000..545e11c
--- /dev/null
+++ b/src/main/java/com/njzscloud/common/log/AnsiColor.java
@@ -0,0 +1,113 @@
+package com.njzscloud.common.log;
+
+
+import java.util.Arrays;
+
+/**
+ * Ansi 颜色
+ */
+public enum AnsiColor {
+
+ /**
+ * 默认前景色
+ */
+ DEFAULT("39"),
+
+ /**
+ * 黑
+ */
+ BLACK("30"),
+
+ /**
+ * 红
+ */
+ RED("31"),
+
+ /**
+ * 绿
+ */
+ GREEN("32"),
+
+ /**
+ * 黄
+ */
+ YELLOW("33"),
+
+ /**
+ * 蓝
+ */
+ BLUE("34"),
+
+ /**
+ * 品红
+ */
+ MAGENTA("35"),
+
+ /**
+ * 青
+ */
+ CYAN("36"),
+
+ /**
+ * 白
+ */
+ WHITE("37"),
+
+ /**
+ * 亮黑(灰)
+ */
+ BRIGHT_BLACK("90"),
+
+ /**
+ * 亮红
+ */
+ BRIGHT_RED("91"),
+
+ /**
+ * 亮绿
+ */
+ BRIGHT_GREEN("92"),
+
+ /**
+ * 亮黄
+ */
+ BRIGHT_YELLOW("93"),
+
+ /**
+ * 亮蓝
+ */
+ BRIGHT_BLUE("94"),
+
+ /**
+ * 亮品红
+ */
+ BRIGHT_MAGENTA("95"),
+
+ /**
+ * 亮青
+ */
+ BRIGHT_CYAN("96"),
+
+ /**
+ * 亮白
+ */
+ BRIGHT_WHITE("97");
+
+ private final String code;
+
+ AnsiColor(String code) {
+ this.code = code;
+ }
+
+ public static AnsiColor parse(String name) {
+ return Arrays.stream(AnsiColor.values())
+ .filter(member -> member.toString().equalsIgnoreCase(name))
+ .findFirst()
+ .orElse(null);
+ }
+
+ @Override
+ public String toString() {
+ return this.code;
+ }
+}
diff --git a/src/main/java/com/njzscloud/common/log/ColorConverter.java b/src/main/java/com/njzscloud/common/log/ColorConverter.java
new file mode 100644
index 0000000..9e3c986
--- /dev/null
+++ b/src/main/java/com/njzscloud/common/log/ColorConverter.java
@@ -0,0 +1,37 @@
+package com.njzscloud.common.log;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.pattern.CompositeConverter;
+
+/**
+ * 日志颜色转换
+ */
+public class ColorConverter extends CompositeConverter {
+ @Override
+ protected String transform(ILoggingEvent event, String in) {
+ AnsiColor color = AnsiColor.parse(getFirstOption());
+ if (color == null) {
+ switch (event.getLevel().toInt()) {
+ case Level.ERROR_INT:
+ color = AnsiColor.RED;
+ break;
+ case Level.WARN_INT:
+ color = AnsiColor.YELLOW;
+ break;
+ case Level.INFO_INT:
+ color = AnsiColor.BLUE;
+ break;
+ case Level.DEBUG_INT:
+ color = AnsiColor.GREEN;
+ break;
+ case Level.TRACE_INT:
+ color = AnsiColor.MAGENTA;
+ break;
+ default:
+ color = AnsiColor.BLACK;
+ }
+ }
+ return "\033[" + color + "m" + in + "\033[0m";
+ }
+}
diff --git a/src/main/java/com/njzscloud/common/utils/BCD.java b/src/main/java/com/njzscloud/common/utils/BCD.java
new file mode 100644
index 0000000..40fadb8
--- /dev/null
+++ b/src/main/java/com/njzscloud/common/utils/BCD.java
@@ -0,0 +1,12 @@
+package com.njzscloud.common.utils;
+
+public class BCD {
+ public static String bcdToStr(byte[] bcd) {
+ StringBuilder sb = new StringBuilder();
+ for (byte b : bcd) {
+ sb.append(String.format("%02x", b));
+ }
+ // 移除前面的0
+ return sb.toString().replaceFirst("^0+", "");
+ }
+}
diff --git a/src/main/java/com/njzscloud/gps/App.java b/src/main/java/com/njzscloud/gps/App.java
deleted file mode 100644
index c3ed860..0000000
--- a/src/main/java/com/njzscloud/gps/App.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.njzscloud.gps;
-
-/**
- * Hello world!
- *
- */
-public class App {
- public static void main(String[] args) {
- System.out.println("Hello World!");
- }
-}
diff --git a/src/main/java/com/njzscloud/jt808/protocol/JT808Decoder.java b/src/main/java/com/njzscloud/jt808/protocol/JT808Decoder.java
new file mode 100644
index 0000000..ee3922c
--- /dev/null
+++ b/src/main/java/com/njzscloud/jt808/protocol/JT808Decoder.java
@@ -0,0 +1,187 @@
+package com.njzscloud.jt808.protocol;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.ByteToMessageDecoder;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * JT808协议解码器
+ * 用于解析JT808协议格式的字节流为消息对象
+ */
+@Slf4j
+public class JT808Decoder extends ByteToMessageDecoder {
+ // 消息起始符和结束符
+ private static final byte MSG_DELIMITER = 0x7e;
+
+ @Override
+ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List