私はAndroidに不慣れで、周辺機器にデータを書き込む必要がある簡単なアプリを実行しています。
実際、SamsungGT-S7272Cデバイスでは何も問題はありません。しかし、Sony LT29iに切り替えると、特定の特性に書き込もうとすると、常にステータス133が表示されます。簡単なコードをいくつか紹介します。
BluetoothGattService syncService = gatt.getService(SYNC_DATA_SERVICE);
BluetoothGattCharacteristic tChar = syncService.getCharacteristic(SYNC_TIME_INPUT_CHAR);
if (tChar == null) throw new AssertionError("characteristic null when sync time!");
int diff = /*a int*/;
tChar.setValue(diff, BluetoothGattCharacteristic.FORMAT_SINT32, 0);
gatt.writeCharacteristic(tChar);
およびonCharacteristicWrite関数:
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.d(TAG, String.format("Sync: onCharWrite, status = %d", status));
try {
if (status != BluetoothGatt.GATT_SUCCESS) throw new AssertionError("Error on char write");
super.onCharacteristicWrite(gatt, characteristic, status);
if (characteristic.getUuid().equals(SYNC_TIME_INPUT_CHAR)) {
BluetoothGattService syncService = gatt.getService(SYNC_DATA_SERVICE);
BluetoothGattCharacteristic tChar = syncService.getCharacteristic(SYNC_HEIGHT_INPUT_CHAR);
if (tChar == null) throw new AssertionError("characteristic null when sync time!");
tChar.setValue(/*another int*/, BluetoothGattCharacteristic.FORMAT_SINT32, 0);
gatt.writeCharacteristic(tChar);
}
else if {
...
}
} catch (AssertionError e) {
...
}
最初の特性への書き込みには何の問題もありません。制御はonCharacteristicWriteに到達し、ステータス0
の最初のif
ステートメントを入力します。これは、成功を意味します。問題は、if
ステートメントの2番目の書き込みアクションです。これもonCharacteristicWrite関数をトリガーしますが、ステータス133
を生成します。これは、 公式サイト では見つかりません。その後、デバイスは自動的に切断されます。
データ型とオフセットがすべて正しいことを確認しました。また、別のデバイスでは非常にうまく機能するため、異なるデバイス間でBluetoothスタックの実装にわずかな違いがある可能性があり、この問題を解決するにはもっと注意が必要です。
私は長い間結果を探してきました。いくつかの結果は私をCソースコードに導きます(申し訳ありませんが、2つ以上のリンクを投稿するのに十分な評判がないので以下のリンクを投稿します)が、133
はそこでGATT_ERRORを意味することがわかります単なる133
よりも役に立ちません。また、グーグルグループでよくある質問について話し合っている問題を見つけましたが、ここで解決策を見つけることができませんでした。
Cコードに問題がある場合、問題を特定できたとしても、自分のコードでそれを正しくする方法がないので、少し悲しいですよね?
誰かが以前に馴染みのある経験をしていて、私にいくつかの提案をしてくれることを願っています。どうもありがとう!
リンク:
Cソースコード:https://Android.googlesource.com/platform/external/bluetooth/bluedroid/+/Android-4.4.2_r1/stack/include/gatt_api.h
問題:https://code.google.com/p/Android/issues/detail?id=58381
同じエラーコードを取得したかどうかは覚えていませんが、いくつかの特性を書き込もうとしたときに同様の問題が発生しました。 (一部のデバイスでは機能しましたが、他のデバイスでは機能しませんでした)
問題であることが判明したのは、property
とcharacteristics
のwriteType
です。
特性には値を設定できるため、次のようになります。
write without response
またはwrite with response
このプロパティを参照して、実際のデータを特性に書き込む前にwriteType
を設定する必要があります。
特性を取得したら、書き込む前にタイプを設定できます。
BluetoothGattCharacteristic tChar = syncService.getCharacteristic(SYNC_HEIGHT_INPUT_CHAR);
if (tChar == null) throw new AssertionError("characteristic null when sync time!");
// use one of them in regards of the Characteristic's property
tChar.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
//tChar.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
tChar.setValue(/*another int*/, BluetoothGattCharacteristic.FORMAT_SINT32, 0);
gatt.writeCharacteristic(tChar);
ここにエラー/成功のステータスコードと意味があります
GATT_ILLEGAL_PARAMETER
0x0087
(135)GATT_NO_RESOURCES
0x0080
(128)GATT_INTERNAL_ERROR
0x0081
(129)GATT_WRONG_STATE
0x0082
(130)GATT_DB_FULL
0x0083
(131)GATT_BUSY
0x0084
(132)GATT_ERROR
0x0085
(133)GATT_CMD_STARTED
0x0086
(134)GATT_PENDING
0x0088
(136)GATT_AUTH_FAIL
0x0089
(137)GATT_MORE
0x008a
(138)GATT_INVALID_CFG
0x008b
(139)GATT_SERVICE_STARTED
0x008c
(140)GATT_ENCRYPED_MITM
GATT_SUCCESS
GATT_ENCRYPED_NO_MITM
0x008d
(141)GATT_NOT_ENCRYPTED
0x008e
(142)私の場合、アクティブなGatt接続を新しいアクティビティで再利用する必要がありましたが、それができず、エラー133で絶えず切断されていました。そのため、BluetoothGatt.close()
の前にstartActivity()
を呼び出すことにしました。 onStart()
で(再)接続します。接続を維持する方法について誰かがより良いアイデアを持っている場合は、投稿してください。
ステータス133onCharacteristicWriteの結果としてこの投稿を見つける可能性がある人のために、リモートデバイスが切断されたためにこの133の結果が得られることがわかりました。 Android側で問題を探すのに多くの時間を失いましたが、後で問題が反対側にあることがわかりました。
このことから、status = 133はある種の 文書化されていない エラーの一般的な原因のように思われることがわかります。