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;
2using System.Collections;
3using System.Collections.Generic;
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("}")) || (s.StartsWith("[") && s.EndsWith("]")))
56 {
57 try
58 {
59 this.value = JSON.Parse(s);
60 this.json = s;
61 this.Timestamp = DateTime.UtcNow;
62 this.QoS = Content.Header.QualityOfService;
63 this.Retain = Content.Header.Retain;
64
65 return Task.FromResult(DataProcessingResult.ProcessedNewMomentaryValues);
66 }
67 catch (Exception)
68 {
69 return Task.FromResult(DataProcessingResult.Incompatible);
70 }
71 }
72 else
73 return Task.FromResult(DataProcessingResult.Incompatible);
74 }
75
79 public override Task<string> GetTypeName(Language Language)
80 {
81 return Language.GetStringAsync(typeof(MqttTopicNode), 38, "JSON");
82 }
83
91 public override Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
92 {
93 List<Field> Fields = new List<Field>();
94 this.AppendFields(ThingReference, Fields, Request, this.value, Prefix);
95 Request.ReportFields(Last, Fields.ToArray());
96
97 return Task.CompletedTask;
98 }
99
100 private void AppendFields(ThingReference ThingReference, List<Field> Fields, ISensorReadout Request, object Value, string Prefix)
101 {
102 if (Value is Dictionary<string, object> Object)
103 {
104 if (string.IsNullOrEmpty(Prefix))
105 {
106 foreach (KeyValuePair<string, object> P in Object)
107 this.AppendFields(ThingReference, Fields, Request, P.Value, P.Key);
108 }
109 else
110 {
111 foreach (KeyValuePair<string, object> P in Object)
112 this.AppendFields(ThingReference, Fields, Request, P.Value, Prefix + ", " + P.Key);
113 }
114 }
115 else if (Value is IEnumerable Array && !(Value is string))
116 {
117 int i = 1;
118
119 if (string.IsNullOrEmpty(Prefix))
120 {
121 foreach (object Item in Array)
122 this.AppendFields(ThingReference, Fields, Request, Item, "#" + (i++).ToString());
123 }
124 else
125 {
126 foreach (object Item in Array)
127 this.AppendFields(ThingReference, Fields, Request, Item, Prefix + " #" + (i++).ToString());
128 }
129 }
130 else
131 {
132 if (string.IsNullOrEmpty(Prefix))
133 this.Add(ThingReference, Fields, "Value", Value, Request);
134 else
135 this.Add(ThingReference, Fields, Prefix, Value, Request);
136 }
137 }
138
139 private void Add(ThingReference ThingReference, List<Field> Fields, string Name, object Value, ISensorReadout Request)
140 {
141 if (Value is null)
142 this.Add(Fields, new StringField(ThingReference, this.Timestamp, Name, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
143 else if (Value is string s)
144 {
145 if (System.TimeSpan.TryParse(s, out TimeSpan TimeSpan))
146 this.Add(Fields, new TimeField(ThingReference, this.Timestamp, Name, TimeSpan, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
147 else if (System.DateTime.TryParse(s, out DateTime DateTime))
148 {
149 if (DateTime.TimeOfDay == TimeSpan.Zero)
150 this.Add(Fields, new DateField(ThingReference, this.Timestamp, Name, DateTime, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
151 else
152 this.Add(Fields, new DateTimeField(ThingReference, this.Timestamp, Name, DateTime, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
153 }
154 else if (CommonTypes.TryParseRfc822(s, out DateTimeOffset DateTimeOffset))
155 this.Add(Fields, new DateTimeField(ThingReference, this.Timestamp, Name, DateTimeOffset.DateTime, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
156 else if (Content.Duration.TryParse(s, out Duration Duration))
157 this.Add(Fields, new DurationField(ThingReference, this.Timestamp, Name, Duration, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
158 else
159 this.Add(Fields, new StringField(ThingReference, this.Timestamp, Name, s, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
160 }
161 else if (Value is int i)
162 this.Add(Fields, new Int32Field(ThingReference, this.Timestamp, Name, i, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
163 else if (Value is long l)
164 this.Add(Fields, new Int64Field(ThingReference, this.Timestamp, Name, l, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
165 else if (Value is double d)
166 {
167 string s2 = CommonTypes.Encode(d);
168
169 if (CommonTypes.TryParse(s2, out d, out byte NrDec))
170 this.Add(Fields, new QuantityField(ThingReference, this.Timestamp, Name, d, NrDec, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
171 }
172 else if (Value is decimal d2)
173 {
174 string s2 = CommonTypes.Encode(d2);
175
176 if (CommonTypes.TryParse(s2, out d2, out byte NrDec))
177 this.Add(Fields, new QuantityField(ThingReference, this.Timestamp, Name, (double)d2, NrDec, string.Empty, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
178 }
179 else if (Value is bool b)
180 this.Add(Fields, new BooleanField(ThingReference, this.Timestamp, Name, b, FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
181 else
182 this.Add(Fields, new StringField(ThingReference, this.Timestamp, Name, Value.ToString(), FieldType.Momentary, FieldQoS.AutomaticReadout), Request);
183 }
184
188 public override bool IsControllable => true;
189
194 {
195 return new ControlParameter[]
196 {
197 new MultiLineTextControlParameter("Value", "Publish", "Value:", "JSON value of topic.",
198 (n) => Task.FromResult<string>(this.json),
199 (n, v) =>
200 {
201 this.value = JSON.Parse(v);
202 this.json = v;
203 this.Topic.MqttClient.PUBLISH(this.Topic.FullTopic, this.QoS, this.Retain, Encoding.UTF8.GetBytes(v));
204 return Task.CompletedTask;
205 })
206 };
207 }
208
212 public override void SnifferOutput(ICommunicationLayer Output)
213 {
214 this.Information(Output, this.json);
215 }
216
220 public override Grade DefaultSupport => Grade.Excellent;
221
229 {
230 IMqttData Result = new JsonData(Topic, default, default);
231 Result.DataReported(Topic, Content);
232 return Result;
233 }
234 }
235}
Helps with parsing of commong data types.
Definition: CommonTypes.cs:13
static string Encode(bool x)
Encodes a Boolean for use in XML and other formats.
Definition: CommonTypes.cs:594
static bool TryParseRfc822(string s, out DateTimeOffset Value)
Parses a date and time value encoded according to RFC 822, §5.
Definition: CommonTypes.cs:170
static bool TryParse(string s, out double Value)
Tries to decode a string encoded double.
Definition: CommonTypes.cs:46
Helps with common JSON-related tasks.
Definition: JSON.cs:14
static object Parse(string Json)
Parses a JSON string.
Definition: JSON.cs:43
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:228
override Task StartReadout(ThingReference ThingReference, ISensorReadout Request, string Prefix, bool Last)
Starts a readout of the data.
Definition: JsonData.cs:91
override ControlParameter[] GetControlParameters()
TODO
Definition: JsonData.cs:193
override Grade DefaultSupport
Default support.
Definition: JsonData.cs:220
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:212
override Task< string > GetTypeName(Language Language)
Type name representing data.
Definition: JsonData.cs:79
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:13
MqttQualityOfService QualityOfService
Quality of Service level.
Definition: MqttHeader.cs:16