2010-12-16 2 views
3

안드로이드에 특정 링크 키를 이미 존재하는 원격 블루투스 장치 인스턴스와 연결시키는 방법이 있는지 확인하려고합니다.페어링하지 않고 안드로이드에 링크 키 지정하기

필자가 원하는 것은 페어링 또는 리어 페어링 절차를 거치지 않고 발견 할 수없는 블루투스 장치와의 연결을 만드는 것입니다.

사용자 지정 독점적 인 페어링 메커니즘으로 작업 중이므로 표준 페어링 절차에서 장치와 링크 키를 설정할 수 없습니다. 네이티브 코드를 사용하지 않고이 작업을 수행하는 것을 선호하지만, 그렇게해야한다면 할 것입니다.

답변

2

링크 키를 페어링 프로세스를 거치지 않고 장치에 연결하는 공개 API 메커니즘이 없습니다.

페어링 후 장치가 결합되면이 연결이 자동으로 생성되고 (일명 본딩) 이전에 생성 된 링크 키가 다시 연결됩니다.

기기를 찾을 수없는 경우에도 기기의 블루투스 주소를 아는 경우 본드/페어를 연결할 수 있어야합니다.

내부/개인 메커니즘을 기반으로 안드로이드 bluez 코드를 변경하고, 사전 생성 된 링크 키 등을 공급하기 위해 연결하는 것은 이론적으로 가능하며 어려운 프로젝트 및 맞춤 솔루션이 될 것입니다. 에는 피드 키/연결 키가 있다고 가정합니다. 참고 - 링크 키는 장치 시계 이외에 두 장치의 장치 주소의 함수입니다. 블루투스

+0

예 위의 내용을 모두 알고 있습니다. Bluez 코드를 변경하려면 지금까지해야합니까? 이 작업을 리플렉션을 사용하여 수행 할 수 있기를 희망했습니다. 키를 설정하는 것으로 보이는이 기능을 안드로이드 소스에서 발견했습니다. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2 /android/bluetooth/BluetoothDevice.java#BluetoothDevice.setPasskey%28int%29 –

+0

궁극적으로 기본 BlueZ 코드와 통신하는 비공개 API/래퍼입니다. 여기에서 링크 키를 설정하는 데는 아무 것도 없습니다. –

+0

그래서 이전에 언급 한 setPasskey 래퍼를 사용하여 자바 API에서 링크 키를 설정할 수 없습니까? 아니면 이것이 올바른 매개 변수 (패스 키! = 링크 키)가 아니며 링크 키와 관련된 모든 것이 BlueZ에서 처리된다고 말하고 있습니까? –

16

이 문제를 직접 해결해야합니다. 중요한 단계는 내 프로젝트에 android.bluetooth 패키지를 추가하고 IBluetooth.aidl 및 IBluetoothCallback.aidl (링크에서 찾을 수 있음) 파일을 추가하라고 알려준 this code을 찾는 것입니다.

IBluetooth 개체를 인스턴스화하면 BluetoothService 클래스에 액세스 할 수 있으며 IBluetooth.aidl의 모든 방법을 사용할 수 있습니다. 나는에 관심이 방법은 다른 블루투스 코드가 페어링 대화 상자가 이미 호출 된 것으로 예상, 그리고 BluetoothEventLoop 클래스는 HashMap에 그 추적 사용하여

setPin(String address, byte[] pin) 

문제였다.

setPin(<address>) called but no native data available, ignoring. Maybe the PasskeyAgent Request was cancelled by the remote device or by bluez. 

그래서 (채팅 예제를 사용하여) 나에 대한 해결 방법은 페어링을 시작하기 위해 연결 스레드를 시작했다 : 당신이 페어링 요청을 시작하지 않고 setPin()를 호출하려고하면이 같은 오류를 볼 수 있습니다 요청한 다음 스레드가 시작되었는지 확인하기 위해 500ms 동안 기다린 다음 setPin()을 호출합니다.

+5

나는이 보조 코드를 만들지 않고도이 작업을 수행 할 수 있었고, byte [] ar = new byte [] {0x31,0x32,0x33,0x34}; Method m2 = btDevice.getClass(). getMethod ("setPin" 새로운 클래스 [] {Array.newInstance (byte.class, 4) .getClass()}); \t \t m2.invoke (btDevice, ar); – JPM

+0

setPin 메서드를 사용하여 128 비트 링크 키가 아닌 페어링 중에 사용 된 핀 값을 설정하는 것이 아닌가? –

+0

맞습니다. "페어링 또는 리어 페어링 절차를 거치지 않고는 검색 할 수없는 블루투스 장치와의 연결을 만드십시오"에 대한 답변입니다. – hemisphire