示例#1
0
        void InitializeScanner()
        {
            if (_adapter == null)
            {
                return;
            }

            // initialize scanner
            var sb = new ScanSettings.Builder()
                     .SetCallbackType(ScanCallbackType.AllMatches)
                     .SetScanMode(ScanMode.LowLatency);

            if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
            {
                sb = sb.SetMatchMode(BluetoothScanMatchMode.Aggressive).SetNumOfMatches(1);
            }

            _scanSettings = sb.Build();
            sb.SetReportDelay(1000);
            _scanSettingsBatch = sb.Build();

            _scanner           = _adapter.BluetoothLeScanner;
            _scanCallback      = new ScanCallbackImpl(this);
            _scanCallbackBatch = new BatchScanCallbackImpl();
        }
示例#2
0
        private void StartScanningNew(Guid[] serviceUuids)
        {
            var hasFilter = serviceUuids?.Any() ?? false;
            List <ScanFilter> scanFilters = null;

            if (hasFilter)
            {
                scanFilters = new List <ScanFilter>();
                foreach (var serviceUuid in serviceUuids)
                {
                    var sfb = new ScanFilter.Builder();
                    sfb.SetServiceUuid(ParcelUuid.FromString(serviceUuid.ToString()));
                    scanFilters.Add(sfb.Build());
                }
            }

            var ssb = new ScanSettings.Builder();

            ssb.SetScanMode(ScanMode.ToNative());
            //ssb.SetCallbackType(ScanCallbackType.AllMatches);

            if (_bluetoothAdapter.BluetoothLeScanner != null)
            {
                Trace.Message($"Adapter >=21: Starting a scan for devices. ScanMode: {ScanMode}");
                if (hasFilter)
                {
                    Trace.Message($"ScanFilters: {string.Join(", ", serviceUuids)}");
                }
                _bluetoothAdapter.BluetoothLeScanner.StartScan(scanFilters, ssb.Build(), _api21ScanCallback);
            }
            else
            {
                Trace.Message("Adapter >= 21: Scan failed. Bluetooth is probably off");
            }
        }
        public IObservable <IScanResult> Scan()
        {
            return(Observable.Create <ScanResult>(ob =>
            {
                _callback = new LollipopScanCallback((native, rssi, sr) =>
                {
                    var scanResult = ToScanResult(native, rssi, sr);
                    ob.OnNext(scanResult);
                });

                var builder = new ScanSettings.Builder();
                builder.SetScanMode(ScanMode.Balanced);

                var scanFilters = new List <ScanFilter>();


                _manager.Adapter.BluetoothLeScanner.StartScan(
                    scanFilters,
                    builder.Build(),
                    _callback);


                return () => _manager.Adapter.BluetoothLeScanner?.StopScan(_callback);
            })
                   .Finally(() =>
            {
            }));
        }
示例#4
0
        static async Task <IReadOnlyCollection <BluetoothDevice> > PlatformScanForDevices(RequestDeviceOptions options)
        {
            List <ScanFilter> filters = new List <ScanFilter>();

            foreach (var f in options.Filters)
            {
                foreach (var u in f.Services)
                {
                    ScanFilter.Builder b = new ScanFilter.Builder();
                    b.SetServiceUuid(ParcelUuid.FromString(u.Value.ToString()));
                    filters.Add(b.Build());
                }
            }

            ScanSettings.Builder sb = new ScanSettings.Builder();
            sb.SetScanMode(Android.Bluetooth.LE.ScanMode.Balanced);
            var settings = sb.Build();
            var callback = new DevicesCallback();

            _manager.Adapter.BluetoothLeScanner.StartScan(callback);

            await Task.Delay(30000);

            return(callback.Devices.AsReadOnly());
        }
        private async Task <bool> NewScanAsync(Action <BrickController2.PlatformServices.BluetoothLE.ScanResult> scanCallback, CancellationToken token)
        {
            try
            {
                var leScanner       = new BluetoothLENewScanner(scanCallback);
                var settingsBuilder = new ScanSettings.Builder()
                                      .SetCallbackType(ScanCallbackType.AllMatches)
                                      .SetScanMode(Android.Bluetooth.LE.ScanMode.LowLatency);

                _bluetoothAdapter.BluetoothLeScanner.StartScan(null, settingsBuilder.Build(), leScanner);

                var tcs = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously);
                using (token.Register(() =>
                {
                    _bluetoothAdapter.BluetoothLeScanner.StopScan(leScanner);
                    tcs.TrySetResult(true);
                }))
                {
                    return(await tcs.Task);
                }
            }
            catch (Exception)
            {
                return(false);
            }
        }
