Exemple #1
0
        public async Task NotifyModuleLoadAsync(string route)
        {
            ModuleLoadedMessage msg = new ModuleLoadedMessage();
            string id = ModuleId;

            if (_moduleTwin == null)
            {
                Log.WriteLine("missing module twin -- assuming moduleId {0}", id);
            }
            else
            {
                string tid = _moduleTwin.ModuleId;
                if (tid == null || tid.Length == 0)
                {
                    Log.WriteLine("missing module id -- assuming moduleId {0}", id);
                }
                else
                {
                    id = tid;
                }
            }
            Log.WriteLine("base NotifyModuleLoadAsync {0} to {1}", id, route);
            msg.ModuleName = id;

            await SendMessageDataAsync(route, msg);
        }
Exemple #2
0
        async Task <MessageResponse> ProcessModuleLoadedMessage(ModuleLoadedMessage msg)
        {
            await Task.Run(() => {
                try
                {
                    ModuleLoaded?.Invoke(this, msg.ModuleName);
                } catch (Exception e)
                {
                    Log.WriteLine("ModuleLoadedMessageHandler event lambda exception {0}", e.ToString());
                }
            });

            return(MessageResponse.Completed);
        }
Exemple #3
0
        public static async Task C2DModuleMessage(string connectionString, string destDeviceId, string destModule, string sourceModuleId, ILogger log)
        {
            ServiceClient client = ServiceClient.CreateFromConnectionString(connectionString);

            log.LogInformation("have service client");
            ModuleLoadedMessage loadMsg = new ModuleLoadedMessage();

            loadMsg.ModuleName = sourceModuleId;
            var mi = new CloudToDeviceMethod(Keys.SetModuleLoaded);

            mi.ConnectionTimeout = TimeSpan.FromSeconds(DEFAULT_NETWORK_TIMEOUT);
            mi.ResponseTimeout   = TimeSpan.FromSeconds(DEFAULT_NETWORK_TIMEOUT);
            mi.SetPayloadJson(JsonConvert.SerializeObject(loadMsg));

            // Invoke the direct method asynchronously and get the response from the simulated device.
            log.LogInformation("invoking device method for {0} {1} with {2} json {3}", destDeviceId, destModule, mi.MethodName, mi.GetPayloadAsJson());
            var r = await client.InvokeDeviceMethodAsync(destDeviceId, destModule, mi);

            log.LogInformation("device method invocation complete");

            return;
        }
