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

InputStream inStrm = socket.getInputStream();

接下来,我尝试读取输入流,但是它说没有字节可用。
int nBytesAvail = inStrm.available(); // always gives me 0

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

异常显示:软件导致连接中断

如果尝试写入流,则会出现另一个异常:传输端点未连接。

可能发生两件事之一。
  • 我首先担心的是,键盘上会说出HID协议(protocol),在我说出正确的咒语之前,它不会泄露其 secret 。那是对的吗?还是应该由BT socket 堆栈自动进行处理?套接字流似乎是标准的串行流,但我不确定这是正确的。
  • 我的第二个担心是因为这是Galaxy Tab,所以我的问题可能仅仅是三星删除了该操作系统的特定部分(但我是否仍会从套接字连接中获得有效的输入流?)。据广泛报道,尽管BT文件传输确实可以正常工作,但使用标准的Android BT实用工具,美国版的Tab根本无法连接到任何BT HID。

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

    如果我完全以错误的方式进行操作(请参阅#1),或者注定要失败(请参阅#2),我不愿意花更多时间。

    最佳答案

    所有普通的蓝牙键盘都实现HID配置文件,该配置文件需要L2CAP连接。到目前为止,Android仅提供使用RFCOMM连接的功能。您将需要使用 native 开发套件,并使用C编写键盘代码以使用bluez来实现您的目标。看看使用Nintendo WiiMote的应用程序。 WiiMote还实现了HID配置文件。

    10-08 17:09