web-dev-qa-db-ja.com

Android onCharacteristicwriteのBluetoothステータス133

私は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

15
Quarter2Twelve

同じエラーコードを取得したかどうかは覚えていませんが、いくつかの特性を書き込もうとしたときに同様の問題が発生しました。 (一部のデバイスでは機能しましたが、他のデバイスでは機能しませんでした)

問題であることが判明したのは、propertycharacteristicswriteTypeです。

特性には値を設定できるため、次のようになります。

  • 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);
6
benka

ここにエラー/成功のステータスコードと意味があります

  • GATT_ILLEGAL_PARAMETER0x0087(135)
  • GATT_NO_RESOURCES0x0080(128)
  • GATT_INTERNAL_ERROR0x0081(129)
  • GATT_WRONG_STATE0x0082(130)
  • GATT_DB_FULL0x0083(131)
  • GATT_BUSY0x0084(132)
  • GATT_ERROR0x0085(133)
  • GATT_CMD_STARTED0x0086(134)
  • GATT_PENDING0x0088(136)
  • GATT_AUTH_FAIL0x0089(137)
  • GATT_MORE0x008a(138)
  • GATT_INVALID_CFG0x008b(139)
  • GATT_SERVICE_STARTED0x008c(140)
  • GATT_ENCRYPED_MITMGATT_SUCCESS
  • GATT_ENCRYPED_NO_MITM0x008d(141)
  • GATT_NOT_ENCRYPTED0x008e(142)
4
Ashraf

私の場合、アクティブなGatt接続を新しいアクティビティで再利用する必要がありましたが、それができず、エラー133で絶えず切断されていました。そのため、BluetoothGatt.close()の前にstartActivity()を呼び出すことにしました。 onStart()で(再)接続します。接続を維持する方法について誰かがより良いアイデアを持っている場合は、投稿してください。

2
rexxar

ステータス133onCharacteristicWriteの結果としてこの投稿を見つける可能性がある人のために、リモートデバイスが切断されたためにこの133の結果が得られることがわかりました。 Android側で問題を探すのに多くの時間を失いましたが、後で問題が反対側にあることがわかりました。

このことから、status = 133はある種の 文書化されていない エラーの一般的な原因のように思われることがわかります。

2
Bamaco