1

onCharacteristicChanged()コールバックが BLE 経由でデータを受信するのを待ちます。しかし、BluetoothDevice が一度に 20 バイトのパケットをあまりにも多く送信すると、907 バイトの長さのメッセージに対して予想される 46 個の通知ではなく、最大 10 個の通知を受け取ります。少量のデータは問題なく通知されます。

onServicesDiscovered(BluetoothGatt gatt, int status) で、次の方法で通知を登録します。

public void onServicesDiscovered(BluetoothGatt gatt, int status) {
  if (status == BluetoothGatt.GATT_SUCCESS) {
    mService = mGatt.getService(SERVICE_UUID);
    mCharacteristic = mService.getCharacteristic(CHARACTERISTIC_UUID);
    mGatt.setCharacteristicNotification(characteristic, enabled);
    BluetoothGattDescriptor descriptor =
            characteristic.getDescriptor(UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG));
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    mGatt.writeDescriptor(descriptor);            
  }
}

でデータを取得したことを何らかの形で認める必要がありonCharacteristicChanged()ますか?

BluetoothDevice は、20 バイトを超えるメッセージを 20 バイトのチャンクに分割して送信しています。通常、これらのメッセージは 200 バイト未満です。ただし、BluetoothDevice が 900 バイトを超える長さのメッセージを送信すると、アプリonCharacteristicChanged()はそれらのバイトのうち 200 バイトのみを介して通知を受け取ります。

これらの大きなメッセージは、iOS で問題なく受信されます。

4

1 に答える 1

1

BLE スタックは現在、パケットが多すぎて複数の特性を読み取るという既知のバグがあり、壊れているようです。基調講演のスライドによると、BT スタックは L リリースで大幅に改善されます (スレーブおよび中央モードを含む)

于 2014-06-26T00:20:13.393 に答える