6

跟随样本

我知道:

  • 如何读取特征值。

但我不知道:

  • 如何将数据写入固件。

我尝试了几次,但没有奏效。

这是编码:

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);
        }
    }
4

3 回答 3

3

我想 jkraybill 已经为你找到了答案。

我正在使用 google 的蓝牙 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;

    ...
}

所以很明显示例代码是不正确的,如果你在谷歌开发文档上进一步检查它的定义: https ://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html

于 2015-05-22T08:43:54.980 回答
2

您必须指定要写入的值。你可以在这个例子中找到你需要的东西

于 2015-10-12T10:02:13.290 回答
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);
                    }
                }
            }
        }
    }
}
于 2016-09-28T08:45:18.813 回答