Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
Ieee1451Parser.cs
1using System;
2using System.IO;
3using System.Text;
4using System.Threading.Tasks;
9
11{
15 public static class Ieee1451Parser
16 {
22 public static Task<Message> TryParseMessage(byte[] Data)
23 {
24 return TryParseMessage(Data, null);
25 }
26
33 public static async Task<Message> TryParseMessage(byte[] Data, ICommunicationLayer ComLayer)
34 {
37 byte NetworkServiceId = 0;
38 int Length = 0;
39 int TailLength = 0;
40 byte[] Body = null;
41 byte[] Tail = null;
42 int i = 0;
43 int c = Data.Length;
44 int Pos = 0;
45 int State = 0;
46 byte b;
47
48 while (i < c)
49 {
50 b = Data[i++];
51
52 switch (State)
53 {
54 case 0: // Network Service Type
55 if (b < 1 || b > 4)
56 {
57 if (ComLayer?.HasSniffers ?? false)
58 await ComLayer.Error("Invalid Network Service Type: " + b.ToString());
59
60 return null;
61 }
62
64 State += b;
65 break;
66
67 case 1: // Discovery services
68 if (b < 1 || b > 10)
69 {
70 if (ComLayer?.HasSniffers ?? false)
71 await ComLayer.Error("Invalid Discovery Service: " + b.ToString());
72
73 return null;
74 }
75
76 NetworkServiceId = b;
77 State = 5;
78 break;
79
80 case 2: // Transducer Access Service
81 if (b < 1 || b > 20)
82 {
83 if (ComLayer?.HasSniffers ?? false)
84 await ComLayer.Error("Invalid Transducer Access Service: " + b.ToString());
85
86 return null;
87 }
88
89 NetworkServiceId = b;
90 State = 5;
91 break;
92
93 case 3: // TEDS Access Service
94 if (b < 1 || b > 4)
95 {
96 if (ComLayer?.HasSniffers ?? false)
97 await ComLayer.Error("Invalid TEDS Access Service: " + b.ToString());
98
99 return null;
100 }
101
102 NetworkServiceId = b;
103 State = 5;
104 break;
105
106 case 4: // Event Notification Service
107 if (b < 1 || b > 12)
108 {
109 if (ComLayer?.HasSniffers ?? false)
110 await ComLayer.Error("Invalid Event Notification Service: " + b.ToString());
111
112 return null;
113 }
114
115 NetworkServiceId = b;
116 State = 5;
117 break;
118
119 case 5: // Message Type
121 State++;
122 break;
123
124 case 6: // Length MSB
125 Length = b;
126 State++;
127 break;
128
129 case 7: // Length LSB
130 Length <<= 8;
131 Length |= b;
132
133 TailLength = c - i - Length;
134 if (TailLength < 0)
135 {
136 if (ComLayer?.HasSniffers ?? false)
137 await ComLayer.Error("Missing data bytes.");
138
139 return null;
140 }
141
142 Body = new byte[Length];
143 Tail = TailLength == 0 ? Array.Empty<byte>() : new byte[TailLength];
144
145 if (Length > 0)
146 State++;
147 else if (TailLength > 0)
148 State += 2;
149 else
150 State += 3;
151 break;
152
153 case 8:
154 Body[Pos++] = b;
155 Length--;
156 if (Length == 0)
157 {
158 if (TailLength > 0)
159 {
160 Pos = 0;
161 State++;
162 }
163 else
164 State += 2;
165 }
166 break;
167
168 case 9:
169 Tail[Pos++] = b;
170 TailLength--;
171 if (TailLength == 0)
172 State++;
173 break;
174
175 case 10:
176 default:
177 if (ComLayer?.HasSniffers ?? false)
178 await ComLayer.Error("Invalid Parsing State: " + State.ToString());
179
180 return null;
181 }
182 }
183
184 if (State != 10)
185 {
186 if (ComLayer?.HasSniffers ?? false)
187 await ComLayer.Error("Unexpected end of message.");
188
189 return null;
190 }
191
192 switch (NetworkServiceType)
193 {
194 case NetworkServiceType.DiscoveryServices:
195 if (ComLayer?.HasSniffers ?? false)
196 {
197 await ComLayer.Information(nameof(DiscoveryMessage) + "(" + NetworkServiceType.ToString() + "," +
198 ((DiscoveryService)NetworkServiceId).ToString() + "," + MessageType.ToString() + "," +
199 Hashes.BinaryToString(Body, true) + ")");
200 }
201
202 return new DiscoveryMessage(NetworkServiceType, (DiscoveryService)NetworkServiceId, MessageType, Body, Tail, ComLayer);
203
204 case NetworkServiceType.TransducerAccessServices:
205 if (ComLayer?.HasSniffers ?? false)
206 {
207 await ComLayer.Information(nameof(TransducerAccessMessage) + "(" + NetworkServiceType.ToString() + "," +
208 ((TransducerAccessService)NetworkServiceId).ToString() + "," + MessageType.ToString() + "," +
209 Hashes.BinaryToString(Body, true) + ")");
210 }
211
212 return new TransducerAccessMessage(NetworkServiceType, (TransducerAccessService)NetworkServiceId, MessageType, Body, Tail, ComLayer);
213
214 case NetworkServiceType.TedsAccessServices:
215 if (ComLayer?.HasSniffers ?? false)
216 {
217 await ComLayer.Information(nameof(TedsAccessMessage) + "(" + NetworkServiceType.ToString() + "," +
218 ((TedsAccessService)NetworkServiceId).ToString() + "," + MessageType.ToString() + "," +
219 Hashes.BinaryToString(Body, true) + ")");
220 }
221
222 return new TedsAccessMessage(NetworkServiceType, (TedsAccessService)NetworkServiceId, MessageType, Body, Tail, ComLayer);
223
224 case NetworkServiceType.EventNotificationServices:
225 if (ComLayer?.HasSniffers ?? false)
226 {
227 await ComLayer.Information(nameof(EventNotificationMessage) + "(" + NetworkServiceType.ToString() + "," +
228 ((EventNotificationService)NetworkServiceId).ToString() + "," + MessageType.ToString() + "," +
229 Hashes.BinaryToString(Body, true) + ")");
230 }
231
232 return new EventNotificationMessage(NetworkServiceType, (EventNotificationService)NetworkServiceId, MessageType, Body, Tail, ComLayer);
233
234 default:
235 if (ComLayer?.HasSniffers ?? false)
236 await ComLayer.Error("Unsupported Network Service Type: " + NetworkServiceType.ToString());
237
238 return null;
239 }
240 }
241
252 byte NetworkServiceId, MessageType MessageType, byte[] Payload)
253 {
254 using (MemoryStream ms = new MemoryStream())
255 {
256 ms.WriteByte((byte)NetworkServiceType);
257 ms.WriteByte(NetworkServiceId);
258 ms.WriteByte((byte)MessageType);
259
260 int Length = Payload?.Length ?? 0;
261 if (Length > ushort.MaxValue)
262 throw new ArgumentException("Payload too large.", nameof(Payload));
263
264 ms.WriteByte((byte)(Length >> 8));
265 ms.WriteByte((byte)Length);
266
267 if (Length > 0)
268 ms.Write(Payload, 0, Length);
269
270 return ms.ToArray();
271 }
272 }
273
283 public static byte[] SerializeMessage(DiscoveryService NetworkServiceId,
284 MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
285 {
286 if (!(SnifferOutput is null))
287 {
288 SnifferOutput.AppendLine("NetworkServiceType: DiscoveryServices");
289 SnifferOutput.Append("NetworkServiceId: ");
290 SnifferOutput.AppendLine(NetworkServiceId.ToString());
291 SnifferOutput.Append("MessageType: ");
292 SnifferOutput.AppendLine(MessageType.ToString());
293 }
294
295 return SerializeMessage(NetworkServiceType.DiscoveryServices, (byte)NetworkServiceId, MessageType, Payload);
296 }
297
307 public static byte[] SerializeMessage(TransducerAccessService NetworkServiceId,
308 MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
309 {
310 if (!(SnifferOutput is null))
311 {
312 SnifferOutput.AppendLine("NetworkServiceType: TransducerAccessServices");
313 SnifferOutput.Append("NetworkServiceId: ");
314 SnifferOutput.AppendLine(NetworkServiceId.ToString());
315 SnifferOutput.Append("MessageType: ");
316 SnifferOutput.AppendLine(MessageType.ToString());
317 }
318
319 return SerializeMessage(NetworkServiceType.TransducerAccessServices,
320 (byte)NetworkServiceId, MessageType, Payload);
321 }
322
332 public static byte[] SerializeMessage(TedsAccessService NetworkServiceId,
333 MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
334 {
335 if (!(SnifferOutput is null))
336 {
337 SnifferOutput.AppendLine("NetworkServiceType: TedsAccessServices");
338 SnifferOutput.Append("NetworkServiceId: ");
339 SnifferOutput.AppendLine(NetworkServiceId.ToString());
340 SnifferOutput.Append("MessageType: ");
341 SnifferOutput.AppendLine(MessageType.ToString());
342 }
343
344 return SerializeMessage(NetworkServiceType.TedsAccessServices,
345 (byte)NetworkServiceId, MessageType, Payload);
346 }
347
357 public static byte[] SerializeMessage(EventNotificationService NetworkServiceId,
358 MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
359 {
360 if (!(SnifferOutput is null))
361 {
362 SnifferOutput.AppendLine("NetworkServiceType: EventNotificationServices");
363 SnifferOutput.Append("NetworkServiceId: ");
364 SnifferOutput.AppendLine(NetworkServiceId.ToString());
365 SnifferOutput.Append("MessageType: ");
366 SnifferOutput.AppendLine(MessageType.ToString());
367 }
368
369 return SerializeMessage(NetworkServiceType.EventNotificationServices,
370 (byte)NetworkServiceId, MessageType, Payload);
371 }
372
373 }
374}
Contains methods for simple hash calculations.
Definition: Hashes.cs:59
static string BinaryToString(byte[] Data)
Converts an array of bytes to a string with their hexadecimal representations (in lower case).
Definition: Hashes.cs:65
Static class for IEEE 1451-related parsing tasks.
static Task< Message > TryParseMessage(byte[] Data)
Tries to parse an IEEE 1451.0-encoded data.
static byte[] SerializeMessage(NetworkServiceType NetworkServiceType, byte NetworkServiceId, MessageType MessageType, byte[] Payload)
Creates a binary IEEE 1451.0 message.
static byte[] SerializeMessage(EventNotificationService NetworkServiceId, MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
Creates a binary IEEE 1451.0 message.
static byte[] SerializeMessage(TedsAccessService NetworkServiceId, MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
Creates a binary IEEE 1451.0 message.
static byte[] SerializeMessage(TransducerAccessService NetworkServiceId, MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
Creates a binary IEEE 1451.0 message.
static byte[] SerializeMessage(DiscoveryService NetworkServiceId, MessageType MessageType, byte[] Payload, StringBuilder SnifferOutput)
Creates a binary IEEE 1451.0 message.
static async Task< Message > TryParseMessage(byte[] Data, ICommunicationLayer ComLayer)
Tries to parse an IEEE 1451.0-encoded data.
Task Information(string Comment)
Called to inform the viewer of something.
Task Error(string Error)
Called to inform the viewer of an error state.
Interface for observable classes implementing communication protocols.
EventNotificationService
Event Notification Service
MessageType
Network Service Message Type
Definition: MessageType.cs:7
TransducerAccessService
Transducer access service
NetworkServiceType
IEEE 1451.0 Network Service Type
TedsAccessService
TEDS Access Service