关注sample
我知道:
但我不知道:
我试了好几次,但没办法。
这是编码:
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()未被调用
@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);
}
}
答案 0 :(得分:3)
我认为jkraybill已经找到了答案。
我使用谷歌的bluetooth le示例代码,用“|”检查属性位操作如下:
if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
...
}
但是当我查看BluetoothGatt代码本身时,我发现它正在使用'&'操作而不是。
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
&& (characteristic.getProperties() &
BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false;
...
}
很明显,示例代码不正确,如果您进一步检查其在Google开发文档中的定义: https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html
答案 1 :(得分:2)
您必须指定要编写的值。 您可以在example
中找到所需内容答案 2 :(得分:0)
这是我写的一个函数来写一个特性,虽然它很简陋,但它特别适用于未知的UUID:
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);
}
}
}
}
}
}