- 基于Netty,实现JT/T808部标协议的消息处理,与编码解码;
- 不依赖Spring,协议编码解码和Netty服务均可独立运行(Android客户端同样适用);
- 最简洁、清爽、易用的部标开发框架。
- 代码足够精简,便于二次开发;
- 致敬Spring、Hibernate设计理念,熟悉Web开发的同学上手极快;
- 使用注解描述协议,告别繁琐的封包、解包;
- 实时兼容2011、2013、2019部标协议版本,支持分包请求;
- 支持T/JSATL12苏标主动安防协议,JT/T1078音视频协议(仅支持信令部分,流媒体服务需要自行搭建);
- 支持异步批量处理,显著提升MySQL入库性能;
- 提供报文解释器(解析过程分析工具),编码解码不再抓瞎;
- 全覆盖的测试用例,稳定发版。
- Gitee仓库地址:https://gitee.com/yezhihao/jt808-server/tree/master
- Github仓库地址:https://github.com/yezhihao/jt808-server/tree/master
编码分析工具:DarkRepulsor(对象 => 报文)
解码分析工具:Elucidator(报文 => 对象)
使用src\test\java\codec\DarkRepulsor 分析报文内每个属性所处的位置以及转换后的值,以便查询报文解析出错的原因
package org.yzh.codec;
public class DarkRepulsor {
private static JTMessageEncoder encoder;
static {
FieldFactory.EXPLAIN = true;
encoder = new JTMessageEncoder("org.yzh.protocol");
}
public static void main(String[] args) {
ByteBuf byteBuf = encoder.encode(/** 消息对象 **/);
System.out.println();
System.out.println(ByteBufUtil.hexDump(byteBuf));
}
}
DarkRepulsor 运行效果如下:
0 [001f] 省域ID: 31
2 [0073] 市县域ID: 115
4 [0000000034] 制造商ID: 4
9 [000000000000000000000042534a2d47462d3036] 终端型号: BSJ-GF-06
29 [74657374313233] 终端ID: test123
36 [01] 车牌颜色: 1
37 [b2e241383838383838] 车辆标识: 测A888888
0 [0100] 消息ID: 256
2 [002e] 消息体属性: 46
4 [012345678901] 终端手机号: 12345678901
10 [7fff] 流水号: 32767
7e0100002e0123456789017fff001f00730000000034000000000000000000000042534a2d47462d30367465737431323301b2e241383838383838157e
运行src\test\resources\发包工具.exe
- 协议类型:【TCP Client】
- 远程主机地址:127.0.0.1
- 远程主机端口:7611
- 接收设置:⊙HEX
- 发送设置:⊙HEX
- 点击按钮【连接】
- 将上一个步骤中生成的报文,粘贴到文本框
- 点击按钮【发送】
注意:先选择HEX,再粘贴报文
7e0100002e0123456789017fff001f00730000000034000000000000000000000042534a2d47462d30367465737431323301b2e241383838383838157e
已集成OpenAPI文档,启动后可访问如下地址
- Knife4j UI:http://127.0.0.1:8000/doc.html
- Swagger UI:http://127.0.0.1:8000/swagger-ui/
package org.yzh.protocol.t808;
@Message(JT808.终端注册)
public class T0100 extends JTMessage {
private int provinceId;
private int cityId;
private String makerId;
private String deviceModel;
private String deviceId;
private int plateColor;
private String plateNo;
@Field(index = 0, type = DataType.WORD, desc = "省域ID")
public int getProvinceId() {
return provinceId;
}
public void setProvinceId(int provinceId) {
this.provinceId = provinceId;
}
@Field(index = 2, type = DataType.WORD, desc = "市县域ID")
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
@Field(index = 4, type = DataType.BYTES, length = 5, desc = "制造商ID", version = {-1, 0})
@Field(index = 4, type = DataType.BYTES, length = 11, desc = "制造商ID", version = 1)
public String getMakerId() {
return makerId;
}
}
package org.yzh.web.endpoint;
@Endpoint
public class JT808Endpoint {
@Autowired
private DeviceService deviceService;
@Mapping(types = 0x0100, desc = "终端注册")
public T8100 register(T0100 message, Session session) {
Header header = message.getHeader();
T8100 result = new T8100(session.nextSerialNo(), header.getMobileNo());
result.setSerialNo(header.getSerialNo());
String token = deviceService.register(message);
if (token != null) {
session.register(header);
result.setResultCode(T8100.Success);
result.setToken(token);
} else {
result.setResultCode(T8100.NotFoundTerminal);
}
return result;
}
}
package org.yzh.web.controller;
@RestController
@RequestMapping("terminal")
public class JT808Controller {
@Autowired
private MessageManager messageManager;
@Operation(summary = "设置终端参数")
@PutMapping("settings")
public T0001 putSettings(@Parameter(description = "终端手机号") @RequestParam String clientId, @RequestBody Parameters parameters) {
Map<Integer, Object> map = parameters.toMap();
T8103 request = new T8103(clientId);
request.setParameters(map);
T0001 response = messageManager.request(request, T0001.class);
return response;
}
}
注解说明:
-
@Message,消息类型,等价Hibernate的 @Table
-
@Field,消息属性,等价Hibernate的 @Column
-
@Endpoint,消息接入点,等价SpringMVC的 @Controller
-
@Mapping,消息映射到方法,等价SpringMVC中 @RequestMapping
-
@AsyncBatch,消息批量处理,对于高并发的消息(例如:位置信息汇报),合并同类消息,提升入库性能。
目录结构
src
│
├──main
│ ├── protocol
│ │ ├── t808 消息定义
│ │ └── codec 消息编码解码
│ └── web
│ ├── config 808服务配置项
│ └── endpoint 808消息入口,通过netty收到的请求会根据@Mapping转发到此
│
└──test
├── java
│ ├── codec 解析工具
│ └── protocol 单元测试
└── resources
├── 协议文档.pdf
└── 发包工具.exe
项目会不定期进行更新,建议star和watch一份,您的支持是我最大的动力。
如有任何疑问或者BUG,请联系我,非常感谢。
技术交流QQ群:[906230542]