示例#1
0
        public IObservable <RangedBeaconResults> WhenBeaconsRanged(params BeaconRegion[] regions) => Observable.Create <RangedBeaconResults>(ob =>
        {
            var beacons = new Dictionary <string, Beacon>();
            var found   = new List <Beacon>();

            foreach (var region in regions)
            {
                var native = this.ToNative(region);
                this.manager.StartRangingBeacons(native);
            }

            var handler = new EventHandler <CLRegionBeaconsRangedEventArgs>((sender, args) =>
            {
                found.Clear();

                foreach (var native in args.Beacons)
                {
                    // also very allocatey
                    var beacon = new Beacon
                                 (
                        native.ProximityUuid.FromNative(),
                        native.Major.UInt16Value,
                        native.Minor.UInt16Value,
                        native.Accuracy,
                        this.FromNative(native.Proximity)
                                 );
                    found.Add(beacon);
                }
                var region = this.FromNative(args.Region);
                //var rbl = new RangedBeaconList(region, list);
                //Debug.WriteLine($"[acr.beacons] Ranged {rbl.Beacons.Count} in {rbl.Region}");
                //ob.OnNext(rbl);
            });
            this.manager.DidRangeBeacons += handler;
            return(() =>
            {
                foreach (var region in regions)
                {
                    var native = this.ToNative(region);
                    this.manager.StopRangingBeacons(native);
                }
                this.manager.DidRangeBeacons -= handler;
            });
        });
示例#2
0
        IObservable <Beacon> Scan()
        {
            // TODO: switch to background scan
            this.beaconScanner = this.beaconScanner ?? Observable
                                 .Create <Beacon>(ob => this.adapter
                                                  .Scan()
                                                  .Subscribe(sr =>
            {
                var md = sr.AdvertisementData?.ManufacturerData;
                if (md != null && Beacon.IsIBeaconPacket(md))
                {
                    var beacon = Beacon.Parse(md, sr.Rssi);
                    ob.OnNext(beacon);
                }
            })
                                                  )
                                 .Publish()
                                 .RefCount();

            return(this.beaconScanner);
        }
示例#3
0
        public bool IsBeaconInRegion(Beacon beacon)
        {
            if (!this.Uuid.Equals(beacon.Uuid))
            {
                return(false);
            }

            if (this.Major == null && this.Minor == null)
            {
                return(true);
            }

            if (this.Major != beacon.Major)
            {
                return(false);
            }

            if (this.Minor == null || this.Minor == beacon.Minor)
            {
                return(true);
            }

            return(false);
        }
示例#4
0
 protected virtual IEnumerable <BeaconRegionStatus> GetRegionStatesForBeacon(IEnumerable <BeaconRegion> regionList, Beacon beacon)
 {
     foreach (var region in regionList)
     {
         var state = this.regionStates[region.ToString()];
         if (state.Region.IsBeaconInRegion(beacon))
         {
             yield return(state);
         }
     }
 }
示例#5
0
        protected virtual IEnumerable <BeaconRegionStatus> GetRegionStatesForBeacon(IEnumerable <BeaconRegion> regionList, Beacon beacon)
        {
            var copy = this.regionStates.ToDictionary(x => x.Key, x => x.Value);

            foreach (var region in regionList)
            {
                var state = copy[region.ToString()];
                if (state.Region.IsBeaconInRegion(beacon))
                {
                    yield return(state);
                }
            }
        }