private async Task SendTemperatureTelemetryAsync(string componentName, CancellationToken cancellationToken)
        {
            const string telemetryName      = "temperature";
            double       currentTemperature = _temperature[componentName];

            using Message msg = PnpConvention.CreateMessage(telemetryName, currentTemperature, componentName);

            await _deviceClient.SendEventAsync(msg, cancellationToken);

            _logger.LogDebug($"Telemetry: Sent - component=\"{componentName}\", {{ \"{telemetryName}\": {currentTemperature} }} in °C.");

            if (_temperatureReadingsDateTimeOffset.ContainsKey(componentName))
            {
                _temperatureReadingsDateTimeOffset[componentName].TryAdd(DateTimeOffset.UtcNow, currentTemperature);
            }
            else
            {
                _temperatureReadingsDateTimeOffset.TryAdd(
                    componentName,
                    new Dictionary <DateTimeOffset, double>
                {
                    { DateTimeOffset.UtcNow, currentTemperature },
                });
            }
        }
        // Send device serial number over property update.
        private async Task SendDeviceSerialNumberAsync(CancellationToken cancellationToken)
        {
            const string   propertyName       = "serialNumber";
            TwinCollection reportedProperties = PnpConvention.CreatePropertyPatch(propertyName, SerialNumber);

            await _deviceClient.UpdateReportedPropertiesAsync(reportedProperties, cancellationToken);

            _logger.LogDebug($"Property: Update - {{ \"{propertyName}\": \"{SerialNumber}\" }} is complete.");
        }
        private async Task UpdateMaxTemperatureSinceLastRebootAsync(string componentName, CancellationToken cancellationToken)
        {
            const string   propertyName       = "maxTempSinceLastReboot";
            double         maxTemp            = _maxTemp[componentName];
            TwinCollection reportedProperties = PnpConvention.CreateComponentPropertyPatch(componentName, propertyName, maxTemp);

            await _deviceClient.UpdateReportedPropertiesAsync(reportedProperties, cancellationToken);

            _logger.LogDebug($"Property: Update - component=\"{componentName}\", {{ \"{propertyName}\": {maxTemp} }} in °C is complete.");
        }
        // 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;

            bool targetTempUpdateReceived = PnpConvention.TryGetPropertyFromTwin(
                desiredProperties,
                TargetTemperatureProperty,
                out double targetTemperature,
                componentName);

            if (!targetTempUpdateReceived)
            {
                _logger.LogDebug($"Property: Update - component=\"{componentName}\", received an update which is not associated with a valid property.\n{desiredProperties.ToJson()}");
                return;
            }

            _logger.LogDebug($"Property: Received - component=\"{componentName}\", {{ \"{TargetTemperatureProperty}\": {targetTemperature}°C }}.");

            s_localWritablePropertiesVersion = desiredProperties.Version;

            TwinCollection pendingReportedProperty = PnpConvention.CreateComponentWritablePropertyResponse(
                componentName,
                TargetTemperatureProperty,
                targetTemperature,
                (int)StatusCode.InProgress,
                desiredProperties.Version,
                "In progress - reporting current temperature");

            await _deviceClient.UpdateReportedPropertiesAsync(pendingReportedProperty);

            _logger.LogDebug($"Property: Update - component=\"{componentName}\", {{\"{TargetTemperatureProperty}\": {targetTemperature} }} in °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);
            }

            TwinCollection completedReportedProperty = PnpConvention.CreateComponentWritablePropertyResponse(
                componentName,
                TargetTemperatureProperty,
                _temperature[componentName],
                (int)StatusCode.Completed,
                desiredProperties.Version,
                "Successfully updated target temperature");

            await _deviceClient.UpdateReportedPropertiesAsync(completedReportedProperty);

            _logger.LogDebug($"Property: Update - component=\"{componentName}\", {{\"{TargetTemperatureProperty}\": {_temperature[componentName]} }} in °C is {StatusCode.Completed}");
        }
Пример #5
0
        // 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();
            ProvisioningDeviceClient     pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, symmetricKeyProvider, mqttTransportHandler);

            var pnpPayload = new ProvisioningRegistrationAdditionalData
            {
                JsonData = PnpConvention.CreateDpsPayload(ModelId),
            };

            return(await pdc.RegisterAsync(pnpPayload, cancellationToken));
        }
        private async Task ReportInitialPropertyAsync(string componentName, string propertyName, CancellationToken cancellationToken)
        {
            // If the device properties are empty, report the default value with ACK(ac=203, av=0) as part of the PnP convention.
            // "DefaultPropertyValue" is set from the device when the desired property is not set via the hub.
            TwinCollection reportedProperties = PnpConvention.CreateComponentWritablePropertyResponse(
                componentName,
                propertyName,
                DefaultPropertyValue,
                (int)StatusCode.ReportDeviceInitialProperty,
                DefaultAckVersion,
                "Initialized with default value");

            await _deviceClient.UpdateReportedPropertiesAsync(reportedProperties, cancellationToken);

            _logger.LogDebug($"Report the default values for \"{componentName}\".\nProperty: Update - {reportedProperties.ToJson()} is complete.");
        }
        // Send working set of device memory over telemetry.
        private async Task SendDeviceMemoryAsync(CancellationToken cancellationToken)
        {
            const string workingSetName = "workingSet";

            long workingSet = Process.GetCurrentProcess().PrivateMemorySize64 / 1024;

            var telemetry = new Dictionary <string, object>
            {
                { workingSetName, workingSet },
            };

            using Message msg = PnpConvention.CreateMessage(telemetry);

            await _deviceClient.SendEventAsync(msg, cancellationToken);

            _logger.LogDebug($"Telemetry: Sent - {JsonConvert.SerializeObject(telemetry)} in KB.");
        }
