4

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

从 Central,我请求读取 Peripheral 的特征,使用mBluetoothGatt.readCharacteristic ( characteristic )

在外围设备上,方法

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

调用,我正在做两件事: 1. 初始化 abyte [] value以将字符串存储在byte表单中。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...

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

你能指出我哪里做错了吗?

编辑:从外围设备,我已经调试我正在发送 32 字节的数据。当我将string值从更改This is a data to be transferred为 时DATA,该方法onCharacteristicReadRequest()仅调用一次。

对该领域的进一步实验string使我得出结论,响应中要发送的最大字节数为 21 字节。如果是这种情况,那么我应该如何从 GATT Server 发送响应,以便 Central Device 只能获取准确的数据?

4

2 回答 2

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#

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

于 2020-03-26T10:24:48.673 回答
1

这来自 C#,但我认为它可以提供帮助。当您传输大量字节数组时,您需要使用偏移量。否则,就像您的情况一样,您会不断地从头开始传输阵列。偏移量自动更改。您只需要在读取下一条数据时使用它来偏移数组即可。

byte[] result = DataBytes.Skip(offset).ToArray();
mGattServer.SendResponse(device, requestId, GattStatus.Success, offset, result);
于 2019-04-23T10:28:35.750 回答