BLE (Bluetooth Low Energy)를 통해 Android 기기를 iOS 기기에 연결하는 방법


82

Android 의 새로운 Bluetooth Low Energy API 를 사용하는 애플리케이션을 만들려고합니다 . 이를 위해 API 레벨 18 과 함께 제공되는 BLE 샘플로 시작했습니다 .

Android가 주변 장치 역할을 할 수 없다는 것을 읽었을 때 Android 전화를 중앙 모드로 설정하여 주변의 BLE 장치 를 검색합니다. 이를 위해 심장 센서를 시뮬레이션하는 Nordic Platform으로 몇 가지 테스트를했습니다. 모든 것이 완벽하게 작동합니다!

그런 다음 iPhone (iOS 7 베타 4) 을 선택하여 주변 장치에 넣고 이전 테스트와 같이 심박수 센서 를 시뮬레이션하려고 합니다. Android 앱은 장치를보고 연결할 수 있습니다. 그러나 연결이 활성화되면 두 장치가 3-4 초 내에 서로 연결이 끊어집니다. 또한 Android 측에서 discoverServices ()를 호출하면 콜백이 트리거되지 않습니다! 경우에 따라 iOS Bluetooth 칩이 꺼져 있어도 Android 장치가 "연결됨"이벤트를 수신합니다. 이것은 매우 이상합니다. 이를 증명하기 위해 Nordic Board를 Central 모드로 설정 하고 문제없이 iOS 장치에 올바르게 연결할 수있었습니다.

뭐가 될수 있었는지? Android에서 iOS로 또는 그 반대로 연결을 허용하지 않는 Android 또는 iOS에 몇 가지 제한이 있습니까?

감사.

편집 : 몇 가지 어려운 테스트 후 AOSP 페이지에서 문제를 제기했습니다. 여기에서 확인할 수 있습니다 .


2
문서에 따르면 Android는 생성 된 값이 가짜이지만 서버 (예 : 심박수 모니터)로 실행하는 것을 지원합니다. 반면에 예제가없고 문서에 잘못된 일을하라고 지시하며 광고를 시작할 수있는 방법이 없습니다 (문서에는 가능하다고 나와 있지만).
Brian Reinhold

네가 옳아. 이미 BluetoothGattServer에 대한 문서 버그를 발견했습니다. getProfileProxy 메서드를 사용하여 GattServer 인스턴스를 가질 수는 없지만 (문서에서 말한대로) BluetoothManager.openGattServer ()에서 할 수 있습니다. 이미 Google에 문제로보고되었습니다. 어쨌든 Android는 GattServer 역할을 할 수 있지만 광고 할 수는 없습니다. 관심이 있으시면 이미 테스트했으며 두 장치를 연결 한 후 리모컨이 Android에서 노출 된 Gatt 서버를 볼 수 있습니다. 이 질문에 대한 내 문제 보고서를 보려면 첫 번째 답변의 의견을 확인하십시오.
edoardotognoni

네, 저도 그 문제를 발견하고 그 문제에 2 센트를 더했습니다. 이제 광고 할 수없는 온도계 서버가있어서 사용할 수 없습니다.
Brian Reinhold

나는 당신의 것과 거의 동일한 스레드를 열었습니다. stackoverflow.com/questions/18410081/… 당신이 찾은 모든 솔루션에 대해이 스레드를 볼 것입니다.
afrederick

질문의 편집 섹션에 게시 한 Android 문제를 읽으십시오. 이 프로세스가 실패하는 이유를 명확하게 설명합니다. 그것은 우리가 생각하는 안드로이드 결함입니다. 주로 고정 BLE 채널을 통해 허용되지 않는 메시지를 보내는 것입니다. 나는 우리가 할 수있는 유일한 일이 새로운 안드로이드 버전 :( 기다릴 생각
edoardotognoni

답변:


7

참조 용 요약 추가 :

뭐가 될수 있었는지? Android에서 iOS로 또는 그 반대로 연결을 허용하지 않는 Android 또는 iOS에 몇 가지 제한이 있습니까?

connectGatt (...)를 호출하여 듀얼 모드 (BLE 및 BR / EDR) 장치로 알려진 GATT 서버에 연결할 때 내부적으로 추가 된 TRANSPORT_AUTO 플래그는 Android를 기본적으로 BR / EDR 모드 ( link )로 설정합니다.

다음 해결 방법이 가능합니다.

  1. 주변부 : 적절한 플래그를 조정하여 BR / EDR 기능 광고 중지 ( 링크 )
  2. 중앙 측 : 리플렉션을 사용하여 숨겨진 버전의 connectGatt ()를 호출하여 전송 매개 변수를 명시 적으로 TRANSPORT_LE로 설정합니다.

예:

public void connectToGatt(BluetoothDevice device) {    
   ...    
   Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);    
   int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);     // LE = 2, BREDR = 1, AUTO = 0    
   BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);    
   ... 
}

2016 년 4 월 수정

으로 갈릴리 Arbel 이스라엘이 코멘트에 지적, 구글의 오버로드 된 버전을 도입 connectGatt (...) 에 전송 지정할 수 있습니다 안드로이드 M을 .


감사합니다. Android M에서 Google은 전송 변수를 취하는 connectGatt 메서드에 대한 오버로드를 추가했습니다. connectGatt (Context context, boolean autoConnect, BluetoothGattCallback callback, int transport)
arbel03

1
아,이 힌트를 주셔서 감사합니다. 그래서 마침내 사용할 수있게 만들었습니다.
Dominik Gebhart 2016

2

비교적 간단한 간단한 작업 예제를 작성하고 Github에 오픈 소스로 포함했습니다 : https://github.com/GitGarage . 지금까지는 Android Nexus 9 및 iPhone 5s에서만 테스트되었지만 Nexus 6 및 다양한 iPhone 유형에서도 작동 할 것으로 예상됩니다. 지금까지 하나의 Android와 하나의 iPhone간에 통신하도록 명시 적으로 설정되었지만 훨씬 더 많은 작업을 수행하도록 조정할 수 있다고 생각합니다.


2

약간 지연 될 수도 있지만 통증이 약간 완화 될 수 있습니다.)

우리는 크로스 플랫폼 BLE 연결 (iOS <-> Android)에 대해 많은 실험을 해왔고 여전히 많은 비 호환성과 연결 문제가 있음을 알게되었습니다. Android의 불안정성 외에도 오늘날 많은 Android 기기가 실제로 BLE 주변기기 모드를 지원하지는 않는다는 점도 고려해야합니다.

따라서 사용 사례가 기능 중심이고 기본적인 데이터 교환 만 필요한 경우 처음부터 빌드 할 필요없이 플랫폼 간 통신을 수행 할 수있는 프레임 워크 및 라이브러리를 살펴 보는 것이 좋습니다.

예 : http://p2pkit.io 또는 google near

면책 조항 : 저는 Uepaa에서 일하며 Android 및 iOS 용 p2pkit.io를 개발합니다.



0

iOS 장치는 항상 주변 장치 또는 중앙 장치이지만 Android 장치는 드물지 않습니다.이 경우 iOS 장치는 주변 장치이고 Android는 중앙 장치 여야합니다. 주변 장치는 서버이고 중앙 장치는 클라이언트라고 생각할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.