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