如何与蓝牙键盘通话?

时间:2010-11-24 03:00:24

标签: android bluetooth keyboard hid

我写过一个连接蓝牙键盘的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,我的问题可能只是因为三星已经删除了操作系统的特定部分(但我仍然会从套接字连接中获得有效的输入流吗? )。据广泛报道,美国版本的Tab根本不会使用标准的Android BT实用程序连接到任何BT HID,尽管BT文件传输工作正常。

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

由于Stack限制,L2CAP协议并非在所有设备上都可用,因此目前无法在所有设备上运行解决方案。

答案 2 :(得分:1)

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

我猜您正在尝试这样做,因为您的Tab根本不会连接到BT键盘。这正是我在四月之前尝试做的事情。从我记忆中读到的,魔术咒语部分应该由Android自动处理:当你进行HID连接时,Android弹出一个消息窗口在键盘上输入代码,然后套接字连接返回到你的程序(或者那种效果)。

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

我确定您已尝试过此功能,但要测试它,请转到设置&gt;无线和网络&gt; Blutetooth设置,你应该看到列表中的键盘是否有HID支持。点击键盘输入,它应该立即连接。如果它只是无限延迟或者如果收到错误消息,那么您就没有HID支持。