private async void DidRangeBeaconsInRegionComplete(object sender, RangeEventArgs rangeEventArgs) { System.Diagnostics.Debug.WriteLine("DidRangeBeaconsInRegionComplete"); var now = DateTime.UtcNow; var keyTime = now.ToString("yyyyMMddHH"); ICollection <Beacon> beacons = rangeEventArgs.Beacons; if (beacons != null && beacons.Count > 0) { var foundBeacons = beacons.ToList(); foreach (Beacon beacon in foundBeacons) { var key = $"{beacon.Id1}{beacon.Id2}{beacon.Id3}.{keyTime}"; lock (dataLock) { var result = _connection.Table <BeaconDataModel>().SingleOrDefault(x => x.Id == key); if (result == null) { // New BeaconDataModel data = new BeaconDataModel(); data.Id = key; data.Count = 0; data.UserBeaconUuid = AppConstants.iBeaconAppUuid; data.BeaconUuid = beacon.Id1.ToString(); data.Major = beacon.Id2.ToString(); data.Minor = beacon.Id3.ToString(); data.Distance = beacon.Distance; data.MinDistance = beacon.Distance; data.MaxDistance = beacon.Distance; data.Rssi = beacon.Rssi; // data.TXPower = beacon.TxPower; data.ElaspedTime = new TimeSpan(); data.LastDetectTime = now; data.FirstDetectTime = now; data.KeyTime = keyTime; data.IsSentToServer = false; _connection.Insert(data); } else { // Update BeaconDataModel data = result; data.Id = key; data.Count++; data.UserBeaconUuid = AppConstants.iBeaconAppUuid; data.BeaconUuid = beacon.Id1.ToString(); data.Major = beacon.Id2.ToString(); data.Minor = beacon.Id3.ToString(); data.Distance += (beacon.Distance - data.Distance) / data.Count; data.MinDistance = (beacon.Distance < data.MinDistance ? beacon.Distance : data.MinDistance); data.MaxDistance = (beacon.Distance > data.MaxDistance ? beacon.Distance : data.MaxDistance); data.Rssi = beacon.Rssi; // data.TXPower = beacon.TxPower; data.ElaspedTime += now - data.LastDetectTime; data.LastDetectTime = now; data.KeyTime = keyTime; data.IsSentToServer = false; _connection.Update(data); System.Diagnostics.Debug.WriteLine(Utils.SerializeToJson(data)); } } } } }