4

中央デバイスとして機能する 1 つの Android Phone と、周辺機器として機能する別の Android Phone があります。

Central から、Peripheral の特性を読み取るように要求しています。mBluetoothGatt.readCharacteristic ( characteristic )

ペリフェラルに、メソッド

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

1.文字列をフォームbyte [] valueに格納するために a を初期化します。byte2. メソッドを使用してクライアントに応答を送信し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 );
}

ここでの問題は、セントラル デバイスから一度読み取り要求を行ったときに、上記のメソッドが複数回呼び出されることです。

このため、Central デバイスでデータを次のように取得しています。

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

他の特性も試しました。しかし、それらの場合、コールバック メソッドは 1 回呼び出されます。

私が間違っているところを教えてもらえますか?

EDIT : Peripheral から、32 バイトのデータを送信していることをデバッグしました。string値を からに変更This is a data to be transferredするDATAと、メソッドonCharacteristicReadRequest()は 1 回だけ呼び出します。

このフィールドをさらに実験したstring結果、応答で送信される最大バイト数は 21 バイトであるという結論に達しました。この場合、Central Device が正確なデータのみを取得できるようにするには、GATT サーバーからの応答をどのように送信すればよいですか?

4

2 に答える 2

1

これはC#からのものですが、役立つと思います。大きなバイト配列を転送する場合は、オフセットを使用する必要があります。それ以外の場合は、あなたの場合のように、配列を最初から常に転送し始めます。オフセットは自動的に変更されます。次のデータを読み取るときに配列をオフセットするために使用する必要があります。

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