2012-09-18 2 views
7

여기 거래가 있습니다. 블루투스를 사용할 수있는 두 개의 Galaxy Nexus 휴대 전화가 있습니다.Android 블루투스 IOException : 연결이 거부되었습니다

저는 장치 검색 및 연결에 사용하는 블루투스 연결 관리 앱을 작성했습니다. 또한 장치에서 지원할 수있는 사용 가능한 모든 UUID를 출력합니다.

http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm 다음 표준 UUID는 Galaxy Nexus 기기에서 공개됩니다.

  • 0x1116 - NAP
  • 0x112f - PBAP (전화 번호부 액세스 프로파일)
  • 0x111f - HFP (핸즈프리)
  • 0x1105 - OPP (개체 푸시 프로필)
  • 0x1112 - HSP (헤드셋 프로필)
  • 0x110c - AVRCP
  • 0x110a - A2DP

OPP 프로필 (UUID 00001105-0000-1000-8000-00805F9B34FB)을 통해 연결하고 장치간에 개체 (파일)를 푸시하려고합니다. 나는 모든 방법을 발견, 쌍/본드 (스레딩 등) 및 모든 블루투스 연결을 관리하는 방법에 대한 전체 Android API documentation 갔다. SPP (0x1101) 프로파일을 통해 기존 보드 장치에 성공적으로 연결하고 대화 할 수있었습니다.

두 갤럭시 넥서스 폰간에 socket.connect()을 사용하려고하면 페어링 대화 상자가 나타나며 두 기기에서 Pair 버튼을 클릭합니다. 그 후에 나는 즉시 Connection Refused IOException을 얻습니다. 페어링이 한 번 발생하면 보안 링크가 캐시 된 이후에 어떤 의미가 있는지 다시 묻지 않습니다.

표준 UUID를 사용하여 이러한 표준 프로파일에 연결할 수없는 경우 그 표준 UUID가 노출되는 이유는 무엇입니까? 내 앱에서 이러한 프로필 중 하나에 연결하여 상호 작용할 수 있습니까? 내 앱이 어떻게 든 신뢰할 수 없기 때문입니까? 이상한 점은 Android의 Share 기능도 전혀 작동하지 않는다는 것입니다. Android에서 완전히 손상된 것입니까?

문서와 같이 "잘 알려진 UUID SPP one 0x1101"을 사용하는 것에 대한 힌트를주지 마십시오. 이것은 내가 원하는 것이 아닙니다. 나는이 물건들이 어떻게 작동하는지에 대해 꽤 잘 이해하고 있으며, 문제에 대한 실질적인 해결책이나 설명을 찾고 있습니다.

일반적인 "리플렉션"솔루션을 보았지만 안드로이드에서 여전히이 문제가 왜 발생하는지 이해할 수 없습니까? 사람들이 왜이 작품을 만들기 위해 반성을 사용합니까? 이 문제를 해결하기 위해 Android에 버그를 제출할 수 있습니까?

해당 UUID가 표준 인 경우 모든 앱이 연결하고 상호 작용할 수 있어야합니다. 왜 이것이 문제이며이 예외가 발생합니까?

미리 감사드립니다.

UPDATE 그래서 어떤 이유로 안드로이드 시스템에서 개체 푸시는 작업을 시작했다. 실제로 내 앱을 통해 연결을 시도했지만 작동하지 않았습니다. 그런 다음 연락처 앱으로 이동하여 마술처럼 작동하는 연락처를 공유하려고했습니다. 그럼, 내 애플 리케이션에 가서 지금은 작동 ... 와우. 이것은 매우 이상하며, 이에 대한 설명이 있어야합니다.

+0

올바른 사용 권한을 설정 했습니까? http://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions – Lars

+0

@Lars 물론 그는 그렇게했습니다. dnkoutso : 소켓을 얼마나 열어 놓았습니까? 페어링을 다시 시도 할 수 있습니까? 페어 페어 페어링을 다시 시도하십시오. Btw, 2 층입니까? – nullpotent

+0

@iccthedral, 2 단계로 무엇을 의미합니까? 종종 두 기기에서 실제 설정 앱으로 이동하여 페어링을 삭제합니다. 한번'socket.connect()'를 호출하면 페어링 대화 상자와 패스 키 번호를 입력하라는 메시지가 나옵니다. 불행하게도 "Connection Refused"IOException을 얻은 직후입니다. 업데이 트에 대한 – dnkoutso

답변

2

