From 2f1e08c1e926ef455f74c8f3da8a281d30ea071c Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Fri, 25 Jun 2021 09:57:24 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0Demo14=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=86=85=E9=83=A8=E6=B6=88=E6=81=AF=E6=B3=A8=E5=86=8C=202.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 + .../JT808.Protocol.Extensions.JT1078.xml | 34 ++++ src/JT808.Protocol.Test/Simples/Demo14.cs | 162 ++++++++++++++++++ 3 files changed, 203 insertions(+) create mode 100644 src/JT808.Protocol.Test/Simples/Demo14.cs diff --git a/README.md b/README.md index e3286ef..262b28a 100644 --- a/README.md +++ b/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| diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078/JT808.Protocol.Extensions.JT1078.xml b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078/JT808.Protocol.Extensions.JT1078.xml index ade6f5b..72d78ad 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078/JT808.Protocol.Extensions.JT1078.xml +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078/JT808.Protocol.Extensions.JT1078.xml @@ -1831,6 +1831,16 @@ 文件上传指令 + + + 文件上传指令 + + + + + 0x9206 + + 服务器IP地址服务 @@ -1916,6 +1926,30 @@ 任务执行条件 + + + + + + + + + + + + + + + + + + + + + + + + 文件上传控制 diff --git a/src/JT808.Protocol.Test/Simples/Demo14.cs b/src/JT808.Protocol.Test/Simples/Demo14.cs new file mode 100644 index 0000000..85a6670 --- /dev/null +++ b/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(); + //替换原有消息存在的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(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); + } + } + + /// + /// 终端通用应答_替换原有的消息,来解决库现有的bug + /// + public class JT808_0x0001_Replace : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 0x0001 + /// + public override ushort MsgId => 0x0001; + /// + /// 终端通用应答 + /// + public override string Description => "终端通用应答"; + /// + /// 应答流水号 + /// 对应的平台消息的流水号 + /// + public ushort ReplyMsgNum { get; set; } + /// + /// 应答 ID + /// 对应的平台消息的 ID + /// + /// + public ushort ReplyMsgId { get; set; } + + /// + /// 结果 + /// 0:成功/确认;1:失败;2:消息有误;3:不支持 + /// + public JT808TerminalResult TerminalResult { get; set; } + /// + /// 测试 + /// + public ushort Test { get; set; } + /// + /// + /// + /// + /// + /// + 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; + } + /// + /// + /// + /// + /// + /// + 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); + } + /// + /// + /// + /// + /// + /// + 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); + } + } +}