# JT809Maven **Repository Path**: dark2000/JT809Maven ## Basic Information - **Project Name**: JT809Maven - **Description**: JT809Maven - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-05-21 - **Last Updated**: 2025-09-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JT809协议通信系统使用说明 ## 一、系统概述 本项目实现了JT809协议的基本通信框架,支持车辆监控平台与企业监控平台之间的数据交换。系统包含服务端(JT809Server)和客户端(JT809Client)两部分,采用Java语言开发,基于TCP协议进行通信。 ## 二、实现的基本功能 1. **基础通信功能** - 登录/注销功能(0x1001-0x1003) - 心跳保持功能(0x1005) 2. **车辆监控功能** - 车辆定位信息上报(0x1200) - 车辆静态信息上报(0x1600) - 驾驶员信息上报(0x1700) 3. **报警处理功能** - 报警信息上报(0x1400) - 报警处理结果反馈(0x1401) 4. **数据统计分析功能** - 车辆运营数据交换(0x1800) - 企业信息统计(0x1900) ## 三、消息体定义与结构 ### 1. JT809 报文基本结构 所有消息都遵循以下基本结构: ```java class JT809Message { int msgLength; // 消息长度 int msgSn; // 消息序列号 int msgId; // 消息ID int msgGnsscenterId; // 接入码 byte[] msgBody; // 消息体 int crcCode; // CRC校验码 } ``` 所有 JT809 报文均采用 **二进制格式**,由 **消息头(Header)+ 消息体(Body)** 组成,结构如下: | **字段** | **类型** | **长度(字节)** | **说明** | | :------------------- | :------- | :--------------- | :---------------------------------------------------------- | | **MSG_HEAD** | uint32 | 4 | 消息头标识(固定 `0x30 0x31 0x63 0x64`,即 ASCII `"01cd"`) | | **MSG_ID** | uint16 | 2 | 消息ID(如 `0x1001` 表示主链路登录请求) | | **MSG_LEN** | uint32 | 4 | **消息体(Body)长度**(不含 Header) | | **MSG_SN** | uint32 | 4 | 消息流水号(递增,用于请求-应答匹配) | | **MSG_GNSSCENTERID** | uint32 | 4 | 监管平台唯一标识(如省级平台ID) | | **VERSION** | uint8[3] | 3 | 协议版本号(如 `0x01 0x02 0x03` 表示 `V1.2.3`) | | **ENCRYPT_FLAG** | uint8 | 1 | 加密标志(`0x00` 不加密,`0x01` RSA加密,`0x02` AES加密) | | **ENCRYPT_KEY** | uint32 | 4 | 加密密钥(仅当 `ENCRYPT_FLAG` 非零时有效) | | **MSG_BODY** | byte[] | 变长 | 消息体内容(具体结构由 `MSG_ID` 决定) | | **CRC_CODE** | uint16 | 2 | CRC16 校验码(从 `MSG_HEAD` 到 `MSG_BODY` 的校验) | ### **2. 主链路管理类报文** 用于建立、维护和断开平台间的通信连接。 #### **(1) 主链路登录请求(0x1001)** - **用途**:企业平台向监管平台发起连接认证。 - **关键字段**: - **用户名/密码**:平台身份认证。 - **接入码**:标识企业平台(如运输公司编号)。 - **数据加密方式**(如RSA/AES)。 - **平台版本号**。 | **字段** | **类型** | **长度(字节)** | **说明** | | :------------- | :------- | :--------------- | :---------------------------- | | USER_ID | string | 20 | 用户名(右补0x00) | | PASSWORD | byte[] | 20 | 密码(MD5加密后的20字节数据) | | DOWN_LINK_IP | string | 32 | 下级平台接入IP(右补0x00) | | DOWN_LINK_PORT | uint16 | 2 | 下级平台接入端口 | **功能**:下级平台向上级平台发起登录认证 #### **(2) 主链路登录应答(0x1002)** - **用途**:监管平台返回登录结果。 - **关键字段**: - **结果**(0x00成功,其他失败)。 - **校验码**(用于后续通信校验)。 | **字段** | **类型** | **长度(字节)** | **说明** | | :---------- | :------- | :--------------- | :----------------------------------------------------------- | | RESULT | uint8 | 1 | 结果: 0x00-成功 0x01-IP地址错误 0x02-接入码错误 0x03-用户没注册 0x04-密码错误 | | VERIFY_CODE | uint32 | 4 | 验证码(成功时有效) | **功能**:上级平台对登录请求的响应 #### **(3) 主链路注销请求(0x1003)** - **用途**:企业平台主动断开连接。 - **关键字段**: - **平台ID**。 | **字段** | **类型** | **长度(字节)** | **说明** | | :------- | :------- | :--------------- | :----------------------- | | USER_ID | string | 20 | 用户名(与登录请求一致) | **功能**:下级平台主动断开连接时发送 #### **(4) 主链路保持连接(0x1005)** - **用途**:心跳包,维持长连接。 | **字段** | **类型** | **长度(字节)** | **说明** | | :--------- | :------- | :--------------- | :------- | | (无消息体) | - | 0 | 空消息体 | **功能**:保持TCP连接活跃 ### **3. 车辆监控功能** #### **(1) 车辆定位信息上报(0x1200)** | **字段** | **类型** | **长度(字节)** | **说明** | | :------------ | :------- | :------------- | :------------------------------------- | | VEHICLE_NO | string | 21 | 车牌号(UTF-8编码,右补0x00) | | VEHICLE_COLOR | uint8 | 1 | 车牌颜色(1:蓝,2:黄,3:黑,4:白) | | GPS_DATA | struct | 28 | GPS数据(见下表) | | ALARM_FLAG | uint32 | 4 | 报警标志位(按位表示不同报警类型) | | STATUS_FLAG | uint32 | 4 | 状态标志位(按位表示车辆状态) | | LONGITUDE | uint32 | 4 | 经度(1/10^6度) | | LATITUDE | uint32 | 4 | 纬度(1/10^6度) | | ALTITUDE | uint16 | 2 | 海拔(米) | | SPEED | uint16 | 2 | 速度(0.1km/h) | | DIRECTION | uint16 | 2 | 方向(0-359度,正北为0) | | TIME | string | 6 | 时间(YYMMDDHHMMSS) | **GPS_DATA结构**: | **子字段** | **类型** | **长度** | **说明** | | :----------- | :------- | :------- | :---------------------------- | | ENCRYPT_FLAG | uint8 | 1 | 定位数据加密标志(0:未加密) | | LONGITUDE | uint32 | 4 | 经度(1/10^6度) | | LATITUDE | uint32 | 4 | 纬度(1/10^6度) | | ... | ... | ... | (其他GPS字段同上表) | ------ #### **(2) 车辆静态信息上报(0x1600)** | **字段** | **类型** | **长度** | **说明** | | :--------------- | :------- | :------- | :------------------------------ | | VEHICLE_NO | string | 21 | 车牌号 | | VEHICLE_COLOR | uint8 | 1 | 车牌颜色 | | VEHICLE_TYPE | uint8 | 1 | 车辆类型(1:客车,2:货车...) | | COMPANY | string | 200 | 运输企业名称(UTF-8编码) | | VIN | string | 17 | 车辆识别代号 | | PLATE_REG_DATE | string | 8 | 注册日期(YYYYMMDD) | | INSURANCE_EXPIRE | string | 8 | 保险到期日 | ------ #### **(3) 驾驶员信息上报(0x1700)** | **字段** | **类型** | **长度** | **说明** | | :---------- | :------- | :------- | :--------------------- | | DRIVER_NAME | string | 50 | 驾驶员姓名 | | ID_CARD | string | 20 | 身份证号 | | LICENSE_NO | string | 40 | 从业资格证号 | | COMPANY | string | 200 | 所属企业 | | VALID_DATE | string | 8 | 证件有效期(YYYYMMDD) | ### **4. 报警处理功能** #### **(1) 报警信息上报(0x1400)** | **字段** | **类型** | **长度** | **说明** | | :------------ | :------- | :------- | :---------------------------------- | | VEHICLE_NO | string | 21 | 车牌号 | | VEHICLE_COLOR | uint8 | 1 | 车牌颜色 | | ALARM_TYPE | uint8 | 1 | 报警类型(1:超速,2:疲劳驾驶...) | | ALARM_TIME | string | 6 | 报警时间(YYMMDDHHMMSS) | | LONGITUDE | uint32 | 4 | 经度 | | LATITUDE | uint32 | 4 | 纬度 | | SPEED | uint16 | 2 | 车速(0.1km/h) | | ALARM_DESC | string | 100 | 报警描述 | ------ #### **(2) 报警处理结果反馈(0x1401)** | **字段** | **类型** | **长度** | **说明** | | :------------ | :------- | :------- | :--------------------------- | | VEHICLE_NO | string | 21 | 车牌号 | | VEHICLE_COLOR | uint8 | 1 | 车牌颜色 | | ALARM_TIME | string | 6 | 原报警时间 | | ALARM_TYPE | uint8 | 1 | 原报警类型 | | RESULT_TYPE | uint8 | 1 | 处理结果(1:警告,2:处罚) | | RESULT_DESC | string | 200 | 处理描述 | ### **5. 数据统计分析功能** #### **(1) 车辆运营数据交换(0x1800)** | **字段** | **类型** | **长度** | **说明** | | :--------------- | :------- | :------- | :------------------------------------------------- | | VEHICLE_NO | string | 21 | 车牌号 | | VEHICLE_COLOR | uint8 | 1 | 车牌颜色 | | PERIOD_TYPE | uint8 | 1 | 统计周期(1:日,2:月,3:年) | | START_TIME | string | 8 | 开始时间(日:YYMMDD,月:YYMM0000,年:YY000000) | | END_TIME | string | 8 | 结束时间 | | MILEAGE | uint32 | 4 | 运营里程(km) | | VIOLATION_COUNT | uint32 | 4 | 违规次数 | | FUEL_CONSUMPTION | uint32 | 4 | 油耗(升) | ------ #### **(2) 企业信息统计(0x1900)** | **字段** | **类型** | **长度** | **说明** | | :-------------- | :------- | :------- | :--------------------- | | COMPANY_ID | string | 11 | 企业ID(数字字母组合) | | COMPANY_NAME | string | 200 | 企业名称 | | TOTAL_VEHICLES | uint32 | 4 | 车辆总数 | | ONLINE_VEHICLES | uint32 | 4 | 在线车辆数 | | TOTAL_DRIVERS | uint32 | 4 | 驾驶员总数 | | COMPLIANCE_RATE | float | 4 | 合规率(0.00-1.00) | ## 四、系统使用指南 ### 1. 环境准备 - **开发环境** - JDK 1.8+(需配置 Java 环境变量) - IDE(推荐 IntelliJ IDEA,支持 Maven 依赖管理) - 开发工具包:包含 JT809 协议解析工具类(`JT809Utils`)、消息体封装类(如`JT809Message`、`LoginRequest`等)。 - **运行环境** - 服务端:Linux/Windows 服务器,开放 TCP 端口(默认 8000,可在代码中修改`SERVER_PORT`常量)。 - 客户端:支持 Java 运行环境的设备(如 PC、车载终端模拟器),需配置服务端 IP 和端口。 ### 2. 服务端部署与启动 #### **步骤 1:配置服务端参数** - 在控制台中输入 ``` JT809Server ``` 注意: - `SERVER_PORT`:监听端口(需确保未被占用)。 - `GNSS_CENTER_ID`:监管平台唯一标识(需与客户端接入码一致)。 - `VALID_USERS`:维护合法客户端账号(用户名 - 密码对,密码需 MD5 加密)。 #### **步骤 2:启动服务端** - 执行`JT809Server.main()`方法,控制台输出`"JT809 Server started on port XXXX"`即表示启动成功。 - 服务端会自动监听客户端连接,并通过线程池处理多客户端请求。 ### 3. 客户端接入与操作 #### **步骤 1:配置客户端参数** - 在控制台中输入 ```sh JT809Client ``` 注意: - `SERVER_HOST`:服务端 IP 地址(如`"192.168.1.100"`)。 - `SERVER_PORT`:服务端端口(需与服务端配置一致)。 - `GNSS_CENTER_ID`:客户端接入码(需与服务端监管平台 ID 一致)。 - 登录信息:`userId`(用户名)、`password`(需与服务端`VALID_USERS`一致)。 #### **步骤 2:启动客户端并登录** - 执行`JT809Client.main()`方法,客户端自动发起登录请求。 ```shell Connected to JT809 server at localhost:8000 Sent login request ``` - 服务端返回登录响应: - 成功:控制台显示`"Login SUCCESS! Verify code: XXXXXXXX"`,并启动心跳机制(默认 30 秒发送一次心跳包)。 - 失败:检查用户名 / 密码、IP 端口或接入码是否正确。 ``` Received message from server: JT809Message{msgHead=30 31 63 64 , msgId=0x1002, msgLen=5, msgSn=1, gnssCenterId=1001, version=01 00 00 , encryptFlag=0x00, encryptKey=0, crcCode=0xE27F} Login SUCCESS! Verify code: 12345678 ``` #### **步骤 3:数据交互操作** 客户端提供交互式菜单,支持以下功能(输入对应数字选择): ```shell Options: 1. Send vehicle location 2. Send control command 3. Send vehicle static info 4. Send driver info 5. Send alarm report 6. Send vehicle operation data 7. Send company statistics info 8. Logout and exit Enter choice: ``` 1)**发送车辆定位信息** - 自动生成模拟 GPS 数据(经度、纬度、速度等),按`0x1200`协议格式封装并发送。 ``` 1 Sent vehicle location message ``` 服务器端接收到消息输出: ``` Received vehicle location: VehicleLocationMessage{vehicleNo='粤B12345', vehicleColor=1, gpsData=GPSData@59dab773, alarmFlag=0, statusFlag=0} ``` 2)**发送车辆管控指令** - 支持区域限速、路线规划等指令(示例代码中为模拟指令,需根据实际业务扩展)。 ``` 2 Sent vehicle control command message ``` 服务器端接收到消息输出: ``` VehicleControlCommand{commandType=1, startTime=930910130648, endTime=930922130648, regionId=1001, vehicleNos=[粤B12345, 粤A88888]} ``` 3)**上报车辆静态信息** - 手动输入或读取车辆档案数据(如车牌号、VIN 码、所属企业),按`0x1600`格式发送。 ``` 3 Sent vehicle static info ``` 服务器端接收到消息输出: ``` Received message: JT809Message{msgHead=30 31 63 64 , msgId=0x1600, msgLen=90, msgSn=19, gnssCenterId=1001, version=01 00 00 , encryptFlag=0x00, encryptKey=0, crcCode=0x0176} Received vehicle static info: Plate No: 粤B12345 Plate Color: 1 Vehicle Type: 2 Company: 深圳运输有限公司 VIN: LSVHJ133022309876 ``` 4)**上报驾驶员信息** - 模拟输入驾驶员姓名、身份证号等信息,按`0x1700`格式发送。 ``` 4 Sent driver info ``` 服务器端接收到消息输出: ``` eceived message: JT809Message{msgHead=30 31 63 64 , msgId=0x1700, msgLen=104, msgSn=24, gnssCenterId=1001, version=01 00 00 , encryptFlag=0x00, encryptKey=0, crcCode=0x49C2} Received driver info: Name: 张三 ID Card: 440301198010101234 Qualification No: GD1234567890 Company: 深圳运输有限公司 ``` 5)**发送报警信息** - 选择报警类型(超速 / 疲劳驾驶),自动生成报警时间和位置,按`0x1400`格式发送。 ``` 5 Select alarm type: 1. Over speed (超速) 2. Fatigue driving (疲劳驾驶) ``` 服务器端接收到消息输出: ``` Received alarm report from client: Vehicle: 粤B12345 Alarm Type: Over speed Time: Mon May 19 14:57:28 CST 2025 Location: 116.404269,39.915378 Speed: 120km/h Sent alarm result to client: AlarmResult[车牌:粤B12345, 类型:1, 时间:2025-05-19 14:57:28, 结果类型:2] ``` - 服务端接收到报警后,会返回处理结果(警告 / 处罚)。 ``` Received alarm result from server: Vehicle: 粤B12345 Alarm Type: Over speed Result: Penalty Description: 已记录违章 ``` 6)**上报车辆运营数据** - 自动生成日 / 月 / 年统计数据(里程、油耗、违规次数),按`0x1800`格式发送。 ``` 6 Sent monthly operation data: VehicleOperationData{vehicleNo='沪D24680', vehicleColor=5, periodType=2, startTime='250501', endTime='250519', operationMileage=4135, violationCount=2, fuelConsumption=860} Sent daily operation data: VehicleOperationData{vehicleNo='沪D24680', vehicleColor=5, periodType=1, startTime='250519', endTime='250519', operationMileage=232, violationCount=0, fuelConsumption=43} ``` 服务器端接收到消息输出: ``` Received vehicle operation data: Vehicle: 沪D24680 Period: Monthly (250501 to 250519) Mileage: 4135 km Violations: 2 Fuel Consumption: 860 L Received message: JT809Message{msgHead=30 31 63 64 , msgId=0x1800, msgLen=51, msgSn=34, gnssCenterId=1001, version=01 00 00 , encryptFlag=0x00, encryptKey=0, crcCode=0xEE5D} Received vehicle operation data: Vehicle: 沪D24680 Period: Daily (250519 to 250519) Mileage: 232 km Violations: 0 Fuel Consumption: 43 L ``` 7)**上报企业统计信息** - 模拟企业车辆总数、在线率、合规率等数据,按`0x1900`格式发送。 ``` 7 Sent company statistics info: CompanyStatisticsInfo{companyId='LOGIS002', companyName='广州物流集团(250519统计)', totalVehicles=242, onlineVehicles=186, totalDrivers=293, complianceRate=0.8772268} ``` 服务器端接收到消息输出: ``` Received message: JT809Message{msgHead=30 31 63 64 , msgId=0x1900, msgLen=227, msgSn=38, gnssCenterId=1001, version=01 00 00 , encryptFlag=0x00, encryptKey=0, crcCode=0xD909} Received company statistics info: Company: 广州物流集团(250519统计) (LOGIS002) Vehicles: 186/242 online Drivers: 293 Compliance Rate: 87.72269% ``` 8)**注销并退出** - 发送注销请求(`0x1003`),断开与服务端的连接。 ``` 8 Sent logout request Client shutdown ``` 服务器端接收到消息输出: ``` Received logout request from platform: test_compan Connection closed for client: /127.0.0.1:65321 ``` ### 4. 关键功能说明 #### **(1) 心跳机制** - 客户端和服务端均会定时发送心跳包(`0x1005`),维持 TCP 长连接。 - 若超过一定时间未收到心跳(需自定义超时逻辑),系统自动断开连接并尝试重连。 #### **(2) 数据加密** - 在`JT809Message`中可通过`ENCRYPT_FLAG`字段配置加密方式(RSA/AES),需在`LoginRequest`中声明加密类型。 - 示例代码中未实现具体加密逻辑,实际使用时需在`JT809Utils`中补充加密 / 解密方法。 #### **(3) 异常处理** - 服务端和客户端均包含 CRC 校验(`verifyCrc()`方法),对校验失败的消息直接丢弃。 - 连接中断时,客户端自动尝试重连;服务端关闭空闲连接并释放资源。 通过以上步骤,用户可快速搭建基于 JT809 协议的车辆监控数据交换系统,实现监管平台与企业平台之间的实时通信和数据共享。实际应用中需根据业务需求完善加密逻辑、数据存储和可视化展示功能。 ## 五、消息交互流程 1. **建立连接** - 客户端发送登录请求(0x1001) - 服务端响应登录结果(0x1002) 2. **数据交换** - 客户端定期发送心跳(0x1005) - 客户端模拟发送各类业务数据 - 服务端接收并处理各类消息 3. **统计分析数据** - 客户端菜单选择6发送车辆运营数据 - 客户端菜单选择7发送企业统计信息 - 服务端接收后打印详细统计信息 4. **终止连接** - 客户端发送注销请求(0x1003) - 关闭TCP连接 ## 六、使用注意事项 1. 服务端默认运行在8000端口 2. 客户端配置的服务端地址为localhost 3. 测试用户:test_company/password123 4. 所有时间字段均使用YYMMDD格式 5. 模拟数据范围可根据实际需求调整 javac -d target/classes src/main/java/site/isscloud/jt809/*.java mvn clean package java -jar target/jt809-console-1.0-SNAPSHOT-server.jar java -jar target/jt809-console-1.0-SNAPSHOT-client.jar