비표준 프로필을 사용해 보셨습니까? 즉, 귀하의 앱에만 맞춤형 UUID을 입력하십시오. 이것은 또한 동일한 프로필로 등록 된 다른 앱보다는 자신의 앱에 연결하는 것 (가장 가능성 있음)을 알 수 있도록 도와줍니다.

제 경험상 Bluetooth 페어링은 첫 번째 쌍 시도에서 매우 버그가 있습니다. 그러나 사용자 정의 UUID을 사용하면 다소 도움이됩니다.

반사 방식 (원래 생각)은 원래 특정 장치로 버그를 수정하려는 시도 였지만 어떤 사람들은 다른 곳에서도 성공적으로 사용하는 것으로 나타났습니다. 이 장치는 Spica 또는 이와 비슷한 것으로 불 렸습니다.

덧글 중 하나가 게시됨에 따라 실패한 후에 다시 연결을 시도합니다.

기본적으로 첫 번째 시도에서 실패 할 계획 인 코드를 작성하지만 실패한 경우 코드는 5 초 후에 다시 연결을 시도합니다.

이것은 불완전한 솔루션이지만 Android에서의 Bluetooth 구현도 완벽하지 않습니다 (IMHO). 그 질문 업데이트와 의견을 바탕으로

편집

도움이되기를 바랍니다 :

내가 뭔가를 동의 확실히 버그입니다. 내가 생각하기에 BT 드라이버는 다양하고 각기 다른 버턴을 가진 다른 BT 스택을 가지고있다. 또한 반사 방식 AND 사용자 정의 UUID 및 기타 표준 방법을 사용하는 질문을 발견했습니다. 이것은 나에게 극도로 보인다. 그러나 그것은 가장 큰 근거를 다룬다. 불행히도 앱 개발자는 저수준 스택/코드/드라이버를 제어 할 수 없습니다.

나는 두 개의 블루투스 공유 앱을 통해 첫 번째 페어링이 항상 까다로 우며이라는 것을 알았습니다.

나는 그것이 나만의 것이 아니라는 것을 알고 기쁩니다.

+1

나는 내 자신의 커스텀 커스텀 UUID와의 연결을 관리 해왔다. 난 그냥 공개적으로 블루투스 표준 UUID가 작동하지 않는 방법을 이해하지 않습니다. 그들은 또한 안드로이드 코드에서 버그가있는 힌트 인 안드로이드에서 일반적인 시스템 "공유"에 대해 작업하지 않습니다. – dnkoutso

+0

나는 무언가가 확실히 버그가 있음에 동의한다. 내가 생각하기에 BT 드라이버는 다양하고 각기 다른 버턴을 가진 다른 BT 스택을 가지고있다. 또한 리플렉션 방법과 사용자 정의 및 다른 표준 방법을 모두 사용하는 질문을 발견했습니다. 이것은 나에게 극도로 보인다. 그러나 그것은 가장 큰 근거를 다룬다. 불행히도 앱 개발자는 저수준 스택/코드/드라이버를 제어 할 수 없습니다. – pjco

4

동일한 문제가 발생하여 저에게 도움이되는 해결책을 찾을 수있었습니다.

내 경우 3 가지 테스트 장치 (Nexus 5, Galaxy S4, Note 2)를 사용하고 있으며, 참고 2는 내 Bluetooth 모듈에 연결하지 않았지만 다른 두 장치는 연결할 것입니다.

내가 발견 한 이유는 블루투스 드라이버가 다양하고 다른 장치 간의 연결을 생성하기 위해 약간 다른 연결 방법이 필요하다는 것입니다.

내가 사용하는 세 가지 방법을 '안전', '안전하지 않음'및 '반사 방법'/ 'hax'라고합니다. 나는 2 만 사용 '을 작동 노트를 발견 내 경우

  switch(connType) 
      { 
      case Secure: 
       tmpSocket = device.createRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Insecure: 
       tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Hax: 
       Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1)); 
       break; 
      } 

는 보안 모드 모두 넥서스 5 일 갤럭시 S4, 그러나 그것은 몇 가지 테스트 후 주 2

작동하지 않았다 불안정한 '모드이므로이 문제를 해결하기 위해 기본적으로 연결을 시도하고 필요한 경우 다른 모드를 순환합니다. 다른 연결 모드를 시도 할 때 단순히 '연결 재 시도'를 촉구합니다. 그래서, 연결이 보안을 사용하여 실패하면 Insecure를 사용하고 반사 방식을 사용하려고합니다.

나는이 세 가지 방법 중 하나가 효과가없는 경우를 다루지 않았습니다.