Exemplo n.º 1
0
        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));
                        }
                    }
                }
            }
        }