Я пытаюсь создать приложение, использующее новый Bluetooth Low Energy API для Android. Для этого я начал с образца BLE, поставляемого с уровнем API 18 .
Когда я прочитал, что Android не может выступать в качестве периферийного устройства, я перевел телефон Android в центральный режим, сканируя устройства BLE вокруг него. Для этого я провел несколько тестов на платформе Nordic, имитирующей датчик сердца. Все работает идеально!
После этого я пытаюсь выбрать iPhone (iOS 7 beta 4) и установить его периферийным способом, имитируя датчик сердечного ритма, как в предыдущем тестировании. Приложение Android может видеть устройство и подключаться к нему. Но после того, как соединение будет активным, 2 устройства отключаются друг от друга через 3-4 секунды. В дополнение к этому, когда я вызываю discoverServices () на стороне Android, обратный вызов не запускается! В некоторых случаях устройство Android получает событие «Подключено», даже если микросхема Bluetooth iOS отключена. Это очень странно. Чтобы доказать это, я перевел Nordic Board в центральный режим, и мне удалось без проблем подключиться к устройству iOS.
Что бы это могло быть? Есть некоторые ограничения на Android или iOS, которые не позволяют подключаться с Android к iOS или наоборот?
Благодарю.
РЕДАКТИРОВАТЬ: после некоторого жесткого тестирования я поднял проблему на странице AOSP. Это можно проверить здесь
источник
Ответы:
Добавление резюме для справки:
Что бы это могло быть? Есть некоторые ограничения на Android или iOS, которые не позволяют подключаться с Android к iOS или наоборот?
При подключении к серверу GATT, который объявлен как двухрежимное (BLE и BR / EDR) устройство, путем вызова connectGatt (...), внутренний добавленный флаг TRANSPORT_AUTO заставляет Android по умолчанию использовать режим BR / EDR ( ссылка ).
Возможны следующие обходные пути:
Пример:
public void connectToGatt(BluetoothDevice device) { ... Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class); int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null); // LE = 2, BREDR = 1, AUTO = 0 BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport); ... }
Изменить 4/2016
Как Арбель Израильского отметил в комментариях, Google представил перегруженную версию connectGatt (...) , который позволяет указать транспорт в Android M .
источник
Я написал простой рабочий пример, относительно простой, и включил его с открытым исходным кодом в Github: https://github.com/GitGarage . Пока что он был протестирован только с Android Nexus 9 и iPhone 5s, но я предполагаю, что он также будет работать с Nexus 6 и различными типами iPhone. Пока что он настроен явно для связи между одним Android и одним iPhone, но я предполагаю, что его можно настроить, чтобы сделать гораздо больше.
источник
Может, немного задержался, но, возможно, вашу боль можно будет немного облегчить;)
Мы много экспериментировали с кроссплатформенными соединениями BLE (iOS <-> Android) и узнали, что по-прежнему существует много несовместимостей и проблем с подключением. Помимо нестабильности Android, вы также должны учитывать, что на сегодняшний день не так много устройств Android поддерживают периферийный режим BLE.
Поэтому, если ваш вариант использования основан на функциях и вам нужен только базовый обмен данными, я бы посоветовал взглянуть на фреймворки и библиотеки, которые могут обеспечить межплатформенное взаимодействие для вас, без необходимости создавать его с нуля.
Например: http://p2pkit.io или Google рядом
Отказ от ответственности: я работаю в Uepaa, разрабатывая p2pkit.io для Android и iOS.
источник
Теперь вы можете пройти
TRANSPORT_LE
черезBluetoothDevice.connectGatt
API 23.См. Ссылки на документацию по Android ниже:
источник
Устройства iOS всегда могут быть периферийными или центральными, но устройства Android не могут быть редко. В этом случае ваше устройство iOS должно быть периферийным, а Android должен быть центральным. Мы можем думать, что периферийное устройство - это сервер, а центральное - это клиент. Это просто.
источник