What are the steps to get notified by Bluetooth Low Energy (BLE) device?

后端 未结 4 904
慢半拍i
慢半拍i 2021-01-31 12:20

I am working on a Bluetooth Low Energy (BLE) app. I have a BLE device (scale) which measures weight. I am able to connect with this device. But I am not getting how to read data

相关标签:
4条回答
  • 2021-01-31 12:48

    Refer the source code of sample application "bluetoothlegatt" provided on developer portal.

    Sample service: http://developer.android.com/samples/BluetoothLeGatt/src/com.example.android.bluetoothlegatt/BluetoothLeService.html

    Using service: http://developer.android.com/samples/BluetoothLeGatt/src/com.example.android.bluetoothlegatt/DeviceControlActivity.html

    This example contains characteristics with read and notify properties. So you definitely find your solution. Please go to section with following code:(You may figure it out)

    public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
            if (mBluetoothAdapter == null || mBluetoothGatt == null) {
                Log.w(TAG, "BluetoothAdapter not initialized");
                return;
            }
            mBluetoothGatt.readCharacteristic(characteristic);
        }
    
    0 讨论(0)
  • Had a device which required me to use

    descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE)
    

    instead of

    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)
    

    as explained in this question

    Android BLE API: GATT Notification not received

    0 讨论(0)
  • 2021-01-31 13:01

    you have to differentiate the value is notification or indication, and set respective value using descriptor.setValue. if you set wrongly, you will not get the value.

    0 讨论(0)
  • 2021-01-31 13:11

    This one is working for me:

    to notify master device that some characteristic is change, call this function on your pheripheral:

    private BluetoothGattServer server;
    //init....
    
    //on BluetoothGattServerCallback...
    
    //call this after change the characteristic
    server.notifyCharacteristicChanged(device, characteristic, false);
    

    in your master device: enable setCharacteristicNotification after discover the service:

    @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);
            services = mGatt.getServices();
            for(BluetoothGattService service : services){
                if( service.getUuid().equals(SERVICE_UUID)) {
                    characteristicData = service.getCharacteristic(CHAR_UUID);
                    for (BluetoothGattDescriptor descriptor : characteristicData.getDescriptors()) {
                        descriptor.setValue( BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
                        mGatt.writeDescriptor(descriptor);
                    }
                    gatt.setCharacteristicNotification(characteristicData, true);
                }
            }
            if (dialog.isShowing()){
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        dialog.hide();
                    }
                });
            }
       }
    

    now you can check your characteristic value is change, for example onCharacteristicRead function :

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            Log.i("onCharacteristicRead", characteristic.toString());
            byte[] value=characteristic.getValue();
            String v = new String(value);
            Log.i("onCharacteristicRead", "Value: " + v);
    }
    
    0 讨论(0)
提交回复
热议问题