示例#6
0
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            // Start scanning for the beacon we want to write a value to
            var scanModeBuilder = new ScanSettings.Builder();

            scanModeBuilder.SetScanMode(ScanMode.LowLatency);

            var deviceAddressFilterBuilder = new ScanFilter.Builder();

            deviceAddressFilterBuilder.SetDeviceAddress(_MyDeviceAddress);

            _Manager      = (BluetoothManager)GetSystemService("bluetooth");
            _Adapter      = _Manager.Adapter;
            _Scanner      = _Adapter.BluetoothLeScanner;
            _ScanCallback = new BleScanCallback(this);
            _GattCallback = new BleGattCallback(this);

            _LogTextView = FindViewById <TextView>(Resource.Id.logTextView);

            _Scanner.StartScan(
                new List <ScanFilter>
            {
                deviceAddressFilterBuilder.Build()
            }, scanModeBuilder.Build(), _ScanCallback);

            _LogTextView.Text = "Started scanning....";
        }
示例#7
0
        private ScanSettings BuildScanSettings()
        {
            var builder = new ScanSettings.Builder();

            builder.SetScanMode(Android.Bluetooth.LE.ScanMode.LowPower);
            return(builder.Build());
        }
示例#8
0
        public void Start()
        {
            ScanSettings.Builder scanSettingsBuilder = null;
            ScanSettings         scanSettings        = null;

            switch (this.DriverState)
            {
            case BluetoothDriverStates.NotPresent:
                return;

            case BluetoothDriverStates.Enabled:
                this.scannerCallback    = new DroidLEScannerCallback();
                this.bluetoothLeScanner = this.bluetoothAdapter.BluetoothLeScanner;
                if (this.scanfiltersList.Count == 0)
                {
                    this.bluetoothLeScanner.StartScan(this.scannerCallback);
                }
                else
                {
                    scanSettingsBuilder = new ScanSettings.Builder();
                    scanSettingsBuilder.SetMatchMode(BluetoothScanMatchMode.Aggressive);
                    scanSettingsBuilder.SetScanMode(Android.Bluetooth.LE.ScanMode.LowLatency);
                    scanSettings = scanSettingsBuilder.Build();
                    try
                    {
                        this.bluetoothLeScanner.StartScan(this.scanfiltersList, scanSettings, this.scannerCallback);
                    }
                    catch (Exception)
                    {
                    }
                }
                this.DriverState = BluetoothDriverStates.Discovering;
                break;
            }
        }
        public DroidBluetoothDriver(Guid[] filter)
            : this(null, null)
        {
            ScanSettings.Builder scanSettingsBuilder = null;

            scanSettingsBuilder = new ScanSettings.Builder();
            scanSettingsBuilder.SetMatchMode(BluetoothScanMatchMode.Aggressive);
            scanSettingsBuilder.SetScanMode(Android.Bluetooth.LE.ScanMode.LowLatency);
            this.scanSettings    = scanSettingsBuilder.Build();
            this.scanfiltersList = new List <ScanFilter>();

            if (filter != null && filter.Length > 0)
            {
                foreach (Guid selectedFilter in filter)
                {
                    ParcelUuid         parcelUuid    = null;
                    ScanFilter.Builder filterBuilder = new ScanFilter.Builder();
                    ScanFilter         currentFilter = null;

                    try
                    {
                        parcelUuid = ParcelUuid.FromString(selectedFilter.ToString());
                        filterBuilder.SetServiceUuid(parcelUuid);
                        currentFilter = filterBuilder.Build();
                        this.scanfiltersList.Add(currentFilter);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
示例#10
0
        protected virtual IObservable <ScanResult> NewScan(ScanConfig config) => Observable.Create <ScanResult>(ob =>
        {
            this.callbacks = new LollipopScanCallback((native, rssi, sr) =>
            {
                var scanResult = this.ToScanResult(native, rssi, new AdvertisementData(sr));
                ob.OnNext(scanResult);
            });

            var builder  = new ScanSettings.Builder();
            var scanMode = this.ToNative(config.ScanType);
            builder.SetScanMode(scanMode);
            if (CrossBleAdapter.AndroidConfiguration.AdvancedScannerSettings)
            {
                if (config.MatchMode != null)
                {
                    builder.SetMatchMode(this.ToNative(config.MatchMode.Value));
                }

                if (config.NumOfMatches != null)
                {
                    builder.SetNumOfMatches((int)this.ToNative(config.NumOfMatches.Value));
                }
            }

            var scanFilters = new List <ScanFilter>();
            if (config.ServiceUuids != null && config.ServiceUuids.Count > 0)
            {
                foreach (var guid in config.ServiceUuids)
                {
                    var uuid = guid.ToParcelUuid();
                    scanFilters.Add(new ScanFilter.Builder()
                                    .SetServiceUuid(uuid)
                                    .Build()
                                    );
                }
            }

            if (config.AndroidUseScanBatching && this.manager.Adapter.IsOffloadedScanBatchingSupported)
            {
                builder.SetReportDelay(100);
            }

            this.manager.Adapter.BluetoothLeScanner.StartScan(
                scanFilters,
                builder.Build(),
                this.callbacks
                );

            return(() => this.manager.Adapter.BluetoothLeScanner?.StopScan(this.callbacks));
        });
示例#11
0
        private void StartScanningNew(Guid[] serviceUuids, ManufacturerData[] manufacturerDataFilters)
        {
            var hasFilter = serviceUuids?.Any() ?? false;
            List <ScanFilter> scanFilters = null;

            if (hasFilter)
            {
                scanFilters = new List <ScanFilter>();
                foreach (var serviceUuid in serviceUuids)
                {
                    var sfb = new ScanFilter.Builder();
                    sfb.SetServiceUuid(ParcelUuid.FromString(serviceUuid.ToString()));
                    scanFilters.Add(sfb.Build());
                }
                foreach (var manufacturerData in manufacturerDataFilters)
                {
                    var sfb = new ScanFilter.Builder();
                    sfb.SetManufacturerData(manufacturerData.Id, manufacturerData.Data);
                    scanFilters.Add(sfb.Build());
                }
            }

            var ssb = new ScanSettings.Builder();

            ssb.SetScanMode(ScanMode.ToNative());
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                // enable Bluetooth 5 Advertisement Extensions on Android 8.0 and above
                ssb.SetLegacy(false);
            }
            //ssb.SetCallbackType(ScanCallbackType.AllMatches);

            if (_bluetoothAdapter.BluetoothLeScanner != null)
            {
                Trace.Message($"Adapter >=21: Starting a scan for devices. ScanMode: {ScanMode}");
                if (hasFilter)
                {
                    Trace.Message($"ScanFilters: {string.Join(", ", serviceUuids)}");
                }
                _bluetoothAdapter.BluetoothLeScanner.StartScan(scanFilters, ssb.Build(), _api21ScanCallback);
            }
            else
            {
                Trace.Message("Adapter >= 21: Scan failed. Bluetooth is probably off");
            }
        }
示例#12
0
        public async void StartScanningForDevices(int timeOutSeconds = 10, string serviceUuid = null)
        {
            Console.WriteLine("Adapter: Starting a scan for devices.");

            // clear out the list
            this._discoveredDevices = new List <IDevice> ();

            // start scanning
            this._isScanning = true;

            var scanFilterBuilder = new ScanFilter.Builder();

            if (!string.IsNullOrWhiteSpace(serviceUuid))
            {
                scanFilterBuilder.SetServiceUuid(ParcelUuid.FromString(serviceUuid));
            }
            var filter = scanFilterBuilder.Build();

            var filterList = new List <ScanFilter>()
            {
                filter
            };

            var scanSettingBuilder = new ScanSettings.Builder();

            scanSettingBuilder.SetScanMode(ScanMode.Balanced);

            var scanSettings = scanSettingBuilder.Build();

            this._adapter.BluetoothLeScanner.StartScan(filterList, scanSettings, _scanCallback);

            //this._adapter.StartLeScan (this);

            // in 10 seconds, stop the scan
            await Task.Delay(TimeSpan.FromSeconds(timeOutSeconds));

            // if we're still scanning
            if (this._isScanning)
            {
                Console.WriteLine("BluetoothLEManager: Scan timeout has elapsed.");
                // Use the method, because it also updates the _isScanning portion.
                StopScanningForDevices();
                this.ScanTimeoutElapsed(this, new EventArgs());
            }
        }
示例#13
0
        public IObservable <ScanResult> Scan(ScanConfig config) => Observable.Create <ScanResult>(ob =>
        {
            this.devices.Clear();

            this.callbacks = new LollipopScanCallback(
                sr =>
            {
                var scanResult = this.ToScanResult(sr.Device, sr.Rssi, new AdvertisementData(sr));
                ob.OnNext(scanResult);
            },
                errorCode => ob.OnError(new BleException("Error during scan: " + errorCode.ToString()))
                );

            var builder  = new ScanSettings.Builder();
            var scanMode = this.ToNative(config.ScanType);
            builder.SetScanMode(scanMode);

            var scanFilters = new List <ScanFilter>();
            if (config.ServiceUuids != null && config.ServiceUuids.Count > 0)
            {
                foreach (var uuid in config.ServiceUuids)
                {
                    var parcel = new ParcelUuid(UUID.FromString(uuid));
                    scanFilters.Add(new ScanFilter.Builder()
                                    .SetServiceUuid(parcel)
                                    .Build()
                                    );
                }
            }

            if (config.AndroidUseScanBatching && this.Manager.Adapter.IsOffloadedScanBatchingSupported)
            {
                builder.SetReportDelay(100);
            }

            this.Manager.Adapter.BluetoothLeScanner.StartScan(
                scanFilters,
                builder.Build(),
                this.callbacks
                );

            return(() => this.Manager.Adapter.BluetoothLeScanner?.StopScan(this.callbacks));
        });
        public DroidBluetoothDriver(IEnumerable <ScanFilter> scanFilters, ScanSettings scanSettings)
        {
            ScanSettings.Builder scanSettingsBuilder = null;

            if (scanFilters != null)
            {
                this.scanfiltersList = new List <ScanFilter>(scanFilters);
            }
            else
            {
                this.scanfiltersList = new List <ScanFilter>();
            }

            if (scanSettings != null)
            {
                this.scanSettings = scanSettings;
            }
            else
            {
                scanSettingsBuilder = new ScanSettings.Builder();
                scanSettingsBuilder.SetMatchMode(BluetoothScanMatchMode.Aggressive);
                scanSettingsBuilder.SetScanMode(Android.Bluetooth.LE.ScanMode.LowLatency);
                this.scanSettings = scanSettingsBuilder.Build();
            }

            if (!Application.Context.PackageManager.HasSystemFeature(PackageManager.FeatureBluetoothLe))
            {
                this.State = BluetoothDriverStates.NotPresent;
                return;
            }

            this.bluetoothManager = Application.Context.GetSystemService(Context.BluetoothService) as BluetoothManager;
            if (this.bluetoothManager != null)
            {
                this.bluetoothAdapter = this.bluetoothManager.Adapter;
                if (this.bluetoothAdapter != null)
                {
                    this.State = BluetoothDriverStates.Enabled;
                }
            }
        }
        void IAdvertiseAndDiscoverBluetoothDevice.Discover()
        {
            try
            {
                Analytics.TrackEvent(Build.Model + " Discover method called.");

                List <ScanFilter> filters = new List <ScanFilter>();

                ScanFilter filter = new ScanFilter.Builder()
                                    .SetServiceUuid(new ParcelUuid(MY_UUID))
                                    .Build();
                filters.Add(filter);

                //ScanSettings settings = new ScanSettings.Builder()
                //        .SetScanMode(Android.Bluetooth.LE.ScanMode.LowLatency)
                //        .Build();

                ScanSettings.Builder builder = new ScanSettings.Builder();
                builder.SetScanMode(Android.Bluetooth.LE.ScanMode.LowLatency);

                if (Build.VERSION.SdkInt >= BuildVersionCodes.M /* Marshmallow */)
                {
                    builder.SetMatchMode(BluetoothScanMatchMode.Aggressive);
                    builder.SetNumOfMatches((int)BluetoothScanMatchNumber.MaxAdvertisement);
                    builder.SetCallbackType(ScanCallbackType.AllMatches);
                }

                var settings = builder.Build();

                myScanCallback     = new MyScanCallback();
                bluetoothLeScanner = BluetoothAdapter.DefaultAdapter.BluetoothLeScanner;


                bluetoothLeScanner.StartScan(filters, settings, myScanCallback);
            }
            catch (System.Exception ex)
            {
                Analytics.TrackEvent(Build.Model + " Something went wrong in Discover method.");
            }
        }
示例#16
0
        public async void StartScanning()
        {
            if (IsScanning)
            {
                return;
            }

            IsScanning = true;

            // TODO: Handle power on state.

            if (_sdkInt >= Android.OS.BuildVersionCodes.Lollipop) // 21
            {
                _bleScanner   = _adapter.BluetoothLeScanner;
                _scanCallback = new OWBLE_ScanCallback(this);
                var scanFilters         = new List <ScanFilter>();
                var scanSettingsBuilder = new ScanSettings.Builder();

                var scanFilterBuilder = new ScanFilter.Builder();
                scanFilterBuilder.SetServiceUuid(OWBoard.ServiceUUID.ToParcelUuid());
                scanFilters.Add(scanFilterBuilder.Build());
                _bleScanner.StartScan(scanFilters, scanSettingsBuilder.Build(), _scanCallback);
            }
            else if (_sdkInt >= Android.OS.BuildVersionCodes.JellyBeanMr2) // 18
            {
                _leScanCallback = new OWBLE_LeScanCallback(this);
#pragma warning disable 0618
                _adapter.StartLeScan(new Java.Util.UUID[] { OWBoard.ServiceUUID.ToUUID() }, _leScanCallback);
#pragma warning restore 0618
            }
            else
            {
                throw new NotImplementedException("Can't run bluetooth scans on device lower than Android 4.3");
            }

            await Task.Delay(15 * 1000);

            StopScanning();
        }
示例#17
0
        public bool StartScanning()
        {
            if (isScanning)
            {
                return(true);
            }

            if (IsEnabled)
            {
                // Stops scanning after a pre-defined scan period.
                //scanHandler.PostDelayed(new Runnable(() =>
                //{
                //    isScanning = false;

                //    scanner.StopScan(scanCallback);
                //}), 10000);

                isScanning = true;
                ScanFilter.Builder builder = new ScanFilter.Builder();
                builder.SetServiceUuid(DottedUUID);
                ScanSettings.Builder sBuilder = new ScanSettings.Builder();
                sBuilder.SetScanMode(Android.Bluetooth.LE.ScanMode.LowPower);
                scanner.StartScan(new List <ScanFilter> {
                    builder.Build()
                },
                                  sBuilder.Build(),
                                  scanCallback);
                return(true);
            }
            else
            {
                isScanning = false;
                scanner.StopScan(scanCallback);
                return(false);
            }
        }
示例#18
0
        protected override Task StartScanningForDevicesNativeAsync(Guid[] serviceUuids, CancellationToken scanCancellationToken)
        {
            // clear out the list
            DiscoveredDevices.Clear();

            if (serviceUuids == null || !serviceUuids.Any())
            {
                if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                {
                    Trace.Message("Adapter < 21: Starting a scan for devices.");
                    //without filter
#pragma warning disable 618
                    _bluetoothAdapter.StartLeScan(_api18ScanCallback);
#pragma warning restore 618
                }
                else
                {
                    Trace.Message("Adapter >= 21: Starting a scan for devices.");
                    if (_bluetoothAdapter.BluetoothLeScanner != null)
                    {
                        _bluetoothAdapter.BluetoothLeScanner.StartScan(_api21ScanCallback);
                    }
                    else
                    {
                        Trace.Message("Adapter >= 21: Scan failed. Bluetooth is probably off");
                    }
                }
            }
            else
            {
                if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                {
                    var uuids = serviceUuids.Select(u => UUID.FromString(u.ToString())).ToArray();
                    Trace.Message("Adapter < 21: Starting a scan for devices.");
#pragma warning disable 618
                    _bluetoothAdapter.StartLeScan(uuids, _api18ScanCallback);
#pragma warning restore 618
                }
                else
                {
                    Trace.Message("Adapter >=21: Starting a scan for devices with service Id {0}.", serviceUuids.First());

                    var scanFilters = new List <ScanFilter>();
                    foreach (var serviceUuid in serviceUuids)
                    {
                        var sfb = new ScanFilter.Builder();
                        sfb.SetServiceUuid(ParcelUuid.FromString(serviceUuid.ToString()));
                        scanFilters.Add(sfb.Build());
                    }

                    var ssb = new ScanSettings.Builder();
                    //ssb.SetCallbackType(ScanCallbackType.AllMatches);

                    if (_bluetoothAdapter.BluetoothLeScanner != null)
                    {
                        _bluetoothAdapter.BluetoothLeScanner.StartScan(scanFilters, ssb.Build(), _api21ScanCallback);
                    }
                    else
                    {
                        Trace.Message("Adapter >= 21: Scan failed. Bluetooth is probably off");
                    }
                }
            }

            return(Task.FromResult(true));
        }
 private ScanSettings CreateScanSettings()
 {
     ScanSettings.Builder mBuilder = new ScanSettings.Builder();
     mBuilder.SetReportDelay(0);
     mBuilder.SetScanMode(ScanMode.LowPower);
     return mBuilder.Build();
 }
示例#20
0
        private async void StartLeScan(Guid[] serviceUuids)
        {
            if (_isScanning)
            {
                Mvx.Trace("Adapter: Already scanning.");
                return;
            }

            _isScanning = true;

            // clear out the list
            _discoveredDevices = new List <IDevice>();

            if (serviceUuids == null || !serviceUuids.Any())
            {
                if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                {
                    Mvx.Trace("Adapter < 21: Starting a scan for devices.");
                    //without filter
                    _adapter.StartLeScan(this);
                }
                else
                {
                    Mvx.Trace("Adapter >= 21: Starting a scan for devices.");
                    if (_adapter.BluetoothLeScanner != null)
                    {
                        _adapter.BluetoothLeScanner.StartScan(_api21ScanCallback);
                    }
                    else
                    {
                        Mvx.Trace("Adapter >= 21: Scan failed. Bluetooth is probably off");
                    }
                }
            }
            else
            {
                if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                {
                    var uuids = serviceUuids.Select(u => UUID.FromString(u.ToString())).ToArray();
                    Mvx.Trace("Adapter < 21: Starting a scan for devices.");
                    _adapter.StartLeScan(uuids, this);
                }
                else
                {
                    Mvx.Trace("Adapter >=21: Starting a scan for devices with service ID {0}.", serviceUuids.First());

                    var scanFilters = new List <ScanFilter>();
                    foreach (var serviceUuid in serviceUuids)
                    {
                        var sfb = new ScanFilter.Builder();
                        sfb.SetServiceUuid(ParcelUuid.FromString(serviceUuid.ToString()));
                        scanFilters.Add(sfb.Build());
                    }

                    var ssb = new ScanSettings.Builder();
                    //ssb.SetCallbackType(ScanCallbackType.AllMatches);

                    if (_adapter.BluetoothLeScanner != null)
                    {
                        _adapter.BluetoothLeScanner.StartScan(scanFilters, ssb.Build(), _api21ScanCallback);
                    }
                    else
                    {
                        Mvx.Trace("Adapter >= 21: Scan failed. Bluetooth is probably off");
                    }
                }
            }

            // in ScanTimeout seconds, stop the scan
            _cancellationTokenSource = new CancellationTokenSource();

            try
            {
                await Task.Delay(ScanTimeout, _cancellationTokenSource.Token);

                Mvx.Trace("Adapter: Scan timeout has elapsed.");

                StopScan();

                TryDisposeToken();
                _isScanning = false;

                //important for this to be caled after _isScanning = false;
                ScanTimeoutElapsed(this, new EventArgs());
            }
            catch (TaskCanceledException)
            {
                Mvx.Trace("Adapter: Scan was cancelled.");
                StopScan();

                TryDisposeToken();
                _isScanning = false;
            }
        }
示例#21
0
        protected override async Task ScanAsync(CancellationToken cancellationToken)
        {
            // start a scan if bluetooth is present and enabled
            if (BluetoothAdapter.DefaultAdapter?.IsEnabled ?? false)
            {
                try
                {
                    if (ScanMode.HasFlag(BluetoothScanModes.LE))
                    {
                        List <ScanFilter> scanFilters = new List <ScanFilter>();

                        if (DiscoverAll == false)
                        {
                            ScanFilter scanFilter = new ScanFilter.Builder()
                                                    .SetServiceUuid(new ParcelUuid(_deviceIdService.Uuid))
                                                    .Build();

                            scanFilters.Add(scanFilter);
                        }

                        ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder()
                                                                   .SetScanMode(global::Android.Bluetooth.LE.ScanMode.Balanced);

                        // return batched scan results periodically if supported on the BLE chip
                        if (BluetoothAdapter.DefaultAdapter.IsOffloadedScanBatchingSupported)
                        {
                            scanSettingsBuilder.SetReportDelay((long)(ScanDurationMS / 2.0));
                        }

                        // start a fresh manager delegate to collect/read results
                        _bluetoothScannerCallback = new AndroidBluetoothClientScannerCallback(_deviceIdService, _deviceIdCharacteristic, this);

                        BluetoothAdapter.DefaultAdapter.BluetoothLeScanner.StartScan(scanFilters, scanSettingsBuilder.Build(), _bluetoothScannerCallback);
                    }

                    if (ScanMode.HasFlag(BluetoothScanModes.Classic))
                    {
                        BluetoothAdapter.DefaultAdapter.StartDiscovery();
                    }

                    TaskCompletionSource <bool> scanCompletionSource = new TaskCompletionSource <bool>();

                    cancellationToken.Register(() =>
                    {
                        try
                        {
                            if (ScanMode.HasFlag(BluetoothScanModes.LE))
                            {
                                BluetoothAdapter.DefaultAdapter.BluetoothLeScanner.StopScan(_bluetoothScannerCallback);
                            }
                            else if (ScanMode.HasFlag(BluetoothScanModes.Classic) && BluetoothAdapter.DefaultAdapter.IsDiscovering)
                            {
                                BluetoothAdapter.DefaultAdapter.CancelDiscovery();
                            }
                        }
                        catch (Exception ex)
                        {
                            SensusServiceHelper.Get().Logger.Log("Exception while stopping scan:  " + ex.Message, LoggingLevel.Normal, GetType());
                        }
                        finally
                        {
                            scanCompletionSource.TrySetResult(true);
                        }
                    });

                    await scanCompletionSource.Task;
                }
                catch (Exception ex)
                {
                    SensusServiceHelper.Get().Logger.Log("Exception while scanning:  " + ex.Message, LoggingLevel.Normal, GetType());
                }
            }
        }
        protected override void StartScan()
        {
            TimeSpan?reportDelay = null;

            SensusContext.Current.MainThreadSynchronizer.ExecuteThreadSafe(() =>
            {
                // start a scan if bluetooth is present and enabled
                if (BluetoothAdapter.DefaultAdapter?.IsEnabled ?? false)
                {
                    try
                    {
                        ScanFilter scanFilter = new ScanFilter.Builder()
                                                .SetServiceUuid(new ParcelUuid(_deviceIdService.Uuid))
                                                .Build();

                        List <ScanFilter> scanFilters = new List <ScanFilter>(new[] { scanFilter });

                        ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder()
                                                                   .SetScanMode(global::Android.Bluetooth.LE.ScanMode.LowPower);

                        // return batched scan results periodically if supported on the BLE chip
                        if (BluetoothAdapter.DefaultAdapter.IsOffloadedScanBatchingSupported)
                        {
                            reportDelay = TimeSpan.FromSeconds(10);
                            scanSettingsBuilder.SetReportDelay((long)reportDelay.Value.TotalMilliseconds);
                        }

                        BluetoothAdapter.DefaultAdapter.BluetoothLeScanner.StartScan(scanFilters, scanSettingsBuilder.Build(), _bluetoothScannerCallback);
                    }
                    catch (Exception ex)
                    {
                        SensusServiceHelper.Get().Logger.Log("Exception while starting scanner:  " + ex.Message, LoggingLevel.Normal, GetType());
                    }
                }
            });

            // if we're batching, wait twice the report delay for some results to come in. we sleep below so as not to return from the poll
            // and release the wakelock we're currently holding.
            if (reportDelay != null)
            {
                SensusServiceHelper.Get().AssertNotOnMainThread("Waiting for BLE scan results.");
                Thread.Sleep((int)(reportDelay.Value.TotalMilliseconds * 2));

                lock (EncounteredDeviceData)
                {
                    SensusServiceHelper.Get().Logger.Log("Encountered " + EncounteredDeviceData.Count + " device(s).", LoggingLevel.Normal, GetType());
                }
            }

            // we've scanned and waited for results to come in. stop scanning and wait for next poll.
            StopScan();
        }
示例#23
0
        private async void StartLeScan(Guid[] serviceUuids)
        {
            if (_isScanning)
            {
                Mvx.Trace("Adapter: Already scanning.");
                return;
            }

            _isScanning = true;

            // clear out the list
            _discoveredDevices = new List<IDevice>();

            if (serviceUuids == null || !serviceUuids.Any())
            {
                if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                {
                    Mvx.Trace("Adapter < 21: Starting a scan for devices.");
                    //without filter
                    _adapter.StartLeScan(this);
                }
                else
                {
                    Mvx.Trace("Adapter >= 21: Starting a scan for devices.");
                    if (_adapter.BluetoothLeScanner != null)
                    {
                        _adapter.BluetoothLeScanner.StartScan(_api21ScanCallback);
                    }
                    else
                    {
                        Mvx.Trace("Adapter >= 21: Scan failed. Bluetooth is probably off");
                    }
                }

            }
            else
            {
                if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                {
                    var uuids = serviceUuids.Select(u => UUID.FromString(u.ToString())).ToArray();
                    Mvx.Trace("Adapter < 21: Starting a scan for devices.");
                    _adapter.StartLeScan(uuids, this);
                }
                else
                {

                    Mvx.Trace("Adapter >=21: Starting a scan for devices with service ID {0}.", serviceUuids.First());

                    var scanFilters = new List<ScanFilter>();
                    foreach (var serviceUuid in serviceUuids)
                    {
                        var sfb = new ScanFilter.Builder();
                        sfb.SetServiceUuid(ParcelUuid.FromString(serviceUuid.ToString()));
                        scanFilters.Add(sfb.Build());
                    }

                    var ssb = new ScanSettings.Builder();
                    //ssb.SetCallbackType(ScanCallbackType.AllMatches);

                    if (_adapter.BluetoothLeScanner != null)
                    {
                        _adapter.BluetoothLeScanner.StartScan(scanFilters, ssb.Build(), _api21ScanCallback);
                    }
                    else
                    {
                        Mvx.Trace("Adapter >= 21: Scan failed. Bluetooth is probably off");
                    }
                }

            }

            // in ScanTimeout seconds, stop the scan
            _cancellationTokenSource = new CancellationTokenSource();

            try
            {
                await Task.Delay(ScanTimeout, _cancellationTokenSource.Token);

                Mvx.Trace("Adapter: Scan timeout has elapsed.");

                StopScan();

                TryDisposeToken();
                _isScanning = false;

                //important for this to be caled after _isScanning = false;
                ScanTimeoutElapsed(this, new EventArgs());
            }
            catch (TaskCanceledException)
            {
                Mvx.Trace("Adapter: Scan was cancelled.");
                StopScan();

                TryDisposeToken();
                _isScanning = false;
            }
        }
示例#24
0
        private void StartScanningNew(ScanFilterOptions scanFilterOptions)
        {
            var hasFilter = scanFilterOptions?.HasFilter == true;
            List <ScanFilter> scanFilters = null;

            if (hasFilter)
            {
                scanFilters = new List <ScanFilter>();
                if (scanFilterOptions.HasServiceIds)
                {
                    foreach (var serviceUuid in scanFilterOptions.ServiceUuids)
                    {
                        var sfb = new ScanFilter.Builder();
                        sfb.SetServiceUuid(ParcelUuid.FromString(serviceUuid.ToString()));
                        scanFilters.Add(sfb.Build());
                    }
                }
                if (scanFilterOptions.HasServiceData)
                {
                    foreach (var serviceDataFilter in scanFilterOptions.ServiceDataFilters)
                    {
                        var sfb = new ScanFilter.Builder();
                        if (serviceDataFilter.ServiceDataMask == null)
                        {
                            sfb.SetServiceData(ParcelUuid.FromString(serviceDataFilter.ServiceDataUuid.ToString()), serviceDataFilter.ServiceData);
                        }
                        else
                        {
                            sfb.SetServiceData(ParcelUuid.FromString(serviceDataFilter.ServiceDataUuid.ToString()), serviceDataFilter.ServiceData, serviceDataFilter.ServiceDataMask);
                        }
                        scanFilters.Add(sfb.Build());
                    }
                }
                if (scanFilterOptions.HasManufacturerIds)
                {
                    foreach (var manufacturerDataFilter in scanFilterOptions.ManufacturerDataFilters)
                    {
                        var sfb = new ScanFilter.Builder();
                        if (manufacturerDataFilter.ManufacturerDataMask != null)
                        {
                            sfb.SetManufacturerData(manufacturerDataFilter.ManufacturerId, manufacturerDataFilter.ManufacturerData);
                        }
                        else
                        {
                            sfb.SetManufacturerData(manufacturerDataFilter.ManufacturerId, manufacturerDataFilter.ManufacturerData, manufacturerDataFilter.ManufacturerDataMask);
                        }
                        scanFilters.Add(sfb.Build());
                    }
                }
                if (scanFilterOptions.HasDeviceAddresses)
                {
                    foreach (var deviceAddress in scanFilterOptions.DeviceAddresses)
                    {
                        if (BluetoothAdapter.CheckBluetoothAddress(deviceAddress))
                        {
                            var sfb = new ScanFilter.Builder();
                            sfb.SetDeviceAddress(deviceAddress);
                            scanFilters.Add(sfb.Build());
                        }
                        else
                        {
                            Trace.Message($"Device address {deviceAddress} is invalid. The correct format is \"01:02:03:AB:CD:EF\"");
                        }
                    }
                }
                if (scanFilterOptions.HasDeviceNames)
                {
                    foreach (var deviceName in scanFilterOptions.DeviceNames)
                    {
                        var sfb = new ScanFilter.Builder();
                        sfb.SetDeviceName(deviceName);
                        scanFilters.Add(sfb.Build());
                    }
                }
            }

            var ssb = new ScanSettings.Builder();

            ssb.SetScanMode(ScanMode.ToNative());
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                // enable Bluetooth 5 Advertisement Extensions on Android 8.0 and above
                ssb.SetLegacy(false);
            }
            //ssb.SetCallbackType(ScanCallbackType.AllMatches);

            if (_bluetoothAdapter.BluetoothLeScanner != null)
            {
                Trace.Message($"Adapter >=21: Starting a scan for devices. ScanMode: {ScanMode}");
                if (hasFilter)
                {
                    if (scanFilterOptions.HasServiceIds)
                    {
                        Trace.Message($"Service UUID Scan Filters: {string.Join(", ", scanFilterOptions.ServiceUuids)}");
                    }
                    if (scanFilterOptions.HasServiceData)
                    {
                        Trace.Message($"Service Data Scan Filters: {string.Join(", ", scanFilterOptions.ServiceDataFilters.ToString())}");
                    }
                    if (scanFilterOptions.HasManufacturerIds)
                    {
                        Trace.Message($"Manufacturer Id Scan Filters: {string.Join(", ", scanFilterOptions.ManufacturerDataFilters.ToString())}");
                    }
                    if (scanFilterOptions.HasDeviceAddresses)
                    {
                        Trace.Message($"Device Address Scan Filters: {string.Join(", ", scanFilterOptions.DeviceAddresses)}");
                    }
                    if (scanFilterOptions.HasDeviceNames)
                    {
                        Trace.Message($"Device Name Scan Filters: {string.Join(", ", scanFilterOptions.DeviceNames)}");
                    }
                }
                _bluetoothAdapter.BluetoothLeScanner.StartScan(scanFilters, ssb.Build(), _api21ScanCallback);
            }
            else
            {
                Trace.Message("Adapter >= 21: Scan failed. Bluetooth is probably off");
            }
        }