2016-03-12 2 views
2

Обычный способ подключения к устройству Bluetooth - это соединение.Bluetooth-соединение без сопряжения

Нам необходимо подключиться к устройству ненормально: используя только MAC-адрес Bluetooth. Мы не хотим запрашивать PIN-код.

Мы знаем, что устройство поддерживает эту технику, но мы не можем найти способ сделать это на Android.

Сокращенный код выглядит следующим образом:

String mac_address = “00:11:22:33:44:55” 
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

    BluetoothDevice bluetoothDevice = mBluetoothAdapter.getRemoteDevice(mac_address); 

    Method m = bluetoothDevice.getClass().getMethod("createRfcommSocket", 
      new Class[] {int.class}); 
    BluetoothSocket socket = (BluetoothSocket) m.invoke(device, 1); 

    socket.connect(); 

Проблема заключается в том, что при socket.connect() мы запрошен PIN-код. PIN-код не нужен для этого устройства, поэтому нам не нужно запрашивать PIN-код.

Причина мы знаем PIN-код не требуется:

  1. Мы производим это устройство и записать прошивку.
  2. Мы можем подключиться к нему с помощью программы на окнах, написанных на C#.

Как мы можем изменить код, чтобы он не запрашивал PIN-код?

[Редактировать, чтобы тест предложения в комментарии]

Мы протестировали метод createInsecureRfcommSocketToServiceRecord так:

ParcelUuid list[] = device.getUuids(); 
BluetoothSocket socket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(list[0].getUuid()); 

Тогда мы получим ошибку, как это:

I/InputDispatcher( 382): Delivering touch to current input target: action: 0x1 
I/InputDispatcher( 382): Delivering touch to current input target: action: 0x1 
V/BluetoothSocket.cpp(16956): initSocketNative 
V/BluetoothSocket.cpp(16956): ...fd 66 created (RFCOMM, lm = 0) 
V/BluetoothSocket.cpp(16956): initSocketFromFdNative 
I/BluetoothPolicyService( 382): getBluetoothDataTransferAllowed 
D/BluetoothUtils(16956): isSocketAllowedBySecurityPolicy start : device null 
V/BluetoothService.cpp( 382): createDeviceNative 
V/BluetoothService.cpp( 382): ... address = 
V/BluetoothEventLoop.cpp( 382): onCreateDeviceResult 
V/BluetoothEventLoop.cpp( 382): onCreateDeviceResult 
E/BluetoothEventLoop.cpp( 382): onCreateDeviceResult: D-Bus error: org.bluez.Error.AlreadyExists (Already Exists) 
D/BluetoothEventLoop( 382): Result of onCreateDeviceResult:1 
V/BluetoothService.cpp( 382): discoverServicesNative 
V/BluetoothService.cpp( 382): ... Object Path = /org/bluez/1100/hci0/dev_00_11_22_33_44_55 
V/BluetoothService.cpp( 382): ... Pattern = , strlen = 0 
D/FStest ( 633): check default 
D/FStest ( 633): check default 
+0

Я считаю, что метод 'createInsecureRfcommSocketToServiceRecord (UUID uuid)' -> * Создает разъем RFCOMM BluetoothSocket, готовый к запустите незащищенное исходящее соединение с этим удаленным устройством, используя SDU-поиск uuid. * будет работать. Ты пробовал ? – Mackovich

+0

@Michael. какой-либо прогресс? – lolo

ответ

2

Это, безусловно, возможно. Вы должны взглянуть на демо-приложение для Android BluetoothChat на: http://developer.android.com/samples/BluetoothChat/src/com.example.android.bluetoothchat/BluetoothChatService.html они используют незащищенный канал:

public ConnectThread(BluetoothDevice device, boolean secure) { 
    mmDevice = device; 
    BluetoothSocket tmp = null; 
    mSocketType = secure ? "Secure" : "Insecure"; 

    // Get a BluetoothSocket for a connection with the 
    // given BluetoothDevice 
    try { 
     if (secure) { 
      tmp = device.createRfcommSocketToServiceRecord(
        MY_UUID_SECURE); 
     } else { 
      tmp = device.createInsecureRfcommSocketToServiceRecord(
        MY_UUID_INSECURE); 
     } 
    } catch (IOException e) { 
     Log.e(TAG, "Socket Type: " + mSocketType + "create() failed", e); 
    } 
    mmSocket = tmp; 
} 

на стороне клиента. И на стороне сервера:

public AcceptThread(boolean secure) { 
      BluetoothServerSocket tmp = null; 
      mSocketType = secure ? "Secure" : "Insecure"; 

      // Create a new listening server socket 
      try { 
       if (secure) { 
        tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, 
          MY_UUID_SECURE); 
       } else { 
        tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(
          NAME_INSECURE, MY_UUID_INSECURE); 
       } 
      } catch (IOException e) { 
       Log.e(TAG, "Socket Type: " + mSocketType + "listen() failed", e); 
      } 
      mmServerSocket = tmp; 
     } 

Имейте в виду, что для этого вам нужен MAC-адрес Bluetooth. Google пытается скрыть адрес и сделать его непригодным (чтобы предотвратить отслеживание). У вас возникнут проблемы с получением собственного MAC-адреса, а MAC-адреса удаленных устройств будут рандомизированы и изменятся через некоторое время: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id

+0

У меня есть адрес mac, и все же он запрашивает сопряжение устройства при использовании 'createInsecureRfcommSocketToServiceRecord' –