Статус Bluetooth Bluetooth 133 в onCharacteristicwrite

Я новичок в Android и теперь делаю простое приложение, которое требует записи некоторых данных в периферийное устройство.

На самом деле ничего не происходит в устройстве Samsung GT-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 и введите первый оператор if со статусом 0, что означает успех. Проблема - второе действие записи в операторе if, которое также вызывает функциюCharacteristicWrite, но дает статус 133, который не может быть найден на официальном сайте. Затем устройство автоматически отключается.

Я подтвердил правильность типа данных и смещения. И поскольку в другом устройстве он работает очень хорошо, я думаю, что могут быть некоторые незначительные различия в реализации стека bluetooth между различными устройствами, что я должен сделать что-то более сложное, чтобы решить эту проблему.

Я искал результат в течение длительного времени. Некоторые результаты приводят меня к исходному коду C (Извините, я отправлю ссылку ниже, потому что у меня недостаточно репутации, чтобы опубликовать более 2 ссылок), но я могу только найти, что 133 означает GATT_ERROR там, что не более полезно, чем просто 133. Я также нашел проблему в группе google, обсуждая некоторые знакомые вопросы, но мне не удалось найти решение здесь.

Мне немного грустно, потому что, если это что-то не так с кодом 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

Ответ 1

У меня была аналогичная проблема, когда я пытался написать какую-то характеристику, которую я не помню, хотя, если бы получил тот же код ошибки или нет. (И он работал на некоторых устройствах, пока он не на других).

То, что оказалось проблемой, - это 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 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);

Ответ 2

Для тех, кто может найти этот пост в результате статуса 133 onCharacteristicWrite, я обнаружил, что мы получили результат 133, потому что удаленное устройство отключено. Я потерял много времени, ища проблемы на стороне Android, только чтобы потом обнаружить, что проблема была с другой стороны.

Из этого я понимаю, что статус = 133 кажется своего рода недокументированным общей причиной ошибки.

Ответ 3

В моем случае мне нужно было повторно использовать активное соединение Gatt в новом действии, но не смог и постоянно отключался с ошибкой 133. Итак, я прибегал к вызову BluetoothGatt.close() до startActivity() и (re) connect в onStart(). Если у кого-то есть лучшая идея о том, как сохранить соединение, отправьте сообщение.

Ответ 4

Здесь код ошибки/успеха и значение

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)

Надеюсь, это поможет. Приветствую вас, проголосуйте