如何与蓝牙键盘通话?

Jef*_*eff 6 keyboard android bluetooth hid

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

InputStream inStrm = socket.getInputStream();
Run Code Online (Sandbox Code Playgroud)

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

int nBytesAvail = inStrm.available(); // always gives me 0
Run Code Online (Sandbox Code Playgroud)

要么

int  dataByte = inStrm.read(); // always generates IOException
Run Code Online (Sandbox Code Playgroud)

例外情况说:软件导致连接中止

如果我尝试写入流,我会得到另一个例外:传输端点未连接.

可能发生两件事之一.

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

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

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

我不愿意花更多的时间来解决这个问题,以防我完全采用错误的方式(参见#1),或注定会失败(见#2).

小智 4

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