4

我正在寻找一种使用 L2CAP 连接到 HID 设备(鼠标)的方法,这适用于 android 应用程序。但是在接受连接时出现错误。我正在使用反射来创建套接字。但有些事情是错误的。有人可以指导我使用这种方式使用 L2CAP 连接到 HID 设备但没有生根的 android 示例代码。

4

1 回答 1

11

您的Android 设备Android 版本是什么?如果是 Android 4.2,他们现在正在使用我所理解的 Broadcom,因此我们只能创建 SDP 连接。

在我的 Nexus 7(带有 CyanogenMod ROM 10 的 Android 4.2.2)和 Wiimote 之间建立蓝牙连接时,我遇到了同样的问题。这是一个 HID 设备,所以我需要使用 L2CAP。最新版本的 Android 能够创建这种连接(我们可以通过查看市场来确定)。如果您在市场上搜索处理此问题的应用程序,您会通过查看说明发现不支持所有 Android 版本 4.0+ 的设备。

我几分钟前才发现这篇文章可以帮助你:stackoverflow.com/a/7838587/1772805

如果你解决了这个问题,请告诉我。如果我发现任何东西,我会与您保持联系。

编辑#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。如果有人知道是否可以重写此文件或如何使用外部 C 库将 L2CAP 功能添加到 Android。恐怕这不是一项简单的任务。

于 2013-04-01T16:55:42.103 回答