Exemple #4
0
        public static async Task HubRun([IoTHubTrigger("messages/events", Connection = "EndpointConnectionString")] EventData message,
                                        ILogger log, WebJobsExecutionContext context)
        {
            try
            {
                string msg = Encoding.UTF8.GetString(message.Body);
                log.LogInformation("{0} C# IoT Hub trigger function received a message: {1} ::: {2}", Thread.CurrentThread.ManagedThreadId, Dump(message), message.ToString());
                log.LogInformation($"payload: {msg}");
                if (message.SystemProperties == null)
                {
                    log.LogInformation("no system metadata. unable to determine source device -- ignoring");
                    return;
                }
                if (message.Properties != null &&
                    message.Properties.ContainsKey(Keys.iothubMessageSchema) &&
                    (string)message.Properties[Keys.iothubMessageSchema] == Keys.twinChangeNotification)
                {
                    log.LogInformation("twin notification -- ignoring");
                    return;
                }
                string sourceDeviceId = (string)message.SystemProperties[Keys.DeviceIdMetadata];
                string sourceModuleId = (string)message.SystemProperties[Keys.ModuleIdMetadata];
                log.LogInformation($"Have device id {sourceDeviceId}");
                var    config = new ConfigurationBuilder().SetBasePath(context.FunctionAppDirectory).AddJsonFile("local.settings.json", optional: true, reloadOnChange: true).AddEnvironmentVariables().Build();
                string conn   = config[Keys.HubConnectionString];
                log.LogInformation("Have connection string {0}", conn);
                var rm = RegistryManager.CreateFromConnectionString(conn);
                log.LogInformation("Have registry manager");
                var destDevices = await GetDestinationDevices(sourceDeviceId, rm, log);

                log.LogInformation("Have topology");
                ModuleLoadedMessage loadMsg = JsonConvert.DeserializeObject <ModuleLoadedMessage>(msg);
                if ((loadMsg != null) && (loadMsg.ModuleName != null) && (loadMsg.ModuleName.Length > 0))
                {
                    if (sourceModuleId != loadMsg.ModuleName)
                    {
                        log.LogError("ignoring message because metadata inconsistency.  system property moduleId = {0} message module {1}", sourceModuleId, loadMsg.ModuleName);
                        return;
                    }
                    log.LogInformation("Load Module {0}", loadMsg.ModuleName);

                    var destModulesFromRouteList = LoadMsgRouting.Where(routeSourceModuleEntry => routeSourceModuleEntry.Item1 == sourceModuleId);
                    int destModulesFromRouteSize = destModulesFromRouteList.Count();
                    if (destModulesFromRouteSize == 0)
                    {
                        log.LogInformation("no destination routes for module {0} -- ignoring", sourceModuleId);
                        return;
                    }
                    if (destModulesFromRouteSize > 1)
                    {
                        log.LogError("configuration error. found {0} route destination lists. expected at most 1.", destModulesFromRouteSize);
                        return;
                    }
                    var destModulesFromRoute = destModulesFromRouteList.First().Item2;
                    foreach (var destDeviceId in destDevices)
                    {
                        log.LogInformation("examining destination device {0}", destDeviceId);
                        List <string> destCandidateNames = await GetDeviceModulesAsync(destDeviceId, rm, log);

                        var destModules = destCandidateNames.Where(n => n != sourceModuleId).Intersect(destModulesFromRoute, StringComparer.InvariantCulture);
                        log.LogInformation("sending loadmsg to destination {0} modules", destModules.Count());
                        foreach (var destModule in destModules)
                        {
                            try
                            {
                                log.LogInformation("sending loadmsg to destination module {0} on {1}", destModule, destDeviceId);
                                await C2DModuleMessage(conn, destDeviceId, destModule, sourceModuleId, log);
                            }
                            catch (Exception e)
                            {
                                log.LogInformation("{0} exception sending module load of {0} to device {1} module {2}", e.ToString(), sourceModuleId, destDeviceId, destModule);
                            }
                        }
                    }
                    return;
                }
                log.LogInformation("Not a Load Module -- checking for fruit");
                FruitMessage fruitMsg = JsonConvert.DeserializeObject <FruitMessage>(msg);
                if (fruitMsg.FruitSeen != null && fruitMsg.FruitSeen.Length > 0)
                {
                    log.LogInformation("fruit msg original time {0} fruit {1}", fruitMsg.OriginalEventUTCTime, fruitMsg.FruitSeen);
                    //log.LogInformation("found {0} slave devices", slaves.Length);
                    string originaleventtime = fruitMsg.OriginalEventUTCTime;
                    if (originaleventtime == null && message.Properties.ContainsKey(Keys.MessageCreationUTC))
                    {
                        originaleventtime = (string)message.Properties[Keys.MessageCreationUTC];
                    }
                    var destModulesFromRouteList = FruitMsgRouting.Where(routeSourceModuleEntry => routeSourceModuleEntry.Item1 == sourceModuleId);
                    int destModulesFromRouteSize = destModulesFromRouteList.Count();
                    if (destModulesFromRouteSize == 0)
                    {
                        log.LogInformation("no destination routes for module {0} -- ignoring", sourceModuleId);
                        return;
                    }
                    if (destModulesFromRouteSize > 1)
                    {
                        log.LogError("configuration error. found {0} route destination lists. expected at most 1.", destModulesFromRouteSize);
                        return;
                    }
                    var destModulesFromRoute = destModulesFromRouteList.First().Item2;
                    log.LogInformation("{0} destination modules for route", destModulesFromRoute.Count());
                    foreach (var destDeviceId in destDevices)
                    {
                        log.LogInformation("examining destination device {0}", destDeviceId);
                        List <string> destCandidateNames = await GetDeviceModulesAsync(destDeviceId, rm, log);

                        log.LogInformation("interecting {0} destmodules with {1} routemodules", destCandidateNames.Count(), destModulesFromRoute.Length);
                        var destModules = destCandidateNames.Intersect(destModulesFromRoute, StringComparer.InvariantCulture);
                        log.LogInformation("{0} modules after intersection", destModules.Count());
                        if (destModules == null || destModules.Count() == 0)
                        {
                            log.LogInformation("destination modules and routes list have empty intersection");
                        }
                        foreach (var destModule in destModules)
                        {
                            try
                            {
                                log.LogInformation("sending fruitmsg to destination module {0} on {1}", destModule, destDeviceId);
                                await C2DFruitMessage(conn, destDeviceId, destModule, fruitMsg.FruitSeen, originaleventtime, log);
                            }
                            catch (Exception e)
                            {
                                log.LogInformation("{0} exception sending module load of {0} to device {1} module {2}", e.ToString(), sourceModuleId, destDeviceId, destModule);
                            }
                        }
                    }
                    return;
                }
                log.LogInformation("Not a fruit message -- checking for orientation");
                OrientationMessage oMsg = JsonConvert.DeserializeObject <OrientationMessage>(msg);
                if (oMsg.OrientationState != Orientation.Unknown)
                {
                    log.LogInformation("orientation msg original time {0} orientation {1} sourceDeviceId {2} sourceModuleId {3}", oMsg.OriginalEventUTCTime, oMsg.OrientationState, sourceDeviceId, sourceModuleId);
                    //log.LogInformation("found {0} slave devices", slaves.Length);
                    string originaleventtime = oMsg.OriginalEventUTCTime;
                    if (originaleventtime == null && message.Properties.ContainsKey(Keys.MessageCreationUTC))
                    {
                        originaleventtime = (string)message.Properties[Keys.MessageCreationUTC];
                    }
                    var destModulesFromRouteList = OrientationMsgRouting.Where(routeSourceModuleEntry => routeSourceModuleEntry.Item1 == sourceModuleId);
                    int destModulesFromRouteSize = destModulesFromRouteList.Count();
                    if (destModulesFromRouteSize == 0)
                    {
                        log.LogInformation("no destination routes for module {0} -- ignoring", sourceModuleId);
                        return;
                    }
                    if (destModulesFromRouteSize > 1)
                    {
                        log.LogError("configuration error. found {0} route destination lists. expected at most 1.", destModulesFromRouteSize);
                        return;
                    }
                    log.LogInformation("orientation msg 1 route list as expected. examining {0} dest devices", destDevices.Count());
                    var destModulesFromRoute = destModulesFromRouteList.First().Item2;
                    foreach (var destDeviceId in destDevices)
                    {
                        log.LogInformation("examining destination device {0}", destDeviceId);
                        List <string> destCandidateNames = await GetDeviceModulesAsync(destDeviceId, rm, log);

                        var destModules = destCandidateNames.Where(n => n != sourceModuleId).Intersect(destModulesFromRoute, StringComparer.InvariantCulture);
                        log.LogInformation("sending loadmsg to destination {0} modules", destModules.Count());
                        foreach (var destModule in destModules)
                        {
                            try
                            {
                                log.LogInformation("sending orientation msg to destination module {0} on {1}", destModule, destDeviceId);
                                await C2DOrientationMessage(conn, destDeviceId, destModule, oMsg.OrientationState, originaleventtime, log);
                            }
                            catch (Exception e)
                            {
                                log.LogInformation("{0} exception sending module load of {0} to device {1} module {2}", e.ToString(), sourceModuleId, destDeviceId, destModule);
                            }
                        }
                    }
                    return;
                }
            }
            catch (Exception e)
            {
                log.LogInformation("{0} HubRun failed with exception {1}", Thread.CurrentThread.ManagedThreadId, e.ToString());
            }
            log.LogInformation("{0}HubRun complete", Thread.CurrentThread.ManagedThreadId);
            return;
        }