-
Notifications
You must be signed in to change notification settings - Fork 262
/
Copy pathDemo6.cs
195 lines (172 loc) · 7.33 KB
/
Demo6.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
using JT808.Protocol.Enums;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.Extensions;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using Xunit;
using JT808.Protocol.Formatters;
using Microsoft.Extensions.DependencyInjection;
using JT808.Protocol.MessagePack;
using JT808.Protocol.Internal;
namespace JT808.Protocol.Test.Simples
{
public class Demo6
{
public JT808Serializer DT1JT808Serializer;
public JT808Serializer DT2JT808Serializer;
public class DT1Config : GlobalConfigBase
{
public override string ConfigId { get; protected set; } = "DT1";
}
public class DT2Config : GlobalConfigBase
{
public override string ConfigId { get; protected set; } = "DT2";
}
public Demo6()
{
IServiceCollection serviceDescriptors = new ServiceCollection();
//1
serviceDescriptors.AddJT808Configure<DT1Config>()
.AddJT808Configure<DT2Config>();
//2
//serviceDescriptors.AddJT808Configure(new DT1Config())
// .AddJT808Configure(new DT2Config());
//注册工厂
serviceDescriptors.AddSingleton(factory =>
{
Func<string, IJT808Config> accesor = type =>
{
if (type == "DT1")
{
return factory.GetRequiredService<DT1Config>();
}
else if (type == "DT2")
{
return factory.GetRequiredService<DT2Config>();
}
else
{
throw new ArgumentException($"Not Support type : {type}");
}
};
return accesor;
});
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
//使用实例的方式获取
IJT808Config DT1JT808Config = serviceProvider.GetRequiredService<DT1Config>();
IJT808Config DT2JT808Config = serviceProvider.GetRequiredService<DT2Config>();
//这边是因为程序集存在协议冲突的情况,所以不直接采用注册程序集的方式。
//根据不同的设备终端号,添加自定义消息Id
DT1JT808Config.MsgIdFactory.SetMap<DT1Demo6>();
DT1JT808Config.FormatterFactory.SetMap<DT1Demo6>();
DT2JT808Config.MsgIdFactory.SetMap<DT2Demo6>();
DT2JT808Config.FormatterFactory.SetMap<DT2Demo6>();
Assert.Equal("DT1", DT1JT808Config.ConfigId);
Assert.Equal("DT2", DT2JT808Config.ConfigId);
DT1JT808Serializer = DT1JT808Config.GetSerializer();
DT2JT808Serializer = DT2JT808Config.GetSerializer();
Assert.Equal("DT1", DT1JT808Serializer.SerializerId);
Assert.Equal("DT2", DT2JT808Serializer.SerializerId);
//使用工厂的方式获取
Func<string, IJT808Config> factory = serviceProvider.GetRequiredService<Func<string, IJT808Config>>();
IJT808Config DT1FactoryJT808Config = factory("DT1");
IJT808Config DT2FactoryJT808Config = factory("DT2");
Assert.Equal("DT1", DT1FactoryJT808Config.ConfigId);
Assert.Equal("DT2", DT2FactoryJT808Config.ConfigId);
}
/// <summary>
/// 处理多设备多协议消息Id冲突
/// </summary>
[Fact]
public void Test1()
{
JT808Package dt1Package = new JT808Package();
dt1Package.Header = new JT808Header
{
MsgId = 0x91,
ManualMsgNum = 126,
TerminalPhoneNo = "1234567891"
};
DT1Demo6 dT1Demo6 = new DT1Demo6();
dT1Demo6.Age1 = 18;
dT1Demo6.Sex1 = 2;
dt1Package.Bodies = dT1Demo6;
JT808Package dt2Package = new JT808Package();
dt2Package.Header = new JT808Header
{
MsgId = 0x91,
ManualMsgNum = 126,
TerminalPhoneNo = "1234567892"
};
DT2Demo6 dT2Demo6 = new DT2Demo6();
dT2Demo6.Age2 = 18;
dT2Demo6.Sex2 = 2;
dt2Package.Bodies = dT2Demo6;
byte[] dt1Data = DT1JT808Serializer.Serialize(dt1Package);
var dt1Hex = dt1Data.ToHexString();
//7E00910003001234567891007D02020012657E
byte[] dt2Data = DT2JT808Serializer.Serialize(dt2Package);
var dt2Hex = dt2Data.ToHexString();
//7E00910003001234567892007D02020012667E
Assert.Equal("7E00910003001234567891007D02020012657E", dt1Hex);
Assert.Equal("7E00910003001234567892007D02020012667E", dt2Hex);
JT808Package dt1Package1 = DT1JT808Serializer.Deserialize(dt1Data);
Assert.Equal(0x91, dt1Package1.Header.MsgId);
Assert.Equal(126, dt1Package1.Header.MsgNum);
Assert.Equal("1234567891", dt1Package1.Header.TerminalPhoneNo);
DT1Demo6 dt1Bodies = (DT1Demo6)dt1Package1.Bodies;
Assert.Equal((ushort)18, dt1Bodies.Age1);
Assert.Equal(2, dt1Bodies.Sex1);
JT808Package dt2Package1 = DT2JT808Serializer.Deserialize(dt2Data);
Assert.Equal(0x91, dt2Package1.Header.MsgId);
Assert.Equal(126, dt2Package1.Header.MsgNum);
Assert.Equal("1234567892", dt2Package1.Header.TerminalPhoneNo);
DT2Demo6 dt2Bodies = (DT2Demo6)dt2Package1.Bodies;
Assert.Equal((ushort)18, dt2Bodies.Age2);
Assert.Equal(2, dt2Bodies.Sex2);
}
}
public class DT1Demo6 : JT808MessagePackFormatter<DT1Demo6>, JT808Bodies
{
public byte Sex1 { get; set; }
public ushort Age1 { get; set; }
public ushort MsgId => 0x91;
public string Description =>"DT1Demo6";
public bool SkipSerialization => false;
public override DT1Demo6 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
DT1Demo6 dT1Demo6 = new DT1Demo6();
dT1Demo6.Sex1 = reader.ReadByte();
dT1Demo6.Age1 = reader.ReadUInt16();
return dT1Demo6;
}
public override void Serialize(ref JT808MessagePackWriter writer, DT1Demo6 value, IJT808Config config)
{
writer.WriteByte(value.Sex1);
writer.WriteUInt16(value.Age1);
}
}
public class DT2Demo6 : JT808MessagePackFormatter<DT2Demo6>,JT808Bodies
{
public ushort MsgId => 0x91;
public bool SkipSerialization => false;
public byte Sex2 { get; set; }
public ushort Age2 { get; set; }
public string Description => "DT2Demo6";
public override DT2Demo6 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
DT2Demo6 dT2Demo6 = new DT2Demo6();
dT2Demo6.Sex2 = reader.ReadByte();
dT2Demo6.Age2 = reader.ReadUInt16();
return dT2Demo6;
}
public override void Serialize(ref JT808MessagePackWriter writer, DT2Demo6 value, IJT808Config config)
{
writer.WriteByte(value.Sex2);
writer.WriteUInt16(value.Age2);
}
}
}