2017-01-12 3 views
5

Я полный новичок в мире Android. Пожалуйста, простите меня, если мой вопрос слишком наивен.Совместимость Bluetooth OOB действительно поддерживается в Android?

Я работаю над примером приложения, чтобы реализовать Bluetooth-сопряжение между Linux Box (FC-21 с Bluez-5.42) и планшет Android. Я использую NFC для передачи имени Bluetooth, адреса и данных OOB с ПК на Android. Я могу отправить вышеуказанные данные с ПК на Android через NFC (луч точно), и я могу разобрать и декодировать все данные со стороны Android. С адресом Bluetooth ящика Linux, доступного на Android, я могу позвонить CreateBond(), чтобы соединить планшет Android с Linux Box. Я тестировал эту часть, и она работает так, как ожидалось.

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

Для этого, когда я заменяю CreateBond() на CreateBondOutOfBand() [используя отражение], запрос на соединение не отправляется с Android на ПК с Linux.

 try { 
     showLog("Pairing started"); 
     Method m = bDev.getClass().getMethod("createBondOutOfBand", byte[].class, byte[].class); 
     showLog("Found method"); 
     Boolean flag = (Boolean) m.invoke(bDev, Hash, Rand,(Object[]) null); 
     //Method m = bDev.getClass().getMethod("createBond", (Class[]) null); 
     //Boolean flag = (Boolean) m.invoke(bDev, (Object[]) null); 
     if(flag) 
      showLog("Pairing successfully finished."); 
     else 
      showLog("Pairing failed"); 
    } catch (Exception e) { 
     showLog("Pairing failed."); 
    } 

Я искал в Интернете, но не нашел конкретных доказательств того, что соединение OOB может быть реализовано на Android.

Кроме того, чтобы проверить поведение собственного Android, я создал тег NFC с именем Bluetooth, адресом и данными OOB в ящике Linux. Когда я держал тег против планшета Android, было запущено спаривание Блюеттота, но оно все еще не использовало модель ассоциации OOB.

Мои вопросы заключаются в следующем,

  • ли OOB модель ассоциации действительно поддерживается на Android?
  • Если поддерживается модель ассоциации OOB, используется CreateBondOutOfBand() используемый API или какой-либо другой API, который мне нужно использовать?

Любые материалы были бы весьма полезными.

Спасибо,

Саи

+0

Эй, мы сталкиваемся с той же проблемой. Вы нашли решение? – Seynorth

+0

Здравствуйте, я также хочу знать, нашли ли вы ответ – ymerdrengene

+0

@Seynorth, ymerdrengene Извините, у меня не было времени оглянуться назад. – saai63

ответ

0

Я не использую NFC, но я использую отражение использовать createBondOutOfBand. Кроме того, этот код действительно работает на Motorola lineage rom 7.1 (на Moto G4 play и Moto E 2015) и на официальном Samsung 7.0 (Galaxy S6), но не работает на LG G5 или G6 официальный rom 7.0 (аутентификация всегда терпит неудачу).

Вот мой код (на самом деле не отличный от вашего @ saai63).

private boolean createBondOutOfBand(final byte[] oobKey) { 
    try { 
     if (DEBUG) { 
      Log.d(LOG_TAG, "createBondOutOfBand entry"); 
     } 

     Class c = Class.forName("android.bluetooth.OobData"); 
     Constructor constr = c.getConstructor(); 
     Object oobData = constr.newInstance(); 
     Method method = c.getMethod("setSecurityManagerTk", byte[].class); 
     method.invoke(oobData, oobKey); 

     Method m = mBluetoothDevice.getClass().getMethod("createBondOutOfBand", int.class, c); 
     boolean res = (boolean)m.invoke(mBluetoothDevice, BluetoothDevice.TRANSPORT_AUTO, oobData); 

     if (DEBUG) { 
      Log.d(LOG_TAG, "createBondOutOfBand result => " + res); 
     } 

     return res; 

    } 
    catch (Exception e) { 
     Log.e(LOG_TAG, "Error when calling createBondOutOfBand", e); 
     return false; 
    } 
} 
Смежные вопросы