Exemplo n.º 1
0
        private async Task GetData()
        {
            try
            {
                Trace.WriteLine(Invariant($"Connecting to {DeviceIP}"));
                ClearSmbState();

                DateTime localTime = DateTime.Now.ToLocalTime();
                string   path      = Invariant($"smb://{DeviceIP}/airvisual/{localTime.Year}{localTime.Month:00}_AirVisual_values.txt");

                var    auth       = new NtlmPasswordAuthentication(null, credentials.UserName, credentials.Password);
                string lastString = null;
                var    smbFile    = new SmbFile(path, auth, SmbFile.FileShareRead | SmbFile.FileShareWrite);
                smbFile.Connect();

                using (Stream fileStream = smbFile.GetInputStream())
                {
                    var length = fileStream.Length;
                    Trace.WriteLine(Invariant($"Reading from {path} with size {length} Bytes"));

                    int bufferSize = 512;
                    fileStream.Seek(-Math.Min(bufferSize, length), SeekOrigin.End);

                    var pos = fileStream.Position;

                    using (var reader = new StreamReader(fileStream, Encoding.ASCII, false, bufferSize))
                    {
                        string lastData = await reader.ReadToEndAsync().ConfigureAwait(false);

                        foreach (var reading in lastData.Split('\n'))
                        {
                            if (!string.IsNullOrWhiteSpace(reading))
                            {
                                lastString = reading;
                            }
                        }
                    }
                }

                if (string.IsNullOrWhiteSpace(lastString))
                {
                    throw new IOException("Last String Read From file is empty");
                }

                Trace.WriteLine(Invariant($"Found data {lastString} from {path}"));

                var tokens = lastString.Split(';');

                SensorData sensorData = new SensorData
                {
                    //Date;Time;Timestamp;PM2_5(ug/m3);AQI(US);AQI(CN);PM10(ug/m3);Outdoor AQI(US);Outdoor AQI(CN);Temperature(C);Temperature(F);Humidity(%RH);CO2(ppm);VOC(ppb)
                    updateTime = new DateTime(DateTimeOffset.FromUnixTimeSeconds(ParseLong(tokens, 2)).Ticks)
                };

                if (lastUpdate != sensorData.updateTime)
                {
                    sensorData.PM25             = ParseValue(tokens, 3);
                    sensorData.PM25AQI          = ParseValue(tokens, 4);
                    sensorData.PM25AQICN        = ParseValue(tokens, 5);
                    sensorData.PM10             = ParseValue(tokens, 6);
                    sensorData.OutsidePM25AQI   = ParseValue(tokens, 7);
                    sensorData.OutsidePM25AQICN = ParseValue(tokens, 8);
                    sensorData.TemperatureC     = ParseValue(tokens, 9);
                    sensorData.TemperatureF     = ParseValue(tokens, 10);
                    sensorData.Humidity         = ParseValue(tokens, 11);
                    sensorData.CO2 = ParseValue(tokens, 12);

                    UpdateDelta(sensorData);
                    lastUpdate = sensorData.updateTime;
                    Trace.TraceInformation(Invariant($"Updated data for device {DeviceIP} for time {sensorData.updateTime}"));
                }
            }
            catch (Exception ex)
            {
                if (ex.IsCancelException())
                {
                    throw;
                }

                Trace.TraceError(Invariant($"Failed to get data from {DeviceIP}. {ex.GetFullMessage()}."));
            }
        }