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 で問題なく受信されます。