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"); } }
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"); } }
protected Task StartScanningForDevicesNativeAsync(Guid[] serviceUuids, bool allowDuplicatesKey, CancellationToken scanCancellationToken) { _serviceUuids = serviceUuids; _bleWatcher = new BluetoothLEAdvertisementWatcher { ScanningMode = ScanMode.ToNative() }; Trace.Message("Starting a scan for devices."); _foundIds = new List <Guid>(); _bleWatcher.Received -= DeviceFoundAsync; _bleWatcher.Received += DeviceFoundAsync; _bleWatcher.Start(); return(Task.FromResult(true)); }
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"); } }