Android 4.3 BLE how to write a feature

Further sample

I know:

  • How to read the characteristic value.

But I do not know:

  • How to write data to the firmware.

I tried several times but this did not work.

This is the encoding:

if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) { System.out.println("read!!!!!!"); // 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) { System.out.println("notify!!!!!!"); mNotifyCharacteristic = characteristic; mBluetoothLeService.setCharacteristicNotification( characteristic, true); } if ((charaProp | BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) { if (SampleGattAttributes.AppConfigToBongCharacteristicUUID .equals(characteristic.getUuid())) { System.out.println("write!!!!!!"); mBluetoothLeService.writeCharacteristic(characteristic); } } public void writeCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } if (UUID_SEND_CONFIG_TO_BONG.equals(characteristic.getUuid())) { Calendar date = Calendar.getInstance(); StringBuilder data = new StringBuilder(); String data_date_y = String.format("%4s", date.get(Calendar.YEAR)) .replace(' ', '0'); String data_date_m = String.format("%2s", date.get(Calendar.MONTH)) .replace(' ', '0'); String data_date_d = String.format("%2s", date.get(Calendar.DATE)) .replace(' ', '0'); String data_date_h = String.format("%2s", date.get(Calendar.HOUR)) .replace(' ', '0'); String data_date_min = String.format("%2s", date.get(Calendar.MINUTE)).replace(' ', '0'); data.append("10FFFF"); data.append(data_date_y); data.append(data_date_m); data.append(data_date_d); data.append(data_date_h); data.append(data_date_min); System.out.println(data); byte[] dataByte = data.toString().getBytes(); characteristic.setValue(dataByte); mBluetoothGatt.writeCharacteristic(characteristic); } } 

// onCharacteristicWrite () Not called

 @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { System.out.println("writeCharacteristic111"); System.out.println("status:" + status); System.out.println(BluetoothGatt.GATT_SUCCESS); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); } } 
+6
source share
3 answers

I think jkraybill got an answer for you.

I used google bluetooth le example code that checks the property bit with '|' in the following way:

 if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) { ... } 

But when I looked at the BluetoothGatt code itself, I found it using '&' instead.

 public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) { if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0 && (characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false; ... } 

Thus, it is obvious that the sample code was incorrect if you once again clarify its definition in Google for document development: https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html

+3
source

You must specify the value you want to write. you can find what you need in this example

+2
source

This is a function that I wrote to write a characteristic, its rudimentary, but it works specifically for unknown UUIDs:

 public void getACharXandWriteToIt(int value, ScanResult result) { Log.i(TAG, "This is result:: " + result.toString()); List<ParcelUuid> serviceUUIDs = result.getScanRecord().getServiceUuids(); ArrayList<BluetoothGattService> services = new ArrayList<>(); List<BluetoothGattCharacteristic> characteristics; ArrayList<UUID> uuidServiceList = new ArrayList<>(); for (ParcelUuid pUUIDx : serviceUUIDs){ uuidServiceList.add(pUUIDx.getUuid()); Log.i(TAG, uuidServiceList.toString()); } for (UUID serviceUUIDx: uuidServiceList){ Log.i(TAG, "services are: "+ serviceUUIDx.toString()); MyLogData +="services are: "+ serviceUUIDx.toString()+"\n"; BluetoothGattService service = bleGatt.getService(serviceUUIDx); if (service!=null) { characteristics = service.getCharacteristics(); services.add(service); for (BluetoothGattCharacteristic characteristic : characteristics) { if(characteristic!=null){ Log.i(TAG, "CharX:: " + characteristic.toString()); MyLogData += "CharX:: " + characteristic.toString()+"\n"; Log.i(TAG, "Charx UUID:: " + characteristic.getUuid().toString()); MyLogData += "Charx UUID:: " + characteristic.getUuid().toString(); Log.i(TAG, "Charx write type:: " + characteristic.getProperties()); /* Log.i(TAG, "Write no response:: " + BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE); Log.i(TAG, "Write:: " + BluetoothGattCharacteristic.PROPERTY_WRITE); Log.i(TAG, "Notify:: " + BluetoothGattCharacteristic.PROPERTY_NOTIFY); Log.i(TAG, "Read:: " + BluetoothGattCharacteristic.PROPERTY_READ);*/ if (characteristic.getWriteType() == 1){ MyLogData += "Write data: " + value + "\n"; characteristic.setValue(value,BluetoothGattCharacteristic.FORMAT_SINT8, 0); writeCharacteristic(characteristic); } } } } } } 
0
source

Source: https://habr.com/ru/post/955871/


All Articles