Как записать характеристики на сервер BLE GATT в Android?

Я работаю над Bluetooth с низким энергопотреблением GATT для связи с чипом. Я могу прочитать ответ от чипа, но я не могу отправить характеристики в этот чип, а также уведомить о некоторых характеристиках. Может какой-нибудь только помочь.

Заранее спасибо.


person Shine    schedule 29.03.2016    source источник
comment
Пожалуйста, укажите, какое Bluetooth-устройство/чип вы используете. Помните, что если это нестандартный чип, который вы получили от поставщика, узнайте подробности у поставщика. Никто не может помочь с этой ограниченной информацией.   -  person Morrison Chang    schedule 29.03.2016
comment
Привет, они дали некоторый MAC-адрес в этом чипе BoreCam и чипе CoreCam.   -  person Shine    schedule 29.03.2016
comment
Я не знаю, что такое BoreCam, если только это не Broadcom. Без подробностей, таких как фактический производитель и номер модели, а также подробного описания того, что вы пробовали, никто не сможет вам помочь.   -  person Morrison Chang    schedule 29.03.2016
comment
Это похоже на маяк и предоставляет вам такие услуги, как ff2/ff1?   -  person Lalit Jadav    schedule 28.02.2017


Ответы (2)


Предполагая, что у вас правильно настроен BluetoothGattServer, характеристики зарегистрированы в службе, а служба добавлена ​​в BluetoothGattServer, вот пример отправки некоторых данных в уведомляющую характеристику:

    private static final UUID serviceUuid   = UUID.fromString("SOME-SERVICE-UUID");
    private static final UUID characteristicUuid = UUID.fromString("SOME-CHAR-UUID");
    private BluetoothGattServer gattServer;
    private BluetoothDevice peerDevice;

    public void sendNotification(byte p1, byte p2, byte p3, byte p4, int correlationid) {
        ByteBuffer bb = ByteBuffer.allocate(8);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.put(p1).put(p2).put(p3).put(p4).putInt(correlationid);
        BluetoothGattCharacteristic notifyingChar = gattServer.getService(serviceUuid).getCharacteristic(characteristicUuid);
        notifyingChar.setValue(bb.array());
        gattServer.notifyCharacteristicChanged(peerDevice, notifyingChar, false);
    }

Вы получите событие, когда данные будут отправлены в методе BluetoothGattServerCallback.onNotificationSent:

    @Override
    public void onNotificationSent(BluetoothDevice device, int status) {
        super.onNotificationSent(device, status);
        Log.d("SVC", "BluetoothGattServerCallback.onNotificationSent");
    }
person BitByteDog    schedule 07.08.2019

Ну, во-первых, я настоятельно рекомендую вам использовать потрясающую библиотеку Bluetooth LE с открытым исходным кодом под названием RxAndroidBle. . Это значительно упростит весь процесс.

После того, как вы включили эту библиотеку в свой проект, вам нужно будет сделать следующее:

  1. Убедитесь, что Bluetooth включен и вы уже запросили у пользователя разрешения на определение местоположения.
  2. Поиск устройств

Пример:

RxBleClient rxBleClient = RxBleClient.create(context);

Disposable scanSubscription = rxBleClient.scanBleDevices(
        new ScanSettings.Builder()
            // .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // change if needed
            // .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // change if needed
            .build()
        // add filters if needed
)
    .subscribe(
        scanResult -> {
            // Process scan result here.
        },
        throwable -> {
            // Handle an error here.
        }
    );

// When done, just dispose.
scanSubscription.dispose();
  1. Подключитесь к нужному устройству и используйте метод writeCharacteristic() для записи нужных байтов.

Пример:

device.establishConnection(false)
    .flatMapSingle(rxBleConnection -> rxBleConnection.writeCharacteristic(characteristicUUID, bytesToWrite))
    .subscribe(
        characteristicValue -> {
            // Characteristic value confirmed.
        },
        throwable -> {
            // Handle an error here.
        }
    ); 
  1. Если вместо этого вы хотите настроить уведомление/индикацию для характеристики, вы можете сделать следующее:

Пример:

device.establishConnection(false)
    .flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid))
    .doOnNext(notificationObservable -> {
        // Notification has been set up
    })
    .flatMap(notificationObservable -> notificationObservable) // <-- Notification has been set up, now observe value changes.
    .subscribe(
        bytes -> {
            // Given characteristic has been changes, here is the value.
        },
        throwable -> {
            // Handle an error here.
        }
    );

На их странице Github есть много информации, а также у них есть свой собственный выделенный тег в Stackoverflow.

person dglozano    schedule 07.08.2019