private void sendCommandToServiceBusQueue(MessageProcessorFactoryModel messageProcessorFactoryModel, string deviceId, JObject command)
        {
            QueueClient queueClient     = messageProcessorFactoryModel.SfInfraQueueClient;
            string      iothubAlias     = messageProcessorFactoryModel.IoTHubAlias;
            bool        iothubIsPrimary = messageProcessorFactoryModel.IsIoTHubPrimary;

            try
            {
                JObject msgObj = new JObject();
                msgObj.Add("job", "device management");
                msgObj.Add("entity", "iotdevice");
                msgObj.Add("entityId", deviceId);
                msgObj.Add("task", "update device reported property to db");
                msgObj.Add("iothubDeviceId", deviceId);
                msgObj.Add("requester", "IoTHubReceiver_" + iothubAlias);
                msgObj.Add("requestDateTime", DateTime.UtcNow);
                msgObj.Add("iothubAlias", iothubAlias);
                msgObj.Add("iothubIsPrimary", iothubIsPrimary);

                JObject payload = new JObject();
                payload.Add(SF_LASTUPDATED_TIMESTAMP, command[SF_LASTUPDATED_TIMESTAMP]);
                msgObj.Add("deviceConfiguration", payload);

                var messageString = JsonConvert.SerializeObject(msgObj);
                var msg           = new BrokeredMessage(messageString);
                queueClient.Send(msg);
            }
            catch (Exception ex)
            {
                ConsoleLog.WriteMessageAlarmErrorLogToConsole("sendCommandToServiceBusQueue Exception: payload={0} ex={1}", command, ex.ToString());
                ConsoleLog.WriteBlobLogError("sendCommandToServiceBusQueue Exception:  payload={0} ex={1}", command, ex.ToString());
            }
        }
        private async Task runAlarmRules(MessageProcessorFactoryModel msgProcessorFactoryModel, int messageCatalogId, JObject payload, string messageDocumentId)
        {
            try
            {
                var      ts           = payload["msgTimestamp"];
                DateTime msgTimestamp = DateTime.Parse(ts.ToString());

                Dictionary <int, List <AlarmRuleCatalogEngine> > messageIdAlarmRules = msgProcessorFactoryModel.MessageIdAlarmRules;
                if (messageIdAlarmRules.ContainsKey(messageCatalogId) == true)
                {
                    List <AlarmRuleCatalogEngine> alarmRuleCatalogEngine = messageIdAlarmRules[messageCatalogId];

                    foreach (AlarmRuleCatalogEngine arcEngine in alarmRuleCatalogEngine)
                    {
                        if (arcEngine.RuleEngineItems.Count > 0)
                        {
                            // Get all results of equations
                            foreach (KeyValuePair <string, RuleEngineItem> ruleEngineItem in arcEngine.RuleEngineItems)
                            {
                                runSingleRuleItem(ruleEngineItem.Value, payload);
                            }

                            // Get the result of bitwise operation
                            bool alarmTriggered = compileBitWiseRules(arcEngine.RuleEngineItems.Count - 1, arcEngine.RuleEngineItems);
                            if (alarmTriggered)
                            {
                                string now       = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
                                bool   alarmSent = checkAlarmTimeWindow(arcEngine, msgTimestamp);

                                ConsoleLog.WriteMessageAlarmLogToConsoleInfo("AlarmRuleCatalogId={0}, alarmSent={1}, LastTriggerTime={2}",
                                                                             arcEngine.AlarmRuleCatalogId, alarmSent, arcEngine.LastTriggerTime.ToString("yyyy-MM-ddTHH:mm:ss"));

                                AlarmMessageHelper alarmMessageHelper = new AlarmMessageHelper(arcEngine.AlarmRuleCatalog,
                                                                                               now,
                                                                                               alarmSent,
                                                                                               messageDocumentId,
                                                                                               payload);

                                // Send the alarm to Service Bus if it matchs the time window
                                if (alarmSent)
                                {
                                    sendAlarmToServiceBusQueue(msgProcessorFactoryModel.SfQueueClient, alarmMessageHelper);
                                }

                                // Put the alarm to document DB
                                await putAlarmDocument(msgProcessorFactoryModel.SfDocumentDBHelper, alarmMessageHelper);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ConsoleLog.WriteToConsole("runAlarmRules Exception: {0}", ex.ToString());
                ConsoleLog.WriteBlobLogError("runAlarmRules Exception: {0}", ex.ToString());
                return;
            }
        }
        private bool testAlarmRuleStringEqual(string left, string op, string right, string testTarget)
        {
            int messageCatalogId = 1;
            MessageProcessorFactoryModel msgProcessorFactoryModel = new MessageProcessorFactoryModel();
            SfMessageEventProcessor      sfMsgEventProcessor      = new SfMessageEventProcessor(msgProcessorFactoryModel);

            msgProcessorFactoryModel.MessageIdAlarmRules = getSampleAlarmRulesStringEqual(messageCatalogId, left, op, right);
            JObject     payload        = getSampleDeviceMessageForString(left, testTarget);
            Task <bool> alarmTriggered = sfMsgEventProcessor.RunAlarmRulesTest(msgProcessorFactoryModel, messageCatalogId, payload, false, false);

            return(alarmTriggered.Result);
        }
        private bool testAlarmRule2(int a, string b, bool c, int d)
        {
            int messageCatalogId = 1;
            MessageProcessorFactoryModel msgProcessorFactoryModel = new MessageProcessorFactoryModel();
            SfMessageEventProcessor      sfMsgEventProcessor      = new SfMessageEventProcessor(msgProcessorFactoryModel);

            msgProcessorFactoryModel.MessageIdAlarmRules = getSampleAlarmRules(messageCatalogId);

            JObject     payload        = getSampleDeviceMessage2(a, b, c, d);
            Task <bool> alarmTriggered = sfMsgEventProcessor.RunAlarmRulesTest(msgProcessorFactoryModel, messageCatalogId, payload, false, false);

            return(alarmTriggered.Result);
        }
Exemple #5
0
        private void loadConfigurationFromDB(string iotHubAliasName, MessageProcessorFactoryModel msgProcessorFactoryModel)
        {
            DBHelper._IoTHub iotHubHelper = new DBHelper._IoTHub();

            IoTHub iotHub = iotHubHelper.GetByid(_IoTHubAliasName);

            if (iotHub == null)
            {
                ConsoleLog.WriteToConsole("IoTHubAlias Not Found. Alias:{0}", iotHubAliasName);
                ConsoleLog.WriteBlobLogError("IoTHubAlias Not Found. Alias:{0}", iotHubAliasName);
                throw new Exception("IoTHubAlias Not Found");
            }

            _companyId = iotHub.CompanyID;

            msgProcessorFactoryModel.SimpleIoTDeviceMessageCatalogList = findAllMessageSchema(iotHub);
            msgProcessorFactoryModel.MessageIdAlarmRules = findAllMessageAlarmRules(iotHub.IoTHubAlias);
            findAllCompatibleEventHubs(iotHub);
            findDocDBConnectionString(iotHub);
        }
        private bool runSingleRuleItem(SupportDataTypeEnum testDataType, string elementName, string op, string right, JObject testObject)
        {
            MessageProcessorFactoryModel msgProcessorFactoryModel = new MessageProcessorFactoryModel();

            IoTHubAliasEventMessageReceiver    receiver            = new IoTHubAliasEventMessageReceiver("test");
            Func <DynamicMessageElement, bool> func                = receiver.CreateCompiledRuleFuncTest(testDataType, op, right);
            SfMessageEventProcessor            sfMsgEventProcessor = new SfMessageEventProcessor(msgProcessorFactoryModel);

            RuleEngineItem ruleEngineItem = new RuleEngineItem
            {
                ElementName    = elementName,
                DataType       = testDataType,
                OrderOperation = "end",
                Result         = false,
                Equality       = func
            };

            sfMsgEventProcessor.RunSingleRuleItemTest(ruleEngineItem, testObject);

            return(ruleEngineItem.Result);
        }
 public SfEventMessageProcessorFactory(MessageProcessorFactoryModel msgProcessorFactoryModel)
 {
     this.msgProcessorFactoryModel = msgProcessorFactoryModel;
 }
 public SfMessageEventProcessor(MessageProcessorFactoryModel msgProcessorFactoryModel)
 {
     this._msgProcessorFactoryModel = msgProcessorFactoryModel;
 }