Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
JsonData.cs
1using System;
4using System.Text;
5using System.Threading.Tasks;
6using Waher.Content;
13
15{
19 public class JsonData : MqttData
20 {
21 private string json;
22 private object value;
23
27 public JsonData()
28 : base()
29 {
30 }
31
38 public JsonData(MqttTopic Topic, string Json, object Value)
39 : base(Topic)
40 {
41 this.json = Json;
42 this.value = Value;
43 }
44
51 public override Task<DataProcessingResult> DataReported(MqttTopic Topic, MqttContent Content)
52 {
53 string s = Content.DataString;
54
55 if ((s.StartsWith('{') && s.EndsWith('}')) ||
56 (s.StartsWith('[') && s.EndsWith(']')))
57 {
58 try
59 {
60 this.value = JSON.Parse(s);
61 this.json = s;
62 this.Timestamp = DateTime.UtcNow;
63 this.QoS = Content.Header.QualityOfService;
64 this.Retain = Content.Header.Retain;
65
66 return Task.FromResult(DataProcessingResult.ProcessedNewMomentaryValues);
67 }
68 catch (Exception)
69 {
70 return Task.FromResult(DataProcessingResult.Incompatible);
71 }
72 }
73 else
74 return Task.FromResult(DataProcessingResult.Incompatible);
75 }
76
80 public override Task<string> GetTypeName(Language Language)
81 {
82 return Language.GetStringAsync(typeof(MqttTopicNode), 38, "JSON");
83 }
84
92 public override Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
93 {
94 List<Field> Fields = new List<Field>();
95 this.AppendFields(ThingReference, Fields, Request, this.value, Prefix);
96 Request.ReportFields(Last, Fields.ToArray());
97
98 return Task.CompletedTask;
99 }
100
101 private void AppendFields(ThingReference ThingReference, List<Field> Fields, ISensorReadout Request, object Value, string Prefix)
102 {
103 if (Value is Dictionary<string, object> Object)
104 {
105 if (string.IsNullOrEmpty(Prefix))
106 {
107 foreach (KeyValuePair<string, object> P in Object)
108 this.AppendFields(ThingReference, Fields, Request, P.Value, P.Key);
109 }
110 else
111 {
112 foreach (KeyValuePair<string, object> P in Object)
113 this.AppendFields(ThingReference, Fields, Request, P.Value, Prefix + ", " + P.Key);
114 }
115 }
116 else if (Value is IEnumerable Array && !(Value is string))
117 {
118 int i = 1;
119
120 if (string.IsNullOrEmpty(Prefix))
121 {
122 foreach (object Item in Array)
123 this.AppendFields(ThingReference, Fields, Request, Item, "#" + (i++).ToString());
124 }
125 else
126 {
127 foreach (object Item in Array)
128 this.AppendFields(ThingReference, Fields, Request, Item, Prefix + " #" + (i++).ToString());
129 }
130 }
131 else
132 {
133 if (string.IsNullOrEmpty(Prefix))
134 this.Add(ThingReference, Fields, "Value", Value, Request);
135 else
136 this.Add(ThingReference, Fields, Prefix, Value, Request);
137 }
138 }
139
140 private void Add(ThingReference ThingReference, List<Field> Fields, string Name, object Value, ISensorReadout Request)
141 {
142 if (Value is null)
143 this.Add(Fields, new StringField(ThingReference, this.Timestamp, Name, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
144 else if (Value is string s)
145 {
146 if (System.TimeSpan.TryParse(s, out TimeSpan TimeSpan))
147 this.Add(Fields, new TimeField(ThingReference, this.Timestamp, Name, TimeSpan, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
148 else if (System.DateTime.TryParse(s, out DateTime DateTime))
149 {
150 if (DateTime.TimeOfDay == TimeSpan.Zero)
151 this.Add(Fields, new DateField(ThingReference, this.Timestamp, Name, DateTime, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
152 else
153 this.Add(Fields, new DateTimeField(ThingReference, this.Timestamp, Name, DateTime, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
154 }
155 else if (CommonTypes.TryParseRfc822(s, out DateTimeOffset DateTimeOffset))
156 this.Add(Fields, new DateTimeField(ThingReference, this.Timestamp, Name, DateTimeOffset.DateTime, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
157 else if (Content.Duration.TryParse(s, out Duration Duration))
158 this.Add(Fields, new DurationField(ThingReference, this.Timestamp, Name, Duration, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
159 else
160 this.Add(Fields, new StringField(ThingReference, this.Timestamp, Name, s, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
161 }
162 else if (Value is int i)
163 this.Add(Fields, new Int32Field(ThingReference, this.Timestamp, Name, i, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
164 else if (Value is long l)
165 this.Add(Fields, new Int64Field(ThingReference, this.Timestamp, Name, l, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
166 else if (Value is double d)
167 {
168 string s2 = CommonTypes.Encode(d);
169
170 if (CommonTypes.TryParse(s2, out d, out byte NrDec))
171 this.Add(Fields, new QuantityField(ThingReference, this.Timestamp, Name, d, NrDec, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
172 }
173 else if (Value is decimal d2)
174 {
175 string s2 = CommonTypes.Encode(d2);
176
177 if (CommonTypes.TryParse(s2, out d2, out byte NrDec))
178 this.Add(Fields, new QuantityField(ThingReference, this.Timestamp, Name, (double)d2, NrDec, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
179 }
180 else if (Value is bool b)
181 this.Add(Fields, new BooleanField(ThingReference, this.Timestamp, Name, b, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
182 else
183 this.Add(Fields, new StringField(ThingReference, this.Timestamp, Name, Value.ToString(), FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
184 }
185
189 public override bool IsControllable => true;
190
195 {
196 return new ControlParameter[]
197 {
198 new MultiLineTextControlParameter("Value", "Publish", "Value:", "JSON value of topic.",
199 (n) => Task.FromResult<string>(this.json),
200 (n, v) =>
201 {
202 this.value = JSON.Parse(v);
203 this.json = v;
204 this.Topic.MqttClient.PUBLISH(this.Topic.FullTopic, this.QoS, this.Retain, Encoding.UTF8.GetBytes(v));
205 return Task.CompletedTask;
206 })
207 };
208 }
209
213 public override void SnifferOutput(ICommunicationLayer Output)
214 {
215 this.Information(Output, this.json);
216 }
217
221 public override Grade DefaultSupport => Grade.Excellent;
222
230 {
231 IMqttData Result = new JsonData(Topic, default, default);
232 Result.DataReported(Topic, Content);
233 return Result;
234 }
235 }
236}
Helps with parsing of commong data types.
Definition: CommonTypes.cs:15
static string Encode(bool x)
Encodes a Boolean for use in XML and other formats.
Definition: CommonTypes.cs:596
static bool TryParseRfc822(string s, out DateTimeOffset Value)
Parses a date and time value encoded according to RFC 822, §5.
Definition: CommonTypes.cs:172
static bool TryParse(string s, out double Value)
Tries to decode a string encoded double.
Definition: CommonTypes.cs:48
Helps with common JSON-related tasks.
Definition: JSON.cs:16
static object Parse(string Json)
Parses a JSON string.
Definition: JSON.cs:45
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 JSON-encoded data.
Definition: JsonData.cs:20
override IMqttData CreateNew(MqttTopic Topic, MqttContent Content)
Creates a new instance of the data.
Definition: JsonData.cs:229
override Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
Starts a readout of the data.
Definition: JsonData.cs:92
override ControlParameter[] GetControlParameters()
TODO
Definition: JsonData.cs:194
override Grade DefaultSupport
Default support.
Definition: JsonData.cs:221
JsonData(MqttTopic Topic, string Json, object Value)
Represents an MQTT topic with JSON-encoded data.
Definition: JsonData.cs:38
JsonData()
Represents an MQTT topic with JSON-encoded data.
Definition: JsonData.cs:27
override void SnifferOutput(ICommunicationLayer Output)
Outputs the parsed data to the sniffer.
Definition: JsonData.cs:213
override Task< string > GetTypeName(Language Language)
Type name representing data.
Definition: JsonData.cs:80
override Task< DataProcessingResult > DataReported(MqttTopic Topic, MqttContent Content)
Called when new data has been published.
Definition: JsonData.cs:51
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
MQTT Topic information.
Definition: MqttTopic.cs:19
A Metering node representing an MQTT topic
Represents a boolean value that can be either true or false.
Definition: BooleanField.cs:11
Represents a date value.
Definition: DateField.cs:11
Represents a date and optional time value.
Represents a duration value. Duration values adhere to the type specified by xsd:duration.
Represents a 32-bit integer value.
Definition: Int32Field.cs:10
Represents a 64-bit integer value.
Definition: Int64Field.cs:10
Represents a physical quantity value.
Represents a string value.
Definition: StringField.cs:10
Represents a time value. Time values adhere to the type specified by xsd:time.
Definition: TimeField.cs:14
Contains a reference to a thing
string Key
Key for thing reference: [NodeId[, SourceId[, Partition]]]
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.
delegate string ToString(IElement Element)
Delegate for callback methods that convert an element value to a string.
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
Represents a duration value, as defined by the xsd:duration data type: http://www....
Definition: Duration.cs:14
MqttQualityOfService QualityOfService
Quality of Service level.
Definition: MqttHeader.cs:16