Пример #8
0
        private async static void SendTelemetry(double temperature, string telemetryName, string componentName)
        {
            Message message;

            if (telemetryName == "temperature")
            {
                //telemetryPayload = $"{{ \"{telemetryName}\": {pt_temperature} }}";
                message = PnpConvention.CreateMessage(telemetryName, pt_temperature, componentName);
                await deviceClient.SendEventAsync(message);
            }
            if (telemetryName == "humidity")
            {
                //telemetryPayload = $"{{ \"{telemetryName}\": {pt_humidity} }}";
                message = PnpConvention.CreateMessage(telemetryName, pt_humidity, componentName);
                await deviceClient.SendEventAsync(message);
            }

            if (telemetryName == "inductance")
            {
                //telemetryPayload = $"{{ \"{telemetryName}\": {pt_humidity} }}";
                message = PnpConvention.CreateMessage(telemetryName, induc, componentName);
                await deviceClient.SendEventAsync(message);
            }

            if (telemetryName == "acceleration")
            {
                //telemetryPayload = $"{{ \"{telemetryName}\": {pt_humidity} }}";
                message = PnpConvention.CreateMessage(telemetryName, acceleration, componentName);
                await deviceClient.SendEventAsync(message);
            }

            if (telemetryName == "angularrate")
            {
                //telemetryPayload = $"{{ \"{telemetryName}\": {pt_humidity} }}";
                message = PnpConvention.CreateMessage(telemetryName, angularrate, componentName);
                await deviceClient.SendEventAsync(message);
            }

            if (telemetryName == "workingSet")
            {
                //telemetryPayload = $"{{ \"{telemetryName}\": {pt_humidity} }}";
                message = PnpConvention.CreateMessage(telemetryName, workingsetsize);
                await deviceClient.SendEventAsync(message);
            }
        }
Пример #9
0
        private static async Task UpdateReadOnlyProperties(string propertyName, string componentName)
        {
            if (propertyName == "maxTempSinceLastReboot")
            {
                //var reportedProperties = new TwinCollection();
                //reportedProperties[propertyName] = max_temperature;
                //await deviceClient.UpdateReportedPropertiesAsync(reportedProperties);

                TwinCollection reportedProperties = PnpConvention.CreateComponentPropertyPatch(componentName, propertyName, max_temperature);
                await deviceClient.UpdateReportedPropertiesAsync(reportedProperties);
            }
            if (propertyName == "maxHumiditySinceLastReboot")
            {
                var reportedProperties = new TwinCollection();
                reportedProperties[propertyName] = max_humidity;
                await deviceClient.UpdateReportedPropertiesAsync(reportedProperties);
            }
        }
        // Report the property updates on "deviceInformation" component.
        private async Task UpdateDeviceInformationAsync(CancellationToken cancellationToken)
        {
            const string componentName = "deviceInformation";

            TwinCollection deviceInfoTc = PnpConvention.CreateComponentPropertyPatch(
                componentName,
                new Dictionary <string, object>
            {
                { "manufacturer", "element15" },
                { "model", "ModelIDxcdvmk" },
                { "swVersion", "1.0.0" },
                { "osName", "Windows 10" },
                { "processorArchitecture", "64-bit" },
                { "processorManufacturer", "Intel" },
                { "totalStorage", 256 },
                { "totalMemory", 1024 },
            });

            await _deviceClient.UpdateReportedPropertiesAsync(deviceInfoTc, cancellationToken);

            _logger.LogDebug($"Property: Update - component = '{componentName}', properties update is complete.");
        }
Пример #11
0
 private static async void SendTelemetry2(object v1, string telemetryName, string componentName)
 {
     var message = PnpConvention.CreateMessage(telemetryName, v1, componentName);
     await deviceClient.SendEventAsync(message);
 }
Пример #12
0
        private static async Task PatchProperty(string componentName, Dictionary <string, object> dictio)
        {
            TwinCollection deviceInfoTc = PnpConvention.CreateComponentPropertyPatch(componentName, dictio);

            await deviceClient.UpdateReportedPropertiesAsync(deviceInfoTc);
        }
Пример #13
0
 private static async Task UpdateProperty(string componentName, string propertyName, string v)
 {
     TwinCollection reportedProperties = PnpConvention.CreateComponentPropertyPatch(componentName, propertyName, v);
     await deviceClient.UpdateReportedPropertiesAsync(reportedProperties);
 }