我有一个Android手机充当中央设备,另一个Android手机充当外围设备。
从中环开始,我使用mBluetoothGatt.readCharacteristic ( characteristic )
在外设上,方法
void onCharacteristicReadRequest ( // Bluetooth GATT Server Callback Method
BluetoothDevice device,
int requestId,
int offset,
BluetoothGattCharacteristic characteristic
)
调用,我做了两件事:
1.初始化byte [] 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...
我也尝试过其他特色。 但对于那些,回调方法被调用一次。
你能指出我做错的地方吗?
编辑:从Peripheral,我调试了我发送的32字节数据。
当我将string
值从This is a data to be transferred
更改为DATA
时,方法onCharacteristicReadRequest()
只会调用一次。
使用字段string
的进一步实验使我得出结论,响应中要发送的最大字节数为21字节。
如果是这种情况,那么我应该如何从GATT服务器发送响应,以便中央设备只能获得确切的数据?
答案 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);