Not able to read a characteristic value from BLE device
我需要向 Android BLE 设备写入和读取特征值。我能写但不能读。这是我的写作方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public void writeCustomCharacteristic(int value) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG,"BluetoothAdapter not initialized"); return; } /*check if the service is available on the device*/ BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("<MY SERVICE UUID>")); if(mCustomService == null){ Log.w(TAG,"Custom BLE Service not found"); return; } /*get the read characteristic from the service*/ BluetoothGattCharacteristic mWriteCharacteristic = mCustomService.getCharacteristic(UUID.fromString("<MY CHARACTERSTIC UUID>")); mWriteCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE); mWriteCharacteristic.setValue(value,BluetoothGattCharacteristic.FORMAT_UINT8,0); if(!mBluetoothGatt.writeCharacteristic(mWriteCharacteristic)){ Log.w(TAG,"Failed to write characteristic"); }else{ Log.w(TAG,"Success to write characteristic"); } } |
如果我使用
这个操作是成功的
1 | mWriteCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE); |
如果我使用任何其他写入类型而不是
这是我阅读特征的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | private boolean readCharacteristics(int groupPosition,int childPosition){ try{ if (mGattCharacteristics != null) { final BluetoothGattCharacteristic characteristic = mGattCharacteristics.get(2).get(2); final int charaProp = characteristic.getProperties(); if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) { // If there is an active notification on a characteristic, clear // it first so it doesn't update the data field on the user interface. if (mNotifyCharacteristic != null) { mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, false); mNotifyCharacteristic = null; } mBluetoothLeService.readCharacteristic(characteristic); } if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) { mNotifyCharacteristic = characteristic; mBluetoothLeService.setCharacteristicNotification(characteristic, true); } waitSometime(100); if ((charaProp | BluetoothGattCharacteristic.PROPERTY_INDICATE) > 0) { mNotifyCharacteristic = characteristic; mBluetoothLeService.setCharacteristicIndication(characteristic, true); } waitSometime(100); if ((charaProp | BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) { byte[] value = characteristic.getValue(); //this is being NULL always if (mNotifyCharacteristic != null) { mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, true); mNotifyCharacteristic = null; } mBluetoothLeService.writeCharacteristic(characteristic, value); if(value!=null&&value.length>0) { Toast.makeText(DeviceControlActivity.this,"success reading data",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(DeviceControlActivity.this,"error reading data",Toast.LENGTH_LONG).show(); } } /* if ((charaProp | BluetoothGattCharacteristic.PROPERTY_INDICATE) > 0) { mNotifyCharacteristic = characteristic; //characteristic.setWriteType(); mBluetoothLeService.setCharacteristicIndication( characteristic, true); byte[] value=characteristic.getValue(); }*/ return true; } }catch (Exception e){ e.printStackTrace(); } return false; } |
这是我的看法:
你需要弄清楚你将获得什么样的特征数据?其中一些需要先设置指示或通知!喜欢:
一个。获取特征的描述符
1 2 | BluetoothGattDescriptor descriptor = gattCharacteristic.getDescriptors().get(0); //Usually is Client_Characteristic_Configuration |
乙。根据特性,设置描述符的property()为true。
1 2 3 4 5 6 7 8 9 10 | if ((gattCharacteristic.PROPERTY_NOTIFY)> 0 ){ if (descriptor != null) { descriptor.setValue((BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)); } } else if((gattCharacteristic.PROPERTY_INDICATE) >0 ){ if(descriptor != null){ descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); } } |
c。将值发送到远程 BLE 设备。
1 | gatt.writeDescriptor(descriptor); |
之后,你可以在回调函数中获取数据:
1 | onCharacteristicChanged |
至少以上对我有用!
希望能帮到人~