部標JT808 JT/T808協議快速開發包
項目介紹
- 基於Netty,實現JT808 JT/T808部標協議的消息處理,與編碼解碼;
- 使用SpringBoot + MyBatis提供數據入庫、Web接口服務;
- 協議部分不依賴Spring,可移除Spring獨立運行(支持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
驗證步驟
1.驗證消息定義
編碼分析工具: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
2.模擬設備請求
運行src\test\resources\發包工具.exe
- 協議類型:【TCP Client】
- 遠程主機地址:127.0.0.1
- 遠程主機端口:7611
- 接收設置:⊙HEX
- 發送設置:⊙HEX
- 點擊按鈕【連接】
- 將上一個步驟中生成的報文,粘貼到文本框
- 點擊按鈕【發送】
注意:先選擇HEX,再粘貼報文
7e0100002e0123456789017fff001f00730000000034000000000000000000000042534a2d47462d30367465737431323301b2e241383838383838157e
如下圖所示
3.下發命令到終端
已集成OpenAPI文檔,啟動后可訪問如下地址
- Knife4j UI:http://127.0.0.1:8000/doc.html
- Swagger UI:http://127.0.0.1:8000/swagger-ui/
錄入參數,點擊發送
開發步驟
1.定義消息
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; } }
2.處理終端上報的消息
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; } }
3.下發消息到終端(通過Web接口)
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:[1527621790] 技術交流QQ群:[906230542]
- JT808泛指JT/T808協議,是指交通部制定的運輸行業通信標准,全程《中華人民共和國交通運輸行業標准 - 道路運輸車輛衛星定位系統終端通信協議及數據格式》