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"); } }
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()); }
public void InitFilter(Guid[] filter) { 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) { } this.Filter = filter; } } }
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) { } } } }
protected virtual void StartNewScanner(ScanConfig config) { this.newCallback = new LollipopScanCallback(args => this.Scanned?.Invoke(this, args)); var scanMode = this.ToNative(config.ScanType); var filterBuilderList = new List <ScanFilter>(); if (config.ServiceUuids != null && config.ServiceUuids.Count > 0) { foreach (var uuid in config.ServiceUuids) { var filterBuilder = new ScanFilter.Builder(); filterBuilder.SetServiceUuid(uuid.ToParcelUuid()); filterBuilderList.Add(filterBuilder.Build()); } } else { var filterBuilder = new ScanFilter.Builder(); filterBuilderList.Add(filterBuilder.Build()); } //new ScanFilter.Builder().SetDeviceAddress().Set this.manager.Adapter.BluetoothLeScanner.StartScan( filterBuilderList, new ScanSettings .Builder() .SetScanMode(scanMode) .Build(), this.newCallback ); }
private IList <ScanFilter> BuildScanFilters(TracingInformation tracingInformation) { var scanFilters = new List <ScanFilter>(); var builder = new ScanFilter.Builder(); var serviceUuid = ParcelUuid.FromString(tracingInformation.ServiceId); builder.SetServiceUuid(serviceUuid); scanFilters.Add(builder.Build()); return(scanFilters); }
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"); } }
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()); } }
protected virtual void StartNewScanner(ScanConfig config) { this.newCallback = new LollipopScanCallback(args => this.Scanned?.Invoke(this, args)); var scanMode = this.ToNative(config.ScanType); var filterBuilder = new ScanFilter.Builder(); if (config.ServiceUuid != null) { filterBuilder.SetServiceUuid(config.ServiceUuid.Value.ToParcelUuid()); } //new ScanFilter.Builder().SetDeviceAddress().Set this.manager.Adapter.BluetoothLeScanner.StartScan( new [] { filterBuilder.Build() }, new ScanSettings .Builder() .SetScanMode(scanMode) .Build(), this.newCallback ); }
void UpdateScanFilters() { if (_scanObservers.Any(obs => obs.Services == null)) { _scanFilters = null; } else { var builder = new ScanFilter.Builder(); _scanFilters = _scanObservers .Aggregate(new HashSet <ServiceUuid>(), (acc, elem) => { acc.UnionWith(elem.Services); return(acc); }) .Select(svc => { builder.SetServiceUuid(svc.Uuid.ToParcelUuid()); return(builder.Build()); }) .ToArray(); } Reschedule(); }
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(); }
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); } }
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 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; } }
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"); } }
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; } }