@@ -12,7 +12,10 @@ namespace JT808.Protocol.Test.Internal | |||||
[Fact] | [Fact] | ||||
public void Test1() | public void Test1() | ||||
{ | { | ||||
new JT808_0x0200_Custom_Factory().Register(Assembly.GetExecutingAssembly()); | |||||
Assert.Throws<ArgumentException>(()=> | |||||
{ | |||||
new JT808_0x0200_Custom_Factory().Register(Assembly.GetExecutingAssembly()); | |||||
}); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -17,7 +17,6 @@ namespace JT808.Protocol.Test | |||||
var result = Parallel.For(0, 100, new ParallelOptions { MaxDegreeOfParallelism = 2 }, (i) => | var result = Parallel.For(0, 100, new ParallelOptions { MaxDegreeOfParallelism = 2 }, (i) => | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
JT808Serializer jT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer jT808Serializer = new JT808Serializer(jT808Config); | ||||
}); | }); | ||||
if (result.IsCompleted) | if (result.IsCompleted) | ||||
@@ -22,7 +22,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
public JT808_0x0200Test() | public JT808_0x0200Test() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808LocationAttachImpl0x06>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -204,7 +204,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | ||||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | ||||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | ||||
var jT808LocationAttachImpl0x06 = JT808Serializer.Deserialize<JT808LocationAttachImpl0x06>(jT808UploadLocationRequest.JT808CustomLocationAttachOriginalData[0x06]); | |||||
var jT808LocationAttachImpl0x06 = (JT808LocationAttachImpl0x06)jT808UploadLocationRequest.JT808CustomLocationAttachData[0x06]; | |||||
Assert.Equal(18, jT808LocationAttachImpl0x06.Age); | Assert.Equal(18, jT808LocationAttachImpl0x06.Age); | ||||
Assert.Equal(1, jT808LocationAttachImpl0x06.Gender); | Assert.Equal(1, jT808LocationAttachImpl0x06.Gender); | ||||
Assert.Equal("smallchi", jT808LocationAttachImpl0x06.UserName); | Assert.Equal("smallchi", jT808LocationAttachImpl0x06.UserName); | ||||
@@ -370,6 +370,58 @@ namespace JT808.Protocol.Test.MessageBody | |||||
var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); | var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); | ||||
Assert.Equal("7E0200005C11223344556622B8000000010000000200BA7F0E07E4F11C0028003C00001807151010100104000000640202003703020038040200011105010000000112060100000001011307000000020022012504000000172A0200F42B04000000F2300102310105167E", hex); | Assert.Equal("7E0200005C11223344556622B8000000010000000200BA7F0E07E4F11C0028003C00001807151010100104000000640202003703020038040200011105010000000112060100000001011307000000020022012504000000172A0200F42B04000000F2300102310105167E", hex); | ||||
//7E0200005C11223344556622B8000000010000000200BA7F0E07E4F11C0028003C00001807151010100104000000640202003703020038040200011105010000000112060100000001011307000000020022012504000000172A0200F42B04000000F2300102310105167E | //7E0200005C11223344556622B8000000010000000200BA7F0E07E4F11C0028003C00001807151010100104000000640202003703020038040200011105010000000112060100000001011307000000020022012504000000172A0200F42B04000000F2300102310105167E | ||||
//7E | |||||
//02 00 | |||||
//00 5C | |||||
//11 22 33 44 55 66 | |||||
//22 B8 | |||||
//00 00 00 01 | |||||
//00 00 00 02 | |||||
//00 BA 7F 0E | |||||
//07 E4 F1 1C | |||||
//00 28 | |||||
//00 3C | |||||
//00 00 | |||||
//18 07 15 10 10 10 | |||||
//01 | |||||
// 04 | |||||
// 00 00 00 64 | |||||
//02 | |||||
// 02 | |||||
// 00 37 | |||||
//03 | |||||
// 02 | |||||
// 00 38 | |||||
//04 | |||||
// 02 | |||||
// 00 01 | |||||
//11 | |||||
// 05 | |||||
// 01 00 00 00 01 | |||||
//12 | |||||
// 06 | |||||
// 01 00 00 00 01 01 | |||||
//13 | |||||
// 07 | |||||
// 00 00 00 02 00 22 01 | |||||
//25 | |||||
// 04 | |||||
// 00 00 00 17 | |||||
//2A | |||||
// 02 | |||||
// 00 F4 | |||||
//2B | |||||
// 04 | |||||
// 00 00 00 F2 | |||||
//30 | |||||
// 01 | |||||
// 02 | |||||
//31 | |||||
// 01 | |||||
// 05 | |||||
//16 | |||||
//7E | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void LatLngTest1_1() | public void LatLngTest1_1() | ||||
@@ -15,7 +15,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
public JT808_0x0701Test() | public JT808_0x0701Test() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.FormatterFactory.SetMap<JT808_0x0701TestBodiesImpl>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -17,7 +17,6 @@ namespace JT808.Protocol.Test.MessageBody | |||||
public JT808_0x0801Test() | public JT808_0x0801Test() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.SkipCRCCode = true; | jT808Config.SkipCRCCode = true; | ||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
@@ -15,8 +15,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
public JT808_0x0900Test() | public JT808_0x0900Test() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.FormatterFactory.SetMap<JT808_0x0900_0x83>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -16,7 +16,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
public JT808_0x8103Test() | public JT808_0x8103Test() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.JT808_0X8103_Custom_Factory.SetMap<JT808_0x8103_0x0075>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -15,7 +15,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
public JT808_0x8900Test() | public JT808_0x8900Test() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.FormatterFactory.SetMap<JT808_0X8900_Test_BodiesImpl>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -16,7 +16,6 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo1() | public Demo1() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
@@ -17,7 +17,6 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo2() | public Demo2() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
@@ -17,7 +17,6 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo3() | public Demo3() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
@@ -18,12 +18,9 @@ namespace JT808.Protocol.Test.Simples | |||||
{ | { | ||||
public class Demo4 | public class Demo4 | ||||
{ | { | ||||
public JT808Serializer JT808Serializer; | |||||
public Demo4() | public Demo4() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | |||||
} | } | ||||
private Dictionary<string, DeviceType> cache = new Dictionary<string, DeviceType> | private Dictionary<string, DeviceType> cache = new Dictionary<string, DeviceType> | ||||
{ | { | ||||
@@ -37,34 +34,35 @@ namespace JT808.Protocol.Test.Simples | |||||
public void Test1() | public void Test1() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808_0x0200_DT1_0x81>(); | |||||
JT808Serializer demo5JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer demo5JT808Serializer = new JT808Serializer(jT808Config); | ||||
JT808Package jT808Package = JT808MsgId.位置信息汇报.Create("123456789012", | JT808Package jT808Package = JT808MsgId.位置信息汇报.Create("123456789012", | ||||
new JT808_0x0200 | |||||
{ | |||||
AlarmFlag = 1, | |||||
Altitude = 40, | |||||
GPSTime = DateTime.Parse("2018-12-20 20:10:10"), | |||||
Lat = 12222222, | |||||
Lng = 132444444, | |||||
Speed = 60, | |||||
Direction = 0, | |||||
StatusFlag = 2, | |||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase> | |||||
{ | |||||
{0x81,new JT808_0x0200_DT1_0x81 { | |||||
Age=15, | |||||
Gender=1, | |||||
UserName="smallchi" | |||||
} } | |||||
} | |||||
}); | |||||
new JT808_0x0200 | |||||
{ | |||||
AlarmFlag = 1, | |||||
Altitude = 40, | |||||
GPSTime = DateTime.Parse("2018-12-20 20:10:10"), | |||||
Lat = 12222222, | |||||
Lng = 132444444, | |||||
Speed = 60, | |||||
Direction = 0, | |||||
StatusFlag = 2, | |||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase> | |||||
{ | |||||
{0x81,new JT808_0x0200_DT1_0x81 { | |||||
Age=15, | |||||
Gender=1, | |||||
UserName="smallchi" | |||||
} } | |||||
} | |||||
}); | |||||
byte[] data = demo5JT808Serializer.Serialize(jT808Package); | byte[] data = demo5JT808Serializer.Serialize(jT808Package); | ||||
var jT808PackageResult = demo5JT808Serializer.Deserialize<JT808Package>(data); | var jT808PackageResult = demo5JT808Serializer.Deserialize<JT808Package>(data); | ||||
JT808_0x0200 jT808_0X0200 = jT808PackageResult.Bodies as JT808_0x0200; | JT808_0x0200 jT808_0X0200 = jT808PackageResult.Bodies as JT808_0x0200; | ||||
var attach = DeviceTypeFactory.Create(cache[jT808PackageResult.Header.TerminalPhoneNo], jT808_0X0200.JT808CustomLocationAttachOriginalData); | |||||
var attach = DeviceTypeFactory.Create(cache[jT808PackageResult.Header.TerminalPhoneNo], jT808_0X0200.JT808CustomLocationAttachData); | |||||
var extJson = attach.ExtData.Data.ToString(Formatting.None); | var extJson = attach.ExtData.Data.ToString(Formatting.None); | ||||
var attachinfo81 = (JT808_0x0200_DT1_0x81)attach.JT808CustomLocationAttachData[0x81]; | var attachinfo81 = (JT808_0x0200_DT1_0x81)attach.JT808CustomLocationAttachData[0x81]; | ||||
Assert.Equal((uint)15, attachinfo81.Age); | Assert.Equal((uint)15, attachinfo81.Age); | ||||
@@ -128,14 +126,14 @@ namespace JT808.Protocol.Test.Simples | |||||
public class DeviceTypeFactory | public class DeviceTypeFactory | ||||
{ | { | ||||
public static DeviceTypeBase Create(DeviceType deviceType, Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData) | |||||
public static DeviceTypeBase Create(DeviceType deviceType, Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachData) | |||||
{ | { | ||||
switch (deviceType) | switch (deviceType) | ||||
{ | { | ||||
case DeviceType.DT1: | case DeviceType.DT1: | ||||
return new DeviceType1(jT808CustomLocationAttachOriginalData); | |||||
return new DeviceType1(jT808CustomLocationAttachData); | |||||
case DeviceType.DT2: | case DeviceType.DT2: | ||||
return new DeviceType2(jT808CustomLocationAttachOriginalData); | |||||
return new DeviceType2(jT808CustomLocationAttachData); | |||||
default: | default: | ||||
return default; | return default; | ||||
} | } | ||||
@@ -157,50 +155,46 @@ namespace JT808.Protocol.Test.Simples | |||||
} | } | ||||
public virtual IExtData ExtData { get; protected set; } = new DefaultExtDataImpl(); | public virtual IExtData ExtData { get; protected set; } = new DefaultExtDataImpl(); | ||||
public abstract Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; protected set; } | public abstract Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; protected set; } | ||||
protected DeviceTypeBase(Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData) | |||||
protected DeviceTypeBase(Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachData) | |||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | |||||
Execute(jT808CustomLocationAttachOriginalData); | |||||
Execute(jT808CustomLocationAttachData); | |||||
} | } | ||||
protected abstract void Execute(Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData); | |||||
protected abstract void Execute(Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachData); | |||||
} | } | ||||
public class DeviceType1 : DeviceTypeBase | public class DeviceType1 : DeviceTypeBase | ||||
{ | { | ||||
private const byte dt1_0x81 = 0x81; | private const byte dt1_0x81 = 0x81; | ||||
private const byte dt1_0x82 = 0x82; | private const byte dt1_0x82 = 0x82; | ||||
public DeviceType1(Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData) : base(jT808CustomLocationAttachOriginalData) | |||||
public DeviceType1(Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachData) : base(jT808CustomLocationAttachData) | |||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808_0x0200_DT1_0x81>(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808_0x0200_DT1_0x82>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | |||||
} | } | ||||
public override Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; protected set; } | public override Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; protected set; } | ||||
protected override void Execute(Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData) | |||||
protected override void Execute(Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachData) | |||||
{ | { | ||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | ||||
foreach (var item in jT808CustomLocationAttachOriginalData) | |||||
foreach (var item in jT808CustomLocationAttachData) | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
switch (item.Key) | switch (item.Key) | ||||
{ | { | ||||
case dt1_0x81: | case dt1_0x81: | ||||
var info81 = JT808Serializer.Deserialize<JT808_0x0200_DT1_0x81>(item.Value); | |||||
if (info81 != null) | |||||
{ | |||||
IExtDataProcessor extDataProcessor = new JT808_0x0200_DT1_0x81_ExtDataProcessor(info81); | |||||
extDataProcessor.Processor(ExtData); | |||||
JT808CustomLocationAttachData.Add(dt1_0x81, info81); | |||||
} | |||||
var info81 = (JT808_0x0200_DT1_0x81)item.Value; | |||||
IExtDataProcessor extDataProcessor81 = new JT808_0x0200_DT1_0x81_ExtDataProcessor(info81); | |||||
extDataProcessor81.Processor(ExtData); | |||||
JT808CustomLocationAttachData.Add(dt1_0x81, info81); | |||||
break; | break; | ||||
case dt1_0x82: | case dt1_0x82: | ||||
var info82 = JT808Serializer.Deserialize<JT808_0x0200_DT1_0x82>(item.Value); | |||||
if (info82 != null) | |||||
{ | |||||
IExtDataProcessor extDataProcessor = new JT808_0x0200_DT1_0x82_ExtDataProcessor(info82); | |||||
extDataProcessor.Processor(ExtData); | |||||
JT808CustomLocationAttachData.Add(dt1_0x82, info82); | |||||
} | |||||
var info82 = (JT808_0x0200_DT1_0x82)item.Value; | |||||
IExtDataProcessor extDataProcessor82 = new JT808_0x0200_DT1_0x82_ExtDataProcessor(info82); | |||||
extDataProcessor82.Processor(ExtData); | |||||
JT808CustomLocationAttachData.Add(dt1_0x82, info82); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -214,13 +208,16 @@ namespace JT808.Protocol.Test.Simples | |||||
public class DeviceType2 : DeviceTypeBase | public class DeviceType2 : DeviceTypeBase | ||||
{ | { | ||||
public DeviceType2(Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData) : base(jT808CustomLocationAttachOriginalData) | |||||
public DeviceType2(Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachData) : base(jT808CustomLocationAttachData) | |||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808_0x0200_DT2_0x81>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | |||||
} | } | ||||
public override Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; protected set; } | public override Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; protected set; } | ||||
private const byte dt2_0x81 = 0x81; | private const byte dt2_0x81 = 0x81; | ||||
protected override void Execute(Dictionary<byte, byte[]> jT808CustomLocationAttachOriginalData) | |||||
protected override void Execute(Dictionary<byte, JT808_0x0200_CustomBodyBase> jT808CustomLocationAttachOriginalData) | |||||
{ | { | ||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | ||||
foreach (var item in jT808CustomLocationAttachOriginalData) | foreach (var item in jT808CustomLocationAttachOriginalData) | ||||
@@ -230,13 +227,10 @@ namespace JT808.Protocol.Test.Simples | |||||
switch (item.Key) | switch (item.Key) | ||||
{ | { | ||||
case dt2_0x81: | case dt2_0x81: | ||||
var info81 = JT808Serializer.Deserialize<JT808_0x0200_DT2_0x81>(item.Value); | |||||
if (info81 != null) | |||||
{ | |||||
IExtDataProcessor extDataProcessor = new JT808_0x0200_DT2_0x81_ExtDataProcessor(info81); | |||||
extDataProcessor.Processor(ExtData); | |||||
JT808CustomLocationAttachData.Add(dt2_0x81, info81); | |||||
} | |||||
var info81 = (JT808_0x0200_DT2_0x81)item.Value; | |||||
IExtDataProcessor extDataProcessor = new JT808_0x0200_DT2_0x81_ExtDataProcessor(info81); | |||||
extDataProcessor.Processor(ExtData); | |||||
JT808CustomLocationAttachData.Add(dt2_0x81, info81); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -14,7 +14,6 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo5() | public Demo5() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
jT808Config.SkipCRCCode = true; | jT808Config.SkipCRCCode = true; | ||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
@@ -16,15 +16,18 @@ namespace JT808.Protocol.Test.Simples | |||||
{ | { | ||||
public class Demo6 | public class Demo6 | ||||
{ | { | ||||
public JT808Serializer JT808Serializer; | |||||
public JT808Serializer DT1JT808Serializer; | |||||
public JT808Serializer DT2JT808Serializer; | |||||
public Demo6() | public Demo6() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.Register(Assembly.GetExecutingAssembly()); | |||||
IJT808Config DT1JT808Config = new DefaultGlobalConfig(); | |||||
IJT808Config DT2JT808Config = new DefaultGlobalConfig(); | |||||
//根据不同的设备终端号,添加自定义消息Id | //根据不同的设备终端号,添加自定义消息Id | ||||
jT808Config.MsgIdFactory.CustomSetMap<DT1Demo6>(0x91, "1234567891"); | |||||
jT808Config.MsgIdFactory.CustomSetMap<DT2Demo6>(0x91, "1234567892"); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | |||||
DT1JT808Config.MsgIdFactory.SetMap<DT1Demo6>(); | |||||
DT2JT808Config.MsgIdFactory.SetMap<DT2Demo6>(); | |||||
DT1JT808Serializer = new JT808Serializer(DT1JT808Config); | |||||
DT2JT808Serializer = new JT808Serializer(DT2JT808Config); | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
@@ -56,16 +59,16 @@ namespace JT808.Protocol.Test.Simples | |||||
dT2Demo6.Age2 = 18; | dT2Demo6.Age2 = 18; | ||||
dT2Demo6.Sex2 = 2; | dT2Demo6.Sex2 = 2; | ||||
dt2Package.Bodies = dT2Demo6; | dt2Package.Bodies = dT2Demo6; | ||||
byte[] dt1Data = JT808Serializer.Serialize(dt1Package); | |||||
byte[] dt1Data = DT1JT808Serializer.Serialize(dt1Package); | |||||
var dt1Hex = dt1Data.ToHexString(); | var dt1Hex = dt1Data.ToHexString(); | ||||
//7E00910003001234567891007D02020012657E | //7E00910003001234567891007D02020012657E | ||||
byte[] dt2Data = JT808Serializer.Serialize(dt2Package); | |||||
byte[] dt2Data = DT2JT808Serializer.Serialize(dt2Package); | |||||
var dt2Hex = dt2Data.ToHexString(); | var dt2Hex = dt2Data.ToHexString(); | ||||
//7E00910003001234567892007D02020012667E | //7E00910003001234567892007D02020012667E | ||||
Assert.Equal("7E00910003001234567891007D02020012657E", dt1Hex); | Assert.Equal("7E00910003001234567891007D02020012657E", dt1Hex); | ||||
Assert.Equal("7E00910003001234567892007D02020012667E", dt2Hex); | Assert.Equal("7E00910003001234567892007D02020012667E", dt2Hex); | ||||
JT808Package dt1Package1 = JT808Serializer.Deserialize(dt1Data); | |||||
JT808Package dt1Package1 = DT1JT808Serializer.Deserialize(dt1Data); | |||||
Assert.Equal(0x91, dt1Package1.Header.MsgId); | Assert.Equal(0x91, dt1Package1.Header.MsgId); | ||||
Assert.Equal(126, dt1Package1.Header.MsgNum); | Assert.Equal(126, dt1Package1.Header.MsgNum); | ||||
Assert.Equal("1234567891", dt1Package1.Header.TerminalPhoneNo); | Assert.Equal("1234567891", dt1Package1.Header.TerminalPhoneNo); | ||||
@@ -73,7 +76,7 @@ namespace JT808.Protocol.Test.Simples | |||||
Assert.Equal((ushort)18, dt1Bodies.Age1); | Assert.Equal((ushort)18, dt1Bodies.Age1); | ||||
Assert.Equal(2, dt1Bodies.Sex1); | Assert.Equal(2, dt1Bodies.Sex1); | ||||
JT808Package dt2Package1 = JT808Serializer.Deserialize(dt2Data); | |||||
JT808Package dt2Package1 = DT2JT808Serializer.Deserialize(dt2Data); | |||||
Assert.Equal(0x91, dt2Package1.Header.MsgId); | Assert.Equal(0x91, dt2Package1.Header.MsgId); | ||||
Assert.Equal(126, dt2Package1.Header.MsgNum); | Assert.Equal(126, dt2Package1.Header.MsgNum); | ||||
Assert.Equal("1234567892", dt2Package1.Header.TerminalPhoneNo); | Assert.Equal("1234567892", dt2Package1.Header.TerminalPhoneNo); | ||||
@@ -8,8 +8,8 @@ namespace JT808.Protocol.Formatters | |||||
{ | { | ||||
public interface IJT808FormatterFactory: IJT808ExternalRegister | public interface IJT808FormatterFactory: IJT808ExternalRegister | ||||
{ | { | ||||
Dictionary<Guid,object> FormatterDict { get;} | |||||
IJT808FormatterFactory SetMap<TJT808Bodies>() | |||||
where TJT808Bodies : JT808Bodies; | |||||
IDictionary<Guid,object> FormatterDict { get;} | |||||
IJT808FormatterFactory SetMap<TIJT808Formatter>() | |||||
where TIJT808Formatter : IJT808Formatter; | |||||
} | } | ||||
} | } |
@@ -1,17 +1,12 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | |||||
namespace JT808.Protocol.Interfaces | namespace JT808.Protocol.Interfaces | ||||
{ | { | ||||
public interface IJT808MsgIdFactory | |||||
public interface IJT808MsgIdFactory:IJT808ExternalRegister | |||||
{ | { | ||||
object GetBodiesImplInstanceByMsgId(ushort msgId, string terminalPhoneNo); | |||||
IJT808MsgIdFactory SetMap<TJT808Bodies>(ushort msgId, string terminalPhoneNo) | |||||
where TJT808Bodies : JT808Bodies; | |||||
IJT808MsgIdFactory SetMap(ushort msgId, string terminalPhoneNo, Type bodiesImplType); | |||||
IJT808MsgIdFactory ReplaceMap<TJT808Bodies>(ushort msgId, string terminalPhoneNo) | |||||
where TJT808Bodies : JT808Bodies; | |||||
IJT808MsgIdFactory CustomSetMap<TJT808Bodies>(ushort msgId, string terminalPhoneNo) | |||||
where TJT808Bodies : JT808Bodies; | |||||
IJT808MsgIdFactory CustomSetMap(ushort msgId, string terminalPhoneNo, Type bodiesImplType); | |||||
IDictionary<ushort, object> Map { get; } | |||||
bool TryGetValue(ushort msgId, out object instance); | |||||
IJT808MsgIdFactory SetMap<TJT808Bodies>() where TJT808Bodies : JT808Bodies; | |||||
} | } | ||||
} | } |
@@ -1,4 +1,5 @@ | |||||
using System; | |||||
using JT808.Protocol.MessageBody; | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Text; | using System.Text; | ||||
@@ -6,6 +7,7 @@ namespace JT808.Protocol.Interfaces | |||||
{ | { | ||||
public interface IJT808_0x0200_Custom_Factory: IJT808ExternalRegister | public interface IJT808_0x0200_Custom_Factory: IJT808ExternalRegister | ||||
{ | { | ||||
HashSet<byte> AttachIds { get; } | |||||
IDictionary<byte, object> Map { get; } | |||||
IJT808_0x0200_Custom_Factory SetMap<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase; | |||||
} | } | ||||
} | } |
@@ -1,12 +1,15 @@ | |||||
using System; | |||||
using JT808.Protocol.MessageBody; | |||||
using System; | |||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Text; | using System.Text; | ||||
namespace JT808.Protocol.Interfaces | namespace JT808.Protocol.Interfaces | ||||
{ | { | ||||
public interface IJT808_0x0200_Factory | |||||
{ | |||||
IDictionary<byte, Type> JT808LocationAttachMethod { get; set; } | |||||
} | |||||
public interface IJT808_0x0200_Factory: IJT808ExternalRegister | |||||
{ | |||||
IDictionary<byte, object> Map { get; set; } | |||||
IJT808_0x0200_Factory SetMap<TJT808_0x0200_Body>() where TJT808_0x0200_Body : JT808_0x0200_BodyBase; | |||||
} | |||||
} | } |
@@ -1,4 +1,5 @@ | |||||
using System; | |||||
using JT808.Protocol.MessageBody; | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Text; | using System.Text; | ||||
@@ -6,6 +7,8 @@ namespace JT808.Protocol.Interfaces | |||||
{ | { | ||||
public interface IJT808_0x8103_Custom_Factory : IJT808ExternalRegister | public interface IJT808_0x8103_Custom_Factory : IJT808ExternalRegister | ||||
{ | { | ||||
IDictionary<uint, Type> ParamMethods { get;} | |||||
IDictionary<uint, object> Map { get;} | |||||
IJT808_0x8103_Custom_Factory SetMap<TJT808_0x8103_CustomBody>() where TJT808_0x8103_CustomBody : JT808_0x8103_CustomBodyBase; | |||||
} | } | ||||
} | } |
@@ -1,12 +1,14 @@ | |||||
using System; | |||||
using JT808.Protocol.MessageBody; | |||||
using System; | |||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Text; | using System.Text; | ||||
namespace JT808.Protocol.Interfaces | namespace JT808.Protocol.Interfaces | ||||
{ | { | ||||
public interface IJT808_0x8103_Factory | |||||
public interface IJT808_0x8103_Factory: IJT808ExternalRegister | |||||
{ | { | ||||
IDictionary<uint, Type> ParamMethods { get; set; } | |||||
IDictionary<uint, object> Map { get; } | |||||
IJT808_0x8103_Factory SetMap<TJT808_0x8103_Body>() where TJT808_0x8103_Body : JT808_0x8103_BodyBase; | |||||
} | } | ||||
} | } |
@@ -12,7 +12,7 @@ namespace JT808.Protocol.Internal | |||||
{ | { | ||||
internal class JT808FormatterFactory : IJT808FormatterFactory | internal class JT808FormatterFactory : IJT808FormatterFactory | ||||
{ | { | ||||
public Dictionary<Guid, object> FormatterDict { get; } | |||||
public IDictionary<Guid, object> FormatterDict { get; } | |||||
public JT808FormatterFactory() | public JT808FormatterFactory() | ||||
{ | { | ||||
@@ -40,20 +40,19 @@ namespace JT808.Protocol.Internal | |||||
} | } | ||||
} | } | ||||
public IJT808FormatterFactory SetMap<TJT808Bodies>() | |||||
where TJT808Bodies:JT808Bodies | |||||
public void Register(Assembly externalAssembly) | |||||
{ | |||||
Init(externalAssembly); | |||||
} | |||||
public IJT808FormatterFactory SetMap<TIJT808Formatter>() where TIJT808Formatter : IJT808Formatter | |||||
{ | { | ||||
Type type = typeof(TJT808Bodies); | |||||
Type type = typeof(TIJT808Formatter); | |||||
if (!FormatterDict.ContainsKey(type.GUID)) | if (!FormatterDict.ContainsKey(type.GUID)) | ||||
{ | { | ||||
FormatterDict.Add(type.GUID, Activator.CreateInstance(type)); | FormatterDict.Add(type.GUID, Activator.CreateInstance(type)); | ||||
} | } | ||||
return this; | return this; | ||||
} | } | ||||
public void Register(Assembly externalAssembly) | |||||
{ | |||||
Init(externalAssembly); | |||||
} | |||||
} | } | ||||
} | } |
@@ -5,130 +5,72 @@ using JT808.Protocol.Formatters; | |||||
using JT808.Protocol.Interfaces; | using JT808.Protocol.Interfaces; | ||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Diagnostics; | |||||
using System.Linq; | |||||
using System.Reflection; | |||||
namespace JT808.Protocol.Internal | namespace JT808.Protocol.Internal | ||||
{ | { | ||||
internal class JT808MsgIdFactory: IJT808MsgIdFactory | internal class JT808MsgIdFactory: IJT808MsgIdFactory | ||||
{ | { | ||||
private Dictionary<ushort, object> map; | |||||
private Dictionary<string, Dictionary<ushort, object>> customMap; | |||||
public IDictionary<ushort, object> Map { get; } | |||||
internal JT808MsgIdFactory() | internal JT808MsgIdFactory() | ||||
{ | { | ||||
map = new Dictionary<ushort, object>(); | |||||
customMap = new Dictionary<string, Dictionary<ushort, object>>(StringComparer.OrdinalIgnoreCase); | |||||
InitMap(); | |||||
Map = new Dictionary<ushort, object>(); | |||||
InitMap(Assembly.GetExecutingAssembly()); | |||||
} | } | ||||
private void InitMap() | |||||
private void InitMap(Assembly assembly) | |||||
{ | { | ||||
foreach (var item in Enum.GetNames(typeof(JT808MsgId))) | |||||
var types = assembly.GetTypes().Where(w => w.BaseType == typeof(JT808Bodies)).ToList(); | |||||
foreach (var type in types) | |||||
{ | { | ||||
JT808MsgId msgId = item.ToEnum<JT808MsgId>(); | |||||
if (!map.ContainsKey((ushort)msgId)) | |||||
var instance = Activator.CreateInstance(type); | |||||
ushort msgId = 0; | |||||
try | |||||
{ | { | ||||
JT808BodiesTypeAttribute jT808BodiesTypeAttribute = msgId.GetAttribute<JT808BodiesTypeAttribute>(); | |||||
if (jT808BodiesTypeAttribute != null) | |||||
{ | |||||
map.Add((ushort)msgId, Activator.CreateInstance(jT808BodiesTypeAttribute.JT808BodiesType)); | |||||
} | |||||
msgId = (ushort)type.GetProperty(nameof(JT808Bodies.MsgId)).GetValue(instance); | |||||
} | } | ||||
} | |||||
} | |||||
public object GetBodiesImplInstanceByMsgId(ushort msgId, string terminalPhoneNo) | |||||
{ | |||||
//判断有无自定义消息Id类型 | |||||
if (customMap.TryGetValue(terminalPhoneNo, out var dict)) | |||||
{ | |||||
if (dict != null) | |||||
catch (Exception ex) | |||||
{ | { | ||||
return dict.TryGetValue(msgId, out object bodiesImptType) ? bodiesImptType : null; | |||||
continue; | |||||
} | |||||
if (Map.ContainsKey(msgId)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {msgId} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(msgId, instance); | |||||
} | } | ||||
} | } | ||||
return map.TryGetValue(msgId, out dynamic type) ? type : null; | |||||
} | |||||
public IJT808MsgIdFactory SetMap<TJT808Bodies>(ushort msgId, string terminalPhoneNo) | |||||
where TJT808Bodies : JT808Bodies | |||||
{ | |||||
if (!map.ContainsKey(msgId)) | |||||
{ | |||||
map.Add(msgId, Activator.CreateInstance(typeof(TJT808Bodies))); | |||||
} | |||||
return this; | |||||
} | } | ||||
public IJT808MsgIdFactory SetMap(ushort msgId, string terminalPhoneNo, Type bodiesImplType) | |||||
public bool TryGetValue(ushort msgId, out object instance) | |||||
{ | { | ||||
if (!map.ContainsKey(msgId)) | |||||
{ | |||||
map.Add(msgId, Activator.CreateInstance(bodiesImplType)); | |||||
} | |||||
return this; | |||||
return Map.TryGetValue(msgId, out instance); | |||||
} | } | ||||
public IJT808MsgIdFactory ReplaceMap<TJT808Bodies>(ushort msgId, string terminalPhoneNo) where TJT808Bodies : JT808Bodies | |||||
public IJT808MsgIdFactory SetMap<TJT808Bodies>() where TJT808Bodies : JT808Bodies | |||||
{ | { | ||||
if (!map.ContainsKey(msgId)) | |||||
Type type = typeof(TJT808Bodies); | |||||
var instance = Activator.CreateInstance(type); | |||||
var msgId = (ushort)type.GetProperty(nameof(JT808Bodies.MsgId)).GetValue(instance); | |||||
if (Map.ContainsKey(msgId)) | |||||
{ | { | ||||
map.Add(msgId, Activator.CreateInstance(typeof(TJT808Bodies))); | |||||
throw new ArgumentException($"{type.FullName} {msgId} An element with the same key already exists."); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
map[msgId] = Activator.CreateInstance(typeof(TJT808Bodies)); | |||||
} | |||||
return this; | |||||
} | |||||
public IJT808MsgIdFactory CustomSetMap<TJT808Bodies>(ushort msgId, string terminalPhoneNo) where TJT808Bodies : JT808Bodies | |||||
{ | |||||
if (!string.IsNullOrEmpty(terminalPhoneNo)) | |||||
{ | |||||
if (!customMap.TryGetValue(terminalPhoneNo, out var dict)) | |||||
{ | |||||
if (dict == null) | |||||
{ | |||||
Dictionary<ushort, dynamic> tmp = new Dictionary<ushort, dynamic>(); | |||||
tmp.Add(msgId, Activator.CreateInstance(typeof(TJT808Bodies))); | |||||
customMap.Add(terminalPhoneNo, tmp); | |||||
} | |||||
else | |||||
{ | |||||
if (!dict.ContainsKey(msgId)) | |||||
{ | |||||
dict.Add(msgId, Activator.CreateInstance(typeof(TJT808Bodies))); | |||||
} | |||||
} | |||||
} | |||||
Map.Add(msgId, instance); | |||||
} | } | ||||
return this; | return this; | ||||
} | } | ||||
public IJT808MsgIdFactory CustomSetMap(ushort msgId, string terminalPhoneNo, Type bodiesImplType) | |||||
public void Register(Assembly externalAssembly) | |||||
{ | { | ||||
if (!string.IsNullOrEmpty(terminalPhoneNo)) | |||||
{ | |||||
if (!customMap.TryGetValue(terminalPhoneNo, out var dict)) | |||||
{ | |||||
if (dict == null) | |||||
{ | |||||
Dictionary<ushort, object> tmp = new Dictionary<ushort, object>(); | |||||
tmp.Add(msgId, Activator.CreateInstance(bodiesImplType)); | |||||
customMap.Add(terminalPhoneNo, tmp); | |||||
return this; | |||||
} | |||||
else | |||||
{ | |||||
if (!dict.ContainsKey(msgId)) | |||||
{ | |||||
dict.Add(msgId, Activator.CreateInstance(bodiesImplType)); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return this; | |||||
InitMap(externalAssembly); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -10,11 +10,11 @@ namespace JT808.Protocol.Internal | |||||
{ | { | ||||
class JT808_0x0200_Custom_Factory : IJT808_0x0200_Custom_Factory | class JT808_0x0200_Custom_Factory : IJT808_0x0200_Custom_Factory | ||||
{ | { | ||||
public HashSet<byte> AttachIds { get; } | |||||
public IDictionary<byte, object> Map { get; } | |||||
public JT808_0x0200_Custom_Factory() | public JT808_0x0200_Custom_Factory() | ||||
{ | { | ||||
AttachIds = new HashSet<byte>(); | |||||
Map = new Dictionary<byte, object>(); | |||||
} | } | ||||
public void Register(Assembly externalAssembly) | public void Register(Assembly externalAssembly) | ||||
@@ -22,12 +22,33 @@ namespace JT808.Protocol.Internal | |||||
var types = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase)).ToList(); | var types = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase)).ToList(); | ||||
foreach(var type in types) | foreach(var type in types) | ||||
{ | { | ||||
var attachid = (byte)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase.AttachInfoId)).GetValue(Activator.CreateInstance(type)); | |||||
if (!AttachIds.Contains(attachid)) | |||||
var instance = Activator.CreateInstance(type); | |||||
var attachid = (byte)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase.AttachInfoId)).GetValue(instance); | |||||
if (Map.ContainsKey(attachid)) | |||||
{ | { | ||||
AttachIds.Add(attachid); | |||||
throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); | |||||
} | } | ||||
else | |||||
{ | |||||
Map.Add(attachid, instance); | |||||
} | |||||
} | |||||
} | |||||
public IJT808_0x0200_Custom_Factory SetMap<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase | |||||
{ | |||||
Type type = typeof(TJT808_0x0200_CustomBody); | |||||
var instance = Activator.CreateInstance(type); | |||||
var attachInfoId = (byte)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase.AttachInfoId)).GetValue(instance); | |||||
if (Map.ContainsKey(attachInfoId)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {attachInfoId} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(attachInfoId, instance); | |||||
} | } | ||||
return this; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -3,29 +3,65 @@ using JT808.Protocol.MessageBody; | |||||
using System; | using System; | ||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | |||||
using System.Reflection; | |||||
using System.Text; | using System.Text; | ||||
namespace JT808.Protocol.Internal | namespace JT808.Protocol.Internal | ||||
{ | { | ||||
class JT808_0x0200_Factory : IJT808_0x0200_Factory | class JT808_0x0200_Factory : IJT808_0x0200_Factory | ||||
{ | { | ||||
public IDictionary<byte, Type> JT808LocationAttachMethod { get ; set; } | |||||
public IDictionary<byte, object> Map { get; set; } | |||||
public JT808_0x0200_Factory() | public JT808_0x0200_Factory() | ||||
{ | { | ||||
JT808LocationAttachMethod = new Dictionary<byte, Type>(); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x01, typeof(JT808_0x0200_0x01)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x02, typeof(JT808_0x0200_0x02)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x03, typeof(JT808_0x0200_0x03)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x04, typeof(JT808_0x0200_0x04)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x11, typeof(JT808_0x0200_0x11)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x12, typeof(JT808_0x0200_0x12)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x13, typeof(JT808_0x0200_0x13)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x25, typeof(JT808_0x0200_0x25)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x2A, typeof(JT808_0x0200_0x2A)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x2B, typeof(JT808_0x0200_0x2B)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x30, typeof(JT808_0x0200_0x30)); | |||||
JT808LocationAttachMethod.Add(JT808Constants.JT808_0x0200_0x31, typeof(JT808_0x0200_0x31)); | |||||
Map = new Dictionary<byte, object>(); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30()); | |||||
Map.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31()); | |||||
} | |||||
public IJT808_0x0200_Factory SetMap<TJT808_0x0200_Body>() where TJT808_0x0200_Body : JT808_0x0200_BodyBase | |||||
{ | |||||
Type type = typeof(TJT808_0x0200_Body); | |||||
var instance = Activator.CreateInstance(type); | |||||
var attachInfoId = (byte)type.GetProperty(nameof(JT808_0x0200_BodyBase.AttachInfoId)).GetValue(instance); | |||||
if (Map.ContainsKey(attachInfoId)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {attachInfoId} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(attachInfoId, instance); | |||||
} | |||||
return this; | |||||
} | |||||
public void Register(Assembly externalAssembly) | |||||
{ | |||||
var types = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_BodyBase)).ToList(); | |||||
foreach (var type in types) | |||||
{ | |||||
var instance = Activator.CreateInstance(type); | |||||
var attachid = (byte)type.GetProperty(nameof(JT808_0x0200_BodyBase.AttachInfoId)).GetValue(instance); | |||||
if (Map.ContainsKey(attachid)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(attachid, instance); | |||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -11,22 +11,43 @@ namespace JT808.Protocol.Interfaces | |||||
{ | { | ||||
public JT808_0x8103_Custom_Factory() | public JT808_0x8103_Custom_Factory() | ||||
{ | { | ||||
ParamMethods = new Dictionary<uint, Type>(); | |||||
Map = new Dictionary<uint, object>(); | |||||
} | } | ||||
public IDictionary<uint, Type> ParamMethods { get;} | |||||
public IDictionary<uint, object> Map { get; } | |||||
public void Register(Assembly externalAssembly) | public void Register(Assembly externalAssembly) | ||||
{ | { | ||||
var types = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x8103_CustomBodyBase)).ToList(); | var types = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x8103_CustomBodyBase)).ToList(); | ||||
foreach (var type in types) | foreach (var type in types) | ||||
{ | { | ||||
var paramId = (uint)type.GetProperty(nameof(JT808_0x8103_CustomBodyBase.ParamId)).GetValue(Activator.CreateInstance(type)); | |||||
if (!ParamMethods.ContainsKey(paramId)) | |||||
var instance = Activator.CreateInstance(type); | |||||
var paramId = (uint)type.GetProperty(nameof(JT808_0x8103_CustomBodyBase.ParamId)).GetValue(instance); | |||||
if (Map.ContainsKey(paramId)) | |||||
{ | { | ||||
ParamMethods.Add(paramId, type); | |||||
throw new ArgumentException($"{type.FullName} {paramId} An element with the same key already exists."); | |||||
} | } | ||||
else | |||||
{ | |||||
Map.Add(paramId, instance); | |||||
} | |||||
} | |||||
} | |||||
public IJT808_0x8103_Custom_Factory SetMap<TJT808_0x8103_CustomBody>() where TJT808_0x8103_CustomBody : JT808_0x8103_CustomBodyBase | |||||
{ | |||||
Type type = typeof(TJT808_0x8103_CustomBody); | |||||
var instance = Activator.CreateInstance(type); | |||||
var paramId = (uint)type.GetProperty(nameof(JT808_0x8103_CustomBodyBase.ParamId)).GetValue(instance); | |||||
if (Map.ContainsKey(paramId)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {paramId} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(paramId, instance); | |||||
} | } | ||||
return this; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -12,90 +12,132 @@ namespace JT808.Protocol.Interfaces | |||||
{ | { | ||||
public JT808_0x8103_Factory() | public JT808_0x8103_Factory() | ||||
{ | { | ||||
ParamMethods = new Dictionary<uint, Type>(); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0001, typeof(JT808_0x8103_0x0001)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0002, typeof(JT808_0x8103_0x0002)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0003, typeof(JT808_0x8103_0x0003)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0004, typeof(JT808_0x8103_0x0004)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0005, typeof(JT808_0x8103_0x0005)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0006, typeof(JT808_0x8103_0x0006)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0007, typeof(JT808_0x8103_0x0007)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0010, typeof(JT808_0x8103_0x0010)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0011, typeof(JT808_0x8103_0x0011)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0012, typeof(JT808_0x8103_0x0012)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0013, typeof(JT808_0x8103_0x0013)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0014, typeof(JT808_0x8103_0x0014)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0015, typeof(JT808_0x8103_0x0015)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0016, typeof(JT808_0x8103_0x0016)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0017, typeof(JT808_0x8103_0x0017)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0018, typeof(JT808_0x8103_0x0018)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0019, typeof(JT808_0x8103_0x0019)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x001A, typeof(JT808_0x8103_0x001A)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x001B, typeof(JT808_0x8103_0x001B)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x001C, typeof(JT808_0x8103_0x001C)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x001D, typeof(JT808_0x8103_0x001D)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0020, typeof(JT808_0x8103_0x0020)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0021, typeof(JT808_0x8103_0x0021)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0022, typeof(JT808_0x8103_0x0022)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0027, typeof(JT808_0x8103_0x0027)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0028, typeof(JT808_0x8103_0x0028)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0029, typeof(JT808_0x8103_0x0029)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x002C, typeof(JT808_0x8103_0x002C)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x002D, typeof(JT808_0x8103_0x002D)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x002E, typeof(JT808_0x8103_0x002E)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x002F, typeof(JT808_0x8103_0x002F)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0030, typeof(JT808_0x8103_0x0030)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0031, typeof(JT808_0x8103_0x0031)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0040, typeof(JT808_0x8103_0x0040)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0041, typeof(JT808_0x8103_0x0041)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0042, typeof(JT808_0x8103_0x0042)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0043, typeof(JT808_0x8103_0x0043)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0044, typeof(JT808_0x8103_0x0044)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0045, typeof(JT808_0x8103_0x0045)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0046, typeof(JT808_0x8103_0x0046)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0047, typeof(JT808_0x8103_0x0047)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0048, typeof(JT808_0x8103_0x0048)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0049, typeof(JT808_0x8103_0x0049)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0050, typeof(JT808_0x8103_0x0050)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0051, typeof(JT808_0x8103_0x0051)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0052, typeof(JT808_0x8103_0x0052)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0053, typeof(JT808_0x8103_0x0053)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0054, typeof(JT808_0x8103_0x0054)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0055, typeof(JT808_0x8103_0x0055)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0056, typeof(JT808_0x8103_0x0056)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0057, typeof(JT808_0x8103_0x0057)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0058, typeof(JT808_0x8103_0x0058)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0059, typeof(JT808_0x8103_0x0059)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x005A, typeof(JT808_0x8103_0x005A)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x005B, typeof(JT808_0x8103_0x005B)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x005C, typeof(JT808_0x8103_0x005C)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x005D, typeof(JT808_0x8103_0x005D)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x005E, typeof(JT808_0x8103_0x005E)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0064, typeof(JT808_0x8103_0x0064)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0065, typeof(JT808_0x8103_0x0065)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0070, typeof(JT808_0x8103_0x0070)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0071, typeof(JT808_0x8103_0x0081)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0072, typeof(JT808_0x8103_0x0072)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0073, typeof(JT808_0x8103_0x0073)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0074, typeof(JT808_0x8103_0x0074)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0080, typeof(JT808_0x8103_0x0080)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0081, typeof(JT808_0x8103_0x0081)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0082, typeof(JT808_0x8103_0x0082)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0083, typeof(JT808_0x8103_0x0083)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0084, typeof(JT808_0x8103_0x0084)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0090, typeof(JT808_0x8103_0x0090)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0091, typeof(JT808_0x8103_0x0091)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0092, typeof(JT808_0x8103_0x0092)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0093, typeof(JT808_0x8103_0x0093)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0094, typeof(JT808_0x8103_0x0094)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0095, typeof(JT808_0x8103_0x0095)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0100, typeof(JT808_0x8103_0x0100)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0101, typeof(JT808_0x8103_0x0101)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0102, typeof(JT808_0x8103_0x0102)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0103, typeof(JT808_0x8103_0x0103)); | |||||
ParamMethods.Add(JT808Constants.JT808_0x8103_0x0110, typeof(JT808_0x8103_0x0110)); | |||||
Map = new Dictionary<uint, object>(); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0001, new JT808_0x8103_0x0001()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0002, new JT808_0x8103_0x0002()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0003, new JT808_0x8103_0x0003()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0004, new JT808_0x8103_0x0004()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0005, new JT808_0x8103_0x0005()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0006, new JT808_0x8103_0x0006()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0007, new JT808_0x8103_0x0007()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0010, new JT808_0x8103_0x0010()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0011, new JT808_0x8103_0x0011()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0012, new JT808_0x8103_0x0012()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0013, new JT808_0x8103_0x0013()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0014, new JT808_0x8103_0x0014()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0015, new JT808_0x8103_0x0015()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0016, new JT808_0x8103_0x0016()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0017, new JT808_0x8103_0x0017()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0018, new JT808_0x8103_0x0018()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0019, new JT808_0x8103_0x0019()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x001A, new JT808_0x8103_0x001A()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x001B, new JT808_0x8103_0x001B()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x001C, new JT808_0x8103_0x001C()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x001D, new JT808_0x8103_0x001D()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0020, new JT808_0x8103_0x0020()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0021, new JT808_0x8103_0x0021()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0022, new JT808_0x8103_0x0022()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0027, new JT808_0x8103_0x0027()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0028, new JT808_0x8103_0x0028()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0029, new JT808_0x8103_0x0029()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x002C, new JT808_0x8103_0x002C()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x002D, new JT808_0x8103_0x002D()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x002E, new JT808_0x8103_0x002E()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x002F, new JT808_0x8103_0x002F()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0030, new JT808_0x8103_0x0030()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0031, new JT808_0x8103_0x0031()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0040, new JT808_0x8103_0x0040()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0041, new JT808_0x8103_0x0041()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0042, new JT808_0x8103_0x0042()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0043, new JT808_0x8103_0x0043()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0044, new JT808_0x8103_0x0044()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0045, new JT808_0x8103_0x0045()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0046, new JT808_0x8103_0x0046()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0047, new JT808_0x8103_0x0047()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0048, new JT808_0x8103_0x0048()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0049, new JT808_0x8103_0x0049()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0050, new JT808_0x8103_0x0050()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0051, new JT808_0x8103_0x0051()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0052, new JT808_0x8103_0x0052()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0053, new JT808_0x8103_0x0053()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0054, new JT808_0x8103_0x0054()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0055, new JT808_0x8103_0x0055()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0056, new JT808_0x8103_0x0056()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0057, new JT808_0x8103_0x0057()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0058, new JT808_0x8103_0x0058()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0059, new JT808_0x8103_0x0059()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x005A, new JT808_0x8103_0x005A()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x005B, new JT808_0x8103_0x005B()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x005C, new JT808_0x8103_0x005C()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x005D, new JT808_0x8103_0x005D()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x005E, new JT808_0x8103_0x005E()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0064, new JT808_0x8103_0x0064()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0065, new JT808_0x8103_0x0065()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0070, new JT808_0x8103_0x0070()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0071, new JT808_0x8103_0x0081()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0072, new JT808_0x8103_0x0072()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0073, new JT808_0x8103_0x0073()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0074, new JT808_0x8103_0x0074()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0080, new JT808_0x8103_0x0080()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0081, new JT808_0x8103_0x0081()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0082, new JT808_0x8103_0x0082()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0083, new JT808_0x8103_0x0083()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0084, new JT808_0x8103_0x0084()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0090, new JT808_0x8103_0x0090()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0091, new JT808_0x8103_0x0091()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0092, new JT808_0x8103_0x0092()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0093, new JT808_0x8103_0x0093()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0094, new JT808_0x8103_0x0094()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0095, new JT808_0x8103_0x0095()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0100, new JT808_0x8103_0x0100()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0101, new JT808_0x8103_0x0101()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0102, new JT808_0x8103_0x0102()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0103, new JT808_0x8103_0x0103()); | |||||
Map.Add(JT808Constants.JT808_0x8103_0x0110, new JT808_0x8103_0x0110()); | |||||
} | } | ||||
public IDictionary<uint, Type> ParamMethods { get; set; } | |||||
public IDictionary<uint, object> Map { get; } | |||||
public void Register(Assembly externalAssembly) | |||||
{ | |||||
var types = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x8103_BodyBase)).ToList(); | |||||
foreach (var type in types) | |||||
{ | |||||
var instance = Activator.CreateInstance(type); | |||||
uint paramId = 0; | |||||
try | |||||
{ | |||||
paramId = (ushort)type.GetProperty(nameof(JT808_0x8103_BodyBase.ParamId)).GetValue(instance); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
continue; | |||||
} | |||||
if (Map.ContainsKey(paramId)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {paramId} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(paramId, instance); | |||||
} | |||||
} | |||||
} | |||||
public IJT808_0x8103_Factory SetMap<TJT808_0x8103_Body>() where TJT808_0x8103_Body : JT808_0x8103_BodyBase | |||||
{ | |||||
Type type = typeof(TJT808_0x8103_Body); | |||||
var instance = Activator.CreateInstance(type); | |||||
var paramId = (uint)type.GetProperty(nameof(JT808_0x8103_BodyBase.ParamId)).GetValue(instance); | |||||
if (Map.ContainsKey(paramId)) | |||||
{ | |||||
throw new ArgumentException($"{type.FullName} {paramId} An element with the same key already exists."); | |||||
} | |||||
else | |||||
{ | |||||
Map.Add(paramId, instance); | |||||
} | |||||
return this; | |||||
} | |||||
} | } | ||||
} | } |
@@ -83,8 +83,7 @@ namespace JT808.Protocol | |||||
// 4.1.判断有无数据体 | // 4.1.判断有无数据体 | ||||
if (jT808Package.Header.MessageBodyProperty.DataLength > 0) | if (jT808Package.Header.MessageBodyProperty.DataLength > 0) | ||||
{ | { | ||||
object instance = config.MsgIdFactory.GetBodiesImplInstanceByMsgId(jT808Package.Header.MsgId, jT808Package.Header.TerminalPhoneNo); | |||||
if (instance != null) | |||||
if(config.MsgIdFactory.TryGetValue(jT808Package.Header.MsgId,out object instance)) | |||||
{ | { | ||||
if (jT808Package.Header.MessageBodyProperty.IsPackage) | if (jT808Package.Header.MessageBodyProperty.IsPackage) | ||||
{ | { | ||||
@@ -132,6 +131,9 @@ namespace JT808.Protocol | |||||
} | } | ||||
} | } | ||||
} | } | ||||
// 5.读取校验码 | // 5.读取校验码 | ||||
jT808Package.CheckCode = reader.ReadByte(); | jT808Package.CheckCode = reader.ReadByte(); | ||||
// 6.读取终止位置 | // 6.读取终止位置 | ||||
@@ -12,7 +12,7 @@ namespace JT808.Protocol | |||||
public byte[] Data { get; set; } | public byte[] Data { get; set; } | ||||
public override ushort MsgId => throw new System.NotImplementedException(); | |||||
public override ushort MsgId => throw new System.NotImplementedException("JT808SplitPackageBodies"); | |||||
public JT808SplitPackageBodies Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | public JT808SplitPackageBodies Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | ||||
{ | { | ||||
@@ -34,17 +34,15 @@ namespace JT808.Protocol.MessageBody | |||||
for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++) | for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++) | ||||
{ | { | ||||
var paramId = reader.ReadVirtualUInt32();//参数ID | var paramId = reader.ReadVirtualUInt32();//参数ID | ||||
if (config.JT808_0X8103_Factory.ParamMethods.TryGetValue(paramId, out Type type)) | |||||
if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance)) | |||||
{ | { | ||||
if (jT808_0x0104.ParamList != null) | if (jT808_0x0104.ParamList != null) | ||||
{ | { | ||||
jT808_0x0104.ParamList.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize( | |||||
config.GetMessagePackFormatterByType(type), ref reader, config)); | |||||
jT808_0x0104.ParamList.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config)); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
jT808_0x0104.ParamList = new List<JT808_0x8103_BodyBase> { JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize( | |||||
config.GetMessagePackFormatterByType(type), ref reader, config) }; | |||||
jT808_0x0104.ParamList = new List<JT808_0x8103_BodyBase> { JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config) }; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -100,7 +100,7 @@ namespace JT808.Protocol.MessageBody | |||||
jT808_0X0200.GPSTime = reader.ReadDateTime6(); | jT808_0X0200.GPSTime = reader.ReadDateTime6(); | ||||
// 位置附加信息 | // 位置附加信息 | ||||
jT808_0X0200.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | jT808_0X0200.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | ||||
jT808_0X0200.JT808CustomLocationAttachOriginalData = new Dictionary<byte, byte[]>(); | |||||
jT808_0X0200.JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | |||||
jT808_0X0200.JT808UnknownLocationAttachOriginalData = new Dictionary<byte, byte[]>(); | jT808_0X0200.JT808UnknownLocationAttachOriginalData = new Dictionary<byte, byte[]>(); | ||||
while (reader.ReadCurrentRemainContentLength() > 0) | while (reader.ReadCurrentRemainContentLength() > 0) | ||||
{ | { | ||||
@@ -109,17 +109,15 @@ namespace JT808.Protocol.MessageBody | |||||
ReadOnlySpan<byte> attachSpan = reader.GetVirtualReadOnlySpan(2); | ReadOnlySpan<byte> attachSpan = reader.GetVirtualReadOnlySpan(2); | ||||
byte attachId = attachSpan[0]; | byte attachId = attachSpan[0]; | ||||
byte attachLen = attachSpan[1]; | byte attachLen = attachSpan[1]; | ||||
if (config.JT808_0X0200_Factory.JT808LocationAttachMethod.TryGetValue(attachId, out Type jT808LocationAttachType)) | |||||
if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance)) | |||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(jT808LocationAttachType); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(jT808LocationAttachInstance, ref reader, config); | |||||
jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | ||||
} | } | ||||
else if (config.JT808_0X0200_Custom_Factory.AttachIds.Contains(attachId)) | |||||
else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId,out object customAttachInstance)) | |||||
{ | { | ||||
reader.Skip(2); | |||||
jT808_0X0200.JT808CustomLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||||
reader.Skip(attachLen); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); | |||||
jT808_0X0200.JT808CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -189,10 +187,9 @@ namespace JT808.Protocol.MessageBody | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType()); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); | |||||
} | } | ||||
catch | |||||
catch(Exception ex) | |||||
{ | { | ||||
} | } | ||||
@@ -202,8 +199,7 @@ namespace JT808.Protocol.MessageBody | |||||
{ | { | ||||
foreach (var item in value.JT808CustomLocationAttachData) | foreach (var item in value.JT808CustomLocationAttachData) | ||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType()); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -20,7 +20,7 @@ namespace JT808.Protocol.MessageBody | |||||
/// 区域或路段 ID | /// 区域或路段 ID | ||||
/// 若位置类型为 0,无该字段 | /// 若位置类型为 0,无该字段 | ||||
/// </summary> | /// </summary> | ||||
public int AreaId { get; set; } | |||||
public uint AreaId { get; set; } | |||||
public override byte AttachInfoId { get; set; } = 0x11; | public override byte AttachInfoId { get; set; } = 0x11; | ||||
public override byte AttachInfoLength | public override byte AttachInfoLength | ||||
{ | { | ||||
@@ -46,7 +46,7 @@ namespace JT808.Protocol.MessageBody | |||||
jT808LocationAttachImpl0x11.JT808PositionType = (JT808PositionType)reader.ReadByte(); | jT808LocationAttachImpl0x11.JT808PositionType = (JT808PositionType)reader.ReadByte(); | ||||
if (jT808LocationAttachImpl0x11.JT808PositionType != JT808PositionType.无特定位置) | if (jT808LocationAttachImpl0x11.JT808PositionType != JT808PositionType.无特定位置) | ||||
{ | { | ||||
jT808LocationAttachImpl0x11.AreaId = reader.ReadInt32(); | |||||
jT808LocationAttachImpl0x11.AreaId = reader.ReadUInt32(); | |||||
} | } | ||||
return jT808LocationAttachImpl0x11; | return jT808LocationAttachImpl0x11; | ||||
} | } | ||||
@@ -58,7 +58,7 @@ namespace JT808.Protocol.MessageBody | |||||
writer.WriteByte((byte)value.JT808PositionType); | writer.WriteByte((byte)value.JT808PositionType); | ||||
if (value.JT808PositionType != JT808PositionType.无特定位置) | if (value.JT808PositionType != JT808PositionType.无特定位置) | ||||
{ | { | ||||
writer.WriteInt32(value.AreaId); | |||||
writer.WriteUInt32(value.AreaId); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -49,16 +49,14 @@ namespace JT808.Protocol.MessageBody | |||||
for (int i = 0; i < paramCount; i++) | for (int i = 0; i < paramCount; i++) | ||||
{ | { | ||||
var paramId = reader.ReadVirtualUInt32();//参数ID | var paramId = reader.ReadVirtualUInt32();//参数ID | ||||
if (config.JT808_0X8103_Factory.ParamMethods.TryGetValue(paramId, out Type type)) | |||||
if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance)) | |||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(type); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); | |||||
jT808_0x8103.ParamList.Add(attachImpl); | jT808_0x8103.ParamList.Add(attachImpl); | ||||
} | } | ||||
else if (config.JT808_0X8103_Custom_Factory.ParamMethods.TryGetValue(paramId, out Type customType)) | |||||
else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance)) | |||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(customType); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config); | |||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customInstance, ref reader, config); | |||||
jT808_0x8103.CustomParamList.Add(attachImpl); | jT808_0x8103.CustomParamList.Add(attachImpl); | ||||
} | } | ||||
} | } | ||||
@@ -77,15 +75,13 @@ namespace JT808.Protocol.MessageBody | |||||
{ | { | ||||
foreach (var item in value.ParamList) | foreach (var item in value.ParamList) | ||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(item.GetType()); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item, config); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); | |||||
} | } | ||||
if (value.CustomParamList != null) | if (value.CustomParamList != null) | ||||
{ | { | ||||
foreach (var item in value.CustomParamList) | foreach (var item in value.CustomParamList) | ||||
{ | { | ||||
object attachImplObj = config.GetMessagePackFormatterByType(item.GetType()); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item, config); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -37,8 +37,7 @@ namespace JT808.Protocol.MessageBody | |||||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900 value, IJT808Config config) | public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900 value, IJT808Config config) | ||||
{ | { | ||||
writer.WriteByte(value.PassthroughType); | writer.WriteByte(value.PassthroughType); | ||||
object obj = config.GetMessagePackFormatterByType(value.JT808_0X8900_BodyBase.GetType()); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808_0X8900_BodyBase, config); | |||||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(value.JT808_0X8900_BodyBase, ref writer, value.JT808_0X8900_BodyBase, config); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -213,9 +213,7 @@ namespace JT808.Protocol.MessagePack | |||||
} | } | ||||
public string ReadRemainStringContent() | public string ReadRemainStringContent() | ||||
{ | { | ||||
var readOnlySpan = ReadContent(0); | |||||
string value = JT808Constants.Encoding.GetString(readOnlySpan.ToArray()); | |||||
return value.Trim('\0'); | |||||
return ReadString(ReadCurrentRemainContentLength()); | |||||
} | } | ||||
public string ReadHex(int len) | public string ReadHex(int len) | ||||
{ | { | ||||