private DecodedMessage DecodeMessage(RawMessage raw) { var decoded = new DecodedMessage(); decoded.AvgSignal = raw.AvgSignal; decoded.Data = raw.Data; decoded.Device = raw.Device; decoded.Duplicate = raw.Duplicate; decoded.Latitude = raw.Latitude; decoded.Longitude = raw.Longitude; decoded.Rssi = raw.Rssi; decoded.SeqNumber = raw.SeqNumber; decoded.Signal = raw.Signal; decoded.Station = raw.Station; decoded.Time = raw.Time; var d = StringToByteArray(raw.Data); decoded.Mode = (Mode)(d[0] & 0x7); decoded.Periode = (Periode)((d[0] & 0x18) >> 3); decoded.Type = (FrameType)((d[0] >> 4) & 0x3); decoded.Battery = (((d[0] >> 7) * 16) + (d[1] >> 4) + 54) / 20.0; decoded.Temperature = ((d[1] & 0xF) * 64 - 200) / 10.0; if ((decoded.Type == FrameType.Regular) && (decoded.Mode == Mode.Light)) { var valeur = (d[2] << 2) >> 2; var multi = d[2] >> 6; switch (multi) { case 0: multi = 1; break; case 1: multi = 8; break; case 2: multi = 64; break; case 3: multi = 2014; break; } decoded.Light = Convert.ToSingle(multi * valeur * 0.01); } //Door else if ((decoded.Type == FrameType.Regular) && (decoded.Mode == Mode.Door)) { // } else { decoded.Temperature = (((d[1] >> 4) << 6) + (d[2] & 0x3F) - 200) / 8.0; decoded.ILS = (d[2] & 0x20) != 0; } //Button if (decoded.Mode == Mode.Button) { decoded.Version = new Version(string.Format("{0}.{1}", d[3] >> 4, d[3] & 0xF)); } //Temperature else if (decoded.Mode == Mode.TemperatureHumidity) { decoded.Humidity = d[3] * 0.5; } else { decoded.AlertCount = Convert.ToInt32(d[3]); } return decoded; }
private async Task StoreInDatabaseAsync(DecodedMessage message) { if (sqlCommand == null) return; sqlCommand.Parameters["@Device"].Value = message.Device; sqlCommand.Parameters["@Data"].Value = message.Data; sqlCommand.Parameters["@Mode"].Value = message.Mode; sqlCommand.Parameters["@Periode"].Value = message.Periode; sqlCommand.Parameters["@FrameType"].Value = message.Type; sqlCommand.Parameters["@Battery"].Value = message.Battery; sqlCommand.Parameters["@Temperature"].Value = message.Temperature; sqlCommand.Parameters["@Humidity"].Value = message.Humidity; sqlCommand.Parameters["@ILS"].Value = message.ILS; sqlCommand.Parameters["@Light"].Value = message.Light; sqlCommand.Parameters["@Version"].Value = message.Version.ToString(); sqlCommand.Parameters["@AlertCount"].Value = message.AlertCount; sqlCommand.Parameters["@TimeStamp"].Value = message.Time; sqlCommand.Parameters["@Duplicate"].Value = message.Duplicate; sqlCommand.Parameters["@Signal"].Value = message.Signal; sqlCommand.Parameters["@Station"].Value = message.Station; sqlCommand.Parameters["@AvgSignal"].Value = message.AvgSignal; sqlCommand.Parameters["@Latitude"].Value = message.Latitude; sqlCommand.Parameters["@Longitude"].Value = message.Longitude; sqlCommand.Parameters["@Rssi"].Value = message.Rssi; sqlCommand.Parameters["@SeqNumber"].Value = message.SeqNumber; await sqlCommand.ExecuteNonQueryAsync(); }
private async Task CheckAlertAsync(DecodedMessage message) { if (cacheDatabase == null) return; string json = await cacheDatabase.StringGetAsync("message-" + message.Device); if (json == null) return; DecodedMessage cached = null; try { cached = JsonConvert.DeserializeObject<DecodedMessage>(json); } catch { } if (cached == null) return; if ((message.Type == FrameType.Alert) || (message.Mode == Mode.Button) || (Math.Abs(message.Temperature - cached.Temperature) > 10)) { var alert = new AlertMessage(); alert.Device = message.Device; var alertMessage = JsonConvert.SerializeObject(alert); await hubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(alertMessage))); } }