private async void StartScan() { Log.Debug("StartScan. BLE adapter. enabled={0}", m_adapter.IsEnabled); if (IsScanning) { return; } if (!m_adapter.IsEnabled) { m_dialogs.Toast("Cannot start scan, Bluetooth is turned off"); return; } StopScan(); IsScanning = true; m_scanCancel = new CancellationTokenSource(TimeSpan.FromSeconds(30)); await m_adapter.ScanForDevices( Observer.Create( ( IBlePeripheral peripheral ) => { Device.BeginInvokeOnMainThread( () => { var existing = FoundDevices.FirstOrDefault(d => d.Equals(peripheral)); if (existing != null) { /* * Log.Trace( * "Advertisement. rssi={2} name={3} address={0} id={1}", * device.Address.EncodeToBase16String(), * device.DeviceId, * device.Rssi, * device.Advertisement.DeviceName ); * Log.Trace( * " services={0} tx={1} service-data={2}", * device.Advertisement.Services.Select( x => x.ToString() ).Join( "," ), * device.Advertisement.TxPowerLevel, * device.Advertisement.ServiceData.Select( x => x.Key + ":" + x.Value.EncodeToBase16String() ).Join( "," ) ); * Log.Trace( * " flags={0} mfg-data={1}", * device.Advertisement.Flags, * device.Advertisement.ManufacturerSpecificData.Select( * x => GetManufacturerName( x.Key ) + ":" + x.Value.EncodeToBase16String() ).Join( "," ) ); * //*/ existing.Update(peripheral); } else { FoundDevices.Add(new BlePeripheralViewModel(peripheral)); } }); }), m_scanCancel.Token); IsScanning = false; }
/// <summary> /// Scan for nearby BLE device advertisements. Stop scanning when <paramref name="token" /> is cancelled. /// </summary> /// <param name="adapter">The adapter to use for scanning</param> /// <param name="advertisementDiscovered">Callback to notify for each discovered advertisement</param> public static Task ScanForDevices(this IBluetoothLowEnergyAdapter adapter, Action <IBlePeripheral> advertisementDiscovered, CancellationToken token) { return(adapter.ScanForDevices(Observer.Create(advertisementDiscovered), token)); }
/// <summary> /// Scan for nearby BLE device advertisements. Stop scanning after <paramref name="timeout" /> /// </summary> /// <param name="adapter">The adapter to use for scanning</param> /// <param name="advertisementDiscovered">Callback to notify for each discovered advertisement</param> /// <param name="timeout">cancel scan after this length of time</param> public static Task ScanForDevices(this IBluetoothLowEnergyAdapter adapter, IObserver <IBlePeripheral> advertisementDiscovered, TimeSpan timeout) { return(adapter.ScanForDevices(advertisementDiscovered, new CancellationTokenSource(timeout).Token)); }