2010-11-24 3 views
6

블루투스 키보드에 연결하는 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이기 때문에 단순히 OS의 특정 부분이 Samsung에 의해 제거되었다는 것입니다 (그러나 여전히 소켓 연결로부터 유효한 입력 스트림을 얻는가?) . BT 파일 전송은 정상적으로 작동하지만 탭의 미국 버전은 표준 Android BT 유틸리티를 사용하는 BT HID에 연결되지 않는다고 널리 알려져 있습니다.

세 번째 가능성은 필자가 키 입력을 놓치고있는 것입니다. 나는 자바가 HID에서 오는 BT 데이터를 얼마나 버퍼링하는지 알지 못한다. 그러나 소켓 연결이 이루어지면 데이터는 입력 스트림에 나타나야한다.

나는 완전히 잘못된 방향으로 가고 싶거나 (# 1 참조), 실패 할 수밖에없는 경우 (# 2 참조)에 대비하여 훨씬 더 많은 시간을 투자하기를 꺼립니다.

답변

4

모든 일반 Bluetooth 키보드는 L2CAP 연결이 필요한 HID 프로필을 구현합니다. Android는 지금까지 RFCOMM 연결을 사용할 수있는 기능 만 제공합니다. 네이티브 개발 키트를 사용하고 bluez을 사용하여 C로 키보드 코드를 작성하여 목표를 달성해야합니다. Nintendo WiiMote를 사용하는 앱을 살펴보십시오. WiiMote는 또한 HID 프로파일을 구현합니다.

+0

위의 예와 같이 반사 및 자바 코드를 사용할 수도 있습니다. – radhoo

1

일부 갤럭시 탭은 HID 프로토콜을 지원하지만 일부는 지원하지 않습니다. 그것은 항공사가 아닌 삼성에 달려 있습니다. 내 Verizon Galaxy Tab은 T-Mobile의 경우에도 HID 지원없이 제공되었습니다. 그러나 올해 4 월 Verizon (삼성이 아님)은 HID 지원을 포함한 펌웨어 업그레이드를 실시하여 BT 키보드 & 마우스가 작동하기 시작했습니다. Android 2.2를 실행하고 펌웨어 빌드 번호는 SCH-I800.EC02입니다.

내 생각에 탭이 BT 키보드에 전혀 연결되지 않기 때문에이 작업을 수행하려고합니다. 이것은 정확하게 내가 4 월 이전에하려고했던 것입니다. 내가 읽은 것을 기억하면, 마술 주문은 안드로이드가 자동으로 처리하도록되어있다. HID 연결을 만들면 안드로이드는 키보드에 코드를 입력하라는 메시지 창을 띄운 다음 소켓 연결이 프로그램에 리턴된다. 또는 그 효과에 대한 것).

Tab을 키보드에 정상적으로 연결할 수없는 경우 HID 프로필이 비활성화되어 Java에서 HID 프로필을 다시 작성하는 경우를 제외하면 (afaik) 프로그래밍하지 않아도됩니다. .

이미 시도했지만 설정> 무선 및 네트워크> Blutetooth 설정으로 이동하여 테스트하려면 HID 지원 여부에 관계없이 목록에 키보드가 표시되어야합니다. 키보드 입력을 탭하면 바로 연결됩니다. 무한정 지연되거나 오류 메시지가 표시되면 HID 지원이 제공되지 않습니다.

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 프로토콜 및 작업 흐름을 배울 필요가있을 것이다, 사본은 여기에 있습니다 : 정확히하고 전문 프로그램, 안드로이드에 대한 지원 HID, 예를 들어이 소프트웨어를 참조 이미 있습니다 http://www.dawidurbanski.pl/public/download/projekty/bluepad/HID_SPEC_V10.pdf

: http://teksoftco.com/index.php?section=product&pid=24

스택 제한으로 인해 모든 장치에서 L2CAP 프로토콜을 사용할 수 없으므로 모든 장치에서 작동하는 솔루션은 현재 불가능합니다.

관련 문제