BluetoothGattServerCallback:onCharacteristicReadRequest()多次调用

时间:2017-09-20 09:15:27

标签: android bluetooth-lowenergy bluetooth-gatt

我有一个Android手机充当中央设备,另一个Android手机充当外围设备。

从中环开始,我使用mBluetoothGatt.readCharacteristic ( characteristic )

请求阅读外围设备的特性

在外设上,方法

void onCharacteristicReadRequest ( // Bluetooth GATT Server Callback Method
            BluetoothDevice device,
            int requestId,
            int offset,
            BluetoothGattCharacteristic characteristic
)

调用,我做了两件事:  1.初始化byte [] valuebyte形式存储字符串。  2.使用方法mGattServer.sendResponse()向客户发送响应。

@Override public void onCharacteristicReadRequest (
        BluetoothDevice device, int requestId, int offset,
        BluetoothGattCharacteristic characteristic ) {
    super.onCharacteristicReadRequest ( device, requestId, offset, characteristic );
    String string = "This is a data to be transferred";
    byte[] value = string.getBytes ( Charset.forName ( "UTF-8" ) );
    mGattServer.sendResponse ( device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value );
}

我的问题是,当我从中央设备发出一次读取请求时,上面的方法被多次调用。

由于这个原因,我将中央设备上的数据视为

This is a data to be transferredThis is a data to be transferredThis is a...

我也尝试过其他特色。 但对于那些,回调方法被调用一次。

你能指出我做错的地方吗?

编辑:从Peripheral,我调试了我发送的32字节数据。 当我将string值从This is a data to be transferred更改为DATA时,方法onCharacteristicReadRequest()只会调用一次。

使用字段string的进一步实验使我得出结论,响应中要发送的最大字节数为21字节。 如果是这种情况,那么我应该如何从GATT服务器发送响应,以便中央设备只能获得确切的数据?

2 个答案:

答案 0 :(得分:3)

在android中,如何处理大文字

    private String data = "123456789123456789123xx";

让我们成为您的文字

接下来将是onCharacteristicReadRequest()的实现

@Override
public void onCharacteristicReadRequest(BluetoothDevice device, 
                  int requestId, int offset,
                  BluetoothGattCharacteristic characteristic) {

    super.onCharacteristicReadRequest(device, requestId, offset, characteristic);

    byte value[] = data.getBytes();
    value = Arrays.copyOfRange(value,offset,value.length);
    gattServer.sendResponse ( device, requestId, 
                              BluetoothGatt.GATT_SUCCESS, offset, value );
}

因此,基本上在每次调用中都会传输偏移量的数据,因此在下一次调用此方法时,您应该仅发送偏移量,直到数据长度

这与@ВадзімЖукоўскі所说的相同,但对于C#

感谢@ВадзімЖукоўскі指出这一点

答案 1 :(得分:0)

这是C#提供的,但我认为它可以提供帮助。

byte[] result = DataBytes.Skip(offset).ToArray();
gattServer.SendResponse(device, requestId, GattStatus.Success, offset, result);