Как я могу получить Bluetooth RSSI в режиме реального времени 10 раз в секунду в течение 10 секунд - PullRequest
0 голосов
/ 28 октября 2018

Вот мой код: MainActivity:

public class MainActivity extends AppCompatActivity {

    private final static int REQUEST_ENABLE_BT=1;
    private BluetoothAdapter bluetooth;
    private BluetoothLeScanner bluetoothLeScanner;
    private LinearLayout devicesList;
    private HashSet<BluetoothDevice> devices = new HashSet();
    private Pattern p = Pattern.compile("Beacon_\\d*");
    private boolean discovering = false;

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())){
                // Получаем объект BluetoothDevice из интента
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                Matcher m = p.matcher(device.getName());
                if(!devices.contains(device) && m.matches()) {
                    TextView textView = new TextView(getApplicationContext());
                    textView.setText(device.getName());
                    devicesList.addView(textView);
                    devices.add(device);
                }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())) {
                Toast.makeText(getApplicationContext(), "Сканирование завершено", Toast.LENGTH_LONG).show();
                discovering = false;
                startDiscoveringButton.setText("Начать новое сканирование");
            }
        }
    };

    private final ScanCallback scanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            System.out.println(result.getRssi());
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            super.onBatchScanResults(results);
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        devicesList = findViewById(R.id.devicesList);
        startDiscoveringButton = findViewById(R.id.startDiscoveringButton);
        checkAndSaveSignalsButton = findViewById(R.id.checkAndSaveSignalsButton);

        bluetooth = BluetoothAdapter.getDefaultAdapter();
        if(bluetooth != null) {
            if (!bluetooth.isEnabled()) {
                // Bluetooth выключен. Предложим пользователю включить его.
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            } else {
                startScanning();
            }
        } else {
            Toast.makeText(this, "Bluetooth не поддерживается", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broadcastReceiver);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUEST_ENABLE_BT) {
            startScanning();
        }
    }

    private void startScanning() {
        Toast.makeText(this, "Начинаю сканирование", Toast.LENGTH_SHORT).show();
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_FOUND);
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(broadcastReceiver, filter);
        bluetooth.startDiscovery();
        discovering = true;
        startDiscoveringButton.setText("Идёт сканирование ...");
        bluetoothLeScanner = bluetooth.getBluetoothLeScanner();
        bluetoothLeScanner.startScan(scanCallback);
    }

    private void clear() {
        devices.clear();
        devicesList.removeAllViews();
    }
}

SignalsStorage:

 public void checkSignals(final HashSet<BluetoothDevice> devices) {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                measurings.add(new HashMap<String, Double>());
                for(int i = 0; i < 10; ++i) {

                }
            }
        }, 0, 1000);
    }

У меня есть несколько маяков Bluetooth.Я могу получить их имена, адрес и т. Д., А также могу получить rssi of ech, но только один раз.Мне нужно получать каждую секунду 10 измерений rssi каждое устройство, которое я нашел раньше в течение 10 секунд.Но Broadcast Reciever работает только один раз для каждого устройства, а LeScanner вообще не работает.Как я могу это сделать?

1 Ответ

0 голосов
/ 30 октября 2018

У меня была такая же проблема некоторое время назад, и это то, что я сделал.

 private final BroadcastReceiver brBluetoothScanningLooper=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                if(deviceFound==false) {
                    bluetoothAdapter.cancelDiscovery();
                    bluetoothAdapter.startDiscovery();
                }
            }
        }

    };


    private final BroadcastReceiver brNearbyBluetoothDevices=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)){
                BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                String deviceName=device.getName();
                String deviceHardwareAddress=device.getAddress();
                int rssi=intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);

                if(bondedList.contains(deviceHardwareAddress)){

                    if(!trackerList.contains(deviceHardwareAddress)){
                        if(trackerList.isEmpty()){
                            MAC=deviceHardwareAddress;
                        }
                        trackerList.add(deviceHardwareAddress);
                        rssiList.add(String.valueOf(rssi));
                        displayList.add(deviceName+"  "+rssi);
                        arrayAdapter.notifyDataSetChanged();
                        lv.setAdapter(arrayAdapter);
                    }
                    if(trackerList.contains(deviceHardwareAddress)){
                        rssiList.set(trackerList.indexOf(deviceHardwareAddress), String.valueOf(rssi));
                        displayList.set(trackerList.indexOf(deviceHardwareAddress),deviceName+"   "+(rssiList.get(trackerList.indexOf(deviceHardwareAddress))));
                        arrayAdapter.notifyDataSetChanged();
                       lv.setAdapter(arrayAdapter);
                    }
                }
}
};

Я делал что-то другое.Я хотел отсканировать RSSI устройства, MAC-идентификатор которого я уже знал.Один приемник braodcast продолжает циклически повторять процесс обнаружения, другой - фактическое обнаружение

...