Skip to content

Commit

Permalink
计价器部分协议
Browse files Browse the repository at this point in the history
  • Loading branch information
yedajiang44 committed Aug 19, 2023
1 parent f6fbbc1 commit 176f9d8
Show file tree
Hide file tree
Showing 30 changed files with 4,850 additions and 106 deletions.
161 changes: 85 additions & 76 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,53 +1,53 @@
# JT905协议
# JT905 协议

[![MIT Licence](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SmallChi/JT905/blob/main/LICENSE)![.NET Core](https://github.com/SmallChi/JT905/workflows/.NET%20Core/badge.svg?branch=main)

## 前提条件

1. 掌握进制转换:二进制转十六进制;
2. 掌握BCD编码、Hex编码
2. 掌握 BCD 编码、Hex 编码
3. 掌握各种位移、异或;
4. 掌握常用反射;
5. 掌握JObject的用法
6. 掌握快速ctrl+c、ctrl+v;
7. 掌握Span\<T\>的基本用法
5. 掌握 JObject 的用法
6. 掌握快速 ctrl+c、ctrl+v;
7. 掌握 Span\<T\>的基本用法
8. 掌握以上装逼技能,就可以开始搬砖了。

## JT905数据结构解析
## JT905 数据结构解析

### 数据包[JT905Package]

| 头标识 | 数据头 | 数据体 | 校验码 | 尾标识 |
| :----: | :---------: | :---------: | :----------: | :----: |
| Begin | JT905Header | JT905Bodies |CheckCode | End |
| 7E | - | - | - | 7E |
| 头标识 | 数据头 | 数据体 | 校验码 | 尾标识 |
| :----: | :---------: | :---------: | :-------: | :----: |
| Begin | JT905Header | JT905Bodies | CheckCode | End |
| 7E | - | - | - | 7E |

### 数据头[JT905Header]

| 消息ID | 消息体长度 | ISU标识 | 消息流水号 |
| :---: | :---: | :---: |:---: |
| MsgId | DataLength | ISU | MsgNum |
| 消息 ID | 消息体长度 | ISU 标识 | 消息流水号 |
| :-----: | :--------: | :------: | :--------: |
| MsgId | DataLength | ISU | MsgNum |

#### 消息体属性[JT905Bodies]

> 根据对应消息ID:MsgId
> 根据对应消息 ID:MsgId
***注意:数据内容(除去头和尾标识)进行转义判断***
**_注意:数据内容(除去头和尾标识)进行转义判断_**

转义规则如下:

1. 若数据内容中有出现字符 0x7e 的,需替换为字符 0x7d 紧跟字符 0x02;
2. 若数据内容中有出现字符 0x7d 的,需替换为字符 0x7d 紧跟字符 0x01;

反转义的原因:确认JT905协议的TCP消息边界
反转义的原因:确认 JT905 协议的 TCP 消息边界

### 举个栗子1
### 举个栗子 1

#### 1.组包:

> MsgId 0x0200:位置信息汇报
``` csharp
```csharp

JT905Package JT905Package = new JT905Package();

Expand Down Expand Up @@ -92,7 +92,7 @@ var hex = data.ToHexString();

#### 2.手动解包:

``` csharp
```csharp
1.原包:
7E 02 00 00 23 10 34 56 78 90 12 00 (7D 02) 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 3C 00 21 10 15 21 10 10 01 04 00 00 00 64 02 02 00 (7D 01) 34 7E

Expand Down Expand Up @@ -127,7 +127,7 @@ var hex = data.ToHexString();

#### 3.程序解包:

``` csharp
```csharp
//1.转成byte数组
byte[] bytes = "7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E".ToHexBytes();

Expand Down Expand Up @@ -155,66 +155,75 @@ Assert.Equal(100, ((JT905_0x0200_0x01)jT905_0x0200.BasicLocationAttachData[JT905
Assert.Equal(125, ((JT905_0x0200_0x02)jT905_0x0200.BasicLocationAttachData[JT905Constants.JT905_0x0200_0x02]).Oil);
```

## NuGet安装
## NuGet 安装

| Package Name| Version| Preview Version |Downloads|Remark|
| --- | --- | --- | ---| --- |
| Install-Package JT905 | ![JT905](https://img.shields.io/nuget/v/JT905.svg) | ![JT905](https://img.shields.io/nuget/vpre/JT905.svg)|![JT905](https://img.shields.io/nuget/dt/JT905.svg) |JT905|
| Package Name | Version | Preview Version | Downloads | Remark |
| --------------------- | -------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------------- | ------ |
| Install-Package JT905 | ![JT905](https://img.shields.io/nuget/v/JT905.svg) | ![JT905](https://img.shields.io/nuget/vpre/JT905.svg) | ![JT905](https://img.shields.io/nuget/dt/JT905.svg) | JT905 |

## 使用BenchmarkDotNet性能测试报告(只是玩玩,不能当真)
## 使用 BenchmarkDotNet 性能测试报告(只是玩玩,不能当真)

> todo:

## JT905终端通讯协议消息对照表

| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |
| :---: | :---: | :---: | :---: | :--- |
|1 |0x0001 |||ISU通用应答 |
|2 |0x8001 |||中心通用应答 |
|3 |0x0002 |||ISU心跳 |
|4 |0x8103 |||设置参数 |
|5 |0x8104 |||查询ISU参数 |
|6 |0x0104 |||查询ISU参数应答 |
|7 |0x8105 |||ISU控制 |
|8 |0x0105 |||ISU升级结果报告消息 |
|9 |0x0200 |||位置信息汇报 |
|10 |0x8201 |||位置信息查询 |
|11 |0x0201 |||位置信息查询应答 |
|12 |0x8202 |||位置跟踪控制 |
|13 |0x0202 |||位置跟踪信息汇报 |
|14 |0x0203 |||位置汇汇报数据补传 |
|15 |0x8300 |||文本信息下发 |
|16 |0x8301 |||事件设置 |
|17 |0x0301 |||事件报告 |
|18 |0x8302 |||提问下发 |
|19 |0x0302 |||提问应答 |
|20 |0x8400 |||电话回拨 |
|21 |0x8401 |||设置电话本 |
|22 |0x8500 |||车辆控制 |
|23 |0x0500 |||车辆控制应答 |
|24 |0x0800 |||摄像头图像上传 |
|25 |0x8801 |||摄像头立即拍摄命令 |
|26 |0x8802 |||存储图像检索 |
|27 |0x0802 |||存储图像检索应答 |
|28 |0x8803 |||存储图像/音视频上传命令 |
|29 |0x8B00 |||订单任务下发 |
|30 |0x8B01 |||下发抢答结果信息 |
|31 |0x0B01 |||驾驶员抢答 |
|32 |0x0B07 |||驾驶员电召任务完成确认 |
|33 |0x0B08 |||驾驶员取消订单 |
|34 |0x8B09 |||中心取消订单 |
|35 |0x0B03 |||上班签到信息上传 |
|36 |0x0B04 |||下班签退信息上传 |
|37 |0x0B05 |||运营数据上传 |
|38 |0x8B10 |||外围设备指令下行透传 |
|39 |0x0B10 |||外围设备指令上行透传 |
|40 |0x8850 | | |音频检索 |
|41 |0x0805 | | |存储音频检索应答 |
|42 |0x0806 | | |音频上传 |
|43 |0x8B0A |||中心报警确认 |
|44 |0x8B0B |||中心报警解除 |
|45 |0x8B11 |||中心巡检设备 |
|46 |0x0B11 | | |设备巡检应答 |
## JT905 终端通讯协议消息对照表

| 序号 | 消息 ID | 完成情况 | 测试情况 | 消息体名称 |
| :--: | :-----: | :------: | :------: | :---------------------- |
| 1 | 0x0001 ||| ISU 通用应答 |
| 2 | 0x8001 ||| 中心通用应答 |
| 3 | 0x0002 ||| ISU 心跳 |
| 4 | 0x8103 ||| 设置参数 |
| 5 | 0x8104 ||| 查询 ISU 参数 |
| 6 | 0x0104 ||| 查询 ISU 参数应答 |
| 7 | 0x8105 ||| ISU 控制 |
| 8 | 0x0105 ||| ISU 升级结果报告消息 |
| 9 | 0x0200 ||| 位置信息汇报 |
| 10 | 0x8201 ||| 位置信息查询 |
| 11 | 0x0201 ||| 位置信息查询应答 |
| 12 | 0x8202 ||| 位置跟踪控制 |
| 13 | 0x0202 ||| 位置跟踪信息汇报 |
| 14 | 0x0203 ||| 位置汇汇报数据补传 |
| 15 | 0x8300 ||| 文本信息下发 |
| 16 | 0x8301 ||| 事件设置 |
| 17 | 0x0301 ||| 事件报告 |
| 18 | 0x8302 ||| 提问下发 |
| 19 | 0x0302 ||| 提问应答 |
| 20 | 0x8400 ||| 电话回拨 |
| 21 | 0x8401 ||| 设置电话本 |
| 22 | 0x8500 ||| 车辆控制 |
| 23 | 0x0500 ||| 车辆控制应答 |
| 24 | 0x0800 ||| 摄像头图像上传 |
| 25 | 0x8801 ||| 摄像头立即拍摄命令 |
| 26 | 0x8802 ||| 存储图像检索 |
| 27 | 0x0802 ||| 存储图像检索应答 |
| 28 | 0x8803 ||| 存储图像/音视频上传命令 |
| 29 | 0x8B00 ||| 订单任务下发 |
| 30 | 0x8B01 ||| 下发抢答结果信息 |
| 31 | 0x0B01 ||| 驾驶员抢答 |
| 32 | 0x0B07 ||| 驾驶员电召任务完成确认 |
| 33 | 0x0B08 ||| 驾驶员取消订单 |
| 34 | 0x8B09 ||| 中心取消订单 |
| 35 | 0x0B03 ||| 上班签到信息上传 |
| 36 | 0x0B04 ||| 下班签退信息上传 |
| 37 | 0x0B05 ||| 运营数据上传 |
| 38 | 0x8B10 ||| 外围设备指令下行透传 |
| 39 | 0x0B10 ||| 外围设备指令上行透传 |
| 40 | 0x8850 | | | 音频检索 |
| 41 | 0x0805 | | | 存储音频检索应答 |
| 42 | 0x0806 | | | 音频上传 |
| 43 | 0x8B0A ||| 中心报警确认 |
| 44 | 0x8B0B ||| 中心报警解除 |
| 45 | 0x8B11 ||| 中心巡检设备 |
| 46 | 0x0B11 | | | 设备巡检应答 |

> todo:
## 串口数据解析

### 计价器数据解析

以营运数据为例,具体使用方法详见:

- [完整串口营运数据解析](src/JT905.Protocol.Test/SerialPort/Taximeter_0x00E8_Up_Test.cs#L43)
- [营运数据解析](src/JT905.Protocol.Test/SerialPort/Taximeter_0x00E8_Up_Test.cs#L90)
- [完整设备营运数据解析](src/JT905.Protocol.Test/SerialPort/Taximeter_0x00E8_Up_Test.cs#L111)
56 changes: 35 additions & 21 deletions src/JT905.Protocol.Test/MessageBody/JT905_0x0B05_Test.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
using JT905.Protocol.Extensions;
using System;
using JT905.Protocol.Extensions;
using JT905.Protocol.Internal;
using JT905.Protocol.MessageBody;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JT905.Protocol.SerialPort;
using JT905.Protocol.SerialPort.Taximeter;
using Xunit;

namespace JT905.Protocol.Test.MessageBody
Expand All @@ -29,23 +27,24 @@ public JT905_0x0B05_Test()
[Fact]
public void Test1_Serialize()
{
JT905.Protocol.JT905Package package = new JT905Package {
JT905Package package = new()
{
Header = new JT905Header
{
MsgId = Enums.JT905MsgId.运营数据上传.ToUInt16Value(),
ManualMsgNum = 0,
ISU = "108000000316",
},
Bodies = new JT905_0x0B05() {
Bodies = new JT905_0x0B05()
{
LdlingHeavyPosition = new JT905_0x0200(),
HeavyLdlingPosition = new JT905_0x0200(),
OperationId = 1,
EvaluateId = 1,
EvaluateOptions = 0x00,
ExtEvaluateOptions = 1,
CallingId = 1,
TaximeterData = new byte[] { 1,3,4,1,6},

TaximeterData = new byte[] { 1, 3, 4, 1, 6 },
}
};
var _0x0B05Hex = JT905Serializer.Serialize(package).ToHexString();
Expand All @@ -55,11 +54,11 @@ public void Test1_Serialize()
}

[Fact]
public void Test2() {
public void Test2()
{
var hex = "7E0B050046108000000316000000000000000000000000000000000000000000010101000000000000000000000000000000000000000000000101010000000000000100000001000001000000010103040106CC7E".ToHexBytes();

string _0x0B05Json = JT905Serializer.Analyze(hex, options: JTJsonWriterOptions.Instance);

}

[Fact]
Expand All @@ -73,12 +72,27 @@ public void Test3()
Assert.NotNull(jT905Package.Bodies);
}





[Theory]
[InlineData("7E0B05008310190019851300D90000000000000100011E8A720450B1360000B22307261941340000000000000300011E8A720450B1360000B223072619414335F53A400000000000000100000000414133333333000000000000000000000000000000003432313038333139383830393036303131580023072619411941000001056700000000000000800000000C00927E")]
public void Test4(string hex)
{
var jT905Package = JT905Serializer.Deserialize<JT905Package>(hex.ToHexBytes());
var serialPortSerializer = new SerialPortSerializer();
var _0x00E8_Down = serialPortSerializer.Deserialize<Taximeter_0x00E8_Up>((jT905Package.Bodies as JT905_0x0B05).TaximeterData);
Assert.NotNull(_0x00E8_Down);
Assert.Equal(0, _0x00E8_Down.AdditionalFee);
Assert.Equal(8, _0x00E8_Down.Amount);
Assert.Equal(DateTime.Parse("2023/7/26 19:41:00"), _0x00E8_Down.BeginDateTime);
Assert.Equal(56.7M, _0x00E8_Down.EmptyDrive);
Assert.Equal(TimeOnly.Parse("19:41:00"), _0x00E8_Down.EndTime);
Assert.Empty(_0x00E8_Down.IntegrationOfTransportationCard);
Assert.Equal("", _0x00E8_Down.License);
Assert.Equal("AA3333", _0x00E8_Down.LicensePlate);
Assert.Equal(0.1M, _0x00E8_Down.Mileage);
Assert.Equal("42108319880906011X", _0x00E8_Down.QualificationCertificate);
Assert.Equal(12M, _0x00E8_Down.Section);
Assert.Equal(0, _0x00E8_Down.TradeType);
Assert.Equal(TimeSpan.Parse("00:00:00"), _0x00E8_Down.WaitTime);
}
}
}



}
10 changes: 10 additions & 0 deletions src/JT905.Protocol.Test/SerialPort/BaseTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using JT905.Protocol.Internal;
using JT905.Protocol.SerialPort;

namespace JT905.Protocol.Test.SerialPort;

public class BaseTest
{
protected JT905Serializer jt905Serializer = new(new DefaultGlobalConfig());
protected readonly SerialPortSerializer serializer = new();
}
45 changes: 45 additions & 0 deletions src/JT905.Protocol.Test/SerialPort/Taximeter_0x0000_Down_Test.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System;
using JT905.Protocol.Extensions;
using JT905.Protocol.SerialPort;
using JT905.Protocol.SerialPort.Taximeter;
using Xunit;

namespace JT905.Protocol.Test.SerialPort;

public class Taximeter_0x0000_Down_Test : BaseTest
{
[Theory]
[InlineData("55AA000B02000000201111111111112955AA")]
public void Test1(string hex)
{
var package = new SerialPortPackage
{
Device = 2,
ManufacturerIdentify = 0,
Body = new Taximeter_0x0000_Down
{
DateTime = DateTime.Parse("2011-11-11 11:11:11")
}
};
var data = serializer.Serialize(package);
Assert.Equal(hex, data.ToHexString());
}

[Theory]
[InlineData("55AA000B02000000201111111111112955AA")]
public void Test2(string hex)
{
var package = serializer.Deserialize(hex.ToHexBytes(), IBody.Types.Down);
Assert.NotNull(package);
Assert.Equal(11, package.Length);
Assert.Equal(2, package.Device);
Assert.Equal(0, package.ManufacturerIdentify);
Assert.Equal(0, package.MessageId);
var body = package.Body;
Assert.NotNull(body);
Assert.IsType<Taximeter_0x0000_Down>(body);
var _0X0000_Down = body as Taximeter_0x0000_Down;
Assert.Equal(DateTime.Parse("2011-11-11 11:11:11"), _0X0000_Down.DateTime);
Assert.Equal(0x29, package.CheckCode);
}
}
Loading

0 comments on commit 176f9d8

Please sign in to comment.