|
|
@@ -1,12 +1,12 @@ |
|
|
|
using JT808.Protocol.Enums; |
|
|
|
using System.Reflection; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using System.Text; |
|
|
|
using System.Text.Json; |
|
|
|
using JT808.Protocol.Enums; |
|
|
|
using JT808.Protocol.Extensions; |
|
|
|
using JT808.Protocol.Formatters; |
|
|
|
using JT808.Protocol.Internal; |
|
|
|
using JT808.Protocol.MessagePack; |
|
|
|
using System.Reflection; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using System.Text; |
|
|
|
using System.Text.Json; |
|
|
|
|
|
|
|
[assembly: InternalsVisibleTo("JT808.Protocol.DependencyInjection")] |
|
|
|
namespace JT808.Protocol |
|
|
@@ -14,7 +14,7 @@ namespace JT808.Protocol |
|
|
|
/// <summary> |
|
|
|
/// JT808序列化器 |
|
|
|
/// </summary> |
|
|
|
public class JT808Serializer |
|
|
|
public class JT808Serializer |
|
|
|
{ |
|
|
|
private readonly static JT808Package jT808Package = new JT808Package(); |
|
|
|
|
|
|
@@ -30,11 +30,11 @@ namespace JT808.Protocol |
|
|
|
|
|
|
|
static JT808Serializer() |
|
|
|
{ |
|
|
|
Instance= new JT808Serializer(); |
|
|
|
Instance = new JT808Serializer(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// ctor |
|
|
|
/// </summary> |
|
|
|
/// <param name="jT808Config"></param> |
|
|
|
public JT808Serializer(IJT808Config jT808Config) |
|
|
@@ -43,26 +43,26 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// ctor |
|
|
|
/// </summary> |
|
|
|
public JT808Serializer():this(new DefaultGlobalConfig()) |
|
|
|
public JT808Serializer() : this(new DefaultGlobalConfig()) |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 标识 |
|
|
|
/// </summary> |
|
|
|
public string SerializerId => jT808Config.ConfigId; |
|
|
|
|
|
|
|
private readonly IJT808Config jT808Config; |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 序列化数据包 |
|
|
|
/// </summary> |
|
|
|
/// <param name="package"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <returns></returns> |
|
|
|
/// <param name="package">数据包</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns>元数据</returns> |
|
|
|
public byte[] Serialize(JT808Package package, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) |
|
|
|
{ |
|
|
|
byte[] buffer = JT808ArrayPool.Rent(minBufferSize); |
|
|
@@ -78,12 +78,12 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 反序列化 |
|
|
|
/// </summary> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <returns></returns> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns>数据包</returns> |
|
|
|
public JT808Package Deserialize(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) |
|
|
|
{ |
|
|
|
byte[] buffer = JT808ArrayPool.Rent(minBufferSize); |
|
|
@@ -99,14 +99,14 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 序列化 |
|
|
|
/// </summary> |
|
|
|
/// <typeparam name="T"></typeparam> |
|
|
|
/// <param name="obj"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <returns></returns> |
|
|
|
public byte [] Serialize<T>(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) |
|
|
|
/// <param name="obj">数据包</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns>元数据</returns> |
|
|
|
public byte[] Serialize<T>(T obj, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) where T : JT808Package |
|
|
|
{ |
|
|
|
byte[] buffer = JT808ArrayPool.Rent(minBufferSize); |
|
|
|
try |
|
|
@@ -122,20 +122,20 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 根据泛型反序列化元数据 |
|
|
|
/// </summary> |
|
|
|
/// <typeparam name="T"></typeparam> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <returns></returns> |
|
|
|
public T Deserialize<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) |
|
|
|
/// <param name="bytes">元素书</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns>数据包</returns> |
|
|
|
public T Deserialize<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) where T : JT808Package |
|
|
|
{ |
|
|
|
byte[] buffer = JT808ArrayPool.Rent(minBufferSize); |
|
|
|
try |
|
|
|
{ |
|
|
|
JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); |
|
|
|
if(CheckPackageType(typeof(T))) |
|
|
|
if (CheckPackageType(typeof(T))) |
|
|
|
jT808MessagePackReader.Decode(buffer); |
|
|
|
var formatter = jT808Config.GetMessagePackFormatter<T>(); |
|
|
|
return formatter.Deserialize(ref jT808MessagePackReader, jT808Config); |
|
|
@@ -146,9 +146,9 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 验证类型是否为<see cref="JT808_Package_Type"/>或者<see cref="JT808_Header_Package_Type"/> |
|
|
|
/// </summary> |
|
|
|
/// <param name="type"></param> |
|
|
|
/// <param name="type">需要验证的类型</param> |
|
|
|
/// <returns></returns> |
|
|
|
private static bool CheckPackageType(Type type) |
|
|
|
{ |
|
|
@@ -156,12 +156,12 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// 用于负载或者分布式的时候,在网关只需要解到头部。 |
|
|
|
/// 根据头部的消息Id进行分发处理,可以防止小部分性能损耗。 |
|
|
|
/// 反序列化消息头 |
|
|
|
/// <para>用于负载或者分布式的时候,在网关只需要解到头部,根据头部的消息Id进行分发处理,可以防止小部分性能损耗。</para> |
|
|
|
/// </summary> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns></returns> |
|
|
|
public JT808HeaderPackage HeaderDeserialize(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) |
|
|
|
{ |
|
|
@@ -170,7 +170,7 @@ namespace JT808.Protocol |
|
|
|
{ |
|
|
|
JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); |
|
|
|
jT808MessagePackReader.Decode(buffer); |
|
|
|
return new JT808HeaderPackage(ref jT808MessagePackReader,jT808Config); |
|
|
|
return new JT808HeaderPackage(ref jT808MessagePackReader, jT808Config); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
@@ -178,12 +178,12 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 根据类型反序列化 |
|
|
|
/// </summary> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="type"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="type">类型</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns></returns> |
|
|
|
public object Deserialize(ReadOnlySpan<byte> bytes, Type type, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) |
|
|
|
{ |
|
|
@@ -202,14 +202,14 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 分析元数据至json |
|
|
|
/// </summary> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="options"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="options">json选项</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns></returns> |
|
|
|
public string Analyze(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096) |
|
|
|
public string Analyze(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096) |
|
|
|
{ |
|
|
|
byte[] buffer = JT808ArrayPool.Rent(minBufferSize); |
|
|
|
try |
|
|
@@ -226,16 +226,16 @@ namespace JT808.Protocol |
|
|
|
finally |
|
|
|
{ |
|
|
|
JT808ArrayPool.Return(buffer); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 分析元数据至json |
|
|
|
/// </summary> |
|
|
|
/// <typeparam name="T"></typeparam> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="options"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="options">json序列化选项</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns></returns> |
|
|
|
public string Analyze<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096) |
|
|
|
{ |
|
|
@@ -270,12 +270,12 @@ namespace JT808.Protocol |
|
|
|
/// <param name="options">序列化选项</param> |
|
|
|
/// <param name="minBufferSize">默认65535</param> |
|
|
|
/// <returns></returns> |
|
|
|
public string Analyze(ushort msgid,ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 65535) |
|
|
|
public string Analyze(ushort msgid, ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 65535) |
|
|
|
{ |
|
|
|
byte[] buffer = JT808ArrayPool.Rent(minBufferSize); |
|
|
|
try |
|
|
|
{ |
|
|
|
if(jT808Config.MsgIdFactory.TryGetValue(msgid,out object msgHandle)) |
|
|
|
if (jT808Config.MsgIdFactory.TryGetValue(msgid, out object msgHandle)) |
|
|
|
{ |
|
|
|
if (msgHandle is IJT808MessagePackFormatter instance) |
|
|
|
{ |
|
|
@@ -336,12 +336,12 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 分析元数据至json |
|
|
|
/// </summary> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="options"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="options">json选项</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns></returns> |
|
|
|
public byte[] AnalyzeJsonBuffer(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096) |
|
|
|
{ |
|
|
@@ -362,13 +362,13 @@ namespace JT808.Protocol |
|
|
|
} |
|
|
|
} |
|
|
|
/// <summary> |
|
|
|
/// |
|
|
|
/// 分析元数据至json |
|
|
|
/// </summary> |
|
|
|
/// <typeparam name="T"></typeparam> |
|
|
|
/// <param name="bytes"></param> |
|
|
|
/// <param name="version"></param> |
|
|
|
/// <param name="options"></param> |
|
|
|
/// <param name="minBufferSize"></param> |
|
|
|
/// <param name="bytes">元数据</param> |
|
|
|
/// <param name="version">协议版本</param> |
|
|
|
/// <param name="options">json选项</param> |
|
|
|
/// <param name="minBufferSize">最低所需缓冲区大小</param> |
|
|
|
/// <returns></returns> |
|
|
|
public byte[] AnalyzeJsonBuffer<T>(ReadOnlySpan<byte> bytes, JT808Version version = JT808Version.JTT2013, JsonWriterOptions options = default, int minBufferSize = 8096) |
|
|
|
{ |
|
|
@@ -400,9 +400,9 @@ namespace JT808.Protocol |
|
|
|
/// <returns></returns> |
|
|
|
public JT808Serializer Register(params Assembly[] externalAssemblies) |
|
|
|
{ |
|
|
|
if(externalAssemblies!=null && externalAssemblies.Length > 0) |
|
|
|
if (externalAssemblies != null && externalAssemblies.Length > 0) |
|
|
|
{ |
|
|
|
foreach(var asm in externalAssemblies) |
|
|
|
foreach (var asm in externalAssemblies) |
|
|
|
{ |
|
|
|
jT808Config.Register(asm); |
|
|
|
} |
|
|
|