Android 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
оператор, который также вызовет функцию onCharacteristicWrite, но даст статус 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
4 ответов
у меня была аналогичная проблема, когда я пытался написать какую-то характеристику, которую я не могу вспомнить, хотя, если я получил тот же код ошибки или нет. (и он работал на некоторых устройствах, а не на других).
как оказалось проблема 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)
надеюсь, что это помогает. Ура Голосуйте
для тех, кто может найти этот пост в результате состояния 133 onCharacteristicWrite, я обнаружил, что мы получаем этот результат 133, потому что удаленное устройство отключено. Я потерял много времени, ища проблему на стороне Android, только чтобы позже обнаружить, что проблема была на другой стороне.
из этого я заключаю, что status = 133 кажется каким-то без документов общая причина ошибки.
в моем случае мне нужно было повторно использовать активное соединение Gatt в новой деятельности, но не смог и постоянно отключался с ошибкой 133.
Итак, я прибегнул к призыву BluetoothGatt.close()
до startActivity()
, и (re)подключение в onStart()
.
Если у кого-то есть лучшая идея о том, как сохранить соединение, пожалуйста, напишите.