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); }
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); }
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; }
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; }