コード例 #1
0
        public async Task <ActionResult <DeviceDetailsApiModel> > Show(string name)
        {
            var device = await _service.GetDeviceByNameAsync(name);

            var sensors        = new List <Sensor>();
            var valsBySensorId = new Dictionary <long, List <(double, Instant)> >();

            await foreach (var sensor in _service.ListSensorsByDeviceAsync(device))
            {
                sensors.Add(sensor);
                valsBySensorId[sensor.Id] = new List <(double, Instant)>();
            }
            await foreach (var(sensor, value, createdAt) in _valueService.GetLastNumberOfValuesBySensorsAsync(sensors, 10))
            {
                valsBySensorId[sensor.Id].Add((value, createdAt));
            }

            var sensorList = new List <SensorDetailsApiModel>();

            sensorList.AddRange(sensors.Select(s => new SensorDetailsApiModel(s, valsBySensorId[s.Id])));

            var sensorNamesFromMqtt = await _mqttService.ListSensorNamesByDeviceNameAsync(device.Name);

            var registeredSensorNames = sensors.Select(s => s.Name);

            sensorList.AddRange(sensorNamesFromMqtt.Except(registeredSensorNames).Select(n => new SensorDetailsApiModel(n, device.Name)));

            var info = await GetBrokerConnectionInfoAsync();

            var res = new DeviceDetailsApiModel(device, sensorList, info);

            return(Ok(res));
        }
コード例 #2
0
        public async Task ProcessCommonMessageAsync_RegistersDeviceAndSensorName()
        {
            await SeedDefaultSensor();

            var message = new MqttMessage("iot/device-new/sensor-new", "120", _clock.GetCurrentInstant());

            await _service.ProcessCommonMessageAsync(message);

            Assert.Contains("device-new", await _mqttIdentifierService.ListDeviceNamesAsync());
            Assert.Contains("sensor-new", await _mqttIdentifierService.ListSensorNamesByDeviceNameAsync("device-new"));
        }
コード例 #3
0
        public async Task <string?> GetOneIdentifierCandidateForSensorAsync(string deviceName)
        {
            var names = await _mqttIdentifierService.ListSensorNamesByDeviceNameAsync(deviceName);

            var candidates = names.ToList();

            if (candidates.Count == 0)
            {
                return(null);
            }
#pragma warning disable SCS0005 // Weak random generator: name doesn't need to be secure
            var idx = _rand.Next(candidates.Count);
#pragma warning restore SCS0005 // Weak random generator
            return(candidates[idx]);
        }
コード例 #4
0
        public async Task CreateSensorByDeviceAndNameAsync(Device device, string sensorName)
        {
            var legalNames = await _identifierService.ListSensorNamesByDeviceNameAsync(device.Name);

            if (!legalNames.Contains(sensorName))
            {
                throw new EntityNotFoundException($"We can't find messages from sensor {device.Name}/{sensorName}.", nameof(sensorName));
            }
            var found = await _dbContext.Sensors.Where(s => s.NormalizedName == Sensor.NormalizeName(sensorName) && s.DeviceId == device.Id).CountAsync();

            if (found > 0)
            {
                throw new EntityExistException($"The sensor {sensorName} was created. You can't create a new one.", nameof(sensorName));
            }
            _dbContext.Sensors.Add(new Sensor {
                Name = sensorName, NormalizedName = Sensor.NormalizeName(sensorName), DeviceId = device.Id
            });
            await _dbContext.SaveChangesAsync();
        }