Подключение к устройству Bluetooth HID (мышь) с помощью L2CAP

Я пытаюсь найти способ подключения к HID bevice (мыши) с помощью L2CAP, это для приложения для Android. но я получаю ошибку при принятии соединения. Я использую отражение, чтобы создать сокет. но что-то не так с этим. Кто-нибудь может направить меня к примеру кода для Android, который подключается к HID-устройству, используя L2CAP таким образом, но без рута.

1 ответ

Какое у вас устройство Android и версия Android? Если это Android 4.2, то теперь они используют Broadcom, как я понял, и поэтому мы можем только создать соединение SDP.

У меня такая же проблема при подключении Bluetooth между Nexus 7 (Android 4.2.2 с CyanogenMod ROM 10) и Wiimote. Это устройство HID, поэтому мне нужно использовать L2CAP. Последние версии Android смогли создать это соединение (это можно выяснить, просто взглянув на рынок). Если вы ищете приложение для обработки этого на рынке, вы увидите, посмотрев описание, что все устройства с версией Android 4.0+ не поддерживаются.

Я только что нашел этот пост несколько минут назад, который может помочь вам: /questions/13288220/kak-razgovarivat-s-klaviaturoj-bluetooth/13288236#13288236

Дайте мне знать, если вы решите это. Я буду держать вас в курсе, если найду что-нибудь.

РЕДАКТИРОВАТЬ #1: я попробовал решение по ссылке выше. Я изменил его, чтобы использовать другой конструктор, как это:

private static final int TYPE_RFCOMM = 1;
private static final int TYPE_SCO = 2;
private static final int TYPE_L2CAP = 3;

/**
 * Create a BluetoothSocket using L2CAP protocol
 * Useful for HID Bluetooth devices
 * @param BluetoothDevice
 * @return BluetoothSocket
 */
private static BluetoothSocket createL2CAPBluetoothSocket(BluetoothDevice device){
  int type        = TYPE_L2CAP; // L2CAP protocol
  int fd          = -1;         // Create a new socket
  boolean auth    = false;      // No authentication
  boolean encrypt = false;      // Not encrypted
  int port        = 0;          // port to use (useless if UUID is given)
  ParcelUuid uuid = new ParcelUuid(wiimoteUuid); // Bluetooth UUID service

  try {
    Constructor<BluetoothSocket> constructor = BluetoothSocket.class.getDeclaredConstructor(
      int.class, int.class, boolean.class, boolean.class,
      BluetoothDevice.class, int.class, ParcelUuid.class);
    constructor.setAccessible(true);
    BluetoothSocket clientSocket = (BluetoothSocket) constructor.newInstance(
      type, fd, auth, encrypt, device, port, uuid);
    return clientSocket;
  } catch (Exception e) {
    e.printStackTrace();
    return null;
  }
}

Мне удалось создать сокет, но когда я вызываю метод connect()Я получаю эту ошибку: bt l2cap socket type not supported, type:3, Этот журнал - очень плохой новый для меня, потому что я нашел эту ветку, которая говорит, что Android 4.2 не поддерживает L2CAP (или просто отключен Google..).

Поскольку на моем устройстве установлен CyanogenMod 10, эта функция, возможно, вернется в новой версии. Я надеюсь..

РЕДАКТИРОВАТЬ #2: Вот ссылка на файл C, содержащий причину проблемы: btif_sock.c. Если кто-нибудь знает, возможно ли переписать этот файл или как добавить функцию L2CAP в Android с внешней библиотекой C. Боюсь, это не простая задача.

Другие вопросы по тегам