private void AddInternalDevice(IDevice device, XamarinBluetoothDeviceInfo info)
 {
     if (!_discoveredDevices.ContainsKey(info.DeviceIdentifier))
     {
         _discoveredDevices.Add(info.DeviceIdentifier, device);
     }
     else
     {
         _discoveredDevices[info.DeviceIdentifier] = device;
     }
 }
        public void Discover(Func <IPoweredUpBluetoothDeviceInfo, 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 XamarinBluetoothDeviceInfo();

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

                    var nativeDeviceInfo = _deviceInfoProvider.GetNativeDeviceInfo(args.Device.NativeDevice);

                    info.Name             = args.Device.Name;
                    info.DeviceIdentifier = nativeDeviceInfo.DeviceIdentifier;

                    AddInternalDevice(args.Device, info);
                    await discoveryHandler(info).ConfigureAwait(false);
                }
            }
        }