2013-08-02 7 views
15

Я помню, как читал в "Guide and Hint" -doc к Samsung BLE API (archived page):Является ли обычная реализация Android BLE синхронной по своей природе?

Одним из наиболее важных понятий Samsung F/W и стек его синхронная природа. То есть, если мы называем, например, writeCharacteristic для конкретного признака, если она возвращает true, следующий вызов любому BluetoothGatt или BluetoothGattServer метода должно быть сделано после того, как onCharacteristicRead обратного вызова принимается. Это происходит потому, что стек предназначен для поддержки и процесса только один GATT вызова в то время, и если, к примеру, вы звоните writeCharacteristic или readCharacteristic на любой характеристике скоро после первой, она игнорируется.

  1. ли это, применяются также к реализации Натив из BLE представил в Android 4.3?
  2. Samsung API также поддерживает только одно подключенное устройство GATT за раз. Изменилось ли это в native API?
+0

Там в постоянный поток связан с синхронным характером API на отслеживания проблем Google: https://code.google.com/p/android/issues/detail?id=58381 –

+0

Я просто реализован очередь для всех записей, и это пока работает хорошо. –

+1

@Ash Согласно документам, предоставленным SAMSUNG, поведение не ограничивается операциями записи. Да, использование очереди - это общий способ решить эту проблему. «хорошо работает до сих пор»: трудно проверить и воспроизвести отмену команды другим. Часто вы столкнетесь с проблемами, когда ваш код BLE становится более сложным, потому что вы делаете больше вещей на основе предыдущих вызовов.Я выполняю только следующую операцию BLE после того, как закончил (полученный ответ), или после того, как он не завершился в соответствующее время. Кстати, ваши комментарии подойдут лучше, как ответ на этот вопрос. – OneWorld

ответ

17

Samsung недавно опубликовал «Migration» -document на на той же странице, которую я связал в своем вопросе. Они точно отвечают на мой вопрос, сравнивая новый собственный BLE API с API Samsung BLE:

Синхронный характер стека и F/W не был затронут. То есть, если мы называем, например, writeCharacteristic для конкретного характерного, если она возвращает истину, то следующий вызов любого BluetoothGatt или BluetoothGattServer метод должен быть сделан после того, как onCharacteristicRead обратного вызов принимается. Это связано с тем, что стек создан для поддержки и обработки только одного вызова GATT за раз, а если для примера вы вызываете writeCharacteristic или readCharacteristic любого characteristic вскоре после первого, он игнорируется.

+1

Я очень рад, что нашел этот вопрос. Google не делает этого, чтобы сделать это ясно. Возвращение true, когда запрос на чтение/запись фактически игнорируется, довольно запутан. – svens

+2

Может ли кто-нибудь подтвердить, может ли android.bluetooth.BluetoothGatt работать только с одной ожидающей работой GATT ** PER DEVICE **, ** PER PROCESS ** или ** PERIOD ** (то есть: во всех процессах). Я предполагаю, что это PER DEVICE, но эта проблема настолько расстроена, что меня это не удивит, если бы это было иначе. Если ограничение - это только PER DEVICE, то OS/Device, способный обрабатывать несколько одновременных операций, является доказательством того, что эта проблема объясняется исключительно слабым наивным внедрением в экземпляре BluetoothAdapter, который ОС поддерживает каждый процесс (который я предположил одноэлемент во всех процессах). – swooby

+0

Это одна ожидающая операция для каждого объекта BluetoothGatt. – Emil

-1
  1. Нет. Большинство вызовов функций являются асинхронными.
  2. Я не знаю. Официальные документы не упоминают об этом, но не говорят, что он поддерживает только одно устройство. Я считаю, что это возможно. Проверьте эту статью: http://blog.lemberg.co.uk/getting-bottom-android-bluetooth-low-energy-api#.UfvK6ZK-1cY

Это говорит (я не знаю, что ее источник), что несколько периферийных устройств могут подключаться к Android один центральный аппарат

+1

Интерфейс Samsung API также является асинхронным. Вы получаете ответ в обратном вызове (API очень похож, кстати) Однако, если вы запустите два запроса за короткое время. В то время как первый из них не полностью продвинулся, первый может быть отменен. Поэтому вопрос заключается в том, что, если родной API также имеет такое поведение. – OneWorld

+0

А теперь, я понимаю. Я не знаю, следуют ли соответствующие API. Я думаю так. Если вы стреляете 2 scanBLE, предыдущий отменяется, но я не уверен в этом. – edoardotognoni