Как подключиться к arduino и просмотреть сервисы в приложении android? - PullRequest
0 голосов
/ 11 февраля 2020

В настоящее время я использую BLE Arduino Nano 33 для вычисления измерения угла из IMU и добавления этих значений к характеристикам Bluetooth c в рамках услуги. Я создаю сервис и характеристики c, используя библиотеку ArduinoBLE:

BLEService angleService("1826");
BLEFloatCharacteristic rollBLE("2A57", BLERead | BLENotify);

В моей настройке я задаю имя устройства, сервис и характеристики c. Первоначально я записываю значение 0 в характеристику c:

BLE.setLocalName("acsAssist");
BLE.setAdvertisedService(angleService);
angleService.addCharacteristic(rollBLE);
BLE.addService(angleService);
rollBLE.writeValue(0);
BLE.advertise();

В моем l oop, после выполнения моих вычислений, я соответственно изменяю значение характеристики c:

rollBLE.writeValue(posiRoll);            // posiRoll is my calculation

Когда я использую стороннее приложение, такое как nrfConnect, на моем Android устройстве, я могу найти свое устройство и подключиться к нему. Служба и характеристики c, которые я определил, присутствуют, и значение изменяется, как и ожидалось:

Вот вывод из приложения nrfConnect

Теперь я пытаюсь вручную подключиться к этому устройству в приложении Android, которое я создаю, чтобы я мог отобразить это изменяющееся значение на экране для просмотра пользователем. Я включаю в свой манифест все следующие разрешения:

<uses-feature android:name="android.hardware.bluetooth" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Я начинаю с проверки того, что на используемом пользователем устройстве есть адаптер Bluetooth и он включен:

        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {                     // Bluetooth not supported
            Toast.makeText(getActivity(), "This device does not support Bluetooth! Use a Bluetooth enabled device.", Toast.LENGTH_LONG).show();
        }

        if (!bluetoothAdapter.isEnabled()) {                // If adapter is not enabled, request to enable it from within the app
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, 1);
        }

        if (bluetoothAdapter.isDiscovering()) {
            bluetoothAdapter.cancelDiscovery();
        }

Поскольку я знаю адрес MA C arduino, я пытаюсь получить устройство, используя этот адрес MA C. Когда я это делаю, я могу просматривать такие атрибуты, как имя устройства и адрес. Тем не менее, когда я пытаюсь просмотреть UUID в Arduino, я получаю «ноль». Следующий код:

BluetoothDevice arduino = bluetoothAdapter.getRemoteDevice("E5:A5:53:32:BD:7C");
Log.i("DEVICES", String.valueOf(arduino.getName()));
Log.i("DEVICES", String.valueOf(arduino.getAddress()));
Log.i("DEVICES", String.valueOf(arduino.getUuids()));

производит вывод в logcat:

02-11 12:09:02.862 29503-29503/com.seniorproject.acsAssistApp I/DEVICES: acsAssist
02-11 12:09:02.862 29503-29503/com.seniorproject.acsAssistApp I/DEVICES: E5:A5:53:32:BD:7C
02-11 12:09:02.868 29503-29503/com.seniorproject.acsAssistApp I/DEVICES: null

Я пытался выяснить, как подключить мое приложение к arduino и просмотреть сервисы, которые Я создал, но я не знаю, как это сделать. Все руководства, вопросы и ответы и документация, которые я пытался найти, связанные с этим, оставили меня безнадежным и растерянным. Любое руководство о том, как это сделать, будет высоко оценено.

PS: Я прошу прощения, если мое форматирование для этого представления плохое. Я впервые задаю вопрос о переполнении стека. Я также совершенно новый новичок с Arduino и Android Development.

1 Ответ

0 голосов
/ 15 февраля 2020

Я нашел ответ на мои трудности. Я слишком усложнял ситуацию; Вместо этого я решил воспользоваться преимуществами свойств GATT моей реализации. Сначала я получаю адаптер и arduino по адресу MA C.

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice arduino = bluetoothAdapter.getRemoteDevice("E5:A5:53:32:BD:7C");

Когда я готов, я подключаюсь к arduino:

arduino.connectGatt(this.getActivity(), true, gattCallback);

Я реализую свой обратный вызов GATT:

 private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            final TextView instructionText = getView().findViewById(R.id.instructionText);
            Log.i("DEVICES", "Status: " + status);
            switch (newState) {
                case BluetoothProfile.STATE_CONNECTED:
                    Log.i("DEVICES", "STATE_CONNECTED");
                    instructionText.setText("Connected. Select Exercise");
                    gatt.discoverServices();
                    break;

                case BluetoothProfile.STATE_DISCONNECTED:
                    Log.i("DEVICES", "STATE_DISCONNECTED");
                    instructionText.setText("acsAssist Disconnected");
                    break;

                case BluetoothProfile.STATE_CONNECTING:
                    Log.i("DEVICES", "CONNECTING");
                    instructionText.setText("Connecting to acsAssist...");
                    break;

                default:
                    Log.i("DEVICES", "STATE_OTHER");
                    instructionText.setText("acsAssist Disconnected");
            }
        }

Я выполняю желаемые действия для Обнаружение службы:

        @Override
        // New services discovered
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                Log.i("DEVICES", "Services Found");
                for (BluetoothGattService service: gatt.getServices()) {
                    Log.i("DEVICES", service.getUuid().toString());
                }
                for (BluetoothGattCharacteristic characteristic: gatt.getService(UUID.fromString("00001826-0000-1000-8000-00805f9b34fb")).getCharacteristics()) {
                    gatt.setCharacteristicNotification(characteristic, true);
                    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
//                    descriptor.setValue(true ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[]{0x00, 0x00});
                    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);

                    gatt.writeDescriptor(descriptor);
                }
            }
        }

И я реализую свое чтение характеристики c, специально для того, чтобы я мог следить за его изменением с помощью onCharacteristicChanged

  @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            //super.onCharacteristicRead(gatt, characteristic, status);
            //gatt.setCharacteristicNotification(characteristic, true);
            Float tester = characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_SFLOAT,1);
            Log.i("UUID", String.valueOf(tester));
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
            TextView instructionText = getView().findViewById(R.id.instructionText);
            instructionText.setText(String.valueOf(characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_SFLOAT,1)));

        }
...