6

我编写了一个连接到蓝牙键盘的 Android 应用程序。它通过 BT 套接字连接到键盘并获取套接字的输入流。

InputStream inStrm = socket.getInputStream();

接下来我尝试读取输入流,但它说没有可用的字节。

int nBytesAvail = inStrm.available(); // always gives me 0

或者

int  dataByte = inStrm.read(); // always generates IOException

异常说:软件导致连接中止

如果我尝试写入流,我会得到另一个异常:传输端点未连接。

可能会发生两件事之一。

  1. 我的第一个担心是键盘上有 HID 协议,在我说出正确的咒语之前,它不会泄露它的秘密。那是对的吗?还是应该由BT套接字堆栈自动处理?套接字流似乎是标准的串行流,我不确定这是否正确。

  2. 我的第二个担心是,由于这是 Galaxy Tab,我的问题可能只是操作系统的特定部分已被三星删除(但我仍会从套接字连接获得有效的输入流吗?)。据广泛报道,尽管 BT 文件传输工作正常,但美国版 Tab 根本不会使用标准的 Android BT 实用程序连接到任何 BT HID。

我想第三种可能性是我只是在击键发生时错过了它们。我不知道 Java 对来自 HID 的 BT 数据做了多少缓冲,但如果建立了套接字连接,数据应该出现在输入流中,不是吗?

我不愿意在这方面投入更多的时间,以防我完全错误地处理它(参见#1),或者它注定要失败(参见#2)。

4

3 回答 3

4

所有普通的蓝牙键盘都实现了 HID 配置文件,这需要 L2CAP 连接。Android 到目前为止只提供了使用 RFCOMM 连接的能力。您需要使用本机开发工具包并用 C 编写键盘代码以使用 bluez 来实现您的目标。查看使用 Nintendo WiiMote 的应用程序。WiiMote 还实现了 HID 配置文件。

于 2011-09-22T12:57:40.283 回答
2

mringwal 的回答是正确的,除了 NDK 方法之外,还可以在某些设备上使用反射,来实现 L2CAP 连接:

public static BluetoothSocket createL2CAPBluetoothSocket(String address, int psm){
        return createBluetoothSocket(TYPE_L2CAP, -1, false,false, address, psm);
    }
    // method for creating a bluetooth client socket
    private static BluetoothSocket createBluetoothSocket(
            int type, int fd, boolean auth, boolean encrypt, String address, int port){
        try {
            Constructor<BluetoothSocket> constructor = BluetoothSocket.class.getDeclaredConstructor(
                    int.class, int.class,boolean.class,boolean.class,String.class, int.class);
            constructor.setAccessible(true);
            BluetoothSocket clientSocket = (BluetoothSocket) 
                constructor.newInstance(type,fd,auth,encrypt,address,port);
            return clientSocket;
        }catch (Exception e) { return null; }
    }

其中 TYPE_L2CAP 是具有常量值 3 的整数。

请注意,此方法仅适用于某些 android 设备。

编写 HID 应用程序并不是一项简单的任务。您需要实现一个报告描述符解析器,这是一个用于“发现”远程 HID 设备的功能(特殊键、功能)的组件。您还需要了解 HID 协议和工作流程,可在此处获得副本: http ://www.dawidurbanski.pl/public/download/projekty/bluepad/HID_SPEC_V10.pdf

已经有专业的程序可以做到这一点,在 Android 上支持 HID,例如这个软件:http ://teksoftco.com/index.php?section=product&pid=24

由于堆栈限制,L2CAP 协议并非在所有设备上都可用,因此目前不可能在所有设备上工作的解决方案。

于 2011-10-20T15:44:12.103 回答
1

有些 Galaxy Tab 支持 HID 协议,有些不支持。这取决于运营商,而不是三星。我的 Verizon Galaxy Tab 没有 HID 支持,尽管 T-Mobile 有它。但在今年 4 月,Verizon(不是三星)推出了包含 HID 支持的固件升级,因此我的 BT 键盘和鼠标开始工作。我运行的是 Android 2.2,我的固件版本号是 SCH-I800.EC02。

我猜您正在尝试这样做,因为您的 Tab 根本无法连接到 BT 键盘。这正是我在四月之前尝试做的事情。根据我记得读过的内容,魔法咒语部分应该是由 Android 自动处理的:当你建立 HID 连接时,Android 会弹出一个消息窗口在键盘上输入代码,然后将套接字连接返回给你的程序(或类似的东西)。

因此,如果您无法让 Tab 正常连接到键盘,那么您的 HID 配置文件已被禁用,并且(afaik)没有任何编程可以使其工作,除非用 Java 重写 HID 配置文件。

我确定您已经尝试过,但要对其进行测试,请转到“设置”>“无线和网络”>“蓝牙设置”,无论您是否支持 HID,您都应该在列表中看到键盘。点击键盘条目,它应该立即连接。如果它只是无限期延迟或者如果您收到错误消息,那么您没有 HID 支持。

于 2011-09-23T10:43:31.773 回答