waterliu99 3 роки тому
джерело
коміт
fec76982ab
3 змінених файлів з 203 додано та 0 видалено
  1. +7
    -0
      README.md
  2. +34
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078/JT808.Protocol.Extensions.JT1078.xml
  3. +162
    -0
      src/JT808.Protocol.Test/Simples/Demo14.cs

+ 7
- 0
README.md Переглянути файл

@@ -320,6 +320,13 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config);

[可以参考Simples的Demo13](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo13.cs)

### 举个栗子14

场景:
由于协议库本身可能存在消息解析出错的情况,要么就提PR上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。

[可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo14.cs)

## NuGet安装

| Package Name| Version| Preview Version |Downloads|Remark|


+ 34
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078/JT808.Protocol.Extensions.JT1078.xml Переглянути файл

@@ -1831,6 +1831,16 @@
文件上传指令
</summary>
</member>
<member name="P:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206.Description">
<summary>
文件上传指令
</summary>
</member>
<member name="P:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206.MsgId">
<summary>
0x9206
</summary>
</member>
<member name="P:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206.ServerIpLength">
<summary>
服务器IP地址服务
@@ -1916,6 +1926,30 @@
任务执行条件
</summary>
</member>
<member name="M:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206.Analyze(JT808.Protocol.MessagePack.JT808MessagePackReader@,System.Text.Json.Utf8JsonWriter,JT808.Protocol.IJT808Config)">
<summary>
</summary>
<param name="reader"></param>
<param name="writer"></param>
<param name="config"></param>
</member>
<member name="M:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206.Deserialize(JT808.Protocol.MessagePack.JT808MessagePackReader@,JT808.Protocol.IJT808Config)">
<summary>
</summary>
<param name="reader"></param>
<param name="config"></param>
<returns></returns>
</member>
<member name="M:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206.Serialize(JT808.Protocol.MessagePack.JT808MessagePackWriter@,JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9206,JT808.Protocol.IJT808Config)">
<summary>
</summary>
<param name="writer"></param>
<param name="value"></param>
<param name="config"></param>
</member>
<member name="T:JT808.Protocol.Extensions.JT1078.MessageBody.JT808_0x9207">
<summary>
文件上传控制


+ 162
- 0
src/JT808.Protocol.Test/Simples/Demo14.cs Переглянути файл

@@ -0,0 +1,162 @@
using JT808.Protocol.Enums;
using JT808.Protocol.Interfaces;
using JT808.Protocol.Internal;
using JT808.Protocol.Extensions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using JT808.Protocol.MessageBody;
using JT808.Protocol.Formatters;
using JT808.Protocol.MessagePack;
using System.Text.Json;
using JT808.Protocol.MessageBody.CarDVR;
using System.Linq;
using JT808.Protocol.Test.JT808LocationAttach;
using static JT808.Protocol.MessageBody.JT808_0x8105;
using System.Buffers.Binary;
using Newtonsoft.Json;

namespace JT808.Protocol.Test.Simples
{
public class Demo14
{
JT808Serializer JT808Serializer;

public Demo14()
{
IServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddJT808Configure();
//通常在startup中使用app的Use进行扩展
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
Use(serviceProvider);
}

public void Use(IServiceProvider serviceProvider)
{
IJT808Config jT808Config = serviceProvider.GetRequiredService<IJT808Config>();
//替换原有消息存在的BUG
jT808Config.MsgIdFactory.Map[0x0001]=new JT808_0x0001_Replace();
JT808Serializer = jT808Config.GetSerializer();
}

[Fact]
public void Test1()
{
JT808Package jT808Package = new JT808Package
{
Header = new JT808Header
{
MsgId = Enums.JT808MsgId.终端通用应答.ToUInt16Value(),
ManualMsgNum = 1203,
TerminalPhoneNo = "012345678900",
},
Bodies = new JT808_0x0001_Replace
{
ReplyMsgId = Enums.JT808MsgId.终端心跳.ToUInt16Value(),
ReplyMsgNum = 1000,
TerminalResult = Enums.JT808TerminalResult.Success,
Test=168
}
};
var hex = JT808Serializer.Serialize(jT808Package).ToHexString();
Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex);
}

[Fact]
public void Test2()
{
var bytes = "7E0001000701234567890004B303E800020000A8797E".ToHexBytes();
JT808Package jT808Package = JT808Serializer.Deserialize<JT808Package>(bytes);
Assert.Equal(Enums.JT808MsgId.终端通用应答.ToValue(), jT808Package.Header.MsgId);
Assert.Equal(1203, jT808Package.Header.MsgNum);
JT808_0x0001_Replace JT808Bodies = (JT808_0x0001_Replace)jT808Package.Bodies;
Assert.Equal(Enums.JT808MsgId.终端心跳.ToUInt16Value(), JT808Bodies.ReplyMsgId);
Assert.Equal(1000, JT808Bodies.ReplyMsgNum);
Assert.Equal(Enums.JT808TerminalResult.Success, JT808Bodies.TerminalResult);
Assert.Equal(168u, JT808Bodies.Test);
}
}

/// <summary>
/// 终端通用应答_替换原有的消息,来解决库现有的bug
/// </summary>
public class JT808_0x0001_Replace : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0001_Replace>, IJT808Analyze
{
/// <summary>
/// 0x0001
/// </summary>
public override ushort MsgId => 0x0001;
/// <summary>
/// 终端通用应答
/// </summary>
public override string Description => "终端通用应答";
/// <summary>
/// 应答流水号
/// 对应的平台消息的流水号
/// </summary>
public ushort ReplyMsgNum { get; set; }
/// <summary>
/// 应答 ID
/// 对应的平台消息的 ID
/// <see cref="JT808.Protocol.Enums.JT808MsgId"/>
/// </summary>
public ushort ReplyMsgId { get; set; }

/// <summary>
/// 结果
/// 0:成功/确认;1:失败;2:消息有误;3:不支持
/// </summary>
public JT808TerminalResult TerminalResult { get; set; }
/// <summary>
/// 测试
/// </summary>
public ushort Test { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0001_Replace Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0001_Replace jT808_0X0001 = new JT808_0x0001_Replace();
jT808_0X0001.ReplyMsgNum = reader.ReadUInt16();
jT808_0X0001.ReplyMsgId = reader.ReadUInt16();
jT808_0X0001.TerminalResult = (JT808TerminalResult)reader.ReadByte();
jT808_0X0001.Test = reader.ReadUInt16();
return jT808_0X0001;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0001_Replace value, IJT808Config config)
{
writer.WriteUInt16(value.ReplyMsgNum);
writer.WriteUInt16(value.ReplyMsgId);
writer.WriteByte((byte)value.TerminalResult);
writer.WriteUInt16(value.Test);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
var replyMsgNum = reader.ReadUInt16();
var replyMsgId = reader.ReadUInt16();
var terminalResult = reader.ReadByte();
var test = reader.ReadUInt16();
writer.WriteNumber($"[{replyMsgNum.ReadNumber()}]应答流水号", replyMsgNum);
writer.WriteNumber($"[{replyMsgId.ReadNumber()}]应答消息Id", replyMsgId);
writer.WriteString($"[{terminalResult.ReadNumber()}]结果", ((JT808TerminalResult)terminalResult).ToString());
writer.WriteNumber($"[{test.ReadNumber()}]测试", test);
}
}
}

Завантаження…
Відмінити
Зберегти