@@ -0,0 +1,288 @@ | |||
## Ignore Visual Studio temporary files, build results, and | |||
## files generated by popular Visual Studio add-ons. | |||
## | |||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore | |||
# User-specific files | |||
*.suo | |||
*.user | |||
*.userosscache | |||
*.sln.docstates | |||
# User-specific files (MonoDevelop/Xamarin Studio) | |||
*.userprefs | |||
# Build results | |||
[Dd]ebug/ | |||
[Dd]ebugPublic/ | |||
[Rr]elease/ | |||
[Rr]eleases/ | |||
x64/ | |||
x86/ | |||
bld/ | |||
[Bb]in/ | |||
[Oo]bj/ | |||
[Ll]og/ | |||
# Visual Studio 2015 cache/options directory | |||
.vs/ | |||
# Uncomment if you have tasks that create the project's static files in wwwroot | |||
#wwwroot/ | |||
# MSTest test Results | |||
[Tt]est[Rr]esult*/ | |||
[Bb]uild[Ll]og.* | |||
# NUNIT | |||
*.VisualState.xml | |||
TestResult.xml | |||
# Build Results of an ATL Project | |||
[Dd]ebugPS/ | |||
[Rr]eleasePS/ | |||
dlldata.c | |||
# .NET Core | |||
project.lock.json | |||
project.fragment.lock.json | |||
artifacts/ | |||
**/Properties/launchSettings.json | |||
*_i.c | |||
*_p.c | |||
*_i.h | |||
*.ilk | |||
*.meta | |||
*.obj | |||
*.pch | |||
*.pdb | |||
*.pgc | |||
*.pgd | |||
*.rsp | |||
*.sbr | |||
*.tlb | |||
*.tli | |||
*.tlh | |||
*.tmp | |||
*.tmp_proj | |||
*.log | |||
*.vspscc | |||
*.vssscc | |||
.builds | |||
*.pidb | |||
*.svclog | |||
*.scc | |||
# Chutzpah Test files | |||
_Chutzpah* | |||
# Visual C++ cache files | |||
ipch/ | |||
*.aps | |||
*.ncb | |||
*.opendb | |||
*.opensdf | |||
*.sdf | |||
*.cachefile | |||
*.VC.db | |||
*.VC.VC.opendb | |||
# Visual Studio profiler | |||
*.psess | |||
*.vsp | |||
*.vspx | |||
*.sap | |||
# TFS 2012 Local Workspace | |||
$tf/ | |||
# Guidance Automation Toolkit | |||
*.gpState | |||
# ReSharper is a .NET coding add-in | |||
_ReSharper*/ | |||
*.[Rr]e[Ss]harper | |||
*.DotSettings.user | |||
# JustCode is a .NET coding add-in | |||
.JustCode | |||
# TeamCity is a build add-in | |||
_TeamCity* | |||
# DotCover is a Code Coverage Tool | |||
*.dotCover | |||
# Visual Studio code coverage results | |||
*.coverage | |||
*.coveragexml | |||
# NCrunch | |||
_NCrunch_* | |||
.*crunch*.local.xml | |||
nCrunchTemp_* | |||
# MightyMoose | |||
*.mm.* | |||
AutoTest.Net/ | |||
# Web workbench (sass) | |||
.sass-cache/ | |||
# Installshield output folder | |||
[Ee]xpress/ | |||
# DocProject is a documentation generator add-in | |||
DocProject/buildhelp/ | |||
DocProject/Help/*.HxT | |||
DocProject/Help/*.HxC | |||
DocProject/Help/*.hhc | |||
DocProject/Help/*.hhk | |||
DocProject/Help/*.hhp | |||
DocProject/Help/Html2 | |||
DocProject/Help/html | |||
# Click-Once directory | |||
publish/ | |||
# Publish Web Output | |||
*.[Pp]ublish.xml | |||
*.azurePubxml | |||
# TODO: Comment the next line if you want to checkin your web deploy settings | |||
# but database connection strings (with potential passwords) will be unencrypted | |||
*.pubxml | |||
*.publishproj | |||
# Microsoft Azure Web App publish settings. Comment the next line if you want to | |||
# checkin your Azure Web App publish settings, but sensitive information contained | |||
# in these scripts will be unencrypted | |||
PublishScripts/ | |||
# NuGet Packages | |||
*.nupkg | |||
# The packages folder can be ignored because of Package Restore | |||
**/packages/* | |||
# except build/, which is used as an MSBuild target. | |||
!**/packages/build/ | |||
# Uncomment if necessary however generally it will be regenerated when needed | |||
#!**/packages/repositories.config | |||
# NuGet v3's project.json files produces more ignorable files | |||
*.nuget.props | |||
*.nuget.targets | |||
# Microsoft Azure Build Output | |||
csx/ | |||
*.build.csdef | |||
# Microsoft Azure Emulator | |||
ecf/ | |||
rcf/ | |||
# Windows Store app package directories and files | |||
AppPackages/ | |||
BundleArtifacts/ | |||
Package.StoreAssociation.xml | |||
_pkginfo.txt | |||
# Visual Studio cache files | |||
# files ending in .cache can be ignored | |||
*.[Cc]ache | |||
# but keep track of directories ending in .cache | |||
!*.[Cc]ache/ | |||
# Others | |||
ClientBin/ | |||
~$* | |||
*~ | |||
*.dbmdl | |||
*.dbproj.schemaview | |||
*.jfm | |||
*.pfx | |||
*.publishsettings | |||
orleans.codegen.cs | |||
# Since there are multiple workflows, uncomment next line to ignore bower_components | |||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | |||
#bower_components/ | |||
# RIA/Silverlight projects | |||
Generated_Code/ | |||
# Backup & report files from converting an old project file | |||
# to a newer Visual Studio version. Backup files are not needed, | |||
# because we have git ;-) | |||
_UpgradeReport_Files/ | |||
Backup*/ | |||
UpgradeLog*.XML | |||
UpgradeLog*.htm | |||
# SQL Server files | |||
*.mdf | |||
*.ldf | |||
*.ndf | |||
# Business Intelligence projects | |||
*.rdl.data | |||
*.bim.layout | |||
*.bim_*.settings | |||
# Microsoft Fakes | |||
FakesAssemblies/ | |||
# GhostDoc plugin setting file | |||
*.GhostDoc.xml | |||
# Node.js Tools for Visual Studio | |||
.ntvs_analysis.dat | |||
node_modules/ | |||
# Typescript v1 declaration files | |||
typings/ | |||
# Visual Studio 6 build log | |||
*.plg | |||
# Visual Studio 6 workspace options file | |||
*.opt | |||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | |||
*.vbw | |||
# Visual Studio LightSwitch build output | |||
**/*.HTMLClient/GeneratedArtifacts | |||
**/*.DesktopClient/GeneratedArtifacts | |||
**/*.DesktopClient/ModelManifest.xml | |||
**/*.Server/GeneratedArtifacts | |||
**/*.Server/ModelManifest.xml | |||
_Pvt_Extensions | |||
# Paket dependency manager | |||
.paket/paket.exe | |||
paket-files/ | |||
# FAKE - F# Make | |||
.fake/ | |||
# JetBrains Rider | |||
.idea/ | |||
*.sln.iml | |||
# CodeRush | |||
.cr/ | |||
# Python Tools for Visual Studio (PTVS) | |||
__pycache__/ | |||
*.pyc | |||
# Cake - Uncomment if you are using it | |||
# tools/** | |||
# !tools/packages.config | |||
# Telerik's JustMock configuration file | |||
*.jmconfig | |||
# BizTalk build output | |||
*.btp.cs | |||
*.btm.cs | |||
*.odx.cs | |||
*.xsd.cs |
@@ -0,0 +1,15 @@ | |||
language: csharp | |||
solution: JT809.Protocol.sln | |||
dotnet: 2.2.101 | |||
os: linux | |||
mono: none | |||
dist: trusty2 | |||
script: | |||
- dotnet restore src/JT809.Protocol.sln | |||
- dotnet build src/JT809.Protocol.Test/JT809.Protocol.Test.csproj | |||
- dotnet test src/JT809.Protocol.Test/JT809.Protocol.Test.csproj | |||
after_success: | |||
- echo successful build! | |||
branches: | |||
only: | |||
- master |
@@ -0,0 +1,21 @@ | |||
MIT License | |||
Copyright (c) 2018 SmallChi | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in all | |||
copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
SOFTWARE. |
@@ -0,0 +1,431 @@ | |||
# JT809协议 | |||
[](https://github.com/SmallChi/JT809/blob/master/LICENSE)[](https://travis-ci.org/SmallChi/JT809) | |||
## 前提条件 | |||
1. 掌握进制转换:二进制转十六进制; | |||
2. 掌握BCD编码、Hex编码; | |||
3. 掌握各种位移、异或; | |||
4. 掌握常用反射; | |||
5. 掌握快速ctrl+c、ctrl+v; | |||
6. 掌握Span\<T\>的基本用法 | |||
7. 掌握以上装逼技能,就可以开始搬砖了。 | |||
## JT809数据结构解析 | |||
### 数据包[JT809Package] | |||
|头标识|数据头|数据体|CRC校验码|尾标识 | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| BeginFlag | JT809Header | JT809Bodies | CRCCode | EndFlag | | |||
| 5B | - | - | - | 5D | | |||
### 数据头[JT809Header] | |||
|数据长度|报文序列号|业务数据类型|下级平台接入码|协议版本号标识|报文加密标识位|数据加密的密匙| | |||
|:------:|:------:|:------:|:------:|:------:|:------:|:------:| | |||
| MsgLength | MsgSN | BusinessType | MsgGNSSCENTERID | Version |EncryptFlag | EncryptKey | | |||
### 数据体[JT809Bodies] | |||
> 根据对应业务数据类型:BusinessType | |||
|车牌号|车辆颜色|子业务类型标识|后续数据长度|子业务数据体 | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| VehicleNo | VehicleColor | SubBusinessType | DataLength | JT809SubBodies | | |||
### 子数据体[JT809SubBodies] | |||
> 根据对应子业务数据类型 SubBusinessType 处理子业务数据体(JT809SubBodies)。 | |||
***注意:数据内容(除去头和尾标识)进行转义判断*** | |||
转义规则如下: | |||
1. 若数据内容中有出现字符 0x5b 的,需替换为字符 0x5a 紧跟字符 0x01; | |||
2. 若数据内容中有出现字符 0x5a 的,需替换为字符 0x5a 紧跟字符 0x02; | |||
3. 若数据内容中有出现字符 0x5d 的,需替换为字符 0x5e 紧跟字符 0x01; | |||
4. 若数据内容中有出现字符 0x5e 的,需替换为字符 0x5e 紧跟字符 0x02. | |||
反转义的原因:确认JT809协议的TCP消息边界。 | |||
### 举个栗子1 | |||
#### 1.组包: | |||
> 业务数据类型 BusinessType:从链路报警信息交互消息 | |||
> | |||
> 子业务类型标识 SubBusinessType:报警督办请求消息 | |||
``` code | |||
JT809Package jT809Package = new JT809Package(); | |||
jT809Package.Header = new JT809Header | |||
{ | |||
MsgSN = 1666, | |||
EncryptKey = 9999, | |||
EncryptFlag= JT809Header_Encrypt.None, | |||
Version = new JT809Header_Version(1, 0, 0), | |||
BusinessType = JT809BusinessType.从链路报警信息交互消息, | |||
MsgGNSSCENTERID = 20180920, | |||
}; | |||
JT809_0x9400 bodies = new JT809_0x9400 | |||
{ | |||
VehicleNo="粤A12345", | |||
VehicleColor= JT809VehicleColorType.黄色, | |||
SubBusinessType= JT809SubBusinessType.报警督办请求消息, | |||
}; | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc = JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.疲劳驾驶报警, | |||
WarnTime = DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID = "123FFAA1", | |||
SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel = 3, | |||
Supervisor = "smallchi", | |||
SupervisorTel = "12345678901", | |||
SupervisorEmail = "123456@qq.com" | |||
}; | |||
bodies.SubBodies = jT809_0x9400_0x9401; | |||
jT809Package.Bodies = bodies; | |||
byte[] data = JT809Serializer.Serialize(jT809Package); | |||
string hex = data.ToHexString(); | |||
// 输出结果Hex: | |||
// 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.手动解包: | |||
``` 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 | |||
2.进行反转义 | |||
5A 01 ->5B | |||
5A 02 ->5A | |||
5E 01 ->5D | |||
5E 02 ->5E | |||
反转义后 | |||
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 5B AC 3F 40 12 3F FA A1 00 00 00 00 5B 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 | |||
3.拆解 | |||
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 5B AC 3F 40 --子数据体->报警时间UTCDateTime | |||
12 3F FA A1 --子数据体->报警督办ID | |||
00 00 00 00 5B 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 --CRC校验码 | |||
5D --尾标识 | |||
``` | |||
#### 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(); | |||
//2.将数组反序列化 | |||
JT809Package jT809Package = JT809Serializer.Deserialize(bytes); | |||
//3.数据包头 | |||
Assert.Equal((uint)146, jT809Package.Header.MsgLength); | |||
Assert.Equal((uint)1666, jT809Package.Header.MsgSN); | |||
Assert.Equal((uint)9999, jT809Package.Header.EncryptKey); | |||
Assert.Equal(JT809Header_Encrypt.None, jT809Package.Header.EncryptFlag); | |||
Assert.Equal((uint)20180920, jT809Package.Header.MsgGNSSCENTERID); | |||
Assert.Equal(JT809BusinessType.从链路报警信息交互消息, jT809Package.Header.BusinessType); | |||
Assert.Equal(new JT809Header_Version(1, 0, 0).ToString(), jT809Package.Header.Version.ToString()); | |||
//4.数据包体 | |||
JT809_0x9400 jT809_0X400 = (JT809_0x9400)jT809Package.Bodies; | |||
Assert.Equal("粤A12345", jT809_0X400.VehicleNo); | |||
Assert.Equal(JT809VehicleColorType.黄色, jT809_0X400.VehicleColor); | |||
Assert.Equal(JT809SubBusinessType.报警督办请求消息, jT809_0X400.SubBusinessType); | |||
Assert.Equal((uint)92, jT809_0X400.DataLength); | |||
//5.子数据包体 | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = (JT809_0x9400_0x9401)jT809_0X400.JT809SubBodies; | |||
Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9401.WarnSrc); | |||
Assert.Equal(JT809WarnType.疲劳驾驶报警, jT809_0x9400_0x9401.WarnType); | |||
Assert.Equal(DateTime.Parse("2018-09-27 10:24:00"), jT809_0x9400_0x9401.WarnTime); | |||
Assert.Equal("123FFAA1", jT809_0x9400_0x9401.SupervisionID); | |||
Assert.Equal(DateTime.Parse("2018-09-27 11:24:00"), jT809_0x9400_0x9401.SupervisionEndTime); | |||
Assert.Equal(3, jT809_0x9400_0x9401.SupervisionLevel); | |||
Assert.Equal("smallchi", jT809_0x9400_0x9401.Supervisor); | |||
Assert.Equal("12345678901", jT809_0x9400_0x9401.SupervisorTel); | |||
Assert.Equal("123456@qq.com", jT809_0x9400_0x9401.SupervisorEmail); | |||
``` | |||
### 举个栗子2 | |||
``` data2 | |||
// 根据业务类型创建对应包 | |||
JT809Package jT809Package = JT809BusinessType.从链路报警信息交互消息.Create_从链路报警信息交互消息( | |||
new JT809Header | |||
{ | |||
MsgSN = 1666, | |||
EncryptKey = 9999, | |||
EncryptFlag = JT809Header_Encrypt.None, | |||
Version = new JT809Header_Version(1, 0, 0), | |||
MsgGNSSCENTERID = 20180920, | |||
}, new JT809_0x9400 | |||
{ | |||
VehicleNo = "粤A12345", | |||
VehicleColor = JT809VehicleColorType.黄色, | |||
SubBusinessType = JT809SubBusinessType.报警督办请求, | |||
SubBodies = JT809SubBusinessType.报警督办请求.Create_报警督办请求( | |||
new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc = JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.疲劳驾驶报警, | |||
WarnTime = DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID = "123FFAA1", | |||
SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel = 3, | |||
Supervisor = "smallchi", | |||
SupervisorTel = "12345678901", | |||
SupervisorEmail = "123456@qq.com" | |||
}) | |||
} | |||
); | |||
var hex = JT809Serializer.Serialize(jT809Package).ToHexString(); | |||
``` | |||
### 举个栗子3 | |||
``` data3 | |||
static void Main(string[] args) | |||
{ | |||
class JT809GlobalConfig: GlobalConfigBase | |||
{ | |||
public override JT809EncryptOptions EncryptOptions { get; set; }= new JT809EncryptOptions() | |||
{ | |||
IA1 = 20000000, | |||
IC1 = 20000000, | |||
M1 = 30000000 | |||
}; | |||
public override string ConfigId => "JT809GlobalConfig"; | |||
} | |||
JT809Serializer JT809Serializer = new JT809Serializer(new JT809GlobalConfig()); | |||
// todo: | |||
} | |||
``` | |||
### 举个栗子4 | |||
使用依赖注入的方式实现配置 | |||
Install-Package JT809.Extensions.DependencyInjection | |||
[参考例子](https://github.com/SmallChi/JT809/blob/master/src/JT809.Protocol.Extensions.DependencyInjection.Test/Program.cs) | |||
## NuGet安装 | |||
| Package Name | Version | Downloads | |||
|--------------| ------- | ---- | |||
| Install-Package JT809 |  |  | |||
| Install-Package JT809.Extensions.DependencyInjection |  |  | |||
## 使用BenchmarkDotNet性能测试报告(只是玩玩,不能当真) | |||
``` ini | |||
BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17763.557 (1809/October2018Update/Redstone5) | |||
Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores | |||
[Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3416.0 | |||
Job-FVMQGI : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3416.0 | |||
Job-LGLQDK : .NET Core 2.2.5 (CoreCLR 4.6.27617.05, CoreFX 4.6.27618.01), 64bit RyuJIT | |||
Platform=AnyCpu Runtime=Clr Server=False | |||
``` | |||
| Method | Toolchain | N | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | | |||
|---------------------------------------- |-------------- |------- |-------------:|-------------:|-------------:|-----------:|------:|------:|-------------:| | |||
| **JT809_0x9400_0x9401_Package_Deserialize** | **Default** | **100** | **690.1 us** | **13.596 us** | **21.565 us** | **18.5547** | **-** | **-** | **118.75 KB** | | |||
| JT809_0x9400_0x9401_Package_Serialize | Default | 100 | 332.8 us | 6.863 us | 7.047 us | 11.7188 | - | - | 74.22 KB | | |||
| JT809_0x9400_0x9401_Package_Deserialize | .NET Core 2.2 | 100 | 385.4 us | 5.410 us | 5.061 us | 19.0430 | - | - | 118.75 KB | | |||
| JT809_0x9400_0x9401_Package_Serialize | .NET Core 2.2 | 100 | 201.0 us | 2.146 us | 1.903 us | 11.9629 | - | - | 74.22 KB | | |||
| **JT809_0x9400_0x9401_Package_Deserialize** | **Default** | **10000** | **68,568.1 us** | **1,263.632 us** | **1,182.002 us** | **1857.1429** | **-** | **-** | **11875.59 KB** | | |||
| JT809_0x9400_0x9401_Package_Serialize | Default | 10000 | 32,706.0 us | 440.949 us | 412.464 us | 1187.5000 | - | - | 7422.12 KB | | |||
| JT809_0x9400_0x9401_Package_Deserialize | .NET Core 2.2 | 10000 | 38,843.3 us | 968.815 us | 858.829 us | 1928.5714 | - | - | 11875 KB | | |||
| JT809_0x9400_0x9401_Package_Serialize | .NET Core 2.2 | 10000 | 19,914.1 us | 383.802 us | 394.136 us | 1187.5000 | - | - | 7421.88 KB | | |||
| **JT809_0x9400_0x9401_Package_Deserialize** | **Default** | **100000** | **678,892.7 us** | **9,244.595 us** | **8,647.400 us** | **19000.0000** | **-** | **-** | **118753.65 KB** | | |||
| JT809_0x9400_0x9401_Package_Serialize | Default | 100000 | 336,631.2 us | 2,672.170 us | 2,499.550 us | 12000.0000 | - | - | 74225.1 KB | | |||
| JT809_0x9400_0x9401_Package_Deserialize | .NET Core 2.2 | 100000 | 387,380.1 us | 6,355.761 us | 5,945.183 us | 19000.0000 | - | - | 118750 KB | | |||
| JT809_0x9400_0x9401_Package_Serialize | .NET Core 2.2 | 100000 | 198,709.1 us | 3,502.843 us | 3,276.562 us | 12000.0000 | - | - | 74218.75 KB | | |||
## JT809协议消息对照表 | |||
### 链路管理类 | |||
#### 主链路 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x1001 | √ | √ | 主链路登录请求消息 | | |||
| 2 | 0x1002 | √ | √ | 主链路登录应答消息 | | |||
| 3 | 0x1003 | √ | √ | 主链路注销请求消息 | | |||
| 4 | 0x1004 | √ | √ | 主链路注销应答消息 | | |||
| 5 | 0x1005 | √ | √ | 主链路连接保持请求消息 | | |||
| 6 | 0x1006 | √ | √ | 主链路连接保持应答消息 | | |||
| 7 | 0x1007 | √ | √ | 主链路断开通知消息 | | |||
| 8 | 0x1008 | √ | √ |下级平台主动关闭链路通知消息 | | |||
#### 从链路 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9001 | √ | √ | 从链路连接请求消息 | | |||
| 2 | 0x9002 | √ | √ | 从链路连接应答消息 | | |||
| 3 | 0x9003 | √ | √ | 从链路注销请求消息 | | |||
| 4 | 0x9004 | √ | √ | 从链路注销应答消息 | | |||
| 5 | 0x9005 | √ | √ | 从链路连接保持请求消息 | | |||
| 6 | 0x9006 | √ | √ | 从链路连接保持应答消息 | | |||
| 7 | 0x9007 | √ | √ | 从链路断开通知消息 | | |||
| 8 | 0x9008 | √ | √ | 上级平台主动关闭链路通知消息 | | |||
### 信息统计类 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9101 | √ | √ |接收定位信息数量通知消息 | | |||
### 车辆动态信息交换 | |||
#### 主链路动态信息交换消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x1200 | √ | √ | 主链路动态信息交换消息 | | |||
| 2 | 0x1201 | √ | √ | 上传车辆注册信息(809补充协议文档) | | |||
| 3 | 0x1202 | √ | √ | 实时上传车辆定位信息 | | |||
| 4 | 0x1203 | √ | √ | 车辆定位信息自动补报 | | |||
| 5 | 0x1205 | √ | √ | 启动车辆定位信息交换应答消息 | | |||
| 6 | 0x1206 | √ | √ | 结束车辆定位信息交换应答消息 | | |||
| 7 | 0x1207 | √ | √ | 申请交换指定车辆定位信息请求消息 | | |||
| 8 | 0x1208 | √ | √ | 取消交换指定车辆定位信息请求 | | |||
| 9 | 0x1209 | √ | √ | 补发车辆定位信息请求 | | |||
| 10 | 0x120A | √ | √ | 上报车辆驾驶员身份识别信息应答 | | |||
| 11 | 0x120B | √ | √ | 上报车辆电子运单应答 | | |||
| 12 | 0x120C | √ | √ | 主动上报驾驶员身份信息(809补充协议文档) | | |||
| 13 | 0x120D | √ | √ | 主动上报车辆电子运单信息(809补充协议文档) | | |||
#### 从链路动态信息交换消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9200 | √ | √ | 从链路动态信息交换消息 | | |||
| 2 | 0x9202 | √ | √(0x1202) | 交换车辆定位信息消息(809补充协议文档) | | |||
| 3 | 0x9203 | √ | √(0x1203) | 车辆定位信息交换补发消息 | | |||
| 4 | 0x9204 | √ | √ | 交换车辆静态信息消息 | | |||
| 5 | 0x9205 | √ | √ | 启动车辆定位信息交换请求消息 | | |||
| 6 | 0x9206 | √ | √ | 结束车辆定位信息交换请求消息 | | |||
| 7 | 0x9207 | √ | √ | 申请交换指定车辆定位信息应答消息 | | |||
| 8 | 0x9208 | √ | √ | 取消申请交换指定车辆定位信息应答消息 | | |||
| 9 | 0x9209 | √ | √ | 补发车辆定位信息应答消息 | | |||
| 10 | 0x920A | √ | √ | 上报驾驶员身份识别信息请求消息 | | |||
| 11 | 0x920B | √ | √ | 上报车辆电子运单请求消息 | | |||
### 平台间信息交互类 | |||
#### 主链路平台间信息交互消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x1300 | √ | √ | 主链路平台间信息交互消息 | | |||
| 2 | 0x1301 | √ | √ | 平台查岗应答消息(809补充协议文档) | | |||
| 3 | 0x1302 | √ | √ | 下发平台间报文应答消息(809补充协议文档) | | |||
#### 从链路平台间信息交互消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9300 | √ | √ | 从链路平台间信息交互消息 | | |||
| 2 | 0x9301 | √ | √ | 平台查岗请求(809补充协议文档) | | |||
| 3 | 0x9302 | √ | √ | 下发平台间报文请求(809补充协议文档) | | |||
### 车辆报警信息交互类 | |||
#### 主链路报警信息交互消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x1400 | √ | √ | 主链路平台间信息交互消息 | | |||
| 2 | 0x1401 | √ | √ | 报警督办应答消息 | | |||
| 3 | 0x1402 | √ | √ | 上报报警信息消息 | | |||
| 4 | 0x1403 | √ | √ | 主动上报报警处理结果信息(809补充协议文档) | | |||
#### 从链路报警信息交互消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9400 | √ | √ | 主链路平台间信息交互消息 | | |||
| 2 | 0x9401 | √ | √ | 报警督办请求 | | |||
| 3 | 0x9402 | √ | √ | 报警预警 | | |||
| 4 | 0x9403 | √ | √ | 实时交换报警信息 | | |||
### 车辆监管类 | |||
#### 主链路车辆监管消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x1500 | √ | √ | 主链路车辆监管消息 | | |||
| 2 | 0x1501 | √ | √ | 车辆单向监听应答 | | |||
| 3 | 0x1502 | √ | √ | 车辆拍照应答 | | |||
| 4 | 0x1503 | √ | √ | 下发车辆报文应答 | | |||
| 5 | 0x1504 | √ | √ | 上报车辆行驶记录应答(809补充协议文档) | | |||
| 6 | 0x1505 | √ | √ | 车辆应急接入监管平台应答消息 | | |||
#### 从链路车辆监管消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9500 | √ | √ | 从链路车辆监管消息 | | |||
| 2 | 0x9501 | √ | √ | 车辆单向监听请求 | | |||
| 3 | 0x9502 | √ | √ | 车辆拍照请求 | | |||
| 4 | 0x9503 | √ | √ | 下发车辆报文请求 | | |||
| 5 | 0x9504 | √ | √ | 上报车辆行驶记录请求(809补充协议文档) | | |||
| 6 | 0x9505 | √ | √ | 车辆应急接入监管平台请求消息(809补充协议文档) | | |||
### 车辆静态信息交换类 | |||
#### 主链路静态信息交换消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x1600 | √ | √ | 主链路静态信息交换消息 | | |||
| 2 | 0x1601 | √ | √ | 补报车辆静态信息应答 | | |||
#### 从链路静态信息交换消息 | |||
|序号|消息ID|完成情况|测试情况|消息体名称| | |||
|:------:|:------:|:------:|:------:|:------:| | |||
| 1 | 0x9600 | √ | √ | 从链路静态信息交换消息 | | |||
| 2 | 0x9601 | √ | √ | 补报车辆静态信息应答 | |
@@ -0,0 +1,32 @@ | |||
5B | |||
00 00 | |||
00 5A 02 00 00 00 85 12 00 01 33 53 D5 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 01 12 02 00 00 00 24 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 34 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 00 00 43 BF | |||
5D | |||
5B -- 标识头 | |||
00 00 00 5A -- Unit32_t 数据长度 | |||
00 00 00 85 -- Unit32_t 报文序列号 a | |||
12 00 -- Unit16_t 业务数据类型 | |||
01 33 53 D5 -- Unit32_t 下级平台接入码,上级平台给下级平台分配唯一标识码 | |||
01 00 00 -- BYTES 协议版本好标识 | |||
00 -- BYTE 报文加密标识位 b: 0 表示报文不加密,1 表示报文加密 | |||
00 00 27 0F -- Unit32_t 数据加密的密匙,长度为 4 个字节 | |||
D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 -- 21 Octet String 车牌号 | |||
01 -- 1 BYTE 车辆颜色,按照 JT/T415-2006 中5.4.12 的规定 | |||
12 02 --2 Uint16_t 子业务类型标识 | |||
00 00 00 24 -- 4 Uint32_t 后续数据长度 | |||
-----********************************************** 数据部分********************************************----- | |||
00 -- BYTE 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。加密标识:1-已加密,0-未加密。 | |||
13 07 07 DC -- 4 BYTES 日月年(dmyy) | |||
0F 0F 0F -- 3 BYTES 时分秒(hms) | |||
07 EF 4D 80 --4 Uint32_t 经度,单位为 1*10^-6 度 | |||
01 70 18 40 -- 4 Uint32_t 纬度,单位为 1*10^-6 度 | |||
00 32 -- 2 Uint16_t 速度, | |||
00 34 -- 2 Uint16_t 行驶记录速度 | |||
00 00 00 96 -- 4 Uint32_t 车辆当前总里程数 | |||
00 2D --2 Uint16_t 方向,0-359,单位为度(。) | |||
00 2D --2 Uint16_t 海拔高度,单位为米(m) | |||
00 00 00 03 -- 4 Uint32_t 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 | |||
00 00 00 00 --4 Uint32_t 报警状态,二进制表示,0 标识正常,1 表示报警:B31B30B29 。。。。。。 B2B1B0. 具 体 定 义 按 照JT/T808-2011 中表 18 的规定 | |||
43 BF -- 2 Unint16_t 数据 CRC 校验码 | |||
5D -- 标识尾 |
@@ -0,0 +1,18 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<OutputType>Exe</OutputType> | |||
<TargetFrameworks>netcoreapp2.2;net472;</TargetFrameworks> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="BenchmarkDotNet" Version="0.11.5" /> | |||
<PackageReference Include="System.Buffers" Version="4.5.0" /> | |||
<PackageReference Include="System.Memory" Version="4.5.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\JT809.Protocol\JT809.Protocol.csproj" /> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,95 @@ | |||
using BenchmarkDotNet.Attributes; | |||
using BenchmarkDotNet.Configs; | |||
using BenchmarkDotNet.Environments; | |||
using BenchmarkDotNet.Jobs; | |||
using BenchmarkDotNet.Toolchains.CsProj; | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Extensions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Benchmark | |||
{ | |||
[Config(typeof(JT809SerializerContextConfig))] | |||
[MarkdownExporter] | |||
[MemoryDiagnoser] | |||
public class JT809SerializerContext | |||
{ | |||
private byte[] bytes; | |||
private JT809Serializer JT809Serializer; | |||
[Params(100, 10000,100000)] | |||
public int N; | |||
[GlobalSetup] | |||
public void Setup() | |||
{ | |||
JT809Serializer = new JT809Serializer(); | |||
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(); | |||
} | |||
[Benchmark(Description = "JT809_0x9400_0x9401_Package_Deserialize")] | |||
public void JT809_0x9400_0x9401_Package_Deserialize_Test() | |||
{ | |||
for (int i = 0; i < N; i++) | |||
{ | |||
var result = JT809Serializer.Deserialize(bytes); | |||
} | |||
} | |||
[Benchmark(Description = "JT809_0x9400_0x9401_Package_Serialize")] | |||
public void JT809_0x9400_0x9401_Package_Serialize_Test() | |||
{ | |||
for (int i = 0; i < N; i++) | |||
{ | |||
JT809Package jT809Package = new JT809Package(); | |||
jT809Package.Header = new JT809Header | |||
{ | |||
MsgSN = 1666, | |||
EncryptKey = 9999, | |||
EncryptFlag = JT809Header_Encrypt.None, | |||
Version = new JT809Header_Version(1, 0, 0), | |||
BusinessType = JT809BusinessType.从链路报警信息交互消息, | |||
MsgGNSSCENTERID = 20180920, | |||
}; | |||
JT809_0x9400 bodies = new JT809_0x9400 | |||
{ | |||
VehicleNo = "粤A12345", | |||
VehicleColor = JT809VehicleColorType.黄色, | |||
SubBusinessType = JT809SubBusinessType.报警督办请求, | |||
}; | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc = JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.疲劳驾驶报警, | |||
WarnTime = DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID = "123FFAA1", | |||
SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel = 3, | |||
Supervisor = "smallchi", | |||
SupervisorTel = "12345678901", | |||
SupervisorEmail = "123456@qq.com" | |||
}; | |||
bodies.SubBodies = jT809_0x9400_0x9401; | |||
jT809Package.Bodies = bodies; | |||
var hex = JT809Serializer.Serialize(jT809Package); | |||
} | |||
} | |||
} | |||
public class JT809SerializerContextConfig : ManualConfig | |||
{ | |||
public JT809SerializerContextConfig() | |||
{ | |||
Add(Job.Default.WithGcServer(false).With(Runtime.Clr).With(Platform.AnyCpu)); | |||
Add(Job.Default.WithGcServer(false).With(CsProjCoreToolchain.NetCoreApp22).With(Platform.AnyCpu)); | |||
} | |||
} | |||
} |
@@ -0,0 +1,20 @@ | |||
using BenchmarkDotNet.Attributes; | |||
using BenchmarkDotNet.Configs; | |||
using BenchmarkDotNet.Environments; | |||
using BenchmarkDotNet.Exporters; | |||
using BenchmarkDotNet.Jobs; | |||
using BenchmarkDotNet.Reports; | |||
using BenchmarkDotNet.Running; | |||
using BenchmarkDotNet.Toolchains.CsProj; | |||
using System; | |||
namespace JT809.Protocol.Benchmark | |||
{ | |||
class Program | |||
{ | |||
static void Main(string[] args) | |||
{ | |||
Summary summary = BenchmarkRunner.Run<JT809SerializerContext>(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<OutputType>Exe</OutputType> | |||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||
<LangVersion>7.3</LangVersion> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\JT809.Protocol.Extensions.DependencyInjection\JT809.Protocol.Extensions.DependencyInjection.csproj" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Update="appsettings.json"> | |||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||
</None> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,68 @@ | |||
using JT809.Protocol.Interfaces; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.Extensions.Hosting; | |||
using System; | |||
using System.Threading.Tasks; | |||
namespace JT809.Protocol.Extensions.DependencyInjection.Test | |||
{ | |||
class Program | |||
{ | |||
static void Main(string[] args) | |||
{ | |||
//单个 | |||
IServiceCollection serviceDescriptors1 = new ServiceCollection(); | |||
serviceDescriptors1.AddJT809Configure(new DefaultConfig()); | |||
var ServiceProvider1 = serviceDescriptors1.BuildServiceProvider(); | |||
var defaultConfig = ServiceProvider1.GetRequiredService<IJT809Config>(); | |||
//多个 | |||
IServiceCollection serviceDescriptors2 = new ServiceCollection(); | |||
serviceDescriptors2.AddJT809Configure(new Config1()); | |||
serviceDescriptors2.AddJT809Configure(new Config2()); | |||
serviceDescriptors2.AddSingleton(factory => | |||
{ | |||
Func<string, IJT809Config> accesor = key => | |||
{ | |||
if (key.Equals("Config1")) | |||
{ | |||
return factory.GetService<Config1>(); | |||
} | |||
else if (key.Equals("Config2")) | |||
{ | |||
return factory.GetService<Config2>(); | |||
} | |||
else | |||
{ | |||
throw new ArgumentException($"Not Support key : {key}"); | |||
} | |||
}; | |||
return accesor; | |||
}); | |||
var ServiceProvider2 = serviceDescriptors2.BuildServiceProvider(); | |||
var config1 = ServiceProvider2.GetRequiredService<Func<string, IJT809Config>>()("Config1"); | |||
var flag21 = config1.GetSerializer().SerializerId == "Config1"; | |||
var config2 = ServiceProvider2.GetRequiredService<Func<string, IJT809Config>>()("Config2"); | |||
var flag22 = config2.GetSerializer().SerializerId == "Config2"; | |||
} | |||
} | |||
public class DefaultConfig : GlobalConfigBase | |||
{ | |||
public override string ConfigId => "test"; | |||
} | |||
public class Config1 : GlobalConfigBase | |||
{ | |||
public override string ConfigId => "Config1"; | |||
} | |||
public class Config2 : GlobalConfigBase | |||
{ | |||
public override string ConfigId => "Config2"; | |||
} | |||
} |
@@ -0,0 +1,19 @@ | |||
{ | |||
"JT809Options": { | |||
"HeaderOptions": { | |||
"MsgGNSSCENTERID": 20181012, | |||
"EncryptFlag": "Common", | |||
"EncryptKey": 9999, | |||
"Version": { | |||
"Major": 2, | |||
"Minor": 1, | |||
"Build": 2 | |||
} | |||
}, | |||
"EncryptOptions": { | |||
"M1": 10000000, | |||
"IA1": 20000000, | |||
"IC1": 30000000 | |||
} | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
using Microsoft.Extensions.DependencyInjection; | |||
using JT809.Protocol.Interfaces; | |||
namespace JT809.Protocol.Extensions.DependencyInjection | |||
{ | |||
public static class DependencyInjectionExtensions | |||
{ | |||
public static IServiceCollection AddJT809Configure(this IServiceCollection services, IJT809Config jT809Config) | |||
{ | |||
services.AddSingleton(jT809Config.GetType(), jT809Config); | |||
services.AddSingleton(jT809Config); | |||
return services; | |||
} | |||
public static IServiceCollection AddJT809Configure(this IServiceCollection services) | |||
{ | |||
services.AddSingleton<IJT809Config>(new DefaultGlobalConfig()); | |||
return services; | |||
} | |||
class DefaultGlobalConfig : GlobalConfigBase | |||
{ | |||
public override string ConfigId => "default"; | |||
} | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFramework>netstandard2.0</TargetFramework> | |||
<LangVersion>latest</LangVersion> | |||
<Copyright>Copyright 2018.</Copyright> | |||
<Authors>SmallChi</Authors> | |||
<PackageId>JT809.Extensions.DependencyInjection</PackageId> | |||
<Product>JT809.Extensions.DependencyInjection</Product> | |||
<Description>JT809协议依赖注入扩展包</Description> | |||
<PackageReleaseNotes>JT809协议依赖注入扩展包</PackageReleaseNotes> | |||
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> | |||
<RepositoryUrl>https://github.com/SmallChi/JT809</RepositoryUrl> | |||
<PackageProjectUrl>https://github.com/SmallChi/JT809</PackageProjectUrl> | |||
<license>https://github.com/SmallChi/JT809/blob/master/LICENSE</license> | |||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | |||
<Version>2.0.0</Version> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\JT809.Protocol\JT809.Protocol.csproj" /> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,27 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||
<IsPackable>false</IsPackable> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Compile Remove="PackageTest.cs" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | |||
<PackageReference Include="xunit" Version="2.4.1" /> | |||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | |||
<PrivateAssets>all</PrivateAssets> | |||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> | |||
</PackageReference> | |||
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\JT809.Protocol\JT809.Protocol.csproj" /> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,45 @@ | |||
using JT809.Protocol.Configs; | |||
using JT809.Protocol.Encrypt; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.Interfaces; | |||
namespace JT809.Protocol.Test.JT809Encrypt | |||
{ | |||
public class JT809EncryptTest | |||
{ | |||
private JT809EncryptOptions options = new JT809EncryptOptions | |||
{ | |||
IA1 = 20000000, | |||
IC1 = 20000000, | |||
M1 = 30000000 | |||
}; | |||
[Fact] | |||
public void Test1() | |||
{ | |||
byte[] bytes = new byte[] | |||
{ | |||
01,02,03,04,05,06,07 | |||
}; | |||
IJT809Encrypt jT809Encrypt = new JT809EncryptImpl(); | |||
var data = jT809Encrypt.Encrypt(bytes, options, 256178).ToHexString(); | |||
//"D3 4C 70 78 A7 3A 41" | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
byte[] bytes = "D3 4C 70 78 A7 3A 41".ToHexBytes(); | |||
IJT809Encrypt jT809Encrypt = new JT809EncryptImpl(); | |||
var data = jT809Encrypt.Decrypt(bytes, options, 256178); | |||
Assert.Equal(new byte[] | |||
{ | |||
01,02,03,04,05,06,07 | |||
}, data); | |||
} | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.Extensions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809Extensions | |||
{ | |||
public class JT809BinaryExtensionsTest | |||
{ | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var jT808_Alarms = JT809EnumExtensions.GetEnumTypes<JT808_Alarm>(24, 32); | |||
var jT808_Alarms1 = JT809EnumExtensions.GetEnumTypes<JT808_Alarm>(5, 32); | |||
var jT808_Alarms2 = JT809EnumExtensions.GetEnumTypes<JT808_Alarm>(16, 32); | |||
var jT808_Alarms3 = JT809EnumExtensions.GetEnumTypes<JT808_Alarm>(18, 32); | |||
var jT808_Alarms4 = JT809EnumExtensions.GetEnumTypes<JT808_Alarm>(31, 32); | |||
var jT808_Alarms5= JT809EnumExtensions.GetEnumTypes<JT808_Alarm>(8388609, 32); | |||
} | |||
[Fact] | |||
public void Test3() | |||
{ | |||
var jT808_Status = JT809EnumExtensions.GetEnumTypes<JT808_Status>(24, 32); | |||
var jT808_Status1 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(5, 32); | |||
var jT808_Status2 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(16, 32); | |||
var jT808_Status3 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(18, 32); | |||
var jT808_Status4 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(31, 32); | |||
var jT808_Status5 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(8388609, 32); | |||
} | |||
[Fact] | |||
public void Test4() | |||
{ | |||
var jT808_Status5 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(8388609, 32); | |||
} | |||
[Fact] | |||
public void Test5() | |||
{ | |||
var jT808_Status5 = JT809EnumExtensions.GetEnumTypes<JT808_Status>(8388609, 32,false); | |||
} | |||
} | |||
} |
@@ -0,0 +1,91 @@ | |||
using JT809.Protocol.Attributes; | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.SubMessageBody; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809Extensions | |||
{ | |||
public class JT809SubPackageExtensionsTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
var types = Enum.GetNames(typeof(JT809SubBusinessType)); | |||
foreach (var item in types) | |||
{ | |||
JT809SubBusinessType jT809SubBusinessType = item.ToEnum<JT809SubBusinessType>(); | |||
JT809BodiesTypeAttribute jT809SubBodiesTypeAttribute = jT809SubBusinessType.GetAttribute<JT809BodiesTypeAttribute>(); | |||
JT809SubBusinessTypeDescriptionAttribute jT809SubBusinessTypeDescriptionAttribute = jT809SubBusinessType.GetAttribute<JT809SubBusinessTypeDescriptionAttribute>(); | |||
if (jT809SubBusinessType == JT809SubBusinessType.None) | |||
{ | |||
Assert.Null(jT809SubBodiesTypeAttribute); | |||
Assert.Null(jT809SubBusinessTypeDescriptionAttribute); | |||
continue; | |||
} | |||
Assert.NotNull(jT809SubBusinessTypeDescriptionAttribute.Code); | |||
Assert.NotNull(jT809SubBusinessTypeDescriptionAttribute.Name); | |||
} | |||
} | |||
[Fact] | |||
public void Create_0x1001_Test() | |||
{ | |||
JT809Package jT809Package= JT809BusinessType.主链路登录请求消息.Create_主链路登录请求消息(new JT809Header | |||
{ | |||
MsgSN = 133, | |||
EncryptKey = 9999, | |||
MsgGNSSCENTERID = 20180920, | |||
}, new MessageBody.JT809_0x1001 | |||
{ | |||
UserId = 20180920, | |||
Password = "20180920", | |||
DownLinkIP = "127.0.0.1", | |||
DownLinkPort = 809 | |||
}); | |||
var hex = JT809Serializer.Serialize(jT809Package).ToHexString(); | |||
Assert.Equal("5B000000480000008510010133EFB8010000000000270F0133EFB832303138303932303132372E302E302E31000000000000000000000000000000000000000000000003296A915D", hex); | |||
} | |||
[Fact] | |||
public void Create_JT809_0x9400_0x9401_Test() | |||
{ | |||
JT809Package jT809Package = JT809BusinessType.从链路报警信息交互消息.Create_从链路报警信息交互消息( | |||
new JT809Header | |||
{ | |||
MsgSN = 1666, | |||
EncryptKey = 9999, | |||
EncryptFlag = JT809Header_Encrypt.None, | |||
Version = new JT809Header_Version(1, 0, 0), | |||
MsgGNSSCENTERID = 20180920, | |||
}, new JT809_0x9400 | |||
{ | |||
VehicleNo = "粤A12345", | |||
VehicleColor = JT809VehicleColorType.黄色, | |||
SubBusinessType = JT809SubBusinessType.报警督办请求, | |||
SubBodies = JT809SubBusinessType.报警督办请求.Create_报警督办请求( | |||
new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc = JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.疲劳驾驶报警, | |||
WarnTime = DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID = "123FFAA1", | |||
SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel = 3, | |||
Supervisor = "smallchi", | |||
SupervisorTel = "12345678901", | |||
SupervisorEmail = "123456@qq.com" | |||
}) | |||
} | |||
); | |||
var hex = JT809Serializer.Serialize(jT809Package).ToHexString(); | |||
Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex); | |||
} | |||
} | |||
} |
@@ -0,0 +1,61 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using System.Threading.Tasks; | |||
using System.Diagnostics; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test | |||
{ | |||
public class JT809HeaderTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809Header jT809Header = new JT809Header(); | |||
jT809Header.MsgLength = 24; | |||
jT809Header.MsgSN = 1024; | |||
jT809Header.BusinessType = JT809BusinessType.从链路静态信息交换消息; | |||
jT809Header.MsgGNSSCENTERID = 1200; | |||
jT809Header.Version = new JT809Header_Version(); | |||
jT809Header.EncryptFlag = JT809Header_Encrypt.None; | |||
jT809Header.EncryptKey = 0; | |||
var hex = JT809Serializer.Serialize(jT809Header).ToHexString(); | |||
Assert.Equal("00000018000004009600000004B00100000000000000", hex); | |||
//"00 00 00 18 00 00 04 00 96 00 00 00 04 B0 01 00 00 00 00 00 00 00" | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 18 00 00 04 00 96 00 00 00 04 B0 01 00 00 00 00 00 00 00".ToHexBytes(); | |||
JT809Header jT809Header= JT809Serializer.Deserialize<JT809Header>(bytes); | |||
Assert.Equal((uint)24, jT809Header.MsgLength); | |||
Assert.Equal((uint)1024, jT809Header.MsgSN); | |||
Assert.Equal(JT809BusinessType.从链路静态信息交换消息, jT809Header.BusinessType); | |||
Assert.Equal((uint)1200, jT809Header.MsgGNSSCENTERID); | |||
Assert.Equal(new JT809Header_Version().ToString(), jT809Header.Version.ToString()); | |||
Assert.Equal(JT809Header_Encrypt.None, jT809Header.EncryptFlag); | |||
Assert.Equal((uint)0, jT809Header.EncryptKey); | |||
} | |||
[Fact] | |||
public void Test4() | |||
{ | |||
JT809Header jT809Header = new JT809Header(); | |||
jT809Header.MsgLength = 24; | |||
jT809Header.MsgSN = 1024; | |||
jT809Header.BusinessType = JT809BusinessType.从链路静态信息交换消息; | |||
jT809Header.MsgGNSSCENTERID = 1200; | |||
jT809Header.Version = new JT809Header_Version (0xFF,0xAA,0xBB); | |||
jT809Header.EncryptFlag = JT809Header_Encrypt.None; | |||
jT809Header.EncryptKey = 0; | |||
var hex = JT809Serializer.Serialize(jT809Header).ToHexString(); | |||
Assert.Equal("00000018000004009600000004B0FFAABB0000000000", hex); | |||
} | |||
} | |||
} |
@@ -0,0 +1,58 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1001Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1001 jT809_0X1001 = new JT809_0x1001(); | |||
jT809_0X1001.UserId = 20180920; | |||
jT809_0X1001.Password = "20180920"; | |||
jT809_0X1001.DownLinkIP = "127.0.0.1"; | |||
jT809_0X1001.DownLinkPort = 809; | |||
var hex = JT809Serializer.Serialize(jT809_0X1001).ToHexString(); | |||
Assert.Equal("0133EFB832303138303932303132372E302E302E3100000000000000000000000000000000000000000000000329", hex); | |||
//5B | |||
//00 00 00 48 | |||
//00 00 00 85 | |||
//10 01 | |||
//01 33 53 D5 | |||
//01 00 00 | |||
//00 | |||
//00 00 27 0F | |||
//01 33 EF B8 | |||
//32 30 31 38 30 39 32 30 | |||
//31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |||
//03 29 | |||
//C3 0D | |||
//5D | |||
//"01 33 EF B8 | |||
//32 30 31 38 30 39 32 30 | |||
//31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |||
//03 29" | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01 33 EF B8 32 30 31 38 30 39 32 30 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 29".ToHexBytes(); | |||
JT809_0x1001 jT809_0X1001 = JT809Serializer.Deserialize<JT809_0x1001>(bytes); | |||
Assert.Equal((uint)20180920, jT809_0X1001.UserId); | |||
Assert.Equal("20180920", jT809_0X1001.Password); | |||
Assert.Equal("127.0.0.1", jT809_0X1001.DownLinkIP); | |||
Assert.Equal((ushort)809,jT809_0X1001.DownLinkPort); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1002Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1002 jT809_0X1002 = new JT809_0x1002(); | |||
jT809_0X1002.Result = JT809_0x1002_Result.成功; | |||
jT809_0X1002.VerifyCode = 54456; | |||
var hex = JT809Serializer.Serialize(jT809_0X1002).ToHexString(); | |||
//"00 00 00 D4 B8" | |||
Assert.Equal("000000D4B8", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 D4 B8".ToHexBytes(); | |||
JT809_0x1002 jT809_0X1002 = JT809Serializer.Deserialize<JT809_0x1002>(bytes); | |||
Assert.Equal(JT809_0x1002_Result.成功, jT809_0X1002.Result); | |||
Assert.Equal((uint)54456, jT809_0X1002.VerifyCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1003Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1003 jT809_0X1003 = new JT809_0x1003(); | |||
jT809_0X1003.UserId = 20180920; | |||
jT809_0X1003.Password = "20180920"; | |||
var hex = JT809Serializer.Serialize(jT809_0X1003).ToHexString(); | |||
//"01 33 EF B8 32 30 31 38 30 39 32 30" | |||
Assert.Equal("0133EFB83230313830393230", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01 33 EF B8 32 30 31 38 30 39 32 30".ToHexBytes(); | |||
JT809_0x1003 jT809_0X1003 = JT809Serializer.Deserialize<JT809_0x1003>(bytes); | |||
Assert.Equal((uint)20180920, jT809_0X1003.UserId); | |||
Assert.Equal("20180920", jT809_0X1003.Password); | |||
} | |||
} | |||
} |
@@ -0,0 +1,20 @@ | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.Extensions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1005Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809Package heartbeatPackage = JT809BusinessType.主链路连接保持请求消息.Create(); | |||
byte[] sendHeartbeatData = JT809Serializer.Serialize(heartbeatPackage, 100); | |||
} | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1006Test | |||
{ | |||
[Fact] | |||
public void Test1() | |||
{ | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1007Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1007 jT809_0X1007 = new JT809_0x1007(); | |||
jT809_0X1007.ErrorCode = JT809_0x1007_ErrorCode.主链路断开; | |||
var hex = JT809Serializer.Serialize(jT809_0X1007).ToHexString(); | |||
Assert.Equal("00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x1007 jT809_0X1007 = JT809Serializer.Deserialize<JT809_0x1007>(bytes); | |||
Assert.Equal(JT809_0x1007_ErrorCode.主链路断开, jT809_0X1007.ErrorCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1008Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1008 jT809_0X1008 = new JT809_0x1008(); | |||
jT809_0X1008.ReasonCode = JT809_0x1008_ReasonCode.网关重启; | |||
var hex = JT809Serializer.Serialize(jT809_0X1008).ToHexString(); | |||
Assert.Equal("00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x1008 jT809_0X1008 = JT809Serializer.Deserialize<JT809_0x1008>(bytes); | |||
Assert.Equal(JT809_0x1008_ReasonCode.网关重启, jT809_0X1008.ReasonCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,66 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1200Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200 jT809_0X1200 = new JT809_0x1200(); | |||
jT809_0X1200.VehicleNo= "粤A12345"; | |||
jT809_0X1200.VehicleColor = JT809VehicleColorType.蓝色; | |||
jT809_0X1200.SubBusinessType = JT809SubBusinessType.上传车辆注册信息; | |||
jT809_0X1200.DataLength = 61; | |||
JT809_0x1200_0x1201 jT809_0X1200_0X1201 = new JT809_0x1200_0x1201 | |||
{ | |||
PlateformId = "1111111111", | |||
ProducerId = "1111111111", | |||
TerminalId = "11111AA", | |||
TerminalModelType = "11111111", | |||
TerminalSimCode = "222222222222" | |||
}; | |||
jT809_0X1200.SubBodies = jT809_0X1200_0X1201; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200).ToHexString(); | |||
//D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 | |||
//00 | |||
//01 | |||
//12 01 | |||
//00 00 00 3D | |||
//00 00 00 00 00 00 00 42 3A 35 C7 | |||
//00 00 00 00 00 00 00 42 3A 35 C7 31 31 31 31 31 31 31 31 | |||
//00 00 00 00 00 00 00 00 00 00 00 00 31 31 31 31 31 41 41 32 32 32 32 32 32 32 32 32 32 32 32 | |||
//D4C1413132333435000000000000000000000000000112010000003D00000000000000423A35C700000000000000423A35C7313131313131313100000000000000000000000031313131314141323232323232323232323232 | |||
Assert.Equal("D4C1413132333435000000000000000000000000000112010000003D00000000000000423A35C700000000000000423A35C7313131313131313100000000000000000000000031313131314141323232323232323232323232", hex); | |||
//"D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 01 12 01 00 00 00 3D 00 00 00 00 00 00 00 42 3A 35 C7 00 00 00 00 00 00 00 42 3A 35 C7 31 31 31 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00 00 31 31 31 31 31 41 41 32 32 32 32 32 32 32 32 32 32 32 32" | |||
//"D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 01 12 01 00 00 00 3D 00 00 00 00 00 00 00 42 3A 35 C7 00 00 00 00 00 00 00 42 3A 35 C7 31 31 31 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00 00 31 31 31 31 31 61 61 32 32 32 32 32 32 32 32 32 32 32 32" | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 01 12 01 00 00 00 3D 00 00 00 00 00 00 00 42 3A 35 C7 00 00 00 00 00 00 00 42 3A 35 C7 31 31 31 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00 00 31 31 31 31 31 41 41 32 32 32 32 32 32 32 32 32 32 32 32".ToHexBytes(); | |||
JT809_0x1200 jT809_0X9001 = JT809Serializer.Deserialize<JT809_0x1200>(bytes); | |||
Assert.Equal("粤A12345", jT809_0X9001.VehicleNo); | |||
Assert.Equal(JT809VehicleColorType.蓝色, jT809_0X9001.VehicleColor); | |||
Assert.Equal(JT809SubBusinessType.上传车辆注册信息, jT809_0X9001.SubBusinessType); | |||
Assert.Equal((ushort)61, jT809_0X9001.DataLength); | |||
JT809_0x1200_0x1201 jT809_0X1200_0X1201 = jT809_0X9001.SubBodies as JT809_0x1200_0x1201; | |||
Assert.Equal("1111111111", jT809_0X1200_0X1201.PlateformId); | |||
Assert.Equal("1111111111", jT809_0X1200_0X1201.ProducerId); | |||
Assert.Equal("11111AA", jT809_0X1200_0X1201.TerminalId); | |||
Assert.Equal("11111111", jT809_0X1200_0X1201.TerminalModelType); | |||
Assert.Equal("222222222222", jT809_0X1200_0X1201.TerminalSimCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1300Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1300 jT809Bodies = new JT809_0x1300(); | |||
jT809Bodies.SubBusinessType = JT809SubBusinessType.平台查岗应答; | |||
jT809Bodies.SubBodies = new JT809_0x1300_0x1301 | |||
{ | |||
ObjectID="111", | |||
InfoContent= "22ha22", | |||
InfoID= 1234, | |||
ObjectType= JT809_0x1301_ObjectType.当前连接的下级平台 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809Bodies).ToHexString(); | |||
//"13 01 00 00 00 1B 01 31 31 31 00 00 00 00 00 00 00 00 00 00 00 04 D2 00 00 00 06 32 32 68 61 32 32" | |||
Assert.Equal("13010000001B01313131000000000000000000000004D200000006323268613232", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "13 01 00 00 00 1B 01 31 31 31 00 00 00 00 00 00 00 00 00 00 00 04 D2 00 00 00 06 32 32 68 61 32 32".ToHexBytes(); | |||
JT809_0x1300 jT809Bodies = JT809Serializer.Deserialize<JT809_0x1300>(bytes); | |||
Assert.Equal(JT809SubBusinessType.平台查岗应答, jT809Bodies.SubBusinessType); | |||
JT809_0x1300_0x1301 jT809SubBodies = (JT809_0x1300_0x1301)jT809Bodies.SubBodies; | |||
Assert.Equal("111", jT809SubBodies.ObjectID); | |||
Assert.Equal("22ha22", jT809SubBodies.InfoContent); | |||
Assert.Equal((uint)1234, jT809SubBodies.InfoID); | |||
Assert.Equal(JT809_0x1301_ObjectType.当前连接的下级平台, jT809SubBodies.ObjectType); | |||
} | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x1600Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1600 jT809Bodies = new JT809_0x1600(); | |||
jT809Bodies.VehicleNo = "粤A12345"; | |||
jT809Bodies.VehicleColor = JT809VehicleColorType.蓝色; | |||
jT809Bodies.SubBusinessType = JT809SubBusinessType.补报车辆静态信息应答; | |||
jT809Bodies.SubBodies = new JT809_0x1600_0x1601 | |||
{ | |||
CarInfo = "什么鬼" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809Bodies).ToHexString(); | |||
//"D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 01 16 01 00 00 00 06 CA B2 C3 B4 B9 ED" | |||
Assert.Equal("D4C14131323334350000000000000000000000000001160100000006CAB2C3B4B9ED",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 01 16 01 00 00 00 06 CA B2 C3 B4 B9 ED".ToHexBytes(); | |||
JT809_0x1600 jT809Bodies = JT809Serializer.Deserialize<JT809_0x1600>(bytes); | |||
Assert.Equal("粤A12345", jT809Bodies.VehicleNo); | |||
Assert.Equal(JT809VehicleColorType.蓝色, jT809Bodies.VehicleColor); | |||
Assert.Equal(JT809SubBusinessType.补报车辆静态信息应答, jT809Bodies.SubBusinessType); | |||
Assert.Equal("什么鬼", ((JT809_0x1600_0x1601)jT809Bodies.SubBodies).CarInfo); | |||
} | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x9001Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9001 jT809_0X9001 = new JT809_0x9001(); | |||
jT809_0X9001.VerifyCode = 45454; | |||
var hex = JT809Serializer.Serialize(jT809_0X9001).ToHexString(); | |||
Assert.Equal("0000B18E", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 B1 8E".ToHexBytes(); | |||
JT809_0x9001 jT809_0X9001 = JT809Serializer.Deserialize<JT809_0x9001>(bytes); | |||
Assert.Equal((uint)45454, jT809_0X9001.VerifyCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x9002Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9002 jT809_0X9002 = new JT809_0x9002(); | |||
jT809_0X9002.Result = JT809_0x9002_Result.成功; | |||
var hex = JT809Serializer.Serialize(jT809_0X9002).ToHexString(); | |||
Assert.Equal("00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x9002 jT809_0X9002 = JT809Serializer.Deserialize<JT809_0x9002>(bytes); | |||
Assert.Equal(JT809_0x9002_Result.成功, jT809_0X9002.Result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x9003Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9003 jT809_0X9003 = new JT809_0x9003(); | |||
jT809_0X9003.VerifyCode = 45454; | |||
var hex = JT809Serializer.Serialize(jT809_0X9003).ToHexString(); | |||
Assert.Equal("0000B18E",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 B1 8E".ToHexBytes(); | |||
JT809_0x9003 jT809_0X9003 = JT809Serializer.Deserialize<JT809_0x9003>(bytes); | |||
Assert.Equal((uint)45454, jT809_0X9003.VerifyCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x9007Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9007 jT809_0X9007 = new JT809_0x9007(); | |||
jT809_0X9007.ReasonCode = JT809_0x9007_ReasonCode.无法连接下级平台指定的服务IP与端口; | |||
var hex = JT809Serializer.Serialize(jT809_0X9007).ToHexString(); | |||
Assert.Equal("00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x9007 jT809_0X9007 = JT809Serializer.Deserialize<JT809_0x9007>(bytes); | |||
Assert.Equal(JT809_0x9007_ReasonCode.无法连接下级平台指定的服务IP与端口, jT809_0X9007.ReasonCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x9008Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9008 jT809_0X9008 = new JT809_0x9008(); | |||
jT809_0X9008.ReasonCode = JT809_0x9008_ReasonCode.其它原因; | |||
var hex = JT809Serializer.Serialize(jT809_0X9008).ToHexString(); | |||
Assert.Equal("01", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01".ToHexBytes(); | |||
JT809_0x9008 jT809_0X9008 = JT809Serializer.Deserialize<JT809_0x9008>(bytes); | |||
Assert.Equal(JT809_0x9008_ReasonCode.其它原因, jT809_0X9008.ReasonCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.JT809MessageBody | |||
{ | |||
public class JT809_0x9101Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9101 jT809_0X9101 = new JT809_0x9101(); | |||
jT809_0X9101.DynamicInfoTotal = 10000; | |||
jT809_0X9101.StartTime = 1537513862; | |||
jT809_0X9101.EndTime = 1537531862; | |||
var hex = JT809Serializer.Serialize(jT809_0X9101).ToHexString(); | |||
Assert.Equal("00002710000000005BA49986000000005BA4DFD6",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 27 10 00 00 00 00 5B A4 99 86 00 00 00 00 5B A4 DF D6".ToHexBytes(); | |||
JT809_0x9101 jT809_0X9101 = JT809Serializer.Deserialize<JT809_0x9101>(bytes); | |||
Assert.Equal((uint)10000, jT809_0X9101.DynamicInfoTotal); | |||
Assert.Equal((ulong)1537513862, jT809_0X9101.StartTime); | |||
Assert.Equal((ulong)1537531862, jT809_0X9101.EndTime); | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809Packages | |||
{ | |||
public class JT809HeaderPackageTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
var bytes = "5B 00 00 00 48 00 00 00 85 10 01 01 33 EF B8 01 00 00 00 00 00 27 0F 01 33 EF B8 32 30 31 38 30 39 32 30 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 29 6A 91 5D".ToHexBytes(); | |||
JT809HeaderPackage jT809HeaderPackage = JT809Serializer.Deserialize<JT809HeaderPackage>(bytes); | |||
Assert.Equal((uint)72, jT809HeaderPackage.Header.MsgLength); | |||
Assert.Equal((uint)133, jT809HeaderPackage.Header.MsgSN); | |||
Assert.Equal((uint)9999, jT809HeaderPackage.Header.EncryptKey); | |||
Assert.Equal((uint)20180920, jT809HeaderPackage.Header.MsgGNSSCENTERID); | |||
Assert.Equal(JT809BusinessType.主链路登录请求消息, jT809HeaderPackage.Header.BusinessType); | |||
Assert.Equal(new JT809Header_Version().ToString(), jT809HeaderPackage.Header.Version.ToString()); | |||
JT809_0x1001 jT809_0X1001 = JT809Serializer.Deserialize<JT809_0x1001>(jT809HeaderPackage.Bodies); | |||
Assert.Equal((uint)20180920, jT809_0X1001.UserId); | |||
Assert.Equal("20180920", jT809_0X1001.Password); | |||
Assert.Equal("127.0.0.1", jT809_0X1001.DownLinkIP); | |||
Assert.Equal((ushort)809, jT809_0X1001.DownLinkPort); | |||
} | |||
} | |||
} |
@@ -0,0 +1,78 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Encrypt; | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.Configs; | |||
using JT809.Protocol.Internal; | |||
using JT809.Protocol.Interfaces; | |||
namespace JT809.Protocol.Test.JT809Packages | |||
{ | |||
public class JT809_0x1001EncryptPackageTest | |||
{ | |||
class JT809GlobalConfig: GlobalConfigBase | |||
{ | |||
public override JT809EncryptOptions EncryptOptions { get; set; }= new JT809EncryptOptions() | |||
{ | |||
IA1 = 20000000, | |||
IC1 = 20000000, | |||
M1 = 30000000 | |||
}; | |||
public override string ConfigId => "JT809GlobalConfig"; | |||
} | |||
private JT809Serializer JT809Serializer; | |||
public JT809_0x1001EncryptPackageTest() | |||
{ | |||
JT809Serializer = new JT809Serializer(new JT809GlobalConfig()); | |||
} | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809Package jT809Package = new JT809Package(); | |||
jT809Package.Header = new JT809Header | |||
{ | |||
EncryptFlag = JT809Header_Encrypt.Common, | |||
MsgSN = 133, | |||
EncryptKey = 256178, | |||
BusinessType = JT809BusinessType.主链路登录请求消息, | |||
MsgGNSSCENTERID = 20180920, | |||
}; | |||
JT809_0x1001 jT809_0X1001 = new JT809_0x1001(); | |||
jT809_0X1001.UserId = 20180920; | |||
jT809_0X1001.Password = "20180920"; | |||
jT809_0X1001.DownLinkIP = "127.0.0.1"; | |||
jT809_0X1001.DownLinkPort = 809; | |||
jT809Package.Bodies = jT809_0X1001; | |||
var hex = JT809Serializer.Serialize(jT809Package).ToHexString(); | |||
//"5B 00 00 00 48 00 00 00 85 10 01 01 33 EF B8 01 00 00 01 00 00 16 BB D3 7D 9C C4 90 0C 77 DC 78 F8 67 65 27 D8 AE 12 24 3C FB 64 CC 2F BA 61 9A EF AD 33 AC CB 32 56 F6 7B FF 19 DF 33 09 78 41 09 86 65 70 3F 2E B5 5D" | |||
//5B000000480000008510010133EFB8010000010003E8B2 0133EFB832303138303932303132372E302E302E3100000000000000000000000000000000000000000000000329 03C5 5D | |||
//5B000000480000008510010133EFB8010000010003E8B2 D37D9CC4900C77DC78F8676527D8AE12243CFB64CC2FBA619AEFAD33ACCB3256F67BFF19DF33097841098665703F E36E 5D | |||
Assert.Equal("5B000000480000008510010133EFB8010000010003E8B2D37D9CC4900C77DC78F8676527D8AE12243CFB64CC2FBA619AEFAD33ACCB3256F67BFF19DF33097841098665703FE36E5D", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "5B000000480000008510010133EFB8010000010003E8B2D37D9CC4900C77DC78F8676527D8AE12243CFB64CC2FBA619AEFAD33ACCB3256F67BFF19DF33097841098665703FE36E5D".ToHexBytes(); | |||
JT809Package jT809Package = JT809Serializer.Deserialize(bytes); | |||
Assert.Equal(JT809Header_Encrypt.Common, jT809Package.Header.EncryptFlag); | |||
Assert.Equal((uint)256178, jT809Package.Header.EncryptKey); | |||
Assert.Equal((uint)72, jT809Package.Header.MsgLength); | |||
Assert.Equal((uint)133, jT809Package.Header.MsgSN); | |||
Assert.Equal((uint)20180920, jT809Package.Header.MsgGNSSCENTERID); | |||
Assert.Equal(JT809BusinessType.主链路登录请求消息, jT809Package.Header.BusinessType); | |||
Assert.Equal("1.0.0", jT809Package.Header.Version.ToString()); | |||
JT809_0x1001 jT809_0X1001 = (JT809_0x1001)jT809Package.Bodies; | |||
Assert.Equal((uint)20180920, jT809_0X1001.UserId); | |||
Assert.Equal("20180920", jT809_0X1001.Password); | |||
Assert.Equal("127.0.0.1", jT809_0X1001.DownLinkIP); | |||
Assert.Equal((ushort)809, jT809_0X1001.DownLinkPort); | |||
} | |||
} | |||
} |
@@ -0,0 +1,87 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809Packages | |||
{ | |||
public class JT809_0x1001PackageTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809Package jT809Package = new JT809Package(); | |||
jT809Package.Header = new JT809Header | |||
{ | |||
MsgSN= 133, | |||
EncryptKey=9999, | |||
BusinessType= JT809BusinessType.主链路登录请求消息, | |||
MsgGNSSCENTERID= 20180920, | |||
}; | |||
JT809_0x1001 jT809_0X1001 = new JT809_0x1001(); | |||
jT809_0X1001.UserId = 20180920; | |||
jT809_0X1001.Password = "20180920"; | |||
jT809_0X1001.DownLinkIP = "127.0.0.1"; | |||
jT809_0X1001.DownLinkPort = 809; | |||
jT809Package.Bodies = jT809_0X1001; | |||
var hex = JT809Serializer.Serialize(jT809Package).ToHexString(); | |||
//5B000000 4800000085 10010133EFB801 000000000027 0F0133EFB8 323031383 039323031 32372 E302E302E31 00000000000000000000000000000000000000000000000329 4055 5D | |||
//5B000000 4800000085 10010133EFB801 000000000027 0F0133EFB8 323031383 039323031 32372 E302E302E31 00000000000000000000000000000000000000000000000329 6A91 5D | |||
Assert.Equal("5B000000480000008510010133EFB8010000000000270F0133EFB832303138303932303132372E302E302E31000000000000000000000000000000000000000000000003296A915D", hex); | |||
//"5B | |||
//00 00 00 48 | |||
//00 00 00 85 | |||
//10 01 | |||
//01 33 EF B8 | |||
//01 00 00 | |||
//00 | |||
//00 00 27 0F | |||
//01 33 EF B8 | |||
//32 30 31 38 30 39 32 30 | |||
//31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |||
//03 29 | |||
//6A 91 | |||
//5D" | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "5B 00 00 00 48 00 00 00 85 10 01 01 33 EF B8 01 00 00 00 00 00 27 0F 01 33 EF B8 32 30 31 38 30 39 32 30 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 29 6A 91 5D".ToHexBytes(); | |||
JT809Package jT809Package = JT809Serializer.Deserialize(bytes); | |||
Assert.Equal((uint)72, jT809Package.Header.MsgLength); | |||
Assert.Equal((uint)133, jT809Package.Header.MsgSN); | |||
Assert.Equal((uint)9999, jT809Package.Header.EncryptKey); | |||
Assert.Equal((uint)20180920, jT809Package.Header.MsgGNSSCENTERID); | |||
Assert.Equal(JT809BusinessType.主链路登录请求消息, jT809Package.Header.BusinessType); | |||
Assert.Equal(new JT809Header_Version().ToString(), jT809Package.Header.Version.ToString()); | |||
JT809_0x1001 jT809_0X1001 = (JT809_0x1001)jT809Package.Bodies; | |||
Assert.Equal((uint)20180920, jT809_0X1001.UserId); | |||
Assert.Equal("20180920", jT809_0X1001.Password); | |||
Assert.Equal("127.0.0.1", jT809_0X1001.DownLinkIP); | |||
Assert.Equal((ushort)809, jT809_0X1001.DownLinkPort); | |||
} | |||
[Fact] | |||
public void Test3() | |||
{ | |||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); | |||
//字符'0':char c = '0'; 它的ASCII码实际上是48。 | |||
//字符'\0' : ASCII码为0,表示一个字符串结束的标志。 | |||
//"5B 00 00 00 48 00 00 00 85 10 01 01 33 EF B8 01 00 00 00 00 00 27 0F 30 01 33 EF B8 32 30 31 38 30 39 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 37 2E 30 2E 30 2E 31 03 29 7D 38 5D" | |||
var data="32 30 31 38 30 39 32 30".ToHexBytes(); | |||
var str = Encoding.GetEncoding("GBK").GetString(data); | |||
var data1 = "31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".ToHexBytes(); | |||
var str1 = Encoding.GetEncoding("GBK").GetString(data1); | |||
var test1 = Encoding.GetEncoding("GBK").GetBytes("\0\0\0\0\0\0127.0.0.1"); | |||
var test2 = Encoding.GetEncoding("GBK").GetBytes("127.0.0.1\0\0\0\0\0\0"); | |||
var test3 = Encoding.GetEncoding("GBK").GetBytes("000000127.0.0.1"); | |||
var test4 = Encoding.GetEncoding("GBK").GetBytes("127.0.0.1000000"); | |||
} | |||
} | |||
} |
@@ -0,0 +1,123 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.Configs; | |||
namespace JT809.Protocol.Test.JT809Packages | |||
{ | |||
public class JT809_0x9400_0x9401PackageTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809Package jT809Package = new JT809Package(); | |||
jT809Package.Header = new JT809Header | |||
{ | |||
MsgSN = 1666, | |||
EncryptKey = 9999, | |||
EncryptFlag= JT809Header_Encrypt.None, | |||
Version = new JT809Header_Version(1, 0, 0), | |||
BusinessType = JT809BusinessType.从链路报警信息交互消息, | |||
MsgGNSSCENTERID = 20180920, | |||
}; | |||
JT809_0x9400 bodies = new JT809_0x9400 | |||
{ | |||
VehicleNo="粤A12345", | |||
VehicleColor= JT809VehicleColorType.黄色, | |||
SubBusinessType= JT809SubBusinessType.报警督办请求, | |||
}; | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc = JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.疲劳驾驶报警, | |||
WarnTime = DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID = "123FFAA1", | |||
SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel = 3, | |||
Supervisor = "smallchi", | |||
SupervisorTel = "12345678901", | |||
SupervisorEmail = "123456@qq.com" | |||
}; | |||
bodies.SubBodies = jT809_0x9400_0x9401; | |||
jT809Package.Bodies = bodies; | |||
var hex = JT809Serializer.Serialize(jT809Package).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" | |||
//5B000000900000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000C69C5D | |||
//5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D | |||
Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
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(); | |||
JT809Package jT809Package = JT809Serializer.Deserialize(bytes); | |||
Assert.Equal((uint)146, jT809Package.Header.MsgLength); | |||
Assert.Equal((uint)1666, jT809Package.Header.MsgSN); | |||
Assert.Equal((uint)9999, jT809Package.Header.EncryptKey); | |||
Assert.Equal(JT809Header_Encrypt.None, jT809Package.Header.EncryptFlag); | |||
Assert.Equal((uint)20180920, jT809Package.Header.MsgGNSSCENTERID); | |||
Assert.Equal(JT809BusinessType.从链路报警信息交互消息, jT809Package.Header.BusinessType); | |||
Assert.Equal(new JT809Header_Version().ToString(), jT809Package.Header.Version.ToString()); | |||
JT809_0x9400 jT809_0X400 = (JT809_0x9400)jT809Package.Bodies; | |||
Assert.Equal("粤A12345", jT809_0X400.VehicleNo); | |||
Assert.Equal(JT809VehicleColorType.黄色, jT809_0X400.VehicleColor); | |||
Assert.Equal(JT809SubBusinessType.报警督办请求, jT809_0X400.SubBusinessType); | |||
Assert.Equal((uint)92, jT809_0X400.DataLength); | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = (JT809_0x9400_0x9401)jT809_0X400.SubBodies; | |||
Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9401.WarnSrc); | |||
Assert.Equal(JT809WarnType.疲劳驾驶报警, jT809_0x9400_0x9401.WarnType); | |||
Assert.Equal(DateTime.Parse("2018-09-27 10:24:00"), jT809_0x9400_0x9401.WarnTime); | |||
Assert.Equal("123FFAA1", jT809_0x9400_0x9401.SupervisionID); | |||
Assert.Equal(DateTime.Parse("2018-09-27 11:24:00"), jT809_0x9400_0x9401.SupervisionEndTime); | |||
Assert.Equal(3, jT809_0x9400_0x9401.SupervisionLevel); | |||
Assert.Equal("smallchi", jT809_0x9400_0x9401.Supervisor); | |||
Assert.Equal("12345678901", jT809_0x9400_0x9401.SupervisorTel); | |||
Assert.Equal("123456@qq.com", jT809_0x9400_0x9401.SupervisorEmail); | |||
} | |||
[Fact] | |||
public void Test3() | |||
{ | |||
JT809Serializer JT809SerializerTest3 = new JT809Serializer(); | |||
JT809Package jT809Package = JT809BusinessType.从链路报警信息交互消息.Create(new JT809_0x9400 | |||
{ | |||
VehicleNo = "粤A12345", | |||
VehicleColor = JT809VehicleColorType.黄色, | |||
SubBusinessType = JT809SubBusinessType.报警督办请求, | |||
SubBodies = new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc = JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.疲劳驾驶报警, | |||
WarnTime = DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID = "123FFAA1", | |||
SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel = 3, | |||
Supervisor = "smallchi", | |||
SupervisorTel = "12345678901", | |||
SupervisorEmail = "123456@qq.com" | |||
} | |||
}); | |||
jT809Package.Header.MsgSN = 1666; | |||
jT809Package.Header.EncryptKey = 9999; | |||
jT809Package.Header.MsgGNSSCENTERID = 20180920; | |||
var hex = JT809SerializerTest3.Serialize(jT809Package).ToHexString(); | |||
//"5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D" | |||
Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex); | |||
} | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x1201Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x1201 jT809_0X1200_0X1201 = new JT809_0x1200_0x1201 | |||
{ | |||
PlateformId= "1111111111", | |||
ProducerId= "1111111111", | |||
TerminalId= "11111AA", | |||
TerminalModelType= "11111111", | |||
TerminalSimCode= "222222222222" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X1201).ToHexString(); | |||
//"00 00 00 00 00 00 00 42 3A 35 C7 00 00 00 00 00 00 00 42 3A 35 C7 31 31 31 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00 00 31 31 31 31 31 41 41 32 32 32 32 32 32 32 32 32 32 32 32" | |||
Assert.Equal("00000000000000423A35C700000000000000423A35C7313131313131313100000000000000000000000031313131314141323232323232323232323232",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 00 00 00 00 42 3A 35 C7 00 00 00 00 00 00 00 42 3A 35 C7 31 31 31 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00 00 31 31 31 31 31 41 41 32 32 32 32 32 32 32 32 32 32 32 32".ToHexBytes(); | |||
JT809_0x1200_0x1201 jT809_0X1200_0X1201 = JT809Serializer.Deserialize<JT809_0x1200_0x1201>(bytes); | |||
Assert.Equal("1111111111", jT809_0X1200_0X1201.PlateformId); | |||
Assert.Equal("1111111111", jT809_0X1200_0X1201.ProducerId); | |||
Assert.Equal("11111AA", jT809_0X1200_0X1201.TerminalId); | |||
Assert.Equal("11111111", jT809_0X1200_0X1201.TerminalModelType); | |||
Assert.Equal("222222222222", jT809_0X1200_0X1201.TerminalSimCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,61 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x1202Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x1202 jT809_0X1200_0X1202 = new JT809_0x1200_0x1202(); | |||
jT809_0X1200_0X1202.VehiclePosition.Day = 19; | |||
jT809_0X1200_0X1202.VehiclePosition.Month = 7; | |||
jT809_0X1200_0X1202.VehiclePosition.Year = 2012; | |||
jT809_0X1200_0X1202.VehiclePosition.Hour = 15; | |||
jT809_0X1200_0X1202.VehiclePosition.Minute = 15; | |||
jT809_0X1200_0X1202.VehiclePosition.Second = 15; | |||
jT809_0X1200_0X1202.VehiclePosition.Lon = 133123456; | |||
jT809_0X1200_0X1202.VehiclePosition.Lat = 24123456; | |||
jT809_0X1200_0X1202.VehiclePosition.Vec1 = 50; | |||
jT809_0X1200_0X1202.VehiclePosition.Vec2 = 51; | |||
jT809_0X1200_0X1202.VehiclePosition.Vec3 = 150; | |||
jT809_0X1200_0X1202.VehiclePosition.Direction = 45; | |||
jT809_0X1200_0X1202.VehiclePosition.Altitude = 45; | |||
jT809_0X1200_0X1202.VehiclePosition.State = 3; | |||
jT809_0X1200_0X1202.VehiclePosition.Alarm = 257; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X1202).ToHexString(); | |||
//"00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01" | |||
Assert.Equal("00130707DC0F0F0F07EF4D80017018400032003300000096002D002D0000000300000101", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01".ToHexBytes(); | |||
JT809_0x1200_0x1202 jT809_0X1200_0X1202 = JT809Serializer.Deserialize<JT809_0x1200_0x1202>(bytes); | |||
Assert.Equal(19, jT809_0X1200_0X1202.VehiclePosition.Day); | |||
Assert.Equal(7, jT809_0X1200_0X1202.VehiclePosition.Month); | |||
Assert.Equal(2012, jT809_0X1200_0X1202.VehiclePosition.Year); | |||
Assert.Equal(15, jT809_0X1200_0X1202.VehiclePosition.Hour); | |||
Assert.Equal(15, jT809_0X1200_0X1202.VehiclePosition.Minute); | |||
Assert.Equal(15, jT809_0X1200_0X1202.VehiclePosition.Second); | |||
Assert.Equal((uint)133123456, jT809_0X1200_0X1202.VehiclePosition.Lon); | |||
Assert.Equal((uint)24123456, jT809_0X1200_0X1202.VehiclePosition.Lat); | |||
Assert.Equal(50, jT809_0X1200_0X1202.VehiclePosition.Vec1); | |||
Assert.Equal(51, jT809_0X1200_0X1202.VehiclePosition.Vec2); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1202.VehiclePosition.Direction); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1202.VehiclePosition.Altitude); | |||
Assert.Equal((uint)3, jT809_0X1200_0X1202.VehiclePosition.State); | |||
Assert.Equal((uint)257, jT809_0X1200_0X1202.VehiclePosition.Alarm); | |||
} | |||
} | |||
} |
@@ -0,0 +1,138 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x1203Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x1203 jT809_0X1200_0X1203 = new JT809_0x1200_0x1203(); | |||
jT809_0X1200_0X1203.GNSS = new List<JT809_0x1200_0x1202>(); | |||
JT809_0x1200_0x1202 jT809_0X1200_0X1202_1 = new JT809_0x1200_0x1202(); | |||
jT809_0X1200_0X1202_1.VehiclePosition.Day = 19; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Month = 7; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Year = 2012; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Hour = 15; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Minute = 15; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Second = 15; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Lon = 133123456; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Lat = 24123456; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Vec1 = 50; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Vec2 = 51; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Vec3 = 150; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Direction = 45; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Altitude = 45; | |||
jT809_0X1200_0X1202_1.VehiclePosition.State = 3; | |||
jT809_0X1200_0X1202_1.VehiclePosition.Alarm = 257; | |||
JT809_0x1200_0x1202 jT809_0X1200_0X1202_2 = new JT809_0x1200_0x1202(); | |||
jT809_0X1200_0X1202_2.VehiclePosition.Day = 19; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Month = 7; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Year = 2012; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Hour = 16; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Minute = 16; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Second = 16; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Lon = 133123456; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Lat = 24123456; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Vec1 = 50; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Vec2 = 51; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Vec3 = 150; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Direction = 45; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Altitude = 45; | |||
jT809_0X1200_0X1202_2.VehiclePosition.State = 3; | |||
jT809_0X1200_0X1202_2.VehiclePosition.Alarm = 257; | |||
JT809_0x1200_0x1202 jT809_0X1200_0X1202_3 = new JT809_0x1200_0x1202(); | |||
jT809_0X1200_0X1202_3.VehiclePosition.Day = 19; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Month = 7; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Year = 2012; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Hour = 17; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Minute = 17; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Second = 17; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Lon = 133123456; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Lat = 24123456; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Vec1 = 50; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Vec2 = 51; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Vec3 = 150; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Direction = 45; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Altitude = 45; | |||
jT809_0X1200_0X1202_3.VehiclePosition.State = 3; | |||
jT809_0X1200_0X1202_3.VehiclePosition.Alarm = 257; | |||
jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_1); | |||
jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_2); | |||
jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_3); | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X1203).ToHexString(); | |||
//"03 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 10 10 10 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 11 11 11 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01" | |||
Assert.Equal("0300130707DC0F0F0F07EF4D80017018400032003300000096002D002D000000030000010100130707DC10101007EF4D80017018400032003300000096002D002D000000030000010100130707DC11111107EF4D80017018400032003300000096002D002D0000000300000101", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "03 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 10 10 10 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 11 11 11 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01".ToHexBytes(); | |||
JT809_0x1200_0x1203 jT809_0X1200_0X1203 = JT809Serializer.Deserialize<JT809_0x1200_0x1203>(bytes); | |||
Assert.Equal(3, jT809_0X1200_0X1203.GNSSCount); | |||
Assert.Equal(19, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Day); | |||
Assert.Equal(7, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Month); | |||
Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Year); | |||
Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Hour); | |||
Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Minute); | |||
Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Second); | |||
Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Lon); | |||
Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Lat); | |||
Assert.Equal(50, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Vec1); | |||
Assert.Equal(51, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Vec2); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Direction); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Altitude); | |||
Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.State); | |||
Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Alarm); | |||
Assert.Equal(19, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Day); | |||
Assert.Equal(7, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Month); | |||
Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Year); | |||
Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Hour); | |||
Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Minute); | |||
Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Second); | |||
Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Lon); | |||
Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Lat); | |||
Assert.Equal(50, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Vec1); | |||
Assert.Equal(51, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Vec2); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Direction); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Altitude); | |||
Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.State); | |||
Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Alarm); | |||
Assert.Equal(19, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Day); | |||
Assert.Equal(7, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Month); | |||
Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Year); | |||
Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Hour); | |||
Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Minute); | |||
Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Second); | |||
Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Lon); | |||
Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Lat); | |||
Assert.Equal(50, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Vec1); | |||
Assert.Equal(51, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Vec2); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Direction); | |||
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Altitude); | |||
Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.State); | |||
Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Alarm); | |||
} | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x1207Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x1207 jT809_0X1200_0X1201 = new JT809_0x1200_0x1207 | |||
{ | |||
StartTime = DateTime.Parse("2018-09-24 14:14:14"), | |||
EndTime = DateTime.Parse("2018-09-24 23:23:23") | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X1201).ToHexString(); | |||
//"00 00 00 00 5B A8 80 B6 00 00 00 00 5B A9 01 6B" | |||
Assert.Equal("000000005BA880B6000000005BA9016B",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 00 5B A8 80 B6 00 00 00 00 5B A9 01 6B".ToHexBytes(); | |||
JT809_0x1200_0x1207 jT809_0X1200_0X1201 = JT809Serializer.Deserialize<JT809_0x1200_0x1207>(bytes); | |||
Assert.Equal(DateTime.Parse("2018-09-24 14:14:14"), jT809_0X1200_0X1201.StartTime); | |||
Assert.Equal(DateTime.Parse("2018-09-24 23:23:23"), jT809_0X1200_0X1201.EndTime); | |||
} | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x1209Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x1209 jT809_0X1200_0X1209 = new JT809_0x1200_0x1209 | |||
{ | |||
StartTime = DateTime.Parse("2018-09-24 14:14:14"), | |||
EndTime = DateTime.Parse("2018-09-24 23:23:23") | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X1209).ToHexString(); | |||
//"00 00 00 00 5B A8 80 B6 00 00 00 00 5B A9 01 6B" | |||
Assert.Equal("000000005BA880B6000000005BA9016B",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 00 5B A8 80 B6 00 00 00 00 5B A9 01 6B".ToHexBytes(); | |||
JT809_0x1200_0x1209 jT809_0X1200_0X1209 = JT809Serializer.Deserialize<JT809_0x1200_0x1209>(bytes); | |||
Assert.Equal(DateTime.Parse("2018-09-24 14:14:14"), jT809_0X1200_0X1209.StartTime); | |||
Assert.Equal(DateTime.Parse("2018-09-24 23:23:23"), jT809_0X1200_0X1209.EndTime); | |||
} | |||
} | |||
} |
@@ -0,0 +1,42 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x120ATest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x120A jT809_0X1200_0X120A = new JT809_0x1200_0x120A | |||
{ | |||
DriverID = "123456789123456789", | |||
DriverName = "smallchi", | |||
Licence= "abcdef123456789", | |||
OrgName= "www123456789" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X120A).ToHexString(); | |||
//"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 31 32 33 34 35 36 37 38 39 00 00 61 62 63 64 65 66 31 32 33 34 35 36 37 38 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 77 77 31 32 33 34 35 36 37 38 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" | |||
Assert.Equal("736D616C6C63686900000000000000003132333435363738393132333435363738390000616263646566313233343536373839000000000000000000000000000000000000000000000000007777773132333435363738390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex);Assert.Equal("736D616C6C63686900000000000000003132333435363738393132333435363738390000616263646566313233343536373839000000000000000000000000000000000000000000000000007777773132333435363738390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "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 31 32 33 34 35 36 37 38 39 00 00 61 62 63 64 65 66 31 32 33 34 35 36 37 38 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 77 77 31 32 33 34 35 36 37 38 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".ToHexBytes(); | |||
JT809_0x1200_0x120A jT809_0X1200_0X120A = JT809Serializer.Deserialize<JT809_0x1200_0x120A>(bytes); | |||
Assert.Equal("123456789123456789", jT809_0X1200_0X120A.DriverID); | |||
Assert.Equal("smallchi", jT809_0X1200_0X120A.DriverName); | |||
Assert.Equal("abcdef123456789", jT809_0X1200_0X120A.Licence); | |||
Assert.Equal("www123456789", jT809_0X1200_0X120A.OrgName); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x120BTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x120B jT809_0X1200_0X120B = new JT809_0x1200_0x120B | |||
{ | |||
EwaybillInfo="asd123456asd" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X120B).ToHexString(); | |||
//"00 00 00 0C 61 73 64 31 32 33 34 35 36 61 73 64" | |||
Assert.Equal("0000000C617364313233343536617364", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 0C 61 73 64 31 32 33 34 35 36 61 73 64".ToHexBytes(); | |||
JT809_0x1200_0x120B jT809_0X1200_0X120B = JT809Serializer.Deserialize<JT809_0x1200_0x120B>(bytes); | |||
Assert.Equal("asd123456asd", jT809_0X1200_0X120B.EwaybillInfo); | |||
Assert.Equal((uint)12, jT809_0X1200_0X120B.EwaybillLength); | |||
} | |||
} | |||
} |
@@ -0,0 +1,41 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x120CTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x120C jT809_0X1200_0X120C = new JT809_0x1200_0x120C | |||
{ | |||
DriverID="1234567890123", | |||
DriverName="smallchi", | |||
Licence="3210987654321", | |||
OrgName = "gov" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X120C).ToHexString(); | |||
Assert.Equal("736D616C6C6368690000000000000000313233343536373839303132330000000000000033323130393837363534333231000000000000000000000000000000000000000000000000000000676F760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "736D616C6C6368690000000000000000313233343536373839303132330000000000000033323130393837363534333231000000000000000000000000000000000000000000000000000000676F760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000".ToHexBytes(); | |||
JT809_0x1200_0x120C jT809_0X1200_0X120C = JT809Serializer.Deserialize<JT809_0x1200_0x120C>(bytes); | |||
Assert.Equal("1234567890123", jT809_0X1200_0X120C.DriverID); | |||
Assert.Equal("smallchi", jT809_0X1200_0X120C.DriverName); | |||
Assert.Equal("3210987654321", jT809_0X1200_0X120C.Licence); | |||
Assert.Equal("gov", jT809_0X1200_0X120C.OrgName); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1200_0x120DTest | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1200_0x120D jT809_0X1200_0X120D = new JT809_0x1200_0x120D | |||
{ | |||
EwaybillInfo="asd123456asd" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1200_0X120D).ToHexString(); | |||
Assert.Equal("0000000C617364313233343536617364", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 0C 61 73 64 31 32 33 34 35 36 61 73 64".ToHexBytes(); | |||
JT809_0x1200_0x120D jT809_0X1200_0X120D = JT809Serializer.Deserialize<JT809_0x1200_0x120D>(bytes); | |||
Assert.Equal("asd123456asd", jT809_0X1200_0X120D.EwaybillInfo); | |||
Assert.Equal((uint)12, jT809_0X1200_0X120D.EwaybillLength); | |||
} | |||
} | |||
} |
@@ -0,0 +1,43 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1300_0x1301Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1300_0x1301 jT809_0x1300_0x1301 = new JT809_0x1300_0x1301 | |||
{ | |||
ObjectID = "111", | |||
InfoContent = "22ha22", | |||
InfoID = 1234, | |||
ObjectType = JT809_0x1301_ObjectType.当前连接的下级平台 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1300_0x1301).ToHexString(); | |||
//"01 31 31 31 00 00 00 00 00 00 00 00 00 00 00 04 D2 00 00 00 06 32 32 68 61 32 32" | |||
Assert.Equal("01313131000000000000000000000004D200000006323268613232", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01 31 31 31 00 00 00 00 00 00 00 00 00 00 00 04 D2 00 00 00 06 32 32 68 61 32 32".ToHexBytes(); | |||
JT809_0x1300_0x1301 jT809_0x1300_0x1301 = JT809Serializer.Deserialize<JT809_0x1300_0x1301>(bytes); | |||
Assert.Equal("111", jT809_0x1300_0x1301.ObjectID); | |||
Assert.Equal("22ha22", jT809_0x1300_0x1301.InfoContent); | |||
Assert.Equal((uint)1234, jT809_0x1300_0x1301.InfoID); | |||
Assert.Equal(JT809_0x1301_ObjectType.当前连接的下级平台, jT809_0x1300_0x1301.ObjectType); | |||
} | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1300_0x1302Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1300_0x1302 jT809_0x1300_0x1302 = new JT809_0x1300_0x1302 | |||
{ | |||
InfoID = 1234 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1300_0x1302).ToHexString(); | |||
Assert.Equal("000004D2", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "000004D2".ToHexBytes(); | |||
JT809_0x1300_0x1302 jT809_0x1300_0x1302 = JT809Serializer.Deserialize<JT809_0x1300_0x1302>(bytes); | |||
Assert.Equal((uint)1234, jT809_0x1300_0x1302.InfoID); | |||
} | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1400_0x1401Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1400_0x1401 jT809_0x1400_0x1401 = new JT809_0x1400_0x1401 | |||
{ | |||
SupervisionID=9898, | |||
Result= JT809_0x1401_Result.处理中 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1400_0x1401).ToHexString(); | |||
Assert.Equal("000026AA00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "000026AA00".ToHexBytes(); | |||
JT809_0x1400_0x1401 jT809_0x1400_0x1401 = JT809Serializer.Deserialize<JT809_0x1400_0x1401>(bytes); | |||
Assert.Equal(JT809_0x1401_Result.处理中, jT809_0x1400_0x1401.Result); | |||
Assert.Equal((uint)9898, jT809_0x1400_0x1401.SupervisionID); | |||
} | |||
} | |||
} |
@@ -0,0 +1,46 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1400_0x1402Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1400_0x1402 jT809_0x1400_0x1402 = new JT809_0x1400_0x1402 | |||
{ | |||
WarnSrc= JT809WarnSrc.车载终端, | |||
WarnType = JT809WarnType.偏离路线报警, | |||
WarnTime=DateTime.Parse("2018-09-26"), | |||
InfoContent = "gfdf454553", | |||
InfoID = 3344, | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1400_0x1402).ToHexString(); | |||
// "01 00 0B 00 00 00 00 5B AA 5B 80 00 00 0D 10 00 00 00 0A 67 66 64 66 34 35 34 35 35 33" | |||
Assert.Equal("01000B000000005BAA5B8000000D100000000A67666466343534353533", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01 00 0B 00 00 00 00 5B AA 5B 80 00 00 0D 10 00 00 00 0A 67 66 64 66 34 35 34 35 35 33".ToHexBytes(); | |||
JT809_0x1400_0x1402 jT809_0x1400_0x1402 = JT809Serializer.Deserialize<JT809_0x1400_0x1402>(bytes); | |||
Assert.Equal(JT809WarnSrc.车载终端, jT809_0x1400_0x1402.WarnSrc); | |||
Assert.Equal("gfdf454553", jT809_0x1400_0x1402.InfoContent); | |||
Assert.Equal(JT809WarnType.偏离路线报警, jT809_0x1400_0x1402.WarnType); | |||
Assert.Equal((uint)3344, jT809_0x1400_0x1402.InfoID); | |||
Assert.Equal((uint)10, jT809_0x1400_0x1402.InfoLength); | |||
Assert.Equal(DateTime.Parse("2018-09-26"), jT809_0x1400_0x1402.WarnTime); | |||
} | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1400_0x1403Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1400_0x1403 jT809_0x1400_0x1403 = new JT809_0x1400_0x1403 | |||
{ | |||
Result= JT809_0x1403_Result.将来处理, | |||
InfoID = 3344, | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1400_0x1403).ToHexString(); | |||
// "00 00 0D 10 03" | |||
Assert.Equal("00000D1003", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 0D 10 03".ToHexBytes(); | |||
JT809_0x1400_0x1403 jT809_0x1400_0x1403 = JT809Serializer.Deserialize<JT809_0x1400_0x1403>(bytes); | |||
Assert.Equal(JT809_0x1403_Result.将来处理, jT809_0x1400_0x1403.Result); | |||
Assert.Equal((uint)3344, jT809_0x1400_0x1403.InfoID); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1500_0x1501Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1500_0x1501 jT809_0X1500_0X1501 = new JT809_0x1500_0x1501 | |||
{ | |||
Result= JT809_0x1501_Result.监听成功 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1500_0X1501).ToHexString(); | |||
Assert.Equal("00",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x1500_0x1501 jT809_0X1500_0X1501 = JT809Serializer.Deserialize<JT809_0x1500_0x1501>(bytes); | |||
Assert.Equal(JT809_0x1501_Result.监听成功, jT809_0X1500_0X1501.Result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,79 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
using JT809.Protocol.Metadata; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1500_0x1502Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1500_0x1502 jT809_0x1500_0x1502 = new JT809_0x1500_0x1502 | |||
{ | |||
PhotoRspFlag= JT809_0x1502_PhotoRspFlag.完成拍照, | |||
VehiclePosition=new JT809VehiclePositionProperties | |||
{ | |||
Encrypt= JT809_VehiclePositionEncrypt.未加密, | |||
Day=19, | |||
Month=7, | |||
Year=2012, | |||
Hour=15, | |||
Minute=15, | |||
Second=15, | |||
Lon= 133123456, | |||
Lat= 24123456, | |||
Vec1=53, | |||
Vec2=45, | |||
Vec3=1234, | |||
Direction=45, | |||
Altitude=45, | |||
State=1, | |||
Alarm=1 | |||
}, | |||
LensID=123, | |||
SizeType=1, | |||
Type=1, | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1500_0x1502).ToHexString(); | |||
//"01 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 35 00 2D 00 00 04 D2 00 2D 00 2D 00 00 00 01 00 00 00 01 7B 00 00 00 00 01 01" | |||
Assert.Equal("0100130707DC0F0F0F07EF4D80017018400035002D000004D2002D002D00000001000000017B000000000101", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 35 00 2D 00 00 04 D2 00 2D 00 2D 00 00 00 01 00 00 00 01 7B 00 00 00 00 01 01".ToHexBytes(); | |||
JT809_0x1500_0x1502 jT809_0x1500_0x1502 = JT809Serializer.Deserialize<JT809_0x1500_0x1502>(bytes); | |||
Assert.Equal(JT809_0x1502_PhotoRspFlag.完成拍照, jT809_0x1500_0x1502.PhotoRspFlag); | |||
Assert.Equal(JT809_VehiclePositionEncrypt.未加密, jT809_0x1500_0x1502.VehiclePosition.Encrypt); | |||
Assert.Equal(19, jT809_0x1500_0x1502.VehiclePosition.Day); | |||
Assert.Equal(7, jT809_0x1500_0x1502.VehiclePosition.Month); | |||
Assert.Equal(2012, jT809_0x1500_0x1502.VehiclePosition.Year); | |||
Assert.Equal(15, jT809_0x1500_0x1502.VehiclePosition.Hour); | |||
Assert.Equal(15, jT809_0x1500_0x1502.VehiclePosition.Minute); | |||
Assert.Equal(15, jT809_0x1500_0x1502.VehiclePosition.Second); | |||
Assert.Equal((uint)133123456, jT809_0x1500_0x1502.VehiclePosition.Lon); | |||
Assert.Equal((uint)24123456, jT809_0x1500_0x1502.VehiclePosition.Lat); | |||
Assert.Equal((ushort)53, jT809_0x1500_0x1502.VehiclePosition.Vec1); | |||
Assert.Equal((ushort)45, jT809_0x1500_0x1502.VehiclePosition.Vec2); | |||
Assert.Equal((uint)1234, jT809_0x1500_0x1502.VehiclePosition.Vec3); | |||
Assert.Equal((ushort)45, jT809_0x1500_0x1502.VehiclePosition.Direction); | |||
Assert.Equal((ushort)45, jT809_0x1500_0x1502.VehiclePosition.Altitude); | |||
Assert.Equal((uint)1, jT809_0x1500_0x1502.VehiclePosition.State); | |||
Assert.Equal((uint)1, jT809_0x1500_0x1502.VehiclePosition.Alarm); | |||
Assert.Equal(123, jT809_0x1500_0x1502.LensID); | |||
Assert.Equal(1, jT809_0x1500_0x1502.SizeType); | |||
Assert.Equal(1, jT809_0x1500_0x1502.Type); | |||
} | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1500_0x1503Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1500_0x1503 jT809_0X1500_0X1503 = new JT809_0x1500_0x1503 | |||
{ | |||
MsgID=9999, | |||
Result= JT809_0x1503_Result.下发成功 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1500_0X1503).ToHexString(); | |||
Assert.Equal("0000270F00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "0000270F00".ToHexBytes(); | |||
JT809_0x1500_0x1503 jT809_0X1500_0X1503 = JT809Serializer.Deserialize<JT809_0x1500_0x1503>(bytes); | |||
Assert.Equal(JT809_0x1503_Result.下发成功, jT809_0X1500_0X1503.Result); | |||
Assert.Equal((uint)9999, jT809_0X1500_0X1503.MsgID); | |||
} | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1500_0x1504Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1400_0x1403 jT809_0x1400_0x1403 = new JT809_0x1400_0x1403 | |||
{ | |||
Result = JT809_0x1403_Result.将来处理, | |||
InfoID = 3344, | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1400_0x1403).ToHexString(); | |||
// "00 00 0D 10 03" | |||
Assert.Equal("00000D1003",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 0D 10 03".ToHexBytes(); | |||
JT809_0x1400_0x1403 jT809_0x1400_0x1403 = JT809Serializer.Deserialize<JT809_0x1400_0x1403>(bytes); | |||
Assert.Equal(JT809_0x1403_Result.将来处理, jT809_0x1400_0x1403.Result); | |||
Assert.Equal((uint)3344, jT809_0x1400_0x1403.InfoID); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1500_0x1505Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1500_0x1505 jT809_0X1500_0X1505 = new JT809_0x1500_0x1505 | |||
{ | |||
Result= JT809_0x1505_Result.无该车辆 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X1500_0X1505).ToHexString(); | |||
Assert.Equal("01",hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01".ToHexBytes(); | |||
JT809_0x1500_0x1505 jT809_0X1500_0X1505 = JT809Serializer.Deserialize<JT809_0x1500_0x1505>(bytes); | |||
Assert.Equal(JT809_0x1505_Result.无该车辆, jT809_0X1500_0X1505.Result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x1600_0x1601Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x1600_0x1601 jT809_0x1600_0x1601 = new JT809_0x1600_0x1601 | |||
{ | |||
CarInfo = "smallchi", | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x1600_0x1601).ToHexString(); | |||
Assert.Equal("736D616C6C636869", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "736D616C6C636869".ToHexBytes(); | |||
JT809_0x1600_0x1601 jT809_0x1600_0x1601 = JT809Serializer.Deserialize<JT809_0x1600_0x1601>(bytes); | |||
Assert.Equal("smallchi", jT809_0x1600_0x1601.CarInfo); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9200_0x9204Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9200_0x9204 jT809_0X9200_0X9204 = new JT809_0x9200_0x9204 | |||
{ | |||
CarInfo= "车辆信息" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9200_0X9204).ToHexString(); | |||
Assert.Equal("B3B5C1BED0C5CFA2", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "B3B5C1BED0C5CFA2".ToHexBytes(); | |||
JT809_0x9200_0x9204 jT809_0X9200_0X9204 = JT809Serializer.Deserialize<JT809_0x9200_0x9204>(bytes); | |||
Assert.Equal("车辆信息", jT809_0X9200_0X9204.CarInfo); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9200_0x9205Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9200_0x9205 jT809_0X9200_0X9205 = new JT809_0x9200_0x9205 | |||
{ | |||
ReasonCode= JT809_0x9205_ReasonCode.应急状态下车辆定位信息回传 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9200_0X9205).ToHexString(); | |||
Assert.Equal("02", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "02".ToHexBytes(); | |||
JT809_0x9200_0x9205 jT809_0X9200_0X9205 = JT809Serializer.Deserialize<JT809_0x9200_0x9205>(bytes); | |||
Assert.Equal(JT809_0x9205_ReasonCode.应急状态下车辆定位信息回传, jT809_0X9200_0X9205.ReasonCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9200_0x9206Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9200_0x9206 jT809_0X9200_0X9206 = new JT809_0x9200_0x9206 | |||
{ | |||
ReasonCode= JT809_0x9206_ReasonCode.紧急监控完成 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9200_0X9206).ToHexString(); | |||
Assert.Equal("02", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "02".ToHexBytes(); | |||
JT809_0x9200_0x9206 jT809_0X9200_0X9206 = JT809Serializer.Deserialize<JT809_0x9200_0x9206>(bytes); | |||
Assert.Equal(JT809_0x9206_ReasonCode.紧急监控完成, jT809_0X9200_0X9206.ReasonCode); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9200_0x9207Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9200_0x9207 jT809_0X9200_0X9207 = new JT809_0x9200_0x9207 | |||
{ | |||
Result= JT809_0x9207_Result.申请成功 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9200_0X9207).ToHexString(); | |||
Assert.Equal("00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x9200_0x9207 jT809_0X9200_0X9207 = JT809Serializer.Deserialize<JT809_0x9200_0x9207>(bytes); | |||
Assert.Equal(JT809_0x9207_Result.申请成功, jT809_0X9200_0X9207.Result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9200_0x9208Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9200_0x9208 jT809_0X9200_0X9208 = new JT809_0x9200_0x9208 | |||
{ | |||
Result= JT809_0x9208_Result.其它 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9200_0X9208).ToHexString(); | |||
Assert.Equal("02", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "02".ToHexBytes(); | |||
JT809_0x9200_0x9208 jT809_0X9200_0X9208 = JT809Serializer.Deserialize<JT809_0x9200_0x9208>(bytes); | |||
Assert.Equal(JT809_0x9208_Result.其它, jT809_0X9200_0X9208.Result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9200_0x9209Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9200_0x9209 jT809_0X9200_0X9209 = new JT809_0x9200_0x9209 | |||
{ | |||
Result= JT809_0x9209_Result.成功_上级平台即刻补发 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9200_0X9209).ToHexString(); | |||
Assert.Equal("00", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00".ToHexBytes(); | |||
JT809_0x9200_0x9209 jT809_0X9200_0X9209 = JT809Serializer.Deserialize<JT809_0x9200_0x9209>(bytes); | |||
Assert.Equal(JT809_0x9209_Result.成功_上级平台即刻补发, jT809_0X9200_0X9209.Result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9300_0x9301Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9300_0x9301 jT809_0x9300_0x9301 = new JT809_0x9300_0x9301 | |||
{ | |||
ObjectID="smallchi", | |||
ObjectType= JT809_0x9301_ObjectType.下级平台所属单一业户, | |||
InfoContent="reply", | |||
InfoID = 3344, | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x9300_0x9301).ToHexString(); | |||
// "02 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 0D 10 00 00 00 05 72 65 70 6C 79" | |||
Assert.Equal("02736D616C6C6368690000000000000D10000000057265706C79", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "02 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 0D 10 00 00 00 05 72 65 70 6C 79".ToHexBytes(); | |||
JT809_0x9300_0x9301 jT809_0x9300_0x9301 = JT809Serializer.Deserialize<JT809_0x9300_0x9301>(bytes); | |||
Assert.Equal(JT809_0x9301_ObjectType.下级平台所属单一业户, jT809_0x9300_0x9301.ObjectType); | |||
Assert.Equal((uint)3344, jT809_0x9300_0x9301.InfoID); | |||
Assert.Equal("reply", jT809_0x9300_0x9301.InfoContent); | |||
Assert.Equal("smallchi", jT809_0x9300_0x9301.ObjectID); | |||
} | |||
} | |||
} |
@@ -0,0 +1,43 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9300_0x9302Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9300_0x9302 jT809_0X9300_0X9302 = new JT809_0x9300_0x9302 | |||
{ | |||
ObjectType= JT809_0x9302_ObjectType.下级平台所属单一平台, | |||
ObjectID="afdasf3", | |||
InfoID=1234, | |||
InfoContent= "下级平台所属单一平台" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9300_0X9302).ToHexString(); | |||
Assert.Equal("00616664617366330000000000000004D200000014CFC2BCB6C6BDCCA8CBF9CAF4B5A5D2BBC6BDCCA8", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00616664617366330000000000000004D200000014CFC2BCB6C6BDCCA8CBF9CAF4B5A5D2BBC6BDCCA8".ToHexBytes(); | |||
JT809_0x9300_0x9302 jT809_0X9300_0X9302 = JT809Serializer.Deserialize<JT809_0x9300_0x9302>(bytes); | |||
Assert.Equal(JT809_0x9302_ObjectType.下级平台所属单一平台, jT809_0X9300_0X9302.ObjectType); | |||
Assert.Equal("afdasf3", jT809_0X9300_0X9302.ObjectID); | |||
Assert.Equal((uint)1234, jT809_0X9300_0X9302.InfoID); | |||
Assert.Equal("下级平台所属单一平台", jT809_0X9300_0X9302.InfoContent); | |||
Assert.Equal((uint)20, jT809_0X9300_0X9302.InfoLength); | |||
} | |||
} | |||
} |
@@ -0,0 +1,55 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9400_0x9401Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = new JT809_0x9400_0x9401 | |||
{ | |||
WarnSrc= JT809WarnSrc.车载终端, | |||
WarnType= JT809WarnType.疲劳驾驶报警, | |||
WarnTime=DateTime.Parse("2018-09-27 10:24:00"), | |||
SupervisionID="123FFAA1", | |||
SupervisionEndTime= DateTime.Parse("2018-09-27 11:24:00"), | |||
SupervisionLevel=3, | |||
Supervisor="smallchi", | |||
SupervisorTel= "12345678901", | |||
SupervisorEmail= "123456@qq.com" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x9400_0x9401).ToHexString(); | |||
//010002000000005BAC3F40123FFAA1000000005BAC4D5003736D616C6C63686931323334353637383930313132333435364071712E636F6D | |||
//010002000000005BAC3F40123FFAA1000000005BAC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000 | |||
//"01 00 02 00 00 00 00 5B AC 3F 40 12 3F FA A1 00 00 00 00 5B 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" | |||
Assert.Equal("010002000000005BAC3F40123FFAA1000000005BAC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01 00 02 00 00 00 00 5B AC 3F 40 12 3F FA A1 00 00 00 00 5B 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".ToHexBytes(); | |||
JT809_0x9400_0x9401 jT809_0x9400_0x9401 = JT809Serializer.Deserialize<JT809_0x9400_0x9401>(bytes); | |||
Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9401.WarnSrc); | |||
Assert.Equal(JT809WarnType.疲劳驾驶报警, jT809_0x9400_0x9401.WarnType); | |||
Assert.Equal(DateTime.Parse("2018-09-27 10:24:00"), jT809_0x9400_0x9401.WarnTime); | |||
Assert.Equal("123FFAA1", jT809_0x9400_0x9401.SupervisionID); | |||
Assert.Equal(DateTime.Parse("2018-09-27 11:24:00"), jT809_0x9400_0x9401.SupervisionEndTime); | |||
Assert.Equal(3, jT809_0x9400_0x9401.SupervisionLevel); | |||
Assert.Equal("smallchi", jT809_0x9400_0x9401.Supervisor); | |||
Assert.Equal("12345678901", jT809_0x9400_0x9401.SupervisorTel); | |||
Assert.Equal("123456@qq.com", jT809_0x9400_0x9401.SupervisorEmail); | |||
} | |||
} | |||
} |
@@ -0,0 +1,43 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9400_0x9402Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9400_0x9402 jT809_0x9400_0x9402 = new JT809_0x9400_0x9402 | |||
{ | |||
WarnSrc= JT809WarnSrc.车载终端, | |||
WarnType= JT809WarnType.劫警, | |||
WarnTime=DateTime.Parse("2018-11-11 10:24:00"), | |||
WarnContent= "劫警", | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x9400_0x9402).ToHexString(); | |||
Assert.Equal("01000A000000005BE792C000000004BDD9BEAF", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "01000A000000005BE792C000000004BDD9BEAF".ToHexBytes(); | |||
JT809_0x9400_0x9402 jT809_0x9400_0x9402 = JT809Serializer.Deserialize<JT809_0x9400_0x9402>(bytes); | |||
Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9402.WarnSrc); | |||
Assert.Equal(JT809WarnType.劫警, jT809_0x9400_0x9402.WarnType); | |||
Assert.Equal(DateTime.Parse("2018-11-11 10:24:00"), jT809_0x9400_0x9402.WarnTime); | |||
Assert.Equal("劫警", jT809_0x9400_0x9402.WarnContent); | |||
Assert.Equal((uint)4, jT809_0x9400_0x9402.WarnLength); | |||
} | |||
} | |||
} |
@@ -0,0 +1,43 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9400_0x9403Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9400_0x9403 jT809_0x9400_0x9403 = new JT809_0x9400_0x9403 | |||
{ | |||
WarnSrc= JT809WarnSrc.车载终端, | |||
WarnType= JT809WarnType.疲劳驾驶报警, | |||
WarnTime=DateTime.Parse("2018-11-11 10:24:00"), | |||
WarnContent= "疲劳驾驶报警", | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0x9400_0x9403).ToHexString(); | |||
Assert.Equal("010002000000005BE792C00000000CC6A3C0CDBCDDCABBB1A8BEAF", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "010002000000005BE792C00000000CC6A3C0CDBCDDCABBB1A8BEAF".ToHexBytes(); | |||
JT809_0x9400_0x9403 jT809_0x9400_0x9403 = JT809Serializer.Deserialize<JT809_0x9400_0x9403>(bytes); | |||
Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9403.WarnSrc); | |||
Assert.Equal(JT809WarnType.疲劳驾驶报警, jT809_0x9400_0x9403.WarnType); | |||
Assert.Equal(DateTime.Parse("2018-11-11 10:24:00"), jT809_0x9400_0x9403.WarnTime); | |||
Assert.Equal("疲劳驾驶报警", jT809_0x9400_0x9403.WarnContent); | |||
Assert.Equal((uint)12, jT809_0x9400_0x9403.WarnLength); | |||
} | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9500_0x9501Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9500_0x9501 jT809_0X9500_0X9501 = new JT809_0x9500_0x9501 | |||
{ | |||
MonitorTel="123456789" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9500_0X9501).ToHexString(); | |||
Assert.Equal("3132333435363738390000000000000000000000", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "3132333435363738390000000000000000000000".ToHexBytes(); | |||
JT809_0x9500_0x9501 jT809_0X9500_0X9501 = JT809Serializer.Deserialize<JT809_0x9500_0x9501>(bytes); | |||
Assert.Equal("123456789", jT809_0X9500_0X9501.MonitorTel); | |||
} | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9500_0x9502Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9500_0x9502 jT809_0X9500_0X9502 = new JT809_0x9500_0x9502 | |||
{ | |||
LensID=0x09, | |||
SizeType=0x01 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9500_0X9502).ToHexString(); | |||
Assert.Equal("0901", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "0901".ToHexBytes(); | |||
JT809_0x9500_0x9502 jT809_0X9500_0X9502 = JT809Serializer.Deserialize<JT809_0x9500_0x9502>(bytes); | |||
Assert.Equal(0x09, jT809_0X9500_0X9502.LensID); | |||
Assert.Equal(0x01, jT809_0X9500_0X9502.SizeType); | |||
} | |||
} | |||
} |
@@ -0,0 +1,40 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9500_0x9503Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9500_0x9503 jT809_0X9500_0X9503 = new JT809_0x9500_0x9503 | |||
{ | |||
MsgSequence=333, | |||
MsgPriority=2, | |||
MsgContent="汉_sfdf3dfs" | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9500_0X9503).ToHexString(); | |||
Assert.Equal("0000014D020000000BBABA5F7366646633646673", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "0000014D020000000BBABA5F7366646633646673".ToHexBytes(); | |||
JT809_0x9500_0x9503 jT809_0X9500_0X9503 = JT809Serializer.Deserialize<JT809_0x9500_0x9503>(bytes); | |||
Assert.Equal((uint)333, jT809_0X9500_0X9503.MsgSequence); | |||
Assert.Equal(2, jT809_0X9500_0X9503.MsgPriority); | |||
Assert.Equal((uint)11, jT809_0X9500_0X9503.MsgLength); | |||
Assert.Equal("汉_sfdf3dfs", jT809_0X9500_0X9503.MsgContent); | |||
} | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9500_0x9504Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9500_0x9504 jT809_0X9500_0X9504 = new JT809_0x9500_0x9504 | |||
{ | |||
Command= JT809CommandType.采集记录仪事故疑点记录, | |||
StartTime=DateTime.Parse("2018-09-27 20:00:20"), | |||
EndTime=DateTime.Parse("2018-09-27 23:00:20"), | |||
Max=5556 | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9500_0X9504).ToHexString(); | |||
//"10 18 09 27 20 00 20 18 09 27 23 00 20 15 B4" | |||
//"10 18 09 27 20 00 20 18 09 27 23 00 20 15 B4" | |||
Assert.Equal("1018092720002018092723002015B4",hex); | |||
//5B 00 00 00 45 00 00 00 85 95 00 01 33 53 D5 01 00 00 00 00 00 27 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 95 04 00 00 00 0F 10 18 09 27 20 00 20 18 09 27 23 00 20 15 B4 3C D8 5D | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "10 18 09 27 20 00 20 18 09 27 23 00 20 15 B4".ToHexBytes(); | |||
JT809_0x9500_0x9504 jT809_0X9500_0X9504 = JT809Serializer.Deserialize<JT809_0x9500_0x9504>(bytes); | |||
Assert.Equal(JT809CommandType.采集记录仪事故疑点记录, jT809_0X9500_0X9504.Command); | |||
Assert.Equal(DateTime.Parse("2018-09-27 20:00:20"), jT809_0X9500_0X9504.StartTime); | |||
Assert.Equal(DateTime.Parse("2018-09-27 23:00:20"), jT809_0X9500_0X9504.EndTime); | |||
Assert.Equal(5556, jT809_0X9500_0X9504.Max); | |||
} | |||
} | |||
} |
@@ -0,0 +1,52 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
using JT809.Protocol; | |||
using JT809.Protocol.Extensions; | |||
using JT809.Protocol.MessageBody; | |||
using JT809.Protocol.Exceptions; | |||
using JT809.Protocol.SubMessageBody; | |||
using JT809.Protocol.Enums; | |||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||
{ | |||
public class JT809_0x9500_0x9505Test | |||
{ | |||
private JT809Serializer JT809Serializer = new JT809Serializer(); | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT809_0x9500_0x9505 jT809_0X9500_0X9505 = new JT809_0x9500_0x9505 | |||
{ | |||
AuthenticationCode= "808", | |||
AccessPointName= "jt808", | |||
UserName = "adslsmallchi", | |||
Password= "adsl123", | |||
ServerIP= "127.0.0.1", | |||
TcpPort=808, | |||
UdpPort=809, | |||
EndTime=DateTime.Parse("2018-09-27 20:00:00") | |||
}; | |||
var hex = JT809Serializer.Serialize(jT809_0X9500_0X9505).ToHexString(); | |||
Assert.Equal("000000000000000008086A743830380000000000000000000000000000006164736C736D616C6C636869000000000000000000000000000000000000000000000000000000000000000000000000006164736C3132330000000000000000000000000000003132372E302E302E31000000000000000000000000000000000000000000000003280329000000005BACC640", hex); | |||
//"00 00 00 00 00 00 00 00 08 08 6A 74 38 30 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 64 73 6C 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 64 73 6C 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 28 03 29 00 00 00 00 5B AC C6 40" | |||
//"00 00 00 00 00 00 00 00 08 08 6A 74 38 30 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 64 73 6C 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 64 73 6C 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 28 03 29 00 00 00 00 5A 01 AC C6 40" | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "00 00 00 00 00 00 00 00 08 08 6A 74 38 30 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 64 73 6C 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 64 73 6C 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 31 32 37 2E 30 2E 30 2E 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 28 03 29 00 00 00 00 5B AC C6 40".ToHexBytes(); | |||
JT809_0x9500_0x9505 jT809_0X9500_0X9505 = JT809Serializer.Deserialize<JT809_0x9500_0x9505>(bytes); | |||
Assert.Equal("808", jT809_0X9500_0X9505.AuthenticationCode); | |||
Assert.Equal("jt808", jT809_0X9500_0X9505.AccessPointName); | |||
Assert.Equal("adslsmallchi", jT809_0X9500_0X9505.UserName); | |||
Assert.Equal("adsl123", jT809_0X9500_0X9505.Password); | |||
Assert.Equal("127.0.0.1", jT809_0X9500_0X9505.ServerIP); | |||
Assert.Equal(808, jT809_0X9500_0X9505.TcpPort); | |||
Assert.Equal(809, jT809_0X9500_0X9505.UdpPort); | |||
Assert.Equal(DateTime.Parse("2018-09-27 20:00:00"), jT809_0X9500_0X9505.EndTime); | |||
} | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
using JT809.Protocol.MessagePack; | |||
using JT809.Protocol.Extensions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.MessagePack | |||
{ | |||
public class JT808MessagePackReaderTest | |||
{ | |||
[Fact] | |||
public void WriteCRC16Test() | |||
{ | |||
var data = "5B000000480000008510010133EFB8010000000000270F0133EFB832303138303932303132372E302E302E31000000000000000000000000000000000000000000000003296A915D".ToHexBytes(); | |||
JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(data); | |||
jT809MessagePackReader.Decode(); | |||
Assert.True(jT809MessagePackReader.CheckXorCodeVali); | |||
} | |||
[Fact] | |||
public void WriteCRC16Test1() | |||
{ | |||
var data = "5A 01 00 5A 02 48 5E 02 5E 00 5E 01".ToHexBytes(); | |||
JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(data); | |||
jT809MessagePackReader.FullDecode(); | |||
Assert.Equal("5B 00 5A 48 5E 5E 00 5D".ToHexBytes(), jT809MessagePackReader.Reader.ToArray()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,24 @@ | |||
using JT809.Protocol.MessagePack; | |||
using JT809.Protocol.Extensions; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Xunit; | |||
namespace JT809.Protocol.Test.MessagePack | |||
{ | |||
public class JT809MessagePackWriterTest | |||
{ | |||
[Fact] | |||
public void WriteCRC16Test() | |||
{ | |||
var bytes = new byte[4096]; | |||
var data = "5B000000480000008510010133EFB8010000000000270F0133EFB832303138303932303132372E302E302E31000000000000000000000000000000000000000000000003296A915D".ToHexBytes(); | |||
JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(bytes); | |||
jT809MessagePackWriter.WriteArray(data); | |||
jT809MessagePackWriter.WriteEncode(); | |||
var result=jT809MessagePackWriter.FlushAndGetEncodingArray(); | |||
Assert.Equal(data, result); | |||
} | |||
} | |||
} |
@@ -0,0 +1,49 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
# Visual Studio Version 16 | |||
VisualStudioVersion = 16.0.28407.52 | |||
MinimumVisualStudioVersion = 10.0.40219.1 | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT809.Protocol", "JT809.Protocol\JT809.Protocol.csproj", "{4D33A5C9-F583-4230-9791-AB0394EFAD57}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT809.Protocol.Test", "JT809.Protocol.Test\JT809.Protocol.Test.csproj", "{59D2D876-8D81-4CCE-839A-B153912C0C27}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT809.Protocol.Benchmark", "JT809.Protocol.Benchmark\JT809.Protocol.Benchmark.csproj", "{47CE50B3-A0D6-4F5F-907B-01BD7B8AB87F}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT809.Protocol.Extensions.DependencyInjection", "JT809.Protocol.Extensions.DependencyInjection\JT809.Protocol.Extensions.DependencyInjection.csproj", "{9C6AD175-2B56-46F6-8817-FA920720BEB2}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT809.Protocol.Extensions.DependencyInjection.Test", "JT809.Protocol.Extensions.DependencyInjection.Test\JT809.Protocol.Extensions.DependencyInjection.Test.csproj", "{3A5D2CC3-4658-4C73-8C73-6E3B97740A66}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Release|Any CPU = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{4D33A5C9-F583-4230-9791-AB0394EFAD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{4D33A5C9-F583-4230-9791-AB0394EFAD57}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{4D33A5C9-F583-4230-9791-AB0394EFAD57}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{4D33A5C9-F583-4230-9791-AB0394EFAD57}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{59D2D876-8D81-4CCE-839A-B153912C0C27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{59D2D876-8D81-4CCE-839A-B153912C0C27}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{59D2D876-8D81-4CCE-839A-B153912C0C27}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{59D2D876-8D81-4CCE-839A-B153912C0C27}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{47CE50B3-A0D6-4F5F-907B-01BD7B8AB87F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{47CE50B3-A0D6-4F5F-907B-01BD7B8AB87F}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{47CE50B3-A0D6-4F5F-907B-01BD7B8AB87F}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{47CE50B3-A0D6-4F5F-907B-01BD7B8AB87F}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{9C6AD175-2B56-46F6-8817-FA920720BEB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{9C6AD175-2B56-46F6-8817-FA920720BEB2}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{9C6AD175-2B56-46F6-8817-FA920720BEB2}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{9C6AD175-2B56-46F6-8817-FA920720BEB2}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{3A5D2CC3-4658-4C73-8C73-6E3B97740A66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{3A5D2CC3-4658-4C73-8C73-6E3B97740A66}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{3A5D2CC3-4658-4C73-8C73-6E3B97740A66}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{3A5D2CC3-4658-4C73-8C73-6E3B97740A66}.Release|Any CPU.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
EndGlobalSection | |||
GlobalSection(ExtensibilityGlobals) = postSolution | |||
SolutionGuid = {6159526D-F9A2-4984-A941-B65CA7B0E2EE} | |||
EndGlobalSection | |||
EndGlobal |
@@ -0,0 +1,14 @@ | |||
using System; | |||
namespace JT809.Protocol.Attributes | |||
{ | |||
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] | |||
public sealed class JT809BodiesTypeAttribute : Attribute | |||
{ | |||
public JT809BodiesTypeAttribute(Type jT809BodiesType) | |||
{ | |||
JT809BodiesType = jT809BodiesType; | |||
} | |||
public Type JT809BodiesType { get;} | |||
} | |||
} |
@@ -0,0 +1,20 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Attributes | |||
{ | |||
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] | |||
public sealed class JT809BusinessTypeDescriptionAttribute : Attribute | |||
{ | |||
public string Code { get; set; } | |||
public string Name { get; set; } | |||
public JT809BusinessTypeDescriptionAttribute(string code,string name) | |||
{ | |||
Code = code; | |||
Name = name; | |||
} | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Attributes | |||
{ | |||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)] | |||
public sealed class JT809FormatterAttribute:Attribute | |||
{ | |||
public Type FormatterType { get; private set; } | |||
public object[] Arguments { get; private set; } | |||
public JT809FormatterAttribute(Type formatterType) | |||
{ | |||
this.FormatterType = formatterType; | |||
} | |||
public JT809FormatterAttribute(Type formatterType, params object[] arguments) | |||
{ | |||
this.FormatterType = formatterType; | |||
this.Arguments = arguments; | |||
} | |||
} | |||
} |
@@ -0,0 +1,24 @@ | |||
using JT809.Protocol.Enums; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Attributes | |||
{ | |||
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] | |||
public sealed class JT809SubBusinessTypeDescriptionAttribute : Attribute | |||
{ | |||
public JT809BusinessType BusinessType { get; set; } | |||
public string Code { get; set; } | |||
public string Name { get; set; } | |||
public JT809SubBusinessTypeDescriptionAttribute(string code,string name, JT809BusinessType businessType) | |||
{ | |||
Code = code; | |||
Name = name; | |||
BusinessType = businessType; | |||
} | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
using System; | |||
namespace JT809.Protocol.Buffers | |||
{ | |||
/// <summary> | |||
/// <see cref="System.Buffers.Writer"/> | |||
/// </summary> | |||
ref partial struct JT809BufferWriter | |||
{ | |||
private Span<byte> _buffer; | |||
public JT809BufferWriter(Span<byte> buffer) | |||
{ | |||
_buffer = buffer; | |||
WrittenCount = 0; | |||
BeforeCodingWrittenPosition = 0; | |||
} | |||
public Span<byte> Free => _buffer.Slice(WrittenCount); | |||
public Span<byte> Written => _buffer.Slice(0, WrittenCount); | |||
/// <summary> | |||
/// 编码之前的写入位置 | |||
/// </summary> | |||
public int BeforeCodingWrittenPosition { get;internal set; } | |||
public int WrittenCount { get; private set; } | |||
public void Shrink(int count) | |||
{ | |||
WrittenCount -= count; | |||
} | |||
public void Advance(int count) | |||
{ | |||
WrittenCount += count; | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
namespace JT809.Protocol.Configs | |||
{ | |||
public class JT809EncryptOptions | |||
{ | |||
public uint M1 { get; set; } | |||
public uint IA1 { get; set; } | |||
public uint IC1 { get; set; } | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Configs | |||
{ | |||
public class JT809HeaderOptions | |||
{ | |||
/// <summary> | |||
/// 下级平台接入码,上级平台给下级平台分配唯一标识码。 | |||
/// </summary> | |||
public uint MsgGNSSCENTERID { get; set; } | |||
/// <summary> | |||
/// 协议版本号标识,上下级平台之间采用的标准协议版 | |||
/// 编号;长度为 3 个字节来表示,0x01 0x02 0x0F 标识 | |||
/// 的版本号是 v1.2.15,以此类推。 | |||
/// </summary> | |||
public JT809Header_Version Version { get; set; } = new JT809Header_Version(); | |||
/// <summary> | |||
/// 报文加密标识位 b: 0 表示报文不加密,1 表示报文加密。 | |||
/// </summary> | |||
public JT809Header_Encrypt EncryptFlag { get; set; } = JT809Header_Encrypt.None; | |||
/// <summary> | |||
/// 数据加密的密匙,长度为 4 个字节 | |||
/// </summary> | |||
public uint EncryptKey { get; set; } | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
using JT809.Protocol.Configs; | |||
using JT809.Protocol.Interfaces; | |||
using System; | |||
namespace JT809.Protocol.Encrypt | |||
{ | |||
/// <summary> | |||
/// JT809 异或加密解密为同一算法 | |||
/// </summary> | |||
public class JT809EncryptImpl : IJT809Encrypt | |||
{ | |||
public byte[] Decrypt(ReadOnlySpan<byte> buffer, JT809EncryptOptions encryptOptions, uint privateKey) | |||
{ | |||
return Encrypt(buffer, encryptOptions,privateKey); | |||
} | |||
public byte[] Encrypt(ReadOnlySpan<byte> buffer, JT809EncryptOptions encryptOptions, uint privateKey) | |||
{ | |||
byte[] data = new byte[buffer.Length]; | |||
if (0 == privateKey) | |||
{ | |||
privateKey = 1; | |||
} | |||
uint mkey = encryptOptions.M1; | |||
if (0 == mkey) | |||
{ | |||
mkey = 1; | |||
} | |||
for (int idx = 0; idx < buffer.Length; idx++) | |||
{ | |||
privateKey = encryptOptions.IA1 * (privateKey % mkey) + encryptOptions.IC1; | |||
byte tmp = buffer[idx]; | |||
tmp ^= (byte)((privateKey >> 20) & 0xFF); | |||
data[idx] = tmp; | |||
} | |||
return data; | |||
} | |||
} | |||
} |
@@ -0,0 +1,162 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 报警标志 | |||
/// </summary> | |||
[Flags] | |||
public enum JT808_Alarm : uint | |||
{ | |||
/// <summary> | |||
/// 紧急报警_触动报警开关后触发 | |||
/// 收到应答后清零 | |||
/// </summary> | |||
紧急报警_触动报警开关后触发 = 1, | |||
/// <summary> | |||
/// 超速报警 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
超速报警 = 2, | |||
/// <summary> | |||
/// 标志维持至报警条件解除 | |||
/// 疲劳驾驶 | |||
/// </summary> | |||
疲劳驾驶 = 4, | |||
/// <summary> | |||
/// 危险预警 | |||
/// 收到应答后清零 | |||
/// </summary> | |||
危险预警 = 8, | |||
/// <summary> | |||
/// GNSS模块发生故障 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
GNSS模块发生故障=16, | |||
/// <summary> | |||
/// GNSS天线未接或被剪断 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
GNSS天线未接或被剪断 = 32, | |||
/// <summary> | |||
/// GNSS天线短路 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
GNSS天线短路 = 64, | |||
/// <summary> | |||
/// 终端主电源欠压 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
终端主电源欠压 = 128, | |||
/// <summary> | |||
/// 终端主电源掉电 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
终端主电源掉电 = 256, | |||
/// <summary> | |||
/// 终端LCD或显示器故障 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
终端LCD或显示器故障 = 512, | |||
/// <summary> | |||
/// TTS模块故障 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
TTS模块故障 = 1024, | |||
/// <summary> | |||
/// 摄像头故障 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
摄像头故障 = 2048, | |||
/// <summary> | |||
/// 道路运输证IC卡模块故障 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
道路运输证IC卡模块故障 = 4096, | |||
/// <summary> | |||
/// 超速预警 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
超速预警 = 8192, | |||
/// <summary> | |||
/// 疲劳驾驶预警 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
疲劳驾驶预警 = 16384, | |||
保留1=32768, | |||
保留2=65536, | |||
保留3=131072, | |||
/// <summary> | |||
/// 当天累计驾驶超时 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
当天累计驾驶超时 = 262144, | |||
/// <summary> | |||
/// 超时停车 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
超时停车 = 524288, | |||
/// <summary> | |||
/// 进出区域 | |||
/// 收到应答后清零 | |||
/// </summary> | |||
进出区域 = 1048576, | |||
/// <summary> | |||
/// 进出路线 | |||
/// 收到应答后清零 | |||
/// </summary> | |||
进出路线 = 2097152, | |||
/// <summary> | |||
/// 路段行驶时间不足或过长 | |||
/// 收到应答后清零 | |||
/// </summary> | |||
路段行驶时间不足或过长= 4194304, | |||
/// <summary> | |||
/// 路线偏离报警 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
路线偏离报警 = 8388608, | |||
/// <summary> | |||
/// 车辆VSS故障 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
车辆VSS故障= 16777216, | |||
/// <summary> | |||
/// 车辆油量异常 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
车辆油量异常 = 33554432, | |||
/// <summary> | |||
/// 车辆被盗通过车辆防盗器 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
车辆被盗 = 67108864, | |||
/// <summary> | |||
/// 车辆非法点火 | |||
/// </summary> | |||
车辆非法点火 = 134217728, | |||
/// <summary> | |||
/// 车辆非法位移 | |||
/// 收到应答后清零 | |||
/// </summary> | |||
车辆非法位移 = 268435456, | |||
/// <summary> | |||
/// 碰撞预警 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
碰撞预警 = 536870912, | |||
/// <summary> | |||
/// 侧翻预警 | |||
/// 标志维持至报警条件解除 | |||
/// </summary> | |||
侧翻预警 = 1073741824, | |||
/// <summary> | |||
/// 非法开门报警 | |||
/// (终端未设置区域时,不判断非法开门) | |||
/// 收到应答后清零 | |||
/// </summary> | |||
非法开门报警 = 2147483648 | |||
} | |||
} |
@@ -0,0 +1,34 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
[Flags] | |||
public enum JT808_Status : uint | |||
{ | |||
ACC开 = 1, | |||
定位 = 2, | |||
南纬 = 4, | |||
西经 = 8, | |||
停运状态 = 16, | |||
经纬度已经保密插件加密 = 32, | |||
//保留 = 64, | |||
//保留 = 128, | |||
半载 = 256, | |||
//保留 = 512, | |||
满载 = 768, | |||
车辆油路断开 = 1024, | |||
车辆电路断开 = 2048, | |||
车门加锁 = 4096, | |||
前门开 = 8192, | |||
中门开 = 16384, | |||
后门开 = 32768, | |||
驾驶席门开 = 65536, | |||
自定义 = 131072, | |||
使用GPS卫星进行定位 = 262144, | |||
使用北斗卫星进行定位 = 524288, | |||
使用GLONASS卫星进行定位 = 1048576, | |||
使用Galileo卫星进行定位 = 2097152 | |||
} | |||
} |
@@ -0,0 +1,246 @@ | |||
using JT809.Protocol.Attributes; | |||
using JT809.Protocol.MessageBody; | |||
using System.ComponentModel; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 业务数据类型标识 | |||
/// 数据交换一协议规定的业务数据类型名称和标识常量定义见表 73。业务数据类型标识的命名规则如下: | |||
/// a) 上级平台向下级平台发送的请求消息,一般以“DOWN_”开头,以后缀_REQ 结尾;而下级平台向上级平台发送的请求消息一般以“UP_”开头,以后缀_REQ 结尾; | |||
/// b) 当上下级平台之间有应答消息情况下,应答消息可继续沿用对应的请求消息开头标识符,而通过后缀 RSP 来标识结尾。 | |||
/// </summary> | |||
public enum JT809BusinessType : ushort | |||
{ | |||
#region 链路管理类 | |||
///<summary> | |||
///主链路登录请求消息 | |||
///UP_CONNECT_REQ | |||
///</summary> | |||
[Description("主链路登录请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x1001))] | |||
[JT809BusinessTypeDescription("UP_CONNECT_REQ", "主链路登录请求消息")] | |||
主链路登录请求消息 = 0x1001, | |||
///<summary> | |||
///主链路登录应答消息 | |||
///UP_CONNECT_RSP | |||
///</summary> | |||
[Description("主链路登录应答消息")] | |||
[JT809BusinessTypeDescription("UP_CONNECT_RSP", "主链路登录应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x1002))] | |||
主链路登录应答消息 = 0x1002, | |||
///<summary> | |||
///主链路注销请求消息 | |||
///UP_DISCONNECT_REQ | |||
///</summary> | |||
[Description("主链路注销请求消息")] | |||
[JT809BusinessTypeDescription("UP_DISCONNECT_REQ", "主链路注销请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x1003))] | |||
主链路注销请求消息 = 0x1003, | |||
///<summary> | |||
///主链路注销应答消息 | |||
///UP_DISCONNECT_RSP | |||
///</summary> | |||
[Description("主链路注销应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x1004))] | |||
[JT809BusinessTypeDescription("UP_DISCONNECT_RSP", "主链路注销应答消息")] | |||
主链路注销应答消息 = 0x1004, | |||
///<summary> | |||
///主链路连接保持请求消息 | |||
///UP_LINKTEST_REQ | |||
///</summary> | |||
[Description("主链路连接保持请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x1005))] | |||
[JT809BusinessTypeDescription("UP_LINKTEST_REQ", "主链路连接保持请求消息")] | |||
主链路连接保持请求消息 = 0x1005, | |||
///<summary> | |||
///主链路连接保持应答消息 | |||
///UP_LINKTEST_RSP | |||
///</summary> | |||
[Description("主链路连接保持应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x1006))] | |||
[JT809BusinessTypeDescription("UP_LINKTEST_RSP", "主链路连接保持应答消息")] | |||
主链路连接保持应答消息 = 0x1006, | |||
///<summary> | |||
///主链路断开通知消息 | |||
///UP_DISCONNECT_INFORM | |||
///</summary> | |||
[Description("主链路断开通知消息")] | |||
[JT809BodiesType(typeof(JT809_0x1007))] | |||
[JT809BusinessTypeDescription("UP_DISCONNECT_INFORM", "主链路断开通知消息")] | |||
主链路断开通知消息 = 0x1007, | |||
///<summary> | |||
///下级平台主动关闭链路通知消息 | |||
///UP_CLOSELINK_INFORM | |||
///</summary> | |||
[Description("下级平台主动关闭链路通知消息")] | |||
[JT809BodiesType(typeof(JT809_0x1008))] | |||
[JT809BusinessTypeDescription("UP_CLOSELINK_INFORM", "下级平台主动关闭链路通知消息")] | |||
下级平台主动关闭链路通知消息 = 0x1008, | |||
///<summary> | |||
///从链路连接请求消息 | |||
///DOWN_CONNECT_REQ | |||
///</summary> | |||
[Description("从链路连接请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x9001))] | |||
[JT809BusinessTypeDescription("DOWN_CONNECT_REQ", "从链路连接请求消息")] | |||
从链路连接请求消息 = 0x9001, | |||
///<summary> | |||
///从链路连接应答消息 | |||
///DOWN_CONNECT_RSP | |||
///</summary> | |||
[Description("从链路连接应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x9002))] | |||
[JT809BusinessTypeDescription("DOWN_CONNECT_RSP", "从链路连接应答消息")] | |||
从链路连接应答消息 = 0x9002, | |||
///<summary> | |||
///从链路注销请求消息 | |||
///DOWN_DISCONNECT_REQ | |||
///</summary> | |||
[Description("从链路注销请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x9003))] | |||
[JT809BusinessTypeDescription("DOWN_DISCONNECT_REQ", "从链路注销请求消息")] | |||
从链路注销请求消息 = 0x9003, | |||
///<summary> | |||
///从链路注销应答消息 | |||
///DOWN_DISCONNECT_RSP | |||
///</summary> | |||
[Description("从链路注销应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x9004))] | |||
[JT809BusinessTypeDescription("DOWN_DISCONNECT_RSP", "从链路注销应答消息")] | |||
从链路注销应答消息 = 0x9004, | |||
///<summary> | |||
///从链路连接保持请求消息 | |||
///DOWN_LINKTEST_REQ | |||
///</summary> | |||
[Description("从链路连接保持请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x9005))] | |||
[JT809BusinessTypeDescription("DOWN_LINKTEST_REQ", "从链路连接保持请求消息")] | |||
从链路连接保持请求消息 = 0x9005, | |||
///<summary> | |||
///从链路连接保持应答消息 | |||
///DOWN_LINKTEST_RSP | |||
///</summary> | |||
[Description("从链路连接保持应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x9006))] | |||
[JT809BusinessTypeDescription("DOWN_LINKTEST_RSP", "从链路连接保持应答消息")] | |||
从链路连接保持应答消息 = 0x9006, | |||
///<summary> | |||
///从链路断开通知消息 | |||
///DOWN_DISCONNECT_INFORM | |||
///</summary> | |||
[Description("从链路断开通知消息")] | |||
[JT809BodiesType(typeof(JT809_0x9007))] | |||
[JT809BusinessTypeDescription("DOWN_DISCONNECT_INFORM", "从链路断开通知消息")] | |||
从链路断开通知消息 = 0x9007, | |||
///<summary> | |||
///上级平台主动关闭链路通知消息 | |||
///DOWN_CLOSELINK_INFORM | |||
///</summary> | |||
[Description("上级平台主动关闭链路通知消息")] | |||
[JT809BodiesType(typeof(JT809_0x9008))] | |||
[JT809BusinessTypeDescription("DOWN_CLOSELINK_INFORM", "上级平台主动关闭链路通知消息")] | |||
上级平台主动关闭链路通知消息 = 0x9008, | |||
#endregion | |||
#region 信息统计类 | |||
///<summary> | |||
///接收定位信息数量通知消息 | |||
///DOWN_TOTAL_RECV_BACK_MSG | |||
///</summary> | |||
[Description("接收定位信息数量通知消息")] | |||
[JT809BodiesType(typeof(JT809_0x9101))] | |||
[JT809BusinessTypeDescription("DOWN_TOTAL_RECV_BACK_MSG", "接收定位信息数量通知消息")] | |||
接收定位信息数量通知消息 = 0x9101, | |||
#endregion | |||
#region 车辆动态信息交换 | |||
///<summary> | |||
///主链路动态信息交换消息 | |||
///UP_EXG_MSG | |||
///</summary> | |||
[Description("主链路动态信息交换消息")] | |||
[JT809BodiesType(typeof(JT809_0x1200))] | |||
[JT809BusinessTypeDescription("UP_EXG_MSG", "主链路动态信息交换消息")] | |||
主链路动态信息交换消息 = 0x1200, | |||
///<summary> | |||
///从链路动态信息交换消息 | |||
///DOWN_EXG_MSG | |||
///</summary> | |||
[Description("从链路动态信息交换消息")] | |||
[JT809BodiesType(typeof(JT809_0x9200))] | |||
[JT809BusinessTypeDescription("DOWN_EXG_MSG", "从链路动态信息交换消息")] | |||
从链路动态信息交换消息 = 0x9200, | |||
#endregion | |||
#region 平台间信息交互类 | |||
///<summary> | |||
///主链路平台间信息交互消息 | |||
///UP_PLATFORM_MSG | |||
///</summary> | |||
[Description("主链路平台间信息交互消息")] | |||
[JT809BodiesType(typeof(JT809_0x1300))] | |||
[JT809BusinessTypeDescription("UP_PLATFORM_MSG", "主链路平台间信息交互消息")] | |||
主链路平台间信息交互消息 = 0x1300, | |||
///<summary> | |||
///从链路平台间信息交互消息 | |||
///DOWN_PLATFORM_MSG | |||
///</summary> | |||
[Description("从链路平台间信息交互消息")] | |||
[JT809BodiesType(typeof(JT809_0x9300))] | |||
[JT809BusinessTypeDescription("DOWN_PLATFORM_MSG", "从链路平台间信息交互消息")] | |||
从链路平台间信息交互消息 = 0x9300, | |||
#endregion | |||
#region 车辆报警信息交互类 | |||
///<summary> | |||
///主链路报警信息交互消息 | |||
///UP_WARN_MSG | |||
///</summary> | |||
[Description("主链路报警信息交互消息")] | |||
[JT809BodiesType(typeof(JT809_0x1400))] | |||
[JT809BusinessTypeDescription("UP_WARN_MSG", "主链路报警信息交互消息")] | |||
主链路报警信息交互消息 = 0x1400, | |||
///<summary> | |||
///从链路报警信息交互消息 | |||
///DOWN_WARN_MSG | |||
///</summary> | |||
[Description("从链路报警信息交互消息")] | |||
[JT809BodiesType(typeof(JT809_0x9400))] | |||
[JT809BusinessTypeDescription("DOWN_WARN_MSG", "从链路报警信息交互消息")] | |||
从链路报警信息交互消息 = 0x9400, | |||
#endregion | |||
#region 车辆监管类 | |||
///<summary> | |||
///主链路车辆监管消息 | |||
///UP_CTRL_MSG | |||
///</summary> | |||
[Description("主链路车辆监管消息")] | |||
[JT809BodiesType(typeof(JT809_0x1500))] | |||
[JT809BusinessTypeDescription("UP_CTRL_MSG", "主链路车辆监管消息")] | |||
主链路车辆监管消息 = 0x1500, | |||
///<summary> | |||
///从链路车辆监管消息 | |||
///DOWN_CTRL_MSG | |||
///</summary> | |||
[Description("从链路车辆监管消息")] | |||
[JT809BodiesType(typeof(JT809_0x9500))] | |||
[JT809BusinessTypeDescription("DOWN_CTRL_MSG", "从链路车辆监管消息")] | |||
从链路车辆监管消息 = 0x9500, | |||
#endregion | |||
#region 车辆静态信息交换类 | |||
///<summary> | |||
///主链路静态信息交换消息 | |||
///UP_BASE_MSG | |||
///</summary> | |||
[Description("主链路静态信息交换消息")] | |||
[JT809BodiesType(typeof(JT809_0x1600))] | |||
[JT809BusinessTypeDescription("UP_BASE_MSG", "主链路静态信息交换消息")] | |||
主链路静态信息交换消息 = 0x1600, | |||
///<summary> | |||
///从链路静态信息交换消息 | |||
///DOWN_BASE_MSG | |||
///</summary> | |||
[Description("从链路静态信息交换消息")] | |||
[JT809BodiesType(typeof(JT809_0x9600))] | |||
[JT809BusinessTypeDescription("DOWN_BASE_MSG", "从链路静态信息交换消息")] | |||
从链路静态信息交换消息 = 0x9600, | |||
#endregion | |||
} | |||
} |
@@ -0,0 +1,29 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 命令字ID | |||
/// </summary> | |||
public enum JT809CommandType:byte | |||
{ | |||
记录仪标准版本=0x00, | |||
当前驾驶人信息=0x01, | |||
记录仪时间=0x02, | |||
记录仪累计行驶里程=0x03, | |||
记录仪脉冲系数=0x04, | |||
车辆信息 = 0x05, | |||
记录仪状态信号配置信息 = 0x06, | |||
记录仪唯一性编号 = 0x07, | |||
采集记录仪行驶记录 = 0x08, | |||
采集记录仪位置信息记录 = 0x09, | |||
采集记录仪事故疑点记录 = 0x10, | |||
采集记录仪超时驾驶记录 = 0x11, | |||
采集记录仪驾驶人身份记录=0x12, | |||
采集记录仪外部供电记录=0x13, | |||
采集记录仪参数修改记录 = 0x14, | |||
采集记录仪速度状态日志 = 0x15, | |||
} | |||
} |
@@ -0,0 +1,19 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
public enum JT809ErrorCode | |||
{ | |||
CRC16CheckInvalid = 1001, | |||
HeaderLengthNotEqualBodyLength=1002, | |||
GetFormatterError=1003, | |||
SerializeError=1004, | |||
DeserializeError=1005, | |||
HeaderParseError=1006, | |||
BodiesParseError=1007, | |||
SubBodiesParseError = 1008, | |||
GetAttributeError=1009 | |||
} | |||
} |
@@ -0,0 +1,394 @@ | |||
using JT809.Protocol.Attributes; | |||
using JT809.Protocol.SubMessageBody; | |||
using System.ComponentModel; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
///<summary> | |||
///子业务类型标识 | |||
///</summary> | |||
public enum JT809SubBusinessType : ushort | |||
{ | |||
None=0x0000, | |||
#region 主链路动态信息交换消息 UP_EXG_MSG | |||
/// <summary> | |||
/// 上传车辆注册信息 | |||
/// UP_EXG_MSG_REGISTER | |||
/// </summary> | |||
[Description("上传车辆注册信息")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1201))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_REGISTER", "上传车辆注册信息", JT809BusinessType.主链路动态信息交换消息)] | |||
上传车辆注册信息 = 0x1201, | |||
///<summary> | |||
///实时上传车辆定位信息 | |||
///UP_EXG_MSG_REAL_LOCATION | |||
///</summary> | |||
[Description("实时上传车辆定位信息")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1202))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_REAL_LOCATION", "实时上传车辆定位信息", JT809BusinessType.主链路动态信息交换消息)] | |||
实时上传车辆定位信息 = 0x1202, | |||
///<summary> | |||
///车辆定位信息自动补报 | |||
///UP_EXG_MSG_HISTORY_LOCATION | |||
///</summary> | |||
[Description("车辆定位信息自动补报")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1203))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_HISTORY_LOCATION", "车辆定位信息自动补报", JT809BusinessType.主链路动态信息交换消息)] | |||
车辆定位信息自动补报 = 0x1203, | |||
///<summary> | |||
///启动车辆定位信息交换应答 | |||
///UP_EXG_MSG_RETURN_STARTUP_ACK | |||
///</summary> | |||
[Description("启动车辆定位信息交换应答")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1205))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_RETURN_STARTUP_ACK", "启动车辆定位信息交换应答", JT809BusinessType.主链路动态信息交换消息)] | |||
启动车辆定位信息交换应答 = 0x1205, | |||
///<summary> | |||
///结束车辆定位信息交换应答 | |||
///UP_EXG_MSG_RETURN_END_ACK | |||
///</summary> | |||
[Description("结束车辆定位信息交换应答")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1206))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_RETURN_END_ACK", "结束车辆定位信息交换应答", JT809BusinessType.主链路动态信息交换消息)] | |||
结束车辆定位信息交换应答 = 0x1206, | |||
///<summary> | |||
///申请交换指定车辆定位信息请求 | |||
///UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP | |||
///</summary> | |||
[Description("申请交换指定车辆定位信息请求")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1207))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP", "申请交换指定车辆定位信息请求", JT809BusinessType.主链路动态信息交换消息)] | |||
申请交换指定车辆定位信息请求 = 0x1207, | |||
///<summary> | |||
///取消交换指定车辆定位信息请求 | |||
///UP_EXG_MSG_APPLY_FOR_MONITOR_END | |||
///</summary> | |||
[Description("取消交换指定车辆定位信息请求")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1208))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_APPLY_FOR_MONITOR_END", "取消交换指定车辆定位信息请求", JT809BusinessType.主链路动态信息交换消息)] | |||
取消交换指定车辆定位信息请求 = 0x1208, | |||
///<summary> | |||
///补发车辆定位信息请求 | |||
///UP_EXG_MSG_APPLY_HISGNSSDATA_REQ | |||
///</summary> | |||
[Description("补发车辆定位信息请求")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x1209))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_APPLY_HISGNSSDATA_REQ", "补发车辆定位信息请求", JT809BusinessType.主链路动态信息交换消息)] | |||
补发车辆定位信息请求 = 0x1209, | |||
///<summary> | |||
///上报车辆驾驶员身份识别信息应答 | |||
///UP_EXG_MSG_REPORT_DRIVER_INFO_ACK | |||
///</summary> | |||
[Description("上报车辆驾驶员身份识别信息应答")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x120A))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_REPORT_DRIVER_INFO_ACK", "上报车辆驾驶员身份识别信息应答", JT809BusinessType.主链路动态信息交换消息)] | |||
上报车辆驾驶员身份识别信息应答 = 0x120A, | |||
///<summary> | |||
///上报车辆电子运单应答 | |||
///UP_EXG_MSG_TAKE_EWAYBILL_ACK | |||
///</summary> | |||
[Description("上报车辆电子运单应答")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x120B))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_TAKE_EWAYBILL_ACK", "上报车辆电子运单应答", JT809BusinessType.主链路动态信息交换消息)] | |||
上报车辆电子运单应答 = 0x120B, | |||
///<summary> | |||
///主动上报驾驶员身份信息 | |||
///UP_EXG_MSG_REPORT_DRIVER_INFO | |||
///</summary> | |||
[Description("主动上报驾驶员身份信息")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x120C))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_REPORT_DRIVER_INFO", "主动上报驾驶员身份信息", JT809BusinessType.主链路动态信息交换消息)] | |||
主动上报驾驶员身份信息 = 0x120C, | |||
///<summary> | |||
///主动上报车辆电子运单信息 | |||
///UP_EXG_MSG_REPORT_EWAYBILL_INFO | |||
///</summary> | |||
[Description("主动上报车辆电子运单信息")] | |||
[JT809BodiesType(typeof(JT809_0x1200_0x120D))] | |||
[JT809SubBusinessTypeDescription("UP_EXG_MSG_REPORT_EWAYBILL_INFO", "主动上报车辆电子运单信息", JT809BusinessType.主链路动态信息交换消息)] | |||
主动上报车辆电子运单信息 = 0x120D, | |||
#endregion | |||
#region 从链路动态信息交换消息 DOWN_EXG_MSG | |||
///<summary> | |||
///交换车辆定位信息 | |||
///DOWN_EXG_MSG_CAR_LOCATION | |||
///</summary> | |||
[Description("交换车辆定位信息")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9202))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_CAR_LOCATION", "交换车辆定位信息", JT809BusinessType.从链路动态信息交换消息)] | |||
交换车辆定位信息 = 0x9202, | |||
///<summary> | |||
///车辆定位信息交换补发 | |||
///DOWN_EXG_MSG_HISTORY_ARCOSSAREA | |||
///</summary> | |||
[Description("车辆定位信息交换补发")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9203))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_HISTORY_ARCOSSAREA", "车辆定位信息交换补发", JT809BusinessType.从链路动态信息交换消息)] | |||
车辆定位信息交换补发 = 0x9203, | |||
///<summary> | |||
///交换车辆静态信息 | |||
///DOWN_EXG_MSG_CAR_INFO | |||
///</summary> | |||
[Description("交换车辆静态信息")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9204))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_CAR_INFO", "交换车辆静态信息", JT809BusinessType.从链路动态信息交换消息)] | |||
交换车辆静态信息 = 0x9204, | |||
///<summary> | |||
///启动车辆定位信息交换请求 | |||
///DOWN_EXG_MSG_RETURN_STARTUP | |||
///</summary> | |||
[Description("启动车辆定位信息交换请求")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9205))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_RETURN_STARTUP", "启动车辆定位信息交换请求", JT809BusinessType.从链路动态信息交换消息)] | |||
启动车辆定位信息交换请求 = 0x9205, | |||
///<summary> | |||
///结束车辆定位信息交换请求 | |||
///</summary> | |||
[Description("结束车辆定位信息交换请求")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9206))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_RETURN_END", "结束车辆定位信息交换请求", JT809BusinessType.从链路动态信息交换消息)] | |||
结束车辆定位信息交换请求 = 0x9206, | |||
///<summary> | |||
///申请交换指定车辆定位信息应答 | |||
///DOWN_EXG_MSG_APPLY_FOR_MONITOR_STARTUP_ACK | |||
///</summary> | |||
[Description("申请交换指定车辆定位信息应答")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9207))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_APPLY_FOR_MONITOR_STARTUP_ACK", "申请交换指定车辆定位信息应答", JT809BusinessType.从链路动态信息交换消息)] | |||
申请交换指定车辆定位信息应答 = 0x9207, | |||
///<summary> | |||
///取消交换指定车辆定位信息应答 | |||
///DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK | |||
///</summary> | |||
[Description("取消交换指定车辆定位信息应答")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9208))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK", "取消交换指定车辆定位信息应答", JT809BusinessType.从链路动态信息交换消息)] | |||
取消交换指定车辆定位信息应答 = 0x9208, | |||
///<summary> | |||
///补发车辆定位信息应答 | |||
///DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK | |||
///</summary> | |||
[Description("补发车辆定位信息应答")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x9209))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK", "补发车辆定位信息应答", JT809BusinessType.从链路动态信息交换消息)] | |||
补发车辆定位信息应答 = 0x9209, | |||
///<summary> | |||
///上报车辆驾驶员身份识别信息请求 | |||
///DOWN_EXG_MSG_REPORT_DRIVER_INFO | |||
///</summary> | |||
[Description("上报车辆驾驶员身份识别信息请求")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x920A))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_REPORT_DRIVER_INFO", "上报车辆驾驶员身份识别信息请求", JT809BusinessType.从链路动态信息交换消息)] | |||
上报车辆驾驶员身份识别信息请求 = 0x920A, | |||
///<summary> | |||
///上报车辆电子运单请求 | |||
///DOWN_EXG_MSG_TAKE_EWAYBILL_REQ | |||
///</summary> | |||
[Description("上报车辆电子运单请求")] | |||
[JT809BodiesType(typeof(JT809_0x9200_0x920B))] | |||
[JT809SubBusinessTypeDescription("DOWN_EXG_MSG_TAKE_EWAYBILL_REQ", "上报车辆电子运单请求", JT809BusinessType.从链路动态信息交换消息)] | |||
上报车辆电子运单请求 = 0x920B, | |||
#endregion | |||
#region 主链路平台信息交互消息 UP_PLATFORM_MSG | |||
///<summary> | |||
///平台查岗应答 | |||
///UP_PLATFORM_MSG_POST_QUERY_ACK | |||
///</summary> | |||
[Description("平台查岗应答")] | |||
[JT809BodiesType(typeof(JT809_0x1300_0x1301))] | |||
[JT809SubBusinessTypeDescription("UP_PLATFORM_MSG_POST_QUERY_ACK", "平台查岗应答", JT809BusinessType.主链路平台间信息交互消息)] | |||
平台查岗应答 = 0x1301, | |||
///<summary> | |||
///下发平台间报文应答 | |||
///UP_PLATFORM_MSG_INFO_ACK | |||
///</summary> | |||
[Description("下发平台间报文应答")] | |||
[JT809BodiesType(typeof(JT809_0x1300_0x1302))] | |||
[JT809SubBusinessTypeDescription("UP_PLATFORM_MSG_INFO_ACK", "下发平台间报文应答", JT809BusinessType.主链路平台间信息交互消息)] | |||
下发平台间报文应答 = 0x1302, | |||
#endregion | |||
#region 从链路平台信息交互消息 DOWN_PLATFORM_MSG | |||
///<summary> | |||
///平台查岗请求 | |||
///DOWN_PLATFORM_MSG_POST_QUERY_REQ | |||
///</summary> | |||
[Description("平台查岗请求")] | |||
[JT809BodiesType(typeof(JT809_0x9300_0x9301))] | |||
[JT809SubBusinessTypeDescription("DOWN_PLATFORM_MSG_POST_QUERY_REQ", "平台查岗请求", JT809BusinessType.从链路平台间信息交互消息)] | |||
平台查岗请求 = 0x9301, | |||
///<summary> | |||
///下发平台间报文请求 | |||
///DOWN_PLATFORM_MSG_INFO_REQ | |||
///</summary> | |||
[Description("下发平台间报文请求")] | |||
[JT809BodiesType(typeof(JT809_0x9300_0x9302))] | |||
[JT809SubBusinessTypeDescription("DOWN_PLATFORM_MSG_INFO_REQ", "下发平台间报文请求", JT809BusinessType.从链路平台间信息交互消息)] | |||
下发平台间报文请求 = 0x9302, | |||
#endregion | |||
#region 主链路报警信息交互消息 UP_WARN_MSG | |||
///<summary> | |||
///报警督办应答 | |||
///UP_WARN_MSG_URGE_TODO_ACK | |||
///</summary> | |||
[Description("报警督办应答")] | |||
[JT809BodiesType(typeof(JT809_0x1400_0x1401))] | |||
[JT809SubBusinessTypeDescription("UP_WARN_MSG_URGE_TODO_ACK", "报警督办应答", JT809BusinessType.主链路报警信息交互消息)] | |||
报警督办应答 = 0x1401, | |||
///<summary> | |||
///上报报警信息 | |||
///UP_WARN_MSG_ADPT_INFO | |||
///</summary> | |||
[Description("上报报警信息")] | |||
[JT809BodiesType(typeof(JT809_0x1400_0x1402))] | |||
[JT809SubBusinessTypeDescription("UP_WARN_MSG_ADPT_INFO", "上报报警信息", JT809BusinessType.主链路报警信息交互消息)] | |||
上报报警信息 = 0x1402, | |||
///<summary> | |||
///主动上报报警处理结果信息 | |||
///UP_WARN_MSG_ADPT_TODO_INFO | |||
///</summary> | |||
[Description("主动上报报警处理结果信息")] | |||
[JT809BodiesType(typeof(JT809_0x1400_0x1403))] | |||
[JT809SubBusinessTypeDescription("UP_WARN_MSG_ADPT_TODO_INFO", "主动上报报警处理结果信息", JT809BusinessType.主链路报警信息交互消息)] | |||
主动上报报警处理结果信息 = 0x1403, | |||
#endregion | |||
#region 从链路报警信息交互消息 DOWN_WARN_MSG | |||
///<summary> | |||
///报警督办请求 | |||
///DOWN_WARN_MSG_URGE_TODO_REQ | |||
///</summary> | |||
[Description("报警督办请求")] | |||
[JT809BodiesType(typeof(JT809_0x9400_0x9401))] | |||
[JT809SubBusinessTypeDescription("DOWN_WARN_MSG_URGE_TODO_REQ", "报警督办请求", JT809BusinessType.从链路报警信息交互消息)] | |||
报警督办请求 = 0x9401, | |||
///<summary> | |||
///报警预警 | |||
///DOWN_WARN_MSG_INFORM_TIPS | |||
///</summary> | |||
[Description("报警预警")] | |||
[JT809BodiesType(typeof(JT809_0x9400_0x9402))] | |||
[JT809SubBusinessTypeDescription("DOWN_WARN_MSG_INFORM_TIPS", "报警预警", JT809BusinessType.从链路报警信息交互消息)] | |||
报警预警 = 0x9402, | |||
///<summary> | |||
///实时交换报警信息 | |||
///DOWN_WARN_MSG_EXG_INFORM | |||
///</summary> | |||
[Description("实时交换报警信息")] | |||
[JT809BodiesType(typeof(JT809_0x9400_0x9403))] | |||
[JT809SubBusinessTypeDescription("DOWN_WARN_MSG_EXG_INFORM", "实时交换报警信息", JT809BusinessType.从链路报警信息交互消息)] | |||
实时交换报警信息 = 0x9403, | |||
#endregion | |||
#region 主链路车辆监管消息 UP_CTRL_MSG | |||
///<summary> | |||
///车辆单向监听应答 | |||
///UP_CTRL_MSG_MONITOR_VEHICLE_ACK | |||
///</summary> | |||
[Description("车辆单向监听应答")] | |||
[JT809BodiesType(typeof(JT809_0x1500_0x1501))] | |||
[JT809SubBusinessTypeDescription("UP_CTRL_MSG_MONITOR_VEHICLE_ACK", "车辆单向监听应答", JT809BusinessType.主链路车辆监管消息)] | |||
车辆单向监听应答 = 0x1501, | |||
///<summary> | |||
///车辆拍照应答 | |||
///UP_CTRL_MSG_TAKE_PHOTO_ACK | |||
///</summary> | |||
[Description("车辆拍照应答")] | |||
[JT809BodiesType(typeof(JT809_0x1500_0x1502))] | |||
[JT809SubBusinessTypeDescription("UP_CTRL_MSG_TAKE_PHOTO_ACK", "车辆拍照应答", JT809BusinessType.主链路车辆监管消息)] | |||
车辆拍照应答 = 0x1502, | |||
///<summary> | |||
///下发车辆报文应答 | |||
///UP_CTRL_MSG_TEXT_INFO_ACK | |||
///</summary> | |||
[Description("下发车辆报文应答")] | |||
[JT809BodiesType(typeof(JT809_0x1500_0x1503))] | |||
[JT809SubBusinessTypeDescription("UP_CTRL_MSG_TEXT_INFO_ACK", "下发车辆报文应答", JT809BusinessType.主链路车辆监管消息)] | |||
下发车辆报文应答 = 0x1503, | |||
///<summary> | |||
///上报车辆行驶记录应答 | |||
///UP_CTRL_MSG_TAKE_TRAVEL_ACK | |||
///</summary> | |||
[Description("上报车辆行驶记录应答")] | |||
[JT809BodiesType(typeof(JT809_0x1500_0x1504))] | |||
[JT809SubBusinessTypeDescription("UP_CTRL_MSG_TAKE_TRAVEL_ACK", "上报车辆行驶记录应答", JT809BusinessType.主链路车辆监管消息)] | |||
上报车辆行驶记录应答 = 0x1504, | |||
///<summary> | |||
///车辆应急接入监管平台应答消息 | |||
///UP_CTRL_MSG_EMERGENCY_MONITORING_ACK | |||
///</summary> | |||
[Description("车辆应急接入监管平台应答消息")] | |||
[JT809BodiesType(typeof(JT809_0x1500_0x1505))] | |||
[JT809SubBusinessTypeDescription("UP_CTRL_MSG_EMERGENCY_MONITORING_ACK", "车辆应急接入监管平台应答消息", JT809BusinessType.主链路车辆监管消息)] | |||
车辆应急接入监管平台应答消息 = 0x1505, | |||
#endregion | |||
#region 从链路车辆监管消息 DOWN_CTRL_MSG | |||
///<summary> | |||
///车辆单向监听请求 | |||
///DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ | |||
///</summary> | |||
[Description("车辆单向监听请求")] | |||
[JT809BodiesType(typeof(JT809_0x9500_0x9501))] | |||
[JT809SubBusinessTypeDescription("DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ", "车辆单向监听请求", JT809BusinessType.从链路车辆监管消息)] | |||
车辆单向监听请求 = 0x9501, | |||
///<summary> | |||
///车辆拍照请求 | |||
///DOWN_CTRL_MSG_TAKE_PHOTO_REQ | |||
///</summary> | |||
[Description("车辆拍照请求")] | |||
[JT809BodiesType(typeof(JT809_0x9500_0x9502))] | |||
[JT809SubBusinessTypeDescription("DOWN_CTRL_MSG_TAKE_PHOTO_REQ", "车辆拍照请求", JT809BusinessType.从链路车辆监管消息)] | |||
车辆拍照请求 = 0x9502, | |||
///<summary> | |||
///下发车辆报文请求 | |||
///DOWN_CTRL_MSG_TEXT_INFO | |||
///</summary> | |||
[Description("下发车辆报文请求")] | |||
[JT809BodiesType(typeof(JT809_0x9500_0x9503))] | |||
[JT809SubBusinessTypeDescription("DOWN_CTRL_MSG_TEXT_INFO", "下发车辆报文请求", JT809BusinessType.从链路车辆监管消息)] | |||
下发车辆报文请求 = 0x9503, | |||
///<summary> | |||
///上报车辆行驶记录请求 | |||
///DOWN_CTRL_MSG_TAKE_TRAVEL_REQ | |||
///</summary> | |||
[Description("上报车辆行驶记录请求")] | |||
[JT809BodiesType(typeof(JT809_0x9500_0x9504))] | |||
[JT809SubBusinessTypeDescription("DOWN_CTRL_MSG_TAKE_TRAVEL_REQ", "上报车辆行驶记录请求", JT809BusinessType.从链路车辆监管消息)] | |||
上报车辆行驶记录请求 = 0x9504, | |||
///<summary> | |||
///车辆应急接入监管平台请求消息 | |||
///DOWN_CTRL_MSG_EMERGENCY_MONITORING_REQ | |||
///</summary> | |||
[Description("车辆应急接入监管平台请求消息")] | |||
[JT809BodiesType(typeof(JT809_0x9500_0x9505))] | |||
[JT809SubBusinessTypeDescription("DOWN_CTRL_MSG_EMERGENCY_MONITORING_REQ", "车辆应急接入监管平台请求消息", JT809BusinessType.从链路车辆监管消息)] | |||
车辆应急接入监管平台请求消息 = 0x9505, | |||
#endregion | |||
#region 主链路静态信息交换消息 UP_BASE_MSG | |||
///<summary> | |||
///补报车辆静态信息应答 | |||
///UP_BASE_MSG_VEHICLE_ADDED_ACK | |||
///</summary> | |||
[Description("补报车辆静态信息应答")] | |||
[JT809BodiesType(typeof(JT809_0x1600_0x1601))] | |||
[JT809SubBusinessTypeDescription("UP_BASE_MSG_VEHICLE_ADDED_ACK", "补报车辆静态信息应答", JT809BusinessType.主链路静态信息交换消息)] | |||
补报车辆静态信息应答 = 0x1601, | |||
#endregion | |||
#region 从链路静态信息交换消息 DOWN_BASE_MSG | |||
///<summary> | |||
///补报车辆静态信息请求 | |||
///DOWN_BASE_MSG_VEHICLE_ADDED | |||
///</summary> | |||
[Description("补报车辆静态信息请求")] | |||
[JT809BodiesType(typeof(JT809_0x9600_0x9601))] | |||
[JT809SubBusinessTypeDescription("DOWN_BASE_MSG_VEHICLE_ADDED", "补报车辆静态信息请求", JT809BusinessType.从链路静态信息交换消息)] | |||
补报车辆静态信息请求 = 0x9601, | |||
#endregion | |||
} | |||
} |
@@ -0,0 +1,18 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 车辆颜色,按照 JT/T415-2006 中5.4.12 的规定 | |||
/// </summary> | |||
public enum JT809VehicleColorType:byte | |||
{ | |||
蓝色=0x01, | |||
黄色=0x02, | |||
黑色 = 0x03, | |||
白色 = 0x04, | |||
其他 =0x09, | |||
} | |||
} |
@@ -0,0 +1,17 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 报警信息来源 | |||
/// </summary> | |||
public enum JT809WarnSrc : byte | |||
{ | |||
车载终端 = 0x01, | |||
企业监控平台 = 0x02, | |||
政府监管平台 = 0x03, | |||
其他 =0x09 | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 报警类型 | |||
/// </summary> | |||
public enum JT809WarnType:ushort | |||
{ | |||
超速报警=0x0001, | |||
疲劳驾驶报警=0x0002, | |||
紧急报警= 0x0003, | |||
进入指定区域报警= 0x0004, | |||
离开指定区域报警= 0x0005, | |||
路段赌赛报警= 0x0006, | |||
危险路段报警= 0x0007, | |||
越界报警= 0x0008, | |||
盗警= 0x0009, | |||
劫警= 0x000A, | |||
偏离路线报警= 0x000B, | |||
车辆移动报警= 0x000C, | |||
超时驾驶报警= 0x000D, | |||
其他报警= 0x000E | |||
} | |||
} |
@@ -0,0 +1,20 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 验证结果 | |||
/// </summary> | |||
public enum JT809_0x1002_Result:byte | |||
{ | |||
成功=0x00, | |||
IP地址不正确=0x01, | |||
接入码不正确=0x02, | |||
用户没用注册=0x03, | |||
密码错误=0x04, | |||
资源紧张_稍后再连接_已经占用= 0x05, | |||
其他 =0x06 | |||
} | |||
} |
@@ -0,0 +1,15 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT809.Protocol.Enums | |||
{ | |||
/// <summary> | |||
/// 错误代码 | |||
/// </summary> | |||
public enum JT809_0x1007_ErrorCode:byte | |||
{ | |||
主链路断开=0x00, | |||
其他原因=0x01 | |||
} | |||
} |