Exemple #1
0
 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;
            }
        }
Exemple #3
0
 public void Publish(object sender, MQTTMessageArgs args)
 {
     numPublishedMessages++;
     receivedMessages.Add(args);
     MessagePublished?.Invoke(this, args);
 }
Exemple #4
0
 public void OnMessagePublished(object sender, MQTTMessageArgs args)
 {
     Console.WriteLine(args);
 }