【问题标题】:How to talk to a Bluetooth keyboard?如何与蓝牙键盘通话?
【发布时间】:2011-05-14 20:50:23
【问题描述】:

我编写了一个连接到蓝牙键盘的 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)。

【问题讨论】:

    标签: android bluetooth keyboard hid


    【解决方案1】:

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

    【讨论】:

    • 你也可以使用反射和java代码,就像我上面贴的例子一样。
    【解决方案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 协议并非在所有设备上都可用,因此目前不可能在所有设备上工作的解决方案。

    【讨论】:

      【解决方案3】:

      有些 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 支持。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 2020-05-06
        • 2015-11-23
        • 2011-12-17
        • 1970-01-01
        相关资源
        最近更新 更多