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; }); });
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); }
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); }
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); } } }
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); } } }