From cba004d9ff736ba0568c9d4c0dfac80d9df015a3 Mon Sep 17 00:00:00 2001 From: SmallChi <564952747@qq.com> Date: Sun, 7 Oct 2018 20:32:35 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E6=8A=A5=E8=AD=A6=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8F=8A=E8=BD=A6=E8=BE=86=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E7=A9=BA=E9=97=B4;=202.=E6=95=B4=E7=90=86?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E6=96=B9=E6=B3=95=203.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 79 +- .../JT809BinaryExtensionsTest.cs | 2 +- src/JT809.Protocol/JT809.Protocol.csproj | 3 +- src/JT809.Protocol/JT809.Protocol.xml | 2358 ----------------- src/JT809.Protocol/JT809Enums/JT808_Alarm.cs | 2 +- src/JT809.Protocol/JT809Enums/JT808_Status.cs | 2 +- .../JT809Extensions/JT809BinaryExtensions.cs | 74 - .../JT809Extensions/JT809HexExtensions.cs | 4 +- .../JT809Extensions/JT809StringExtensions.cs | 70 + 9 files changed, 116 insertions(+), 2478 deletions(-) delete mode 100644 src/JT809.Protocol/JT809.Protocol.xml create mode 100644 src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs diff --git a/README.md b/README.md index 931ec15..36154c3 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,11 @@ # JT809协议 -## 瞎逼逼: +## 瞎逼逼 -> 该JT809协议是参考[MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)一款二进制序列化器,借鉴其思想,不得不说站在巨人的肩膀上搬砖就是爽歪歪。 - -> 在github上面搜索竟然没有针对.NET开源的809协议库,难道做GPS行业的.NET很少人吗?可能是藏着,掖着<( ̄3 ̄)> <( ̄3 ̄)> <( ̄3 ̄)> 。 - -> 不得不说这GB的文档,太坑了。。。 - -> 现在有了[JT808](https://github.com/SmallChi/GPSPlatform/blob/master/JT808.md)的基础,对JT809就只剩搬砖了。 +1. 该JT809协议是参考[MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)一款二进制序列化器,借鉴其思想,不得不说站在巨人的肩膀上搬砖就是爽歪歪。 +2. 搜索了很多资源没有针对.NET开源的809协议库,难道做GPS行业的.NET很少人吗?可能是藏着,掖着<( ̄3 ̄)> <( ̄3 ̄)> <( ̄3 ̄)> 。 +3. 不得不说这GB的文档,太坑了。。。 +4. 现在有了[JT808](https://github.com/SmallChi/GPSPlatform/blob/master/JT808.md)的基础,对JT809就只剩搬砖了。 ## 前提条件 @@ -22,6 +19,7 @@ ## JT809数据结构解析 ### 数据包[JT809Package] + |头标识|数据头|数据体|CRC校验码|尾标识 |:------:|:------:|:------:|:------:|:------:| | BeginFlag | JT809Header | JT809Bodies | CRCCode | EndFlag | @@ -48,6 +46,7 @@ ***注意:数据内容(除去头和尾标识)进行转义判断*** 转义规则如下: + 1. 若数据内容中有出现字符 0x5b 的,需替换为字符 0x5a 紧跟字符 0x01; 2. 若数据内容中有出现字符 0x5a 的,需替换为字符 0x5a 紧跟字符 0x02; 3. 若数据内容中有出现字符 0x5d 的,需替换为字符 0x5e 紧跟字符 0x01; @@ -57,11 +56,12 @@ ### 举个栗子 -1. 组包: +#### 1.组包: + > 业务数据类型 MsgID:从链路报警信息交互消息 > 子业务类型标识 SubBusinessType:报警督办请求消息 -``` +``` code JT809Package jT809Package = new JT809Package(); jT809Package.Header = new JT809Header @@ -104,8 +104,9 @@ string hex = data.ToHexString(); // 5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D ``` -2. 手动解包: -``` +#### 2.手动解包: + +``` data 1.原包: 5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 (5A 01) AC 3F 40 12 3F FA A1 00 00 00 00 (5A 01) AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D @@ -143,8 +144,9 @@ BA D8 --CRC校验码 5D --尾标识 ``` -3. 程序解包: -``` +#### 3.程序解包: + +``` data //1.转成byte数组 var bytes = "5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D".ToHexBytes(); @@ -188,32 +190,30 @@ Install-Package JT809 ## 使用BenchmarkDotNet性能测试报告(只是玩玩,不能当真) ``` ini -BenchmarkDotNet=v0.11.1, OS=Windows 7 SP1 (6.1.7601.0) -Intel Core i5-5200U CPU 2.20GHz (Max: 2.18GHz) (Broadwell), 1 CPU, 4 logical and 2 physical cores -Frequency=2143505 Hz, Resolution=466.5256 ns, Timer=TSC -.NET Core SDK=2.1.401 - [Host] : .NET Core 2.1.2 (CoreCLR 4.6.26628.05, CoreFX 4.6.26629.01), 64bit RyuJIT - Job-VCXLHD : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3133.0 - Job-WATJMQ : .NET Core 2.1.2 (CoreCLR 4.6.26628.05, CoreFX 4.6.26629.01), 64bit RyuJIT - -Platform=AnyCpu Server=True - +BenchmarkDotNet=v0.11.1, OS=Windows 10.0.17134.228 (1803/April2018Update/Redstone4) +Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores +.NET Core SDK=2.1.402 + [Host] : .NET Core 2.1.4 (CoreCLR 4.6.26814.03, CoreFX 4.6.26814.02), 64bit RyuJIT + Job-FMFELU : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3132.0 + Job-TADNYV : .NET Core 2.1.4 (CoreCLR 4.6.26814.03, CoreFX 4.6.26814.02), 64bit RyuJIT + +Platform=AnyCpu Server=True ``` -| Method | Runtime | Toolchain | N | Mean | Error | StdDev | Median | Gen 0 | Allocated | -|---------------------------------------- |-------- |-------------- |------- |-------------:|------------:|------------:|-------------:|------------:|-------------:| -| **JT809_0x9400_0x9401_Package_Deserialize** | **Clr** | **Default** | **100** | **6.023 ms** | **0.1358 ms** | **0.3939 ms** | **5.890 ms** | **-** | **520 KB** | -| JT809_0x9400_0x9401_Package_Serialize | Clr | Default | 100 | 7.548 ms | 0.1737 ms | 0.5067 ms | 7.479 ms | - | 536 KB | -| JT809_0x9400_0x9401_Package_Deserialize | Core | .NET Core 2.1 | 100 | 4.405 ms | 0.0874 ms | 0.2332 ms | 4.372 ms | 23.4375 | 465.18 KB | -| JT809_0x9400_0x9401_Package_Serialize | Core | .NET Core 2.1 | 100 | 5.178 ms | 0.1031 ms | 0.2107 ms | 5.131 ms | 23.4375 | 466.74 KB | -| **JT809_0x9400_0x9401_Package_Deserialize** | **Clr** | **Default** | **10000** | **569.689 ms** | **11.3421 ms** | **28.0348 ms** | **560.844 ms** | **33000.0000** | **50755.41 KB** | -| JT809_0x9400_0x9401_Package_Serialize | Clr | Default | 10000 | 709.679 ms | 14.0759 ms | 32.0580 ms | 705.015 ms | 34000.0000 | 52365.04 KB | -| JT809_0x9400_0x9401_Package_Deserialize | Core | .NET Core 2.1 | 10000 | 435.974 ms | 8.6721 ms | 23.2971 ms | 432.058 ms | 2000.0000 | 46516.3 KB | -| JT809_0x9400_0x9401_Package_Serialize | Core | .NET Core 2.1 | 10000 | 559.733 ms | 16.1688 ms | 46.3913 ms | 552.344 ms | 2000.0000 | 46672.55 KB | -| **JT809_0x9400_0x9401_Package_Deserialize** | **Clr** | **Default** | **100000** | **6,167.859 ms** | **182.6382 ms** | **512.1372 ms** | **6,133.157 ms** | **330000.0000** | **507097.91 KB** | -| JT809_0x9400_0x9401_Package_Serialize | Clr | Default | 100000 | 7,558.213 ms | 179.7646 ms | 518.6620 ms | 7,478.251 ms | 340000.0000 | 523420.85 KB | -| JT809_0x9400_0x9401_Package_Deserialize | Core | .NET Core 2.1 | 100000 | 5,064.515 ms | 179.1875 ms | 511.2320 ms | 4,932.761 ms | 27000.0000 | 465045.28 KB | -| JT809_0x9400_0x9401_Package_Serialize | Core | .NET Core 2.1 | 100000 | 5,108.023 ms | 99.7554 ms | 126.1587 ms | 5,071.244 ms | 26000.0000 | 466693.55 KB | +| Method | Runtime | Toolchain | N | Mean | Error | StdDev | Gen 0 | Allocated | +|---------------------------------------- |-------- |-------------- |------- |-------------:|-----------:|-----------:|-----------:|-------------:| +| **JT809_0x9400_0x9401_Package_Deserialize** | **Clr** | **Default** | **100** | **3.274 ms** | **0.0603 ms** | **0.0535 ms** | **82.0313** | **507.41 KB** | +| JT809_0x9400_0x9401_Package_Serialize | Clr | Default | 100 | 3.863 ms | 0.0314 ms | 0.0293 ms | 82.0313 | 522.64 KB | +| JT809_0x9400_0x9401_Package_Deserialize | Core | .NET Core 2.1 | 100 | 2.445 ms | 0.0402 ms | 0.0376 ms | - | 464.89 KB | +| JT809_0x9400_0x9401_Package_Serialize | Core | .NET Core 2.1 | 100 | 2.789 ms | 0.0326 ms | 0.0272 ms | - | 466.45 KB | +| **JT809_0x9400_0x9401_Package_Deserialize** | **Clr** | **Default** | **10000** | **329.457 ms** | **1.6247 ms** | **1.2685 ms** | **8000.0000** | **50808.81 KB** | +| JT809_0x9400_0x9401_Package_Serialize | Clr | Default | 10000 | 386.584 ms | 2.2065 ms | 1.9560 ms | 8000.0000 | 52296.78 KB | +| JT809_0x9400_0x9401_Package_Deserialize | Core | .NET Core 2.1 | 10000 | 239.150 ms | 1.6893 ms | 1.4975 ms | - | 46495.02 KB | +| JT809_0x9400_0x9401_Package_Serialize | Core | .NET Core 2.1 | 10000 | 275.206 ms | 2.5906 ms | 2.4233 ms | - | 46651.27 KB | +| **JT809_0x9400_0x9401_Package_Deserialize** | **Clr** | **Default** | **100000** | **3,253.840 ms** | **9.0636 ms** | **8.4781 ms** | **82000.0000** | **507671.31 KB** | +| JT809_0x9400_0x9401_Package_Serialize | Clr | Default | 100000 | 4,070.297 ms | 79.1599 ms | 94.2342 ms | 85000.0000 | 522556.27 KB | +| JT809_0x9400_0x9401_Package_Deserialize | Core | .NET Core 2.1 | 100000 | 2,425.372 ms | 37.3067 ms | 34.8967 ms | 2000.0000 | 464875.67 KB | +| JT809_0x9400_0x9401_Package_Serialize | Core | .NET Core 2.1 | 100000 | 2,823.721 ms | 42.6518 ms | 39.8965 ms | 2000.0000 | 466438.17 KB | ## JT809协议消息对照表 @@ -363,5 +363,4 @@ Platform=AnyCpu Server=True |序号|消息ID|完成情况|消息体名称| |:------:|:------:|:------:|:------:| | 1 | 0x9600 | √ | 从链路静态信息交换消息 | -| 2 | 0x9601 | √ | 补报车辆静态信息应答 | - +| 2 | 0x9601 | √ | 补报车辆静态信息应答 | \ No newline at end of file diff --git a/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs b/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs index ec7e6e1..ff004a5 100644 --- a/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs +++ b/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs @@ -1,4 +1,4 @@ -using JT809.Protocol.Enums; +using JT809.Protocol.JT809Enums; using JT809.Protocol.JT809Extensions; using System; using System.Collections.Generic; diff --git a/src/JT809.Protocol/JT809.Protocol.csproj b/src/JT809.Protocol/JT809.Protocol.csproj index 5751b72..100b51f 100644 --- a/src/JT809.Protocol/JT809.Protocol.csproj +++ b/src/JT809.Protocol/JT809.Protocol.csproj @@ -14,6 +14,7 @@ https://github.com/SmallChi/JT809 https://github.com/SmallChi/JT809/blob/master/LICENSE true + 1.0.1 @@ -24,7 +25,7 @@ true - E:\koike\My Project\JT809\src\JT809.Protocol\JT809.Protocol.xml + 1701;1702;1591 diff --git a/src/JT809.Protocol/JT809.Protocol.xml b/src/JT809.Protocol/JT809.Protocol.xml deleted file mode 100644 index 4be79f6..0000000 --- a/src/JT809.Protocol/JT809.Protocol.xml +++ /dev/null @@ -1,2358 +0,0 @@ - - - - JT809.Protocol - - - - - 车牌号 - - - - - 车辆颜色 - - - - - 子业务类型标识 - - - - - 后续数据长度 - - - - - 子业务数据体 - - - - - JT809 异或加密解密为同一算法 - - - - - - ref:"www.codeproject.com/tips/447938/high-performance-csharp-byte-array-to-hex-string-t" - - - - - 数字编码 大端模式、高位在前 - - - - - - - - - 数字编码 小端模式、低位在前 - - - - - - - - - 数字编码 大端模式、高位在前 - - - - - - - - - - 数字编码 小端模式、低位在前 - - - - - - - - - - 字节数组字符串 - - - 默认 " " - - - - - 经纬度 - - - - - - - 从数据头到校验码前的 CRC 1 G-CCITT 的校验值,遵循人端排序方式的规定。 - - - - - - - - - 从数据头到校验码前的 CRC 1 G-CCITT 的校验值,遵循人端排序方式的规定。 - - - - - - - - - 日期限制于2000年 - - - - - - - - - D2: 10 X2:16 - - - - - - - - - D2: 10 X2:16 - - - - - - - - - - BCD:10 HEX:16 - - - - - - - - - - BCD:10 HEX:16 - - - - - values for '\0' to 'f' where 255 indicates invalid input character - starting from '\0' and not from '0' costs 48 bytes - but results 0 subtructions and less if conditions - - - - - same as above but valid values are multiplied by 16 - - - - - 16进制字符串转16进制数组 - - - - - - - - 16进制字符串转16进制数组 - - - - - - - hexIndicator: use prefix ("0x") or not - - - - - - - - 枚举扩展 - - - - - 转为整型 - - - - - - - - 转为Byte - - - - - - - - 转为整型 - - - - - - - - 字符转枚举 - - - - - - - - 获取枚举字符串 - - - - - - 获取DescriptionAttribute特性枚举值的描述 - - - - - - - 验证是否是枚举类型 - - - - - - - - 获取DescriptionAttribute特性枚举及描述 - - - - - - - 获取DisplayNameAttribute特性枚举值的描述 - - 枚举值 - - - - - 获取DisplayNameAttribute特性枚举及描述 - - - - - - - 获取枚举对应特性 - - - - - - - - 根据值获取对应枚举类型集合 - - 具体枚举类型 - 枚举值 - 位数(8,16,32) - - - - - 根据值获取对应枚举类型集合 - - 具体枚举类型 - 枚举值 - 位数(8,16,32) - 是否忽略未知数据 - - - - - - ref http://adamsitnik.com/Span/#span-must-not-be-a-generic-type-argument - ref http://adamsitnik.com/Span/ - ref MessagePack.Formatters.DynamicObjectTypeFallbackFormatter - - - - - 固定为22个字节长度 - MSG LENGTH + MSG_SN + MSG_ID + MSG_GNSSCENTERID + VERSION_FLAG + ENCRYPT_FLAG + ENCRYPT_KEY - 4 + 4 + 2 + 4 + 3 + 1 + 4 = 22 - - - - - 数据长度(包括头标识、数据头、数据体和尾标识) - 头标识 + 数据头 + 数据体 + 尾标识 - 1 + 22 + n + 1 - - - - - 报文序列号 a - - - - - 业务数据类型 - - - - - 下级平台接入码,上级平台给下级平台分配唯一标识码。 - - - - - 协议版本号标识,上下级平台之间采用的标准协议版 - 编号;长度为 3 个字节来表示,0x01 0x02 0x0F 标识 - 的版本号是 v1.2.15,以此类推。 - - - - - 报文加密标识位 b: 0 表示报文不加密,1 表示报文加密。 - - - - - 数据加密的密匙,长度为 4 个字节 - - - - - 报文加密标识位 b: 0 表示报文不加密,1 表示报文加密。 - - - - - 默认1.0.0版本 - - - - - 主链路登录请求消息 - 链路类型:主链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识: UP-CONNECT-REQ - 描述:下级平台向上级平台发送用户名和密码等登录信息 - - - - - 用户名 - - - - - 密码 - 8位 - - - - - 下级平台提供对应的从链路服务端 IP 地址 - 32位 - - - - - 下级平台提供对应的从链路服务器端口号 - - - - - 主链路登录应答消息 - 链路类型:主链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:UP_CONNCCT_RSP - 描述:上级平台对下级平台登录请求信息、进行安全验证后,返回相应的验证结果。 - - - - - 验证结果,定义如下: - 0x00:成功; - 0x01:IP 地址不正确; - 0x02:接入码不正确; - 0x03:用户没用注册; - 0x04:密码错误; - 0x05:资源紧张,稍后再连接(已经占用; - 0x06:其他。 - - - - - 校验码 - - - - - 主链路注销请求消息 - 链路类型:主链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP-DISCONNECT-REQ - 描述:下级平台在中断与上级平台的主链路连接时,应向上级平台发送主链路注销请求消息。 - - - - - 用户名 - - - - - 密码 - - - - - 主链路注销应答消息 - 链路类型:主链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:UP_DISCONNECT_RSP - 描述:上级平台收到下级平台发送的主链路注销请求消息后,向下级平台返回主链路注销应答消息,并记录链路注销日志,下级平台接收到应答消息后,可中断主从链路联接。 - 主链路注销应答消息,数据体为空。 - - - - - 主链路连接保持请求消息 - 链路类型:主链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:UP_LINKTEST_RSP - 描述:上级平台收到下级平台的主链路连接保持请求消息后,向下级平台返回.主链路连接保持应答消息,保持主链路的连接状态 - 主链路连接保持应答消息,数据体为空 - - - - - 主链路连接保持应答消息 - 链路类型:主链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:UP_LINKTEST_RSP。 - 描述:上级平台收到下级平台的主链路连接保持请求消息后,向下级平台返回.主链路连接保持应答消息,保持主链路的连接状态。 - 主链路连接保持应答消息,数据体为空。 - - - - - 主链路断开通知消息 - 链路类型:从链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP_DISCONNECT_INFORM - 描述:'当主链路中断后,下级平台可通过从链路向上级平台发送本消息通知上级平台主链路中断 - 主链路连接保持应答消息,数据体为空 - 本条消息无需被通知方应答 - - - - - 错误代码 - - - - - 下级平台主动关闭主从链路通知消息 - 链路类型:从链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP_CLOSELINIC INFORM - 描述:下级平台作为服务端,发现从链路出现异常时,下级平台通过从链路向上级平台发送本消息,通知上级平台下级平台即将关闭主从链路 - - - - - 错误代码 - - - - - 主链路车辆动态信息交换业务 - 链路类型:主链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP_EXG_MSG - 描述:下级平台向上级平台发送车辆动态信息交换业务数据包 - - - - - 主链路平台间信息交互消息 - 链路类型:主链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP_PLATFORM_MSG - 描述:下级平台向上级平台发送平台间交互信息 - - - - - 主链路报警信息交互消息 - 主链路车辆报警信息业务 - 链路类型:主链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP_WARN_MSG - 描述:下级平台向上级平台发送车辆报警信息业务 - - - - - 主链路车辆监管消息 - 链路类型:主链路 - 消息方向:下级平台往上级平台 - 业务数据类型标识:UP_CTRL_MSG - 描述:下级平台向上级平台发送车辆监管业务 - - - - - 主链路静态信息交换消息 - 链路类型:主链路 - 业务数据类型标识:UP_ BASE_ MSG - 消息方向:下级平台往上级平台 - 描述:下级平台向上级平台发送车辆睁态信息交换业务 - - - - - 从链路连接请求消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_CONNECT_REQ - 描述:主链路建立连接后,上级平台向下级平台发送从链路连接清求消息,以建立从链路连接 - 下级平台在收到本息后,根据本校验码 VERIFY CODE 来实现数据的校验,校验后,则返回DOWN CONNECT RSP 消息 - - - - - 4.5.1.2 对应的校验码 - - - - - 从链路连接应答信息 - 链路类型:从链路 - 消息方问:下级平台往上级平台 - 业务数据类型标识:DOWN_CONNNECT_RSP - 描述:下级平台作为服务器端向上级平台客户端返回从链路连接应答消息,上级平台在接收到该应答消息结果后 - - - - - 验证结果 - - - - - 从链路注销请求消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_DISCONNIrCT_REQ - 描述:从链路建立后,上级平台在取消该链路时,应向下级平台发送从链路注销请求消息 - - - - - 校验码 - - - - - 从链路注销应答消息 - 链路类型:从链路 - 消息方向:下级平台往上级平台 - 业务数据类型构之识:DOWN_DISCONNECT_RSP - 描述:下级平台在收到上级平台发送的从链路注销请求消息后,返回从链路注销应答消息,记录相关日志,中断该从链路 - 从链路注销应答消息,数据体为空 - - - - - 从链路连接保持请求消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_LINKTEST_REQ - 描述:从链路建立成功后,上级平台向下级平台发送从链路连接保持请求消息,以保持从链路的连接状态 - 从链路连接保持请求消息,数据体为空 - - - - - 从链路连接保持应答消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_LINKTEST_REP - 描述:下级平台收到上级平台链路连接保持请求消息后,向上级平台返回从链路连接保持应答消息,保持从链路连接状态 - 从链路连接保持应答消息,数据体为空 - - - - - 从链路断开通知消息 - 链路类型:主链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_DISCONNECT_INFORM - 描述: - 情景 1:上级平台与下级平台的从链路中断后,重连二次仍未成功时,上级平台通过主链路发送本消息给下级平台。 - 情景 2:上级平台作为客户端向下级平台登录时,根据之前收到的 IP 地址及端口无法连接到下级平台服务端时发送本消息通知下级平台。 - - 本条消息无需被通知方应答 - - - - - 错误代码 - - - - - 上级平台主动关闭链路通知消息 - 业务数据类型标识:DOWN_CLOSELINK_INFORM - - - - - 错误代码 - - - - - 接收车辆定位信息数量通知消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务类型标识: DOWN_TOTAL_RECV_BACK_MSG - 描述:上级平台向下级平台定星通知已经收到下级平台上传的车辆定位信息数量(如:每收到10,000 条车辆定位信息通知一次) - 本条消息不需下级平台应答。 - - - - - START_TIME_END_TIME共收到的车辆定位信息数量 - - - - - 开始时间,用 UTC 时间表示 - 注:采用 UTC 时间表示,如 2010-1-10 9:7:54 的 UTC 值为 1263085674,其在协议中表示为0x000000004B49286A. - - - - - 结束时间,用 UTC 时间表示 - 注:采用 UTC 时间表示,如 2010-1-10 9:7:54 的 UTC 值为 1263085674,其在协议中表示为0x000000004B49286A. - - - - - 从链路车辆动态信息交换业务 - 链路类型:从链路 - 消息方向:上级平台台往下级平台 - 业务数据类型标识:DOWN_EXG_MSG - 描述:上级平台作为客户端向下级平台服务端发送车辆动态信息交换业务 - - - - - 从链路平台间信息交互业务 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_PLATFORM_MSG - 描述:上级平台向下级平台发送平台问交互信息 - - - - - 从链路报警信息交互消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_WARN_MSG - 描述:上级平台向下级平台发送报瞥信息业务 - - - - - 从链路车辆监管消息 - 链路类型:从链路 - 消息方向:上级平台往下级平台 - 业务数据类型标识:DOWN_CTRL_MSG - 描述:上级平台向下级平台发送车辆监监管业务 - - - - - 从链路静态信息交换消息 - 链路类型:从链路 - 消息方向:上级平台往下级台 - 业务数据类型标识:DOWN_BASE_MSG - 描述:上级平台向下级平台发送车辆静态信息交换业务 - - - - - 固定为26个字节长度 - Head flag + Message Header + CRC Code + End Flag - 1 + 22 + 2 + 1 = 26 - - - - - 车辆定位 - - - - - 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 - - - - - 日 - - - - - 月 - - - - - 年 - - - - - 时 - - - - - 分 - - - - - 秒 - - - - - 经度,单位为 1*10^-6 度。 - - - - - 纬度,单位为 1*10^-6 度。 - - - - - 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 - - - - - 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 - - - - - 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) - - - - - 方向,0-359,单位为度(。),正北为 0,顺时针。 - - - - - 海拔高度,单位为米(m)。 - - - - - 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 - - - - - 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 - - - - - 子业务数据体 - - - - - 上传车辆注册信息消息 - 子业务类型标识:UP_ EXG_ MSG_ REGISTER - 描述:监控平台收到车载终端鉴权信息后,启动本命令向上级监管平台上传该车辆注册信息.各级监管平台再逐级向上级平台上传该信息 - 本条消息服务端无需应答 - - - - - 平台唯一编码 - - - - - 车载终端厂商唯一编码 - - - - - 车载终端型号,不是 8 位时以“\0”终结 - - - - - 车载终端编号,大写字母和数字组成 - - - - - 车载终端 SIM 卡电话号码。号码不是12 位,则在前补充数字 0. - - - - - 实时上传车辆定位信息 - 子业务类型标识:UP_EXG_MSG_REAL_LOCATION - - - - - 车辆定位信息 - - - - - 车辆定位信息自动补报请求消息 - 子业务类型标识:UP_EXG_MSG_HISTORY_LOCATION - 描述:如果平台间传输链路中断,下级平台重新登录并与上级平台建立通信链路后,下级平台应将中断期间内车载终端上传的车辆定位信息自动补报到上级平台。 - 如果系统断线期间,该车需发送的数据包条数大于 5,则以每包五条进行补发,直到补发完毕。 - 多条数据以卫星定位时间先后顺序排列。 - 本条消息上级平台采用定量回复,即收到一定数量的数据后,即通过从链路应答数据量。 - - - - - - 卫星定位数据个数 1大于GNSS_CNT小于5 - - - - - 卫星定位数据集合 - - - - - 启动车辆定位信息交换应答消息 - 子业务类型标识:UP_EXG_ MSG_ RETURN_ STARTUP ACK - 描述:本条消息是下级平台对上级平台下发的 DOWN_EXG_ MSG_ RETURN_STARTUP 消息的应答消息 - - - - - 结束车辆定位信息交换应答消息 - 子业务类型标识:UP_EXG_MSG_RETURN_END_ACK - - - - - 申请交换指定车辆定位信息请求消息 - 子业务类型标识:UP_EXG_MSG_APPLY-FOR_MONITOR_STARTUP - 描述:当下级平台需要在特定时问段内监控特殊车辆时,可上传此命令到上级平台申请对该车辆定位数据交换到下级平台,申请成功后,此车辆定位数据将在指定时间内交换到该平台(即使该车没有进入该平台所属区域也会交换) - - - - - 开始时间,用 UTC 时间表示 - - - - - 结束时间,用 UTC 时间表示 - - - - - 取消交换指定车辆定位信息请 - 子业务类型标识:UP_EXG_MSG_APPLY_F0R_MONIOR_END - 描述:下级平台上传该命令给上级平台,取消之前申请监控的特殊车辆 - - - - - 补发车辆定位信息请求 - 子业务类型标识:UP_EXG_MSG_APPLY_HISGNSSDATA_REQ - 描述:在平台间传输链路中断并重新建立连接后,下级平台向上级平台请求中断期间内上级平台需交换至下级平台的车辆定位信息时,向上级平台发出补发车辆定位信息请求,上级平台对请求应答后进行“补发车辆定位信息” - - - - - 开始时间,用 UTC 时间表示 - - - - - 结束时间,用 UTC 时间表示 - - - - - 上报驾驶员身份识别信息应答消息 - 子业务类型标识:UP_EXG_MSG_REPORT_DRIVER_INFO_ACK - 描述:下级平台应答上级平台发送的上报驾驶员身份识别信息请求消息,上传指定车辆的驾驶员身份识别信息数据 - - - - - 驾驶员姓名 - - - - - 身份证编号 - - - - - 从业资格证(备用) - - - - - 发证机构名称(备用) - - - - - 上报车辆电子运单应答消息 - 子业务类型标识:UP_CXG_MSG_TAKE_EWAYBILL_ACK - 描述:下级平台应答上级平台发送的上报车辆电子运单请求消息,向上级平台上传车辆当前电子运单 - - - - - 电子运单数据体长度 - - - - - 电子运单数据内容 - - - - - 主动上报驾驶员身份信息消息 - 子业务类型标识:UP_EXG_MSG_REPORT_DRIVER_INFO - - - - - 驾驶员姓名 - - - - - 身份证编号 - - - - - 从业资格证(备用) - - - - - 发证机构名称(备用) - - - - - 主动上报车辆电子运单信息 - 子业务类型标识:UP_EXG_MSG_REPORT_EWAYBILL_INFO - - - - - 电子运单数据体长度 - - - - - 电子运单数据内容 - - - - - 平台查岗应答消息 - 子业务类型标识:UP_PLATFORM_MSG_POST_QUERY_ACK - 描述:下级平台应答上级平台发送的不定期平台查岗消息 - - - - - 查岗对象的类型 - - - - - 查岗对象的ID - - - - - 信息ID - - - - - 数据长度 - - - - - 应答内容 - - - - - 下发平台间报文应答消息 - 子业务类型标识:UP_PLATFORM_MSG_INFO_ACK - 描述:下级平台收到上级平台发送的下发平台间报文请求消息后,发送应答消息 - - - - - 信息ID - - - - - 报警督办应答消息 - 子业务类型标识:UP_WARN_MSG_URGE_TODO_ACK - 描述:下级平台应答上级平台下发的报警督办请求消息,向上.级平台上报车辆的报瞥处理结果 - - - - - 报警督办 ID - - - - - 报警处理结果 - - - - - 上报报警信息消息 - 子业务类型标识:UP_WARN_MSG_ADPT_INFO - 描述:下级平台向上级平台上报某车辆的报警信息 - 本条消息上级平台无需应答 - - - - - 报警信息来源 - - - - - 报警类型 - - - - - 报警时间 - - - - - 信息ID - - - - - 数据长度 - - - - - 数据长度 - - - - - 主动上报报警处理结果信息 - 子业务类型标识:UP_WARN_MSG_ADPT_TODO_INFO - 描述:下级平台向上级平台上报报警处理结果 - 本条消息上级平台无需应答 - - - - - 报警信息ID - - - - - 处理结果 - - - - - 车辆单向监听应答 - 子业务类型标识:UP_CTRL_MSG_MONITOR_VEHTCLE_ACK - 描述:下级平台向上级平台上传车辆单向监听请求消息的应答 - - - - - 应答结果 - - - - - 车辆拍照应答 - 子业务类型标识:UP_ CTRL_ MSG _TAKE_ PHOTO_ ACK - 描述:下级平台应答上级平台发送的车辆拍照请求消息,上传图片信息到上级平台 - - - - - 拍照应答标识 - - - - - 车辆定位信息 - - - - - 镜头ID - - - - - 图片长度 - - - - - 图片大小 - - - - - 图像格式 - - - - - 图片内容 - - - - - 下发车辆报文应答消息 - 子业务类型标识:UP_CTRL_MSG_TEXT_INFO_ACK - 描述:下级平台应答上级平台下发的报文是否成功到达指定车辆 - - - - - 消息ID - 对应“下发车辆报文请求消息”中的MSG_ID - - - - - 应答结果 - - - - - 上报车辆行驶记录应答消息 - 子业务类型标识:UP_CTRL_MSG_TAKE_T'RAVEL_ACK - 描述:下级平台应答上级平台下发的上报车辆行驶记录请求消息,将车辆行驶记录数据上传至上级平台 - - - - - 命令字 - - - - - 车辆行驶记录数据体长度 - - - - - 车辆行驶记录信息 - - - - - 车辆应急接入监管平台应答消息 - 子业务类型标识: UP_CTRL_MSG_EMERGENCY_MONITORING_ACK - 描述:下级平台应答上级平台下发的车辆应急接入监管平台请求消息应答 - - - - - 应答结果 - - - - - 补报车辆静态信息应答 - 子业务类型标识:UP_BASE_MSG_VEHICLE_ADDED_ACK - 描述:上级平台应答下级平台发送的补报车辆静态信息清求消息 - - - - - 车辆信息 - - - - - 交换车辆定位信息消息 - 子业务类型标识:DOWN_EXG_MSG_CAR_LOCATION - 描述:上级平台通过该消息不间断地向车辆驶入区域所属的下级平台发送车辆定位信息,直到该车驶离该区域 - - - - - 车辆定位信息 - - - - - 车辆定位信息交换补发消息 - 子业务类型标识:DOWN_EXG_MSG_HISTORY_ARCOSSAREA - 描述:本业务在 DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK 应答成功后,立即开始交换。如果申请失败,则不进行数据转发 - - - - - 卫星定位数据个数 1大于GNSS_CNT小于5 - - - - - 卫星定位数据集合 - - - - - 交换车辆静态信息消息 - 子业务类型标识:DOWN_EXG_MSG_CAR_INFO - 描述:在首次启动跨域车辆定位信息交换,或者以后交换过程中车辆静态信息有更新时,由上级平台向下级平台下发一次车辆静态信息。下.级平台接收后自行更新该车辆静态信息 - - - - - 车牌号 - - - - - 启动车辆定位信息交换请求消息 - 子业务类型标识:DOWN_EXG_MSG_RETURN_STARTUP - 描述:在有车辆进入非归属地区地理区域、人工指定车辆定位信息交换和应急状态监控车辆时,上级平台向下级平台发出启动车辆定位信息交换清求消息。下级平台收到此命令后需要回复启动车辆定位信息交换应答消息给上级平台,即UP_EXG_MSG-RETURN-STARTUP_ ACK - - - - - 错误代码 - - - - - 结束车辆定位信息交换请求 - 子业务类型标识:DOWN_EXG_MSG_RETURN_END - 描述:在进入非归属地区地理区域的车辆离开该地理区域、人上取消指定车辆定位信息交换和应急状态结束时,上级平台向下级平台发出结束车辆定位信息交换请求消息。下级平台收到该命令后应回复结束车辆定位信息交换应答消息,即 UP_EXG_MSG_RE_TURN_END_ACK - - - - - 错误代码 - - - - - 申请交换指定车辆定位信息应答 - 子业务类型标识:DOWN_EXG_MSG_APPLY_FOR_MONITOR_STARTUP_ACK - 描述:应答下级平台申请交换指定车辆定位信息,请求消息."即 UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP - - - - - 返回结果 - - - - - 取消交换指定车辆定位信息应答 - 子业务类型标识:DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK - - - - - 返回结果 - - - - - 取消交换指定车辆定位信息应答 - 子业务类型标识:DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK - - - - - 返回结果 - - - - - 上报车辆驾驶员身份识别信息请求 - 子业务类型标识:DOWN_EXG_MSG_REPORT_DRIVER_INFO - - - - - 上报车辆电子运单请求消息 - 子业务类型标识:DOWN_EXG_MSG_TAKE_EWAYBILL_REQ - - - - - 平台查岗请求 - 子业务类型标识:DOWN_PLATFORM-MSG_POST_QUERY_REQ - 描述:上级平台不定期向下级平台发送平台查岗信息 - - - - - 查岗对象的类型 - - - - - 查岗对象的ID - - - - - 信息ID - - - - - 数据长度 - - - - - 应答内容 - - - - - 下发平台间报文请求 - 子业务类型标识:DOWN_PLATFORM_MSG_INFO_REQ - 描述:上级平台不定期向下级平台下发平台间报文 - - - - - 查岗对象的类型 - - - - - 查岗对象的ID - - - - - 信息ID - - - - - 数据长度 - - - - - 应答内容 - - - - - 报警督办请求消息 - 子业务类型标识:DOWN_WARN_MSG_URGE_TODO_REQ - 描述:上级平台向车辆归属下级平台下发本消息,催促其及时处理相关车辆的报警信息 - - - - - 报警信息来源 - - - - - 报警类型 - - - - - 报警时间UTCDateTime - - - - - 报警督办ID HexString - - - - - 督办截止时间 - - - - - 督办级别 - - - - - 督办人 - - - - - 督办联系电话 - - - - - 督办联系电子邮件 - - - - - 报警预警 - 子业务类型标识:DOWN_WARN_MSG_INFORM_TIPS - 描述:用于上级平台向车辆归属或车辆跨域下级平台下发相关车辆的报警顶警或运行提示信息 - 本条消息下级平台无需应答 - - - - - 报警信息来源 - - - - - 报警类型 - - - - - 报警时间 UTCDateTime - - - - - 数据长度 - - - - - 报警描述 - - - - - 实时交换报警信息 - 子业务类型标识:DOWN_WARN_MSG_EXG_INFORM - 描述:用于上级平台向车辆跨域目的地下级平台下发相关车辆的当前报警情况 - 本条消息下级平台无需应答 - - - - - 报警信息来源 - - - - - 报警类型 - - - - - 报警时间 - - - - - 数据长度 - - - - - 报警描述 - - - - - 车辆单向监听请求消息 - 子业务类型标识:DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ - 描述:上级平台向下级平台下发车辆单向监听清求消息 - - - - - 回拨电话号码 - - - - - 车辆拍照请求消息 - 子业务类型标识:DOWN_CTRL_MSG_TAKE_PHOTO_REQ - 描述:上级平台向下级平台下发对某指定车辆的拍照请求消息 - - - - - 镜头ID - - - - - 图片大小 - - - - - 下发车辆报文请求 - 子业务类型标识:DOWN_CTRL_MSG_TEXT_INFO - 描述:用于上级平台向下级平台下发报文到某指定车辆 - - - - - 消息ID序号 - - - - - 报文优先级 - - - - - 报文信息长度 - - - - - 报文信息内容 - - - - - 上报车辆行驶记录请求消息 - 子业务类型标识:DOVJN_CTRL_MSG_TAKE_TRAVEL_REQ - 描述:上级平台向下级平台下发上报车辆行驶记录请求消息 - - - - - 命令字ID - - - - - 开始时间 - - - - - 开始时间 - - - - - 最大数据数 - - - - - 车辆应急接入监管平台请求消息 - 子业务类型标识:UP_CTRL_MSG_EMERGENCY_MONITORING_REQ - 描述:发生应急情况时,政府监管平台需要及时监控该车辆时,就向该车辆归属的下级平台发送该命令 - - - - - 监管平台下发的鉴权码 - - - - - 拨号点名称 - - - - - 拨号用户名 - - - - - 拨号密码 - - - - - 地址 - - - - - 服务器TCP端口 - - - - - 服务器UDP端口 - - - - - 结束时间 - - - - - 补报车辆静态信息请求消息 - 子业务类型标识:DOWN_BASE_MSG_VEHICLE_ADDED - 描述:上级平台在接收到车辆定位信息后,发现该车辆静态信息在上级平台不存在,上级平台向下级平台下发补报该车辆静态信息的请求消息 - - - - - 报警标志 - - - - - 紧急报警_触动报警开关后触发 - 收到应答后清零 - - - - - 超速报警 - 标志维持至报警条件解除 - - - - - 标志维持至报警条件解除 - 疲劳驾驶 - - - - - 危险预警 - 收到应答后清零 - - - - - GNSS模块发生故障 - 标志维持至报警条件解除 - - - - - GNSS天线未接或被剪断 - 标志维持至报警条件解除 - - - - - GNSS天线短路 - 标志维持至报警条件解除 - - - - - 终端主电源欠压 - 标志维持至报警条件解除 - - - - - 终端主电源掉电 - 标志维持至报警条件解除 - - - - - 终端LCD或显示器故障 - 标志维持至报警条件解除 - - - - - TTS模块故障 - 标志维持至报警条件解除 - - - - - 摄像头故障 - 标志维持至报警条件解除 - - - - - 道路运输证IC卡模块故障 - 标志维持至报警条件解除 - - - - - 超速预警 - 标志维持至报警条件解除 - - - - - 疲劳驾驶预警 - 标志维持至报警条件解除 - - - - - 当天累计驾驶超时 - 标志维持至报警条件解除 - - - - - 超时停车 - 标志维持至报警条件解除 - - - - - 进出区域 - 收到应答后清零 - - - - - 进出路线 - 收到应答后清零 - - - - - 路段行驶时间不足或过长 - 收到应答后清零 - - - - - 路线偏离报警 - 标志维持至报警条件解除 - - - - - 车辆VSS故障 - 标志维持至报警条件解除 - - - - - 车辆油量异常 - 标志维持至报警条件解除 - - - - - 车辆被盗通过车辆防盗器 - 标志维持至报警条件解除 - - - - - 车辆非法点火 - - - - - 车辆非法位移 - 收到应答后清零 - - - - - 碰撞预警 - 标志维持至报警条件解除 - - - - - 侧翻预警 - 标志维持至报警条件解除 - - - - - 非法开门报警 - (终端未设置区域时,不判断非法开门) - 收到应答后清零 - - - - - 命令字ID - - - - - 业务数据类型标识 - 数据交换一协议规定的业务数据类型名称和标识常量定义见表 73。业务数据类型标识的命名规则如下: - a) 上级平台向下级平台发送的请求消息,一般以“DOWN_”开头,以后缀_REQ 结尾;而下级平台向上级平台发送的请求消息一般以“UP_”开头,以后缀_REQ 结尾; - b) 当上下级平台之间有应答消息情况下,应答消息可继续沿用对应的请求消息开头标识符,而通过后缀 RSP 来标识结尾。 - - - - - 主链路登录请求消息 - - - - - 主链路登录应答消息 - - - - - 主链路注销请求消息 - - - - - 主链路注销应答消息 - - - - - 主链路连接保持请求消息 - - - - - 主链路连接保持应答消息 - - - - - 主链路断开通知消息 - - - - - 下级平台主动关闭链路通知消息 - - - - - 从链路连接请求消息 - - - - - 从链路连接应答消息 - - - - - 从链路注销请求消息 - - - - - 从链路注销应答消息 - - - - - 从链路连接保持请求消息 - - - - - 从链路连接保持应答消息 - - - - - 从链路断开通知消息 - - - - - 上级平台主动关闭链路通知消息 - - - - - 接收定位信息数量通知消息 - - - - - 主链路动态信息交换消息 - - - - - 从链路动态信息交换消息 - - - - - 主链路平台间信息交互消息 - - - - - 从链路平台间信息交互消息 - - - - - 主链路报警信息交互消息 - - - - - 从链路报警信息交互消息 - - - - - 主链路车辆监管消息 - - - - - 从链路车辆监管消息 - - - - - 主链路静态信息交换消息 - - - - - 从链路静态信息交换消息 - - - - - 子业务类型标识 - - - - - 上传车辆注册信息 - - - - - 实时上传车辆定位信息 - - - - - 车辆定位信息自动补报 - - - - - 启动车辆定位信息交换应答 - - - - - 结束车辆定位信息交换应答 - - - - - 申请交换指定车辆定位信息请求 - - - - - 取消交换指定车辆定位信息请求 - - - - - 补发车辆定位信息请求 - - - - - 上报车辆驾驶员身份识别信息应答 - - - - - 上报车辆电子运单应答 - - - - - 主动上报驾驶员身份信息 - - - - - 主动上报车辆电子运单信息 - - - - - 交换车辆定位信息 - - - - - 车辆定位信息交换补发 - - - - - 交换车辆静态信息 - - - - - 启动车辆定位信息交换请求 - - - - - 结束车辆定位信息交换请求 - - - - - 申请交换指定车辆定位信息应答 - - - - - 取消交换指定车辆定位信息应答 - - - - - 补发车辆定位信息应答 - - - - - 上报车辆驾驶员身份识别信息请求 - - - - - 上报车辆电子运单请求 - - - - - 平台查岗应答 - - - - - 下发平台间报文应答 - - - - - 平台查岗请求 - - - - - 下发平台间报文请求 - - - - - 报警督办应答 - - - - - 上报报警信息 - - - - - 主动上报报警处理结果信息 - - - - - 报警督办请求 - - - - - 报警预警 - - - - - 实时交换报警信息 - - - - - 车辆单向监听应答 - - - - - 车辆拍照应答 - - - - - 下发车辆报文应答 - - - - - 上报车辆行驶记录应答 - - - - - 车辆应急接入监管平台应答消息 - - - - - 车辆单向监听请求 - - - - - 车辆拍照请求 - - - - - 下发车辆报文请求 - - - - - 上报车辆行驶记录请求 - - - - - 车辆应急接入监管平台请求消息 - - - - - 补报车辆静态信息应答 - - - - - 补报车辆静态信息请求 - - - - - 车辆颜色,按照 JT/T415-2006 中5.4.12 的规定 - - - - - 报警信息来源 - - - - - 报警类型 - - - - - 拍照应答标识 - - - - - 应答结果 - - - - - 应答结果 - - - - - 应答结果 - - - - - 报警处理结果 - - - - - 报警处理结果 - - - - - 验证结果 - - - - - 错误代码 - - - - - 查岗对象的类型 - - - - - 查岗对象的类型 - - - - - 查岗对象的类型 - - - - - 验证结果 - - - - - 验证结果 - - - - - 验证结果 - - - - - 错误代码 - - - - - 错误代码 - - - - - 错误代码 - - - - - 错误代码 - - - - - 验证结果 - - - - - 错误代码 - - - - - 定位信息是否使用国家测绘局批准的地图保密插件进行加密。 - - - - diff --git a/src/JT809.Protocol/JT809Enums/JT808_Alarm.cs b/src/JT809.Protocol/JT809Enums/JT808_Alarm.cs index baefbd9..d29e845 100644 --- a/src/JT809.Protocol/JT809Enums/JT808_Alarm.cs +++ b/src/JT809.Protocol/JT809Enums/JT808_Alarm.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace JT809.Protocol.Enums +namespace JT809.Protocol.JT809Enums { /// /// 报警标志 diff --git a/src/JT809.Protocol/JT809Enums/JT808_Status.cs b/src/JT809.Protocol/JT809Enums/JT808_Status.cs index a8beb2d..85fab1e 100644 --- a/src/JT809.Protocol/JT809Enums/JT808_Status.cs +++ b/src/JT809.Protocol/JT809Enums/JT808_Status.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace JT809.Protocol.Enums +namespace JT809.Protocol.JT809Enums { [Flags] public enum JT808_Status : uint diff --git a/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs index f506eeb..dccd1a6 100644 --- a/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs +++ b/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs @@ -9,20 +9,6 @@ namespace JT809.Protocol.JT809Extensions { public static partial class JT809BinaryExtensions { - public static string ReadStringLittle(ReadOnlySpan read, ref int offset, int len) - { - string value = encoding.GetString(read.Slice(offset, len).ToArray()); - offset += len; - return value.Trim('\0'); - } - - public static string ReadStringLittle(ReadOnlySpan read, ref int offset) - { - string value = encoding.GetString(read.Slice(offset).ToArray()); - offset += value.Length; - return value.Trim('\0'); - } - public static int ReadInt32Little(ReadOnlySpan read, ref int offset) { int value = (read[offset] << 24) | (read[offset + 1] << 16) | (read[offset + 2] << 8) | read[offset + 3]; @@ -168,50 +154,6 @@ namespace JT809.Protocol.JT809Extensions return data.Length; } - public static int WriteStringLittle(IMemoryOwner memoryOwner, int offset, string data) - { - byte[] codeBytes = encoding.GetBytes(data); - CopyTo(codeBytes, memoryOwner.Memory.Span, offset); - return codeBytes.Length; - } - - public static int WriteStringLittle(IMemoryOwner memoryOwner, int offset, string data, int len) - { - byte[] bytes = null; - if (string.IsNullOrEmpty(data)) - { - bytes = new byte[0]; - } - else - { - bytes = encoding.GetBytes(data); - } - byte[] rBytes = new byte[len]; - for (int i = 0; i < bytes.Length; i++) - { - if (i >= len) break; - rBytes[i] = bytes[i]; - } - CopyTo(rBytes, memoryOwner.Memory.Span, offset); - return rBytes.Length; - } - - public static int WriteStringPadLeftLittle(IMemoryOwner memoryOwner, int offset, string data, int len) - { - data = data.PadLeft(len, '\0'); - byte[] codeBytes = encoding.GetBytes(data); - CopyTo(codeBytes, memoryOwner.Memory.Span, offset); - return codeBytes.Length; - } - - public static int WriteStringPadRightLittle(IMemoryOwner memoryOwner, int offset, string data, int len) - { - data = data.PadRight(len, '\0'); - byte[] codeBytes = encoding.GetBytes(data); - CopyTo(codeBytes, memoryOwner.Memory.Span, offset); - return codeBytes.Length; - } - /// /// 数字编码 大端模式、高位在前 /// @@ -272,22 +214,6 @@ namespace JT809.Protocol.JT809Extensions return bytes; } - public static byte ToBcdByte(this byte buf) - { - return (byte)Convert.ToInt32(buf.ToString(), 16); - } - - /// - /// 字节数组字符串 - /// - /// - /// 默认 " " - /// - public static string ToHexString(this byte[] bytes, string separator = " ") - { - return string.Join(separator, bytes.Select(s => s.ToString("X2"))); - } - /// /// 经纬度 /// diff --git a/src/JT809.Protocol/JT809Extensions/JT809HexExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809HexExtensions.cs index c66bc43..8d03670 100644 --- a/src/JT809.Protocol/JT809Extensions/JT809HexExtensions.cs +++ b/src/JT809.Protocol/JT809Extensions/JT809HexExtensions.cs @@ -77,7 +77,7 @@ namespace JT809.Protocol.JT809Extensions 208, 224, 240 }; - public static string ToHexString(byte[] source) + public static string ToHexString(this byte[] source) { return ToHexString(source, false); } @@ -229,7 +229,7 @@ namespace JT809.Protocol.JT809Extensions } } - public unsafe static byte[] FromHexString(string source) + public unsafe static byte[] FromHexString(this string source) { // return an empty array in case of null or empty source if (string.IsNullOrEmpty(source)) diff --git a/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs new file mode 100644 index 0000000..caea63f --- /dev/null +++ b/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Buffers.Binary; +using System.Buffers; + +namespace JT809.Protocol.JT809Extensions +{ + public static partial class JT809BinaryExtensions + { + public static string ReadStringLittle(ReadOnlySpan read, ref int offset, int len) + { + string value = encoding.GetString(read.Slice(offset, len).ToArray()); + offset += len; + return value.Trim('\0'); + } + + public static string ReadStringLittle(ReadOnlySpan read, ref int offset) + { + string value = encoding.GetString(read.Slice(offset).ToArray()); + offset += value.Length; + return value.Trim('\0'); + } + + public static int WriteStringLittle(IMemoryOwner memoryOwner, int offset, string data) + { + byte[] codeBytes = encoding.GetBytes(data); + CopyTo(codeBytes, memoryOwner.Memory.Span, offset); + return codeBytes.Length; + } + + public static int WriteStringLittle(IMemoryOwner memoryOwner, int offset, string data, int len) + { + byte[] bytes = null; + if (string.IsNullOrEmpty(data)) + { + bytes = new byte[0]; + } + else + { + bytes = encoding.GetBytes(data); + } + byte[] rBytes = new byte[len]; + for (int i = 0; i < bytes.Length; i++) + { + if (i >= len) break; + rBytes[i] = bytes[i]; + } + CopyTo(rBytes, memoryOwner.Memory.Span, offset); + return rBytes.Length; + } + + public static int WriteStringPadLeftLittle(IMemoryOwner memoryOwner, int offset, string data, int len) + { + data = data.PadLeft(len, '\0'); + byte[] codeBytes = encoding.GetBytes(data); + CopyTo(codeBytes, memoryOwner.Memory.Span, offset); + return codeBytes.Length; + } + + public static int WriteStringPadRightLittle(IMemoryOwner memoryOwner, int offset, string data, int len) + { + data = data.PadRight(len, '\0'); + byte[] codeBytes = encoding.GetBytes(data); + CopyTo(codeBytes, memoryOwner.Memory.Span, offset); + return codeBytes.Length; + } + } +}