Як підключити пристрій Android до пристрою iOS через BLE (Bluetooth Low Energy)


82

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

Коли я прочитав, що Android не може діяти як периферія, я перевів телефон Android у центральний режим, скануючи навколо нього пристрої BLE . Для цього я провів тестування на скандинавській платформі, що імітує датчик серця. Все працює ідеально!

Після цього я намагаюся вибрати iPhone (iOS 7 beta 4) і поставити його периферійним способом, імітуючи датчик серцевого ритму, як попереднє тестування. Додаток Android може бачити пристрій і підключатися до нього. Але після активного з’єднання два пристрої від’єднуються один від одного через 3-4 секунди. На додаток до цього, коли я закликаю DiscoverServices () на стороні Android, зворотний дзвінок не запускається! У деяких випадках пристрій Android отримує подію "Підключено", навіть якщо мікросхема Bluetooth iOS вимкнена. Це дуже дивно. Щоб довести це, я перевів Північну дошку в центральний режим, і я без проблем зміг підключитися до пристрою iOS.

Що це може бути? Є деякі обмеження на Android або iOS, які не дозволяють підключатися з Android на iOS або навпаки?

Дякую.

EDIT: Після важкого тестування я підняв проблему на сторінці AOSP. Це можна перевірити тут


2
Згідно з документацією, Android ДОПОМОГАЄ підтримку, яка працює як сервер (наприклад, монітор серцевого ритму), хоча значення, які генерує, будуть фальшивими. З іншого боку, прикладів немає, документація наказує вам робити неправильні вчинки, і немає можливості розпочати рекламу (хоча документація говорить, що ви можете).
Брайан Рейнгольд

Ти маєш рацію. Я вже знайшов помилку документа про BluetoothGattServer. Ви не можете мати екземпляр GattServer з методом getProfileProxy (як сказано в документі), але ви можете з BluetoothManager.openGattServer (). Про це вже повідомляється в Google як проблема. Так чи інакше, так, Android може виступати в ролі GattServer, але не може рекламувати. Якщо вам може бути цікаво, я вже тестував, і після з'єднання 2-х пристроїв пульт може бачити сервери Gatt, виставлені з Android. Перегляньте коментарі першої відповіді, щоб побачити мій звіт про це питання.
edoardotognoni

Так, я теж натрапив на це і додав свої два центи до цього випуску. Зараз у мене є сервер термометра, який не може рекламувати, тому я не можу ним користуватися.
Брайан Рейнгольд,

Я відкрив ланцюжок, майже ідентичний вашому: stackoverflow.com/questions/18410081/... Я буду стежити за цією ланцюжком для будь-яких рішень, які ви знайдете.
afrederick

Прочитайте випуск Android, який я опублікував у розділі EDIT запитання. Це чітко пояснює, чому цей процес не вдається. ми вважаємо, що це помилка Android. В основному це надсилання забороненого повідомлення через фіксований канал BLE. Я думаю, що єдине, що ми можемо зробити, це дочекатися нового випуску Android :(
edoardotognoni

Відповіді:


7

Додавання резюме для довідки:

Що це може бути? Є деякі обмеження на 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

Як Арбель Ізраїльського зазначив в коментарі, Google представив перевантажену версію connectGatt (...) , який дозволяє вказати транспорт в Android M .


Дякую, це працює для мене, зауважте, що в android M google додав перевантаження для методу connectGatt, який приймає транспортну змінну: connectGatt (контекст контексту, логічний autoConnect, зворотний виклик BluetoothGattCallback, int transport)
arbel03

1
О, дякую за цей натяк, отже, нарешті вони зробили його придатним для життя.
Домінік Гебхарт

2

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


2

Можливо, трохи затримується, але, можливо, ваш біль можна трохи полегшити;)

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

Тому, якщо ваш варіант використання керується функціями, і вам потрібен лише базовий обмін даними, я б запропонував розглянути фреймворки та бібліотеки, які можуть забезпечити міжплатформене спілкування для вас, без необхідності створювати його з нуля.

Наприклад: http://p2pkit.io або google поблизу

Застереження: я працюю в Uepaa, розробляючи p2pkit.io для Android та iOS.



0

Пристрої iOS завжди мають бути периферійними або центральними, але пристрої Android не можуть бути рідко. У цьому випадку ваш пристрій iOS повинен бути периферійним, а Android - центральним. Ми можемо думати, що периферійний - це сервер, а центральний - це клієнт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.