Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
Base64Data.cs
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Text.RegularExpressions;
5using System.Threading.Tasks;
12
14{
18 public class Base64Data : MqttData
19 {
23 public const string RegExString = @"^\s*(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\s*$";
24
28 public static readonly Regex RegEx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.Singleline);
29
30 private byte[] value;
31 private bool firstReport = true;
32
36 public Base64Data()
37 : base()
38 {
39 }
40
46 public Base64Data(MqttTopic Topic, byte[] Value)
47 : base(Topic)
48 {
49 this.value = Value;
50 }
51
58 public override Task<DataProcessingResult> DataReported(MqttTopic Topic, MqttContent Content)
59 {
60 string s = Content.DataString;
61
62 if (RegEx.IsMatch(s))
63 {
64 try
65 {
66 this.value = Convert.FromBase64String(s);
67
68 if (this.firstReport)
69 this.firstReport = false;
70 else
71 {
72 IMqttData Processor = Topic.FindDataType(Content);
73 if (!(Processor is Base64Data))
74 return Task.FromResult(DataProcessingResult.Incompatible);
75 }
76
77 this.Timestamp = DateTime.UtcNow;
78 this.QoS = Content.Header.QualityOfService;
79 this.Retain = Content.Header.Retain;
80 return Task.FromResult(DataProcessingResult.Processed);
81 }
82 catch (Exception)
83 {
84 return Task.FromResult(DataProcessingResult.Incompatible);
85 }
86 }
87 else
88 return Task.FromResult(DataProcessingResult.Incompatible);
89 }
90
94 public override Task<string> GetTypeName(Language Language)
95 {
96 return Language.GetStringAsync(typeof(MqttTopicNode), 42, "BASE-64");
97 }
98
106 public override Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
107 {
108 List<Field> Data = new List<Field>()
109 {
110 new Int32Field(ThingReference, this.Timestamp, this.Append(Prefix, "#Bytes"),
111 this.value.Length, FieldType.Momentary, FieldQoS.AutomaticReadout)
112 };
113
114 if (!(this.value is null) && this.value.Length <= 256)
115 {
116 Data.Add(new StringField(ThingReference, this.Timestamp, "Raw",
117 Convert.ToBase64String(this.value), FieldType.Momentary, FieldQoS.AutomaticReadout));
118 }
119
120 Request.ReportFields(Last, Data);
121
122 return Task.CompletedTask;
123 }
124
128 public override bool IsControllable => true;
129
134 {
135 return new ControlParameter[]
136 {
137 new StringControlParameter("Value", "Publish", "Value:", "BASE-64 value of topic.", RegExString,
138 (n) => Task.FromResult<string>(Convert.ToBase64String(this.value)),
139 (n, v) =>
140 {
141 this.value = Convert.FromBase64String(v);
142 this.Topic.MqttClient.PUBLISH(this.Topic.FullTopic, this.QoS, this.Retain, Encoding.UTF8.GetBytes(v));
143 return Task.CompletedTask;
144 })
145 };
146 }
147
151 public override void SnifferOutput(ICommunicationLayer Output)
152 {
153 if (this.value is null)
154 this.Information(Output, "NULL");
155 else if (this.value.Length == 1)
156 this.Information(Output, "1 byte.");
157 else
158 this.Information(Output, this.value.Length.ToString() + " bytes.");
159 }
160
164 public override Grade DefaultSupport => Grade.Excellent;
165
173 {
174 IMqttData Result = new Base64Data(Topic, default);
175 Result.DataReported(Topic, Content);
176 return Result;
177 }
178 }
179}
Information about content received from the MQTT server.
Definition: MqttContent.cs:9
string DataString
String representation of UTF-8 encoded binary data.
Definition: MqttContent.cs:56
MqttHeader Header
MQTT Header
Definition: MqttContent.cs:35
Contains information about a language.
Definition: Language.cs:17
Task< string > GetStringAsync(Type Type, int Id, string Default)
Gets the string value of a string ID. If no such string exists, a string is created with the default ...
Definition: Language.cs:209
Abstract base class for control parameters.
Represents an MQTT topic with base64-encoded binary data.
Definition: Base64Data.cs:19
Base64Data()
Represents an MQTT topic with base64-encoded binary data.
Definition: Base64Data.cs:36
override IMqttData CreateNew(MqttTopic Topic, MqttContent Content)
Creates a new instance of the data.
Definition: Base64Data.cs:172
override Grade DefaultSupport
Default support.
Definition: Base64Data.cs:164
override void SnifferOutput(ICommunicationLayer Output)
Outputs the parsed data to the sniffer.
Definition: Base64Data.cs:151
override Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
Starts a readout of the data.
Definition: Base64Data.cs:106
static readonly Regex RegEx
Parsed regular expression for BASE64-encoded data.
Definition: Base64Data.cs:28
const string RegExString
Regular expression for BASE64-encoded data.
Definition: Base64Data.cs:23
override Task< string > GetTypeName(Language Language)
Type name representing data.
Definition: Base64Data.cs:94
override Task< DataProcessingResult > DataReported(MqttTopic Topic, MqttContent Content)
Called when new data has been published.
Definition: Base64Data.cs:58
Base64Data(MqttTopic Topic, byte[] Value)
Represents an MQTT topic with base64-encoded binary data.
Definition: Base64Data.cs:46
override ControlParameter[] GetControlParameters()
TODO
Definition: Base64Data.cs:133
Abstract base class for MQTT data encapsulations.
Definition: MqttData.cs:18
void Information(ICommunicationLayer Output, string Info)
Outputs information to sniffer.
Definition: MqttData.cs:91
DateTime Timestamp
Timestamp of data reception.
Definition: MqttData.cs:39
string Append(string Prefix, string Name)
Appends a name to a topic name.
Definition: MqttData.cs:100
MQTT Topic information.
Definition: MqttTopic.cs:19
IMqttData FindDataType(MqttContent Content)
FInds best implementation to process binary data.
Definition: MqttTopic.cs:273
A Metering node representing an MQTT topic
Represents a 32-bit integer value.
Definition: Int32Field.cs:10
Represents a string value.
Definition: StringField.cs:10
Contains a reference to a thing
Interface for observable classes implementing communication protocols.
Interface for classes managing sensor data readouts.
Task ReportFields(bool Done, params Field[] Fields)
Report read fields to the client.
Interface for MQTT Data encapsulations
Definition: IMqttData.cs:38
Task< DataProcessingResult > DataReported(MqttTopic Topic, MqttContent Content)
Called when new data has been published.
Grade
Grade enumeration
Definition: Grade.cs:7
DataProcessingResult
Results from processing an incoming message.
Definition: IMqttData.cs:17
FieldQoS
Field Quality of Service flags
Definition: FieldQoS.cs:10
FieldType
Field Type flags
Definition: FieldType.cs:10
MqttQualityOfService QualityOfService
Quality of Service level.
Definition: MqttHeader.cs:16