public void InjectMessage(MQTTMessageArgs args) { MessageReceived?.Invoke(this, args); }
public async void ProcessMessage(object sender, MQTTMessageArgs args) { try { string[] parts = args.Topic.Split("/"); string deviceEUI = null; string messageType = null; if (parts[0] == "application") { // application/powerpilot/uplink/{type}/{deviceEUI} messageType = parts[3]; deviceEUI = parts[4]; } else if (parts[0] == "spBv1.0") { // spBv1.0/DTX/{0}/PowerPilotCS/{1} messageType = parts[2]; deviceEUI = parts[4]; } if (deviceEUI == null) { _loggerClient.LogError($"Could not get device eui from {args.Topic}", "ProcessMessage", Pplogger.ErrorMessage.Types.Severity.Fatal); return; } // check if this device exists in our system var connection = await _dataService.GetConnection(deviceEUI); if (connection == null) { return; } Payload payload = new Payload() { Seq = GetSeq(), Timestamp = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now) }; // check if we have this deviceEUI already, if not then send DBIRTH // use lock to avoid concurrent adds bool added = false; lock (dbirthLock) { if (!deviceEUIs.Contains(deviceEUI)) { deviceEUIs.Add(deviceEUI); added = true; } } if (added) { var dbirthPayload = await BuildDBIRTH(connection); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DBIRTH, connection.DeviceEUI), dbirthPayload.ToByteArray())); // return; } // var topic = $"spBv1.0/DTX/{SparkPlugMessageTypes.DDATA}/PowerPilotCS/{deviceEUI}"; switch (messageType) { // sparkplug commands case SparkPlugMessageTypes.DCMD: var cmd = Payload.Parser.ParseFrom(args.Payload); await HandleCommand(cmd, connection); break; // powerpilot messages case TopicNames.ENERGY: var energy = Ppuplink.EnergyMessage.Parser.ParseFrom(args.Payload); var energyPayload = AddEnergyMetrics(energy, payload); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DDATA, deviceEUI), energyPayload.ToByteArray())); break; case TopicNames.PQ: var pq = Ppuplink.PQMessage.Parser.ParseFrom(args.Payload); var pqPayload = AddPQMetrics(pq, payload, connection); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DDATA, deviceEUI), pqPayload.ToByteArray())); break; case TopicNames.INST: var inst = Ppuplink.InstMessage.Parser.ParseFrom(args.Payload); // not interested yet break; case TopicNames.ALARM: var alarm = Ppuplink.AlarmMessage.Parser.ParseFrom(args.Payload); var alarmPayload = AddAlarmMetrics(alarm, payload, connection); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DDATA, deviceEUI), alarmPayload.ToByteArray())); //if power fail also need DDEATH if (alarm.Alarmtype == "powerfailalarm") { var ddeathPayload = BuildDDEATH(alarm); var ddeath_topic = string.Format(_publishTopic, SparkPlugMessageTypes.DDEATH, deviceEUI); // $"spBv1.0/DTX/{SparkPlugMessageTypes.DDEATH}/PowerPilotCS/{deviceEUI}"; MessageProcessed?.Invoke(this, new MQTTMessageArgs(ddeath_topic, ddeathPayload.ToByteArray())); } //if normal voltage then also need DBIRTH else if (alarm.Alarmtype == "normalvoltage") { var dbirthPayload = await BuildDBIRTH(connection); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DBIRTH, connection.DeviceEUI), dbirthPayload.ToByteArray())); } break; case TopicNames.UPLINK: var uplink = Ppuplink.UplinkMessage.Parser.ParseFrom(args.Payload); var uplinkPayload = AddUplinkMetrics(uplink, payload); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DDATA, deviceEUI), uplinkPayload.ToByteArray())); break; case TopicNames.VOLTAGE_STATS: var vs = Ppuplink.VoltageStatsMessage.Parser.ParseFrom(args.Payload); var vsPayload = AddVoltageStatsMetrics(vs, payload, connection); MessageProcessed?.Invoke(this, new MQTTMessageArgs(string.Format(_publishTopic, SparkPlugMessageTypes.DDATA, deviceEUI), vsPayload.ToByteArray())); break; default: _loggerClient.LogMessage($"Not processing type {messageType}"); break; } } catch (Exception ex) { _loggerClient.LogError($"Exception while processing Message: {ex.Message}", "ProcessMessage", Pplogger.ErrorMessage.Types.Severity.Fatal); if (ex.StackTrace != null) { _loggerClient.LogMessage(ex.StackTrace); } return; } }
public void Publish(object sender, MQTTMessageArgs args) { numPublishedMessages++; receivedMessages.Add(args); MessagePublished?.Invoke(this, args); }
public void OnMessagePublished(object sender, MQTTMessageArgs args) { Console.WriteLine(args); }