public AndroidBluetoothPacketProvider(Context context) { var manager = (BluetoothManager)context.GetSystemService("bluetooth"); _adapter = manager.Adapter; _scanCallback = new BLEScanCallback(); }
public void Start() { SystemDebug.WriteLine($"{nameof(Start)}()", LogTag); if (_adapter is null || _adapter.BluetoothLeScanner is null) { SystemDebug.WriteLine("adapter is null, please turn bluetooth on", LogTag); return; } var scanSettings = new ScanSettings.Builder().SetScanMode(Android.Bluetooth.LE.ScanMode.LowPower).Build(); SystemDebug.WriteLine("starting scan", LogTag); lock (_lock) { _cancellationTokenSource = new CancellationTokenSource(); _cancellationToken = _cancellationTokenSource.Token; // if Start/Stop were called on different threads and start ran first the token // will be canceled and this will cancel immediately anyways _scanTask = Task.Run(async() => { while (!_cancellationToken.IsCancellationRequested) { //SystemDebug.WriteLine("scanning for beacons...", LogTag); var scanCallback = new BLEScanCallback(); scanCallback.OnAdvertisementPacketReceived += ScanCallback_OnAdvertisementPacketReceived; _adapter.BluetoothLeScanner.StartScan(null, scanSettings, scanCallback); try { await Task.Delay(ScanDurationMs, _cancellationToken); } catch (TaskCanceledException) { SystemDebug.WriteLine("Scan duration delay cancelled", LogTag); } //SystemDebug.WriteLine("scanning for beacons completed...", LogTag); _adapter.BluetoothLeScanner.StopScan(scanCallback); scanCallback.OnAdvertisementPacketReceived -= ScanCallback_OnAdvertisementPacketReceived; //SystemDebug.WriteLine("scanning for beacons paused...", LogTag); try { await Task.Delay(ScanDelayMs, _cancellationToken); } catch (TaskCanceledException) { SystemDebug.WriteLine("Scan delay cancelled", LogTag); } } }, _cancellationToken); } }