Scaffold for telemetry service

This commit is contained in:
Denis-Cosmin Nutiu 2019-11-14 16:45:32 +02:00
parent 8a6094b8a3
commit fb4034773c
7 changed files with 134 additions and 3 deletions

View file

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NucuCar.Sensors.Telemetry;
using NucuCarSensorsProto;
namespace NucuCar.Sensors.EnvironmentSensor
@ -21,7 +22,7 @@ namespace NucuCar.Sensors.EnvironmentSensor
var configSection = config.GetSection("EnvironmentSensor");
_serviceEnabled = configSection.GetValue<bool>("Enabled");
_telemetryEnabled = configSection.GetValue<bool>("Telemetry");
_measurementDelay = configSection.GetValue<int>("MeasurementDelay");
_measurementDelay = configSection.GetValue<int>("MeasurementInterval");
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@ -34,6 +35,11 @@ namespace NucuCar.Sensors.EnvironmentSensor
using var sensor = Sensor.Instance;
sensor.SetLogger(_logger);
sensor.InitializeSensor();
if (_telemetryEnabled)
{
TelemetryService.Instance.RegisterSensor(sensor);
}
while (!stoppingToken.IsCancellationRequested)
{
if (sensor.GetState() == SensorStateEnum.Initialized)
@ -49,6 +55,8 @@ namespace NucuCar.Sensors.EnvironmentSensor
await Task.Delay(_measurementDelay, stoppingToken);
}
TelemetryService.Instance.UnregisterSensor(sensor);
}
}
}

View file

@ -1,14 +1,16 @@
using System;
using System.Collections.Generic;
using System.Device.I2c;
using System.Threading.Tasks;
using Iot.Device.Bmxx80;
using Iot.Device.Bmxx80.PowerMode;
using Microsoft.Extensions.Logging;
using NucuCar.Sensors.Telemetry;
using NucuCarSensorsProto;
namespace NucuCar.Sensors.EnvironmentSensor
{
public class Sensor : IDisposable
public class Sensor : IDisposable, ITelemetrySensor
{
private ILogger _logger;
private I2cConnectionSettings _i2CSettings;
@ -101,5 +103,16 @@ namespace NucuCar.Sensors.EnvironmentSensor
_logger.LogInformation(
$"{_lastMeasurement.Temperature:N2} \u00B0C | {_lastMeasurement.Pressure:N2} hPa | {_lastMeasurement.Humidity:N2} %rH");
}
public Dictionary<string, double> GetTelemetryData()
{
return new Dictionary<string, double>
{
["temperature"] = _lastMeasurement.Temperature,
["humidity"] = _lastMeasurement.Humidity,
["pressure"] = _lastMeasurement.Pressure,
["voc"] = _lastMeasurement.VolatileOrganicCompound
};
}
}
}

View file

@ -16,6 +16,7 @@ namespace NucuCar.Sensors
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Telemetry.BackgroundWorker>();
services.AddHostedService<EnvironmentSensor.BackgroundWorker>();
})
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<GrpcStartup>(); });

View file

@ -0,0 +1,41 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace NucuCar.Sensors.Telemetry
{
public class BackgroundWorker : BackgroundService
{
private readonly bool _serviceEnabled;
private readonly int _interval;
private readonly ILogger _logger;
public BackgroundWorker(ILogger<BackgroundWorker> logger, IConfiguration configuration)
{
_logger = logger;
var configSection = configuration.GetSection("Telemetry");
_serviceEnabled = configSection.GetValue<bool>("Enabled");
_interval = configSection.GetValue<int>("Interval");
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (!_serviceEnabled)
{
return;
}
await Task.Delay(_interval, stoppingToken);
using var telemetryService = TelemetryService.Instance;
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Publishing telemetry data!");
await telemetryService.PublishData();
await Task.Delay(_interval, stoppingToken);
}
}
}
}

View file

@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace NucuCar.Sensors.Telemetry
{
public interface ITelemetrySensor
{
/* Dictionary containing the topic and the value */
Dictionary<string, double> GetTelemetryData();
}
}

View file

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace NucuCar.Sensors.Telemetry
{
public class TelemetryService : IDisposable
{
private readonly List<ITelemetrySensor> _registeredSensors;
/* Singleton Instance */
public static TelemetryService Instance { get; } = new TelemetryService();
static TelemetryService()
{
}
private TelemetryService()
{
_registeredSensors = new List<ITelemetrySensor>(5);
}
public void Dispose()
{
}
public async Task PublishData()
{
foreach (var sensor in _registeredSensors)
{
var data = sensor.GetTelemetryData();
await UploadData(data);
}
}
private async Task UploadData(Dictionary<string, double> data)
{
foreach (var entry in data)
{
// TODO: Publish data to IoTCore
}
}
public void RegisterSensor(ITelemetrySensor sensor)
{
_registeredSensors.Add(sensor);
}
public void UnregisterSensor(ITelemetrySensor sensor)
{
_registeredSensors.Remove(sensor);
}
}
}

View file

@ -1,8 +1,12 @@
{
"Telemetry": {
"Enabled": true,
"Interval": 5000
},
"EnvironmentSensor": {
"Enabled": true,
"Telemetry": false,
"MeasurementDelay": 1000
"MeasurementInterval": 1000
},
"Logging": {
"LogLevel": {