예제 #1
0
        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);
                }
            }
        }
예제 #2
0
 private void AddInternalDevice(IDevice device, PoweredUpBluetoothDeviceInfo info)
 {
     if (!_discoveredDevices.ContainsKey(info.BluetoothAddress))
     {
         _discoveredDevices.Add(info.BluetoothAddress, device);
     }
     else
     {
         _discoveredDevices[info.BluetoothAddress] = device;
     }
 }
예제 #3
0
        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);
            }
        }