Как подключить Android-устройство к устройству iOS через BLE (Bluetooth Low Energy)

Я пытаюсь создать приложение, которое использует новый Bluetooth Low Energy API для Android. Для этого я начал с образца BLE, входящего в API уровня 18 .

Поскольку я читал, что Android не может действовать как периферийное устройство, я поместил телефон Android в центральный режим, просматривая устройства BLE вокруг него. Для этой цели я провел некоторые испытания с помощью Nordic Platform, имитирующей Heart Sensor. Все работает отлично!

После этого я пытаюсь выбрать iPhone (iOS 7 beta 4) и поместить его в Peripheral way и имитировать датчик сердечного ритма как предыдущее тестирование. Приложение Android может видеть устройство и подключаться к нему. Но после того, как соединение активно, 2 устройства отключаются друг от друга через 3-4 секунды. В дополнение к этому, когда я вызываю opensServices () на стороне Android, никакой обратный вызов не срабатывает! В некоторых случаях устройство Android получает событие «Подключено», даже если чип IOS Bluetooth выключен. Это очень странно. Чтобы доказать это, я поставил Северный совет в центральном режиме, и я правильно смог подключиться к устройству iOS без проблем.

Что бы это могло быть? Есть некоторые ограничения на Android или iOS, которые не позволяют подключаться с Android к iOS или наоборот?

Благодарю.

EDIT: после некоторого жесткого тестирования я поднял вопрос на странице AOSP. Здесь можно проверить

Solutions Collecting From Web of "Как подключить Android-устройство к устройству iOS через BLE (Bluetooth Low Energy)"

Добавление сводки для справки:

Что бы это могло быть? Есть некоторые ограничения на Android или iOS, которые не позволяют подключаться с Android к iOS или наоборот?

При подключении к серверу GATT, который рекламируется как устройство с двойной связью (BLE и BR / EDR), вызывая функцию connectGatt (…), флаг TRANSPORT_AUTO, который добавляется внутри страны, делает Android по умолчанию режимом BR / EDR ( ссылка ).

Возможны следующие обходные пути:

  1. Периферийная сторона: прекратите рекламировать возможности BR / EDR, настроив соответствующие флаги ( ссылка )
  2. Центральная сторона. Задайте параметр транспорта явно TRANSPORT_LE, вызвав скрытую версию connectGatt (), используя отражение

Пример:

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

Как отметил Arbel Israel в комментарии, Google представил перегруженную версию connectGatt (…), которая позволяет указать транспорт в Android M.

Я написал простой рабочий пример, довольно простой и включил его с открытым исходным кодом в Github: https://github.com/GitGarage . Пока он протестирован только с Android Nexus 9 и iPhone 5, но я полагаю, что он также будет работать с Nexus 6 и различными типами iPhone. Пока что он настроен явно для связи между одним Android и одним iPhone, но я полагаю, что он способен делать гораздо больше.

Может быть, немного задержка, но, возможно, ваша боль может немного облегчиться;)

Мы много экспериментировали с кросс-платформенными соединениями BLE (iOS <-> Android) и узнали, что по-прежнему существует много несовместимостей и проблем с подключением. Помимо нестабильности Android, вы также должны учитывать, что на сегодняшний день не так много Android-устройств фактически поддерживают режим периферийных устройств BLE.

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

Например: http://p2pkit.io или google поблизости

Отказ от ответственности: я работаю на Uepaa, разрабатывая p2pkit.io для Android и iOS.