// Send device serial number over property update. private async Task SendDeviceSerialNumberAsync(CancellationToken cancellationToken) { string propertyName = "serialNumber"; string propertyPatch = PnpHelper.CreatePropertyPatch(propertyName, JsonConvert.SerializeObject(SerialNumber)); var reportedProperties = new TwinCollection(propertyPatch); await _deviceClient.UpdateReportedPropertiesAsync(reportedProperties, cancellationToken); _logger.LogDebug($"Property: Update - {{ \"{propertyName}\": \"{SerialNumber}\" }} is {StatusCode.Completed}."); }
private async Task UpdateMaxTemperatureSinceLastRebootAsync(string componentName, CancellationToken cancellationToken) { string propertyName = "maxTempSinceLastReboot"; double maxTemp = _maxTemp[componentName]; string propertyPatch = PnpHelper.CreatePropertyPatch(propertyName, JsonConvert.SerializeObject(maxTemp), componentName); var reportedProperties = new TwinCollection(propertyPatch); await _deviceClient.UpdateReportedPropertiesAsync(reportedProperties, cancellationToken); _logger.LogDebug($"Property: Update - component=\"{componentName}\", {{ \"{propertyName}\": {maxTemp}°C }} is {StatusCode.Completed}."); }
// Send working set of device memory over telemetry. private async Task SendDeviceMemoryAsync(CancellationToken cancellationToken) { string telemetryName = "workingSet"; long workingSet = Process.GetCurrentProcess().PrivateMemorySize64 / 1024; using Message msg = PnpHelper.CreateIothubMessageUtf8(telemetryName, JsonConvert.SerializeObject(workingSet)); await _deviceClient.SendEventAsync(msg, cancellationToken); _logger.LogDebug($"Telemetry: Sent - {{ \"{telemetryName}\": {workingSet}KiB }}."); }
// Send working set of device memory over telemetry. private static async Task SendDeviceMemoryAsync() { string telemetryName = "workingSet"; long workingSet = Environment.WorkingSet / 1024; Message msg = PnpHelper.CreateIothubMessageUtf8(telemetryName, JsonConvert.SerializeObject(workingSet)); await s_deviceClient.SendEventAsync(msg); s_logger.LogDebug($"Telemetry: Sent - {{ \"{telemetryName}\": {workingSet}KiB }}."); }
// Provision a device via DPS, by sending the PnP model Id as DPS payload. private static async Task <DeviceRegistrationResult> ProvisionDeviceAsync(Parameters parameters, CancellationToken cancellationToken) { SecurityProvider symmetricKeyProvider = new SecurityProviderSymmetricKey(parameters.DeviceId, parameters.DeviceSymmetricKey, null); ProvisioningTransportHandler mqttTransportHandler = new ProvisioningTransportHandlerMqtt(); var pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, symmetricKeyProvider, mqttTransportHandler); var pnpPayload = new ProvisioningRegistrationAdditionalData { JsonData = PnpHelper.CreateDpsPayload(ModelId), }; return(await pdc.RegisterAsync(pnpPayload, cancellationToken)); }
// The desired property update callback, which receives the target temperature as a desired property update, // and updates the current temperature value over telemetry and property update. private async Task TargetTemperatureUpdateCallbackAsync(TwinCollection desiredProperties, object userContext) { string componentName = (string)userContext; string propertyName = "targetTemperature"; (bool targetTempUpdateReceived, double targetTemperature) = PnpHelper.GetPropertyFromTwin <double>(desiredProperties, propertyName, componentName); if (targetTempUpdateReceived) { _logger.LogDebug($"Property: Received - component=\"{componentName}\", {{ \"{propertyName}\": {targetTemperature}°C }}."); string pendingPropertyPatch = PnpHelper.CreatePropertyEmbeddedValuePatch( propertyName, JsonConvert.SerializeObject(targetTemperature), ackCode: (int)StatusCode.InProgress, ackVersion: desiredProperties.Version, componentName: componentName); var pendingReportedProperty = new TwinCollection(pendingPropertyPatch); await _deviceClient.UpdateReportedPropertiesAsync(pendingReportedProperty); _logger.LogDebug($"Property: Update - component=\"{componentName}\", {{\"{propertyName}\": {targetTemperature}°C }} is {StatusCode.InProgress}"); // Update Temperature in 2 steps double step = (targetTemperature - _temperature[componentName]) / 2d; for (int i = 1; i <= 2; i++) { _temperature[componentName] = Math.Round(_temperature[componentName] + step, 1); await Task.Delay(6 * 1000); } string completedPropertyPatch = PnpHelper.CreatePropertyEmbeddedValuePatch( propertyName, JsonConvert.SerializeObject(_temperature[componentName]), ackCode: (int)StatusCode.Completed, ackVersion: desiredProperties.Version, serializedAckDescription: JsonConvert.SerializeObject("Successfully updated target temperature"), componentName: componentName); var completedReportedProperty = new TwinCollection(completedPropertyPatch); await _deviceClient.UpdateReportedPropertiesAsync(completedReportedProperty); _logger.LogDebug($"Property: Update - component=\"{componentName}\", {{\"{propertyName}\": {_temperature[componentName]}°C }} is {StatusCode.Completed}"); } else { _logger.LogDebug($"Property: Update - component=\"{componentName}\", received an update which is not associated with a valid property."); } }
private static async Task SendTemperatureTelemetryAsync(string componentName) { string telemetryName = "temperature"; double currentTemperature = s_temperature[componentName]; Message msg = PnpHelper.CreateIothubMessageUtf8(telemetryName, JsonConvert.SerializeObject(currentTemperature), componentName); await s_deviceClient.SendEventAsync(msg); s_logger.LogDebug($"Telemetry: Sent - component=\"{componentName}\", {{ \"{telemetryName}\": {currentTemperature}°C }}."); if (s_temperatureReadings.ContainsKey(componentName)) { s_temperatureReadings[componentName].TryAdd(DateTimeOffset.Now, currentTemperature); } else { s_temperatureReadings.TryAdd(componentName, new Dictionary <DateTimeOffset, double>() { { DateTimeOffset.Now, currentTemperature } }); } }