Как разговаривать с клавиатурой Bluetooth? - PullRequest
6 голосов
/ 24 ноября 2010

Я написал приложение для Android, которое подключается к клавиатуре Bluetooth.Он подключается через разъем BT к клавиатуре и получает входной поток сокета.

InputStream inStrm = socket.getInputStream();

Затем я попытался прочитать поток ввода, но он говорит, что нет доступных байтов.

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

Или

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

Исключение гласит: Программное обеспечение вызвало прерывание соединения

Если я попытаюсь выполнить запись в поток, я получу еще одно исключение: конечная точка транспорта не подключена.

Может происходить одно из двух.

  1. Мой первый страх - это то, что есть HID-протокол, с которым нужно говорить на клавиатуре, и он не разглашает свои секреты, пока я не произнесуправильное заклинание.Это верно?Или об этом должен позаботиться стек BT BT автоматически?Поток сокетов кажется стандартным последовательным потоком, и я не уверен, что это правильно.

  2. Мой второй страх состоит в том, что, поскольку это Galaxy Tab, моя проблема может заключаться в том, чтоэта конкретная часть ОС была удалена Samsung (но получу ли я по-прежнему действительный входной поток из сокетного соединения?).Широко распространено сообщение о том, что американские версии Tab просто не будут подключаться к каким-либо BT HID с использованием стандартных утилит Android BT, хотя передача файлов BT работает нормально.

Полагаю, третьявероятность, что я просто пропускаю нажатия клавиш, когда они случаются.Я не знаю, сколько Java выполняет буферизацию данных BT, поступающих из HID, но если соединение с сокетом установлено, данные должны появиться во входном потоке, нет?

Я не хочу ставитьгораздо больше времени для этого на случай, если я пойду совершенно неправильно (см. # 1), или он обречен на неудачу (см. # 2).

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

Все обычные Bluetooth-клавиатуры реализуют профиль HID, для которого требуется соединение L2CAP.До сих пор Android предоставляет только возможность использовать соединения RFCOMM.Вам нужно будет использовать Native Development Kit и написать код клавиатуры на C, чтобы использовать bluez для достижения своей цели.Посмотрите на приложения, которые используют Nintendo WiiMote.WiiMote также реализует профиль HID.

2 голосов
/ 20 октября 2011

Ответ 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

Уже есть профессиональные программы, которые делают именно это, поддерживая HID на Android, см., Например, это программное обеспечение: http://teksoftco.com/index.php?section=product&pid=24

Из-за ограничений стека протокол L2CAP доступен не на всех устройствах, поэтому решение, которое работает на ВСЕХ устройствах, в настоящее время невозможно.

1 голос
/ 23 сентября 2011

Некоторые Galaxy Tab поддерживают протокол HID, некоторые нет.Это зависит от носителя, а не от Samsung.Моя Verizon Galaxy Tab была без поддержки HID, хотя у T-Mobile она была.Но в апреле этого года Verizon (не Samsung) выпустил обновление прошивки, которое включало поддержку HID, так что моя BT клавиатура и мышь начали работать.Я использую Android 2.2, и у меня номер сборки прошивки SCH-I800.EC02.

Я предполагаю, что вы пытаетесь это сделать, потому что ваша вкладка вообще не подключается к клавиатуре BT.Это именно то, что я пытался сделать до апреля.Из того, что я помню, магическая часть заклинания должна обрабатываться Android автоматически: когда вы устанавливаете HID-соединение, Android открывает окно сообщения, чтобы ввести код на клавиатуре, затем сокетное соединение возвращается вашей программе (или что-то в этом роде).

Так что, если вы не можете заставить Tab подключаться к клавиатуре в обычном режиме, то ваш HID-профиль был отключен, и (afaik) никакое количество программ не будет работать, кромевозможно, переписать профиль HID в Java.

Я уверен, что вы уже пробовали это, но чтобы проверить это, перейдите в Настройки> Беспроводные сети> Настройки Blutetooth, вы должны увидеть клавиатуру в списке, илине у вас есть HID поддержка.Нажмите на запись клавиатуры, она должна подключиться сразу.Если это просто задерживается на неопределенное время или вы получаете сообщение об ошибке, то у вас нет поддержки HID.

...