部標JT808 JT/T808協議快速開發包


 

部標JT808 JT/T808協議快速開發包

項目介紹

  • 基於Netty,實現JT808 JT/T808部標協議的消息處理,與編碼解碼;
  • 使用SpringBoot + MyBatis提供數據入庫、Web接口服務;
  • 協議部分不依賴Spring,可移除Spring獨立運行(支持Android客戶端);
  • 最簡潔、清爽、易用的部標開發框架。

主要特性

  • 代碼足夠精簡,便於二次開發;
  • 致敬Spring、Hibernate設計理念,熟悉Web開發的同學上手極快;
  • 使用注解描述協議,告別繁瑣的封包、解包;
  • 實時兼容2011、2013、2019部標協議版本,支持分包請求;
  • 支持T/JSATL12蘇標主動安防協議,JT/T1078音視頻協議(僅支持信令部分,流媒體服務需要自行搭建);
  • 支持異步批量處理,顯著提升MySQL入庫性能;
  • 提供報文解釋器(解析過程分析工具),編碼解碼不再抓瞎;
  • 全覆蓋的測試用例,穩定發版。

代碼倉庫

驗證步驟

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

  1. 協議類型:【TCP Client】
  2. 遠程主機地址:127.0.0.1
  3. 遠程主機端口:7611
  4. 接收設置:⊙HEX
  5. 發送設置:⊙HEX
  6. 點擊按鈕【連接】
  7. 將上一個步驟中生成的報文,粘貼到文本框
  8. 點擊按鈕【發送】

注意:先選擇HEX,再粘貼報文

7e0100002e0123456789017fff001f00730000000034000000000000000000000042534a2d47462d30367465737431323301b2e241383838383838157e

如下圖所示 使用發包工具模擬請求

3.下發命令到終端

已集成OpenAPI文檔,啟動后可訪問如下地址

錄入參數,點擊發送 Knife4j 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協議,是指交通部制定的運輸行業通信標准,全程《中華人民共和國交通運輸行業標准 - 道路運輸車輛衛星定位系統終端通信協議及數據格式》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM