Exemplo n.º 1
0
        public AndroidBluetoothPacketProvider(Context context)
        {
            var manager = (BluetoothManager)context.GetSystemService("bluetooth");

            _adapter      = manager.Adapter;
            _scanCallback = new BLEScanCallback();
        }
Exemplo n.º 2
0
        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);
            }
        }