public void Discover(Func<PoweredUpBluetoothDeviceInfo, Task> discoveryHandler, CancellationToken cancellationToken = default) { _bluetoothAdapter.ScanMode = ScanMode.Balanced; _bluetoothAdapter.DeviceDiscovered += ReceivedHandler; cancellationToken.Register(async () => { await _bluetoothAdapter.StopScanningForDevicesAsync().ConfigureAwait(false); _bluetoothAdapter.DeviceDiscovered -= ReceivedHandler; }); _bluetoothAdapter.StartScanningForDevicesAsync(new Guid[] { new Guid(PoweredUpBluetoothConstants.LegoHubService) }, DeviceFilter, false).ConfigureAwait(false); async void ReceivedHandler(object sender, DeviceEventArgs args) { var info = new PoweredUpBluetoothDeviceInfo(); var advertisementRecord = args.Device.AdvertisementRecords.FirstOrDefault(x => x.Type == AdvertisementRecordType.ManufacturerSpecificData); if (advertisementRecord?.Data?.Length > 0) { var data = advertisementRecord.Data.ToList(); data.RemoveRange(0, 2); info.ManufacturerData = data.ToArray(); info.Name = args.Device.Name; info.BluetoothAddress = _deviceInfoProvider.GetNativeDeviceInfo(args.Device.NativeDevice).MacAddressNumeric; AddInternalDevice(args.Device, info); await discoveryHandler(info).ConfigureAwait(false); } } }
private void AddInternalDevice(IDevice device, PoweredUpBluetoothDeviceInfo info) { if (!_discoveredDevices.ContainsKey(info.BluetoothAddress)) { _discoveredDevices.Add(info.BluetoothAddress, device); } else { _discoveredDevices[info.BluetoothAddress] = device; } }
public void Discover(Func <PoweredUpBluetoothDeviceInfo, Task> discoveryHandler, CancellationToken cancellationToken = default) { var watcher = new BluetoothLEAdvertisementWatcher { ScanningMode = BluetoothLEScanningMode.Active }; watcher.AdvertisementFilter.Advertisement.ServiceUuids.Add(new Guid(PoweredUpBluetoothConstants.LegoHubService)); watcher.Received += ReceivedHandler; cancellationToken.Register(() => { watcher.Stop(); watcher.Received -= ReceivedHandler; }); watcher.Start(); async void ReceivedHandler(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs) { var info = new PoweredUpBluetoothDeviceInfo(); if (eventArgs.Advertisement.ManufacturerData.Count > 0) { var reader = DataReader.FromBuffer(eventArgs.Advertisement.ManufacturerData[0].Data); var data = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(data); info.ManufacturerData = data; using var device = BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress).AsTask().Result; info.Name = device.Name; } info.BluetoothAddress = eventArgs.BluetoothAddress; await discoveryHandler(info); } }