programing

Android 4.3 Bluetooth Low Energy 불안정

mailnote 2023. 10. 8. 10:17
반응형

Android 4.3 Bluetooth Low Energy 불안정

현재 블루투스 Low Energy를 사용할 어플리케이션을 개발 중입니다(넥서스4에서 테스트).Android 4.3의 공식 BLE API로 시작한 후, 장치를 처음 연결한 후에는 해당 장치 또는 다른 장치에 다시 성공적으로 연결/통신할 수 없는 경우가 거의 없습니다.

여기 안내에 따라 기기에 성공적으로 연결하여 서비스 및 특성을 스캔하고 문제없이 알림을 읽고/쓰기/수신할 수 있습니다.그러나 연결을 끊고 다시 연결한 후 서비스/특성을 검색할 수 없거나 읽기/쓰기를 완료할 수 없는 경우가 많습니다.로그에서 왜 이런 일이 일어나고 있는지 알 수 없습니다.

이 문제가 발생하면 응용 프로그램을 제거하고 Bluetooth를 비활성화한 다음 전화를 다시 시작해야 다시 작동할 수 있습니다.

장치의 연결이 끊어질 때마다 Bluetooth Gatt 개체에서 close()를 호출하고 null로 설정합니다.통찰력이 있습니까?


:
로그 덤프:를 위해 하고 /conf 이 로그를 위해 전화기를 루팅하고 /etc/bluetooth/bt_stack.conf 에서 관련 항목의 추적 수준을 높였습니다에서 관련.

연결 성공 - 전화기 재부팅 후 앱 설치 후 첫 시도연결하고, 모든 서비스/특성을 검색하고, 읽고 쓸 수 있습니다.

시도 실패 1 - 위의 성공적인 연결을 끊은 후 다음 시도입니다.특징을 발견할 수 있었던 것 같지만, 첫 번째 읽기 시도가 null 값을 반환하고 곧 연결이 끊겼습니다.

실패한 시도 2 - 서비스/특성을 발견할 수조차 없는 예


2:
제가 연결하려는 장치는 TI의 CC2541 칩을 기반으로 합니다.가지고 놀 TI SensorTag (또한 CC2541 기반)을 구했는데 어제 TI가 SensorTag용 안드로이드 앱을 출시했습니다.하지만 이 앱에도 같은 문제가 있습니다.다른 두 개의 Nexus 4s에서도 테스트를 했는데, SensorTag 연결은 처음이나 두 번째로 성공했지만, (로그에 따르면) 그 이후 서비스를 검색하지 못해 모든 종류의 충돌이 발생했습니다.이 칩에 문제가 있는 게 아닌가 하는 생각이 들기 시작했습니다.

중요한 구현 힌트

(아마 안드로이드 OS 업데이트로 인해 일부 힌트는 더 이상 필요하지 않을 것입니다.)

  1. 안드로이드 4.3을 탑재한 넥서스 4와 같은 일부 장치는 기존 gatt 인스턴스를 사용하여 연결하는 데 45초 이상이 걸립니다.해결 방법:연결을 끊을 때 항상 gatt 인스턴스를 닫고 각 연결에 새 gatt 인스턴스를 만듭니다.
  2. 에 하는 거 android.bluetooth.BluetoothGatt#close()
  3. 에서 새 onLeScan(..)연결합니다.이유:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)합니다 합니다.LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)안드로이드 4.3을 탑재한 삼성 갤럭시 S3에서도 동일한 쓰레드(적어도 빌드 JSS15J의 경우).I9300XXUGMK6)
  4. 대부분의 장치는 광고를 필터링합니다.
  5. 사용하지 않는 것이 좋습니다. android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) 특정 서비스 UUID를 필터링하기 위한 매개 변수와 함께 이것은 안드로이드 4.3이 있는 삼성 갤럭시 S3에서 완전히 깨지고 일반적으로 128비트 UUID에서는 작동하지 않기 때문입니다.
  6. Gatt는 항상번에 하나의 명령을 처리할 수 있습니다.여러 명령이 차례로 짧게 호출되면 gatt 구현의 동기화 특성으로 인해 첫 번째 명령이 취소됩니다.
  7. 안드로이드 5가 탑재된 현대 기기에서도 와이파이가 블루투스를 방해하는 것을 자주 볼 수 있습니다.마지막 수단으로 와이파이를 끄면 블루투스가 안정됩니다.

초보자용 튜토리얼

새로 오신 분들께 꽤 괜찮은 입문점은 이 비디오 튜토리얼이 될 수 있습니다.Android용 블루투스 스마트 애플리케이션 개발 http://youtu.be/x1y4tEHDwk0

아래에 설명된 문제와 해결 방법은 OS 업데이트를 통해 해결되었을 수 있습니다.

해결 방법:그렇게 하면 앱을 안정시킬 수 있을 겁니다

  1. 사용자에게 "Restart Bluetooth" 설정을 제공합니다.해당 설정이 활성화되면 BLE 스택이 불안정해지는 일부 지점에서 블루투스를 재시작합니다.예: if startScan이 false를 반환합니다.serviceDiscovery가 실패하는 경우도 좋은 점이 될 수 있습니다.저는 그냥 블루투스를 껐다가 켰다 합니다.
  2. 저는 "WiFi 끄기"라는 다른 설정을 제공합니다.해당 설정이 활성화되어 있으면 앱이 실행 중일 때 Wifi를 해제하고 나중에 다시 켭니다.

이 해결책은 다음의 경험을 바탕으로...

  • Bluetooth를 다시 시작하면 대부분의 경우 BLE 문제를 해결하는 데 도움이 됩니다.
  • 와이파이를 끄면 BLE 스택이 훨씬 안정적이 됩니다.하지만 와이파이가 켜져 있는 대부분의 기기에서도 잘 작동합니다.
  • WiFi를 끄면 블루투스를 다시 시작하면 대부분의 경우 장치를 재부팅할 필요 없이 BLE 스택이 완전히 복구됩니다.

WIFI 끄기:

WIFI를 끄면 블루투스 4.0이 특히 구글 넥서스(Nexus 7이 있습니다)에서 더 안정적이라는 것도 확인할 수 있습니다.

문제가

제가 개발하고 있는 어플리케이션은 WIFI와 지속적인 블루투스 LE 스캔필요합니다.그래서 WIFI를 끄는 것은 저에게는 선택의 여지가 없었습니다.

또한 지속적인 블루투스 LE 스캔이 실제로 WIFI 연결을 차단하고 BLE 스캔이 켜질 때까지 WIFI 어댑터를 어떤 WIFI 네트워크에도 다시 연결할 수 없다는 것을 깨달았습니다(모바일 네트워크와 모바일 인터넷에 대해서도 잘 모르겠습니다).
이는 분명히 다음 장치에서 발생했습니다.

  • 넥서스 7
  • 모토로라 모토G

그러나 WIFI가 켜져 있는 BLE 스캔은 다음과 같이 상당히 안정적인 것으로 보입니다.

  • 삼성S4
  • HTC 원

나의 해결책

BLE3-4초간 짧게 스캔하고 3-4초간 스캔을 끕니다.그럼 또 ON.

  • BLE 디바이스에 연결할 때 항상 BLE 스캔을 끕니다.
  • 장치에서 연결을 끊으면 다시 스캔을 시작하기 전에 BLE를 다시 시작(어댑터를 껐다가 다시 켜짐)하여 스택을 재설정합니다.
  • 또한 BLE를 재설정할 때는services아니면characteristics실패.
  • 앱이 연결해야 하는 장치에서 광고 데이터를 받으면(연결할 수 없는 상태에서 500번 정도 - 약 5-10초 정도 광고) BLE를 다시 설정합니다.

Nexus가 장치에 페어링되어 있는지 확인합니다.통신이 제대로 작동하는지는 확인할 수 없지만 재부팅 없이 두 번 이상 연결할 수 있습니다.첫 번째 연결은 페어링이 필요 없지만 이후의 모든 시도는 필요한 것 같습니다.

서비스 검색을 테스트하고 재부팅 없이 요청을 읽고 쓸 때 이 답변을 며칠 후 업데이트하겠습니다.

편집: 제가 개발 펌웨어 버전(우리 센서)에서 테스트하고 있었는데 페어링되지 않으면 문제가 발생했습니다.우리의 최신 생산 펌웨어 빌드는 2540년대와 2541년대에 잘 작동합니다.

편집: Nexus 7 2013에서는 WiFi를 끌 때 연결이 더 안정적이라는 것을 알게 되었습니다.이것이 다른 사람에게 도움이 되는지 알고 싶습니다.

편집: 제가 짝짓기를 해서 거꾸로 한 것 같습니다.쌍을 이루지 않으면 모든 것이 정상적으로 작동합니다.페어링 후 OP와 똑같은 증상이 나타납니다.이것이 우리 펌웨어와 관련된 것인지 안드로이드 BLE API와 관련된 것인지는 아직 알 수 없습니다.게시물의 3b에 설명된 버그로 인해 페어링이 해제되지 않을 수 있으므로 테스트 시 주의해야 합니다.

일부 모델에는 결함이 있습니다. https://code.google.com/p/android/issues/detail?id=180440

반면에 저의 경우 문제는 Destroy 방식에서 제 연결이 제대로 닫히지 않았다는 것입니다.올바르게 닫으면 와이파이가 켜지거나 꺼지는 것과 상관없이 문제가 없습니다.

btGatt.disconnect();
btGatt.close();

저도 비슷한 문제에 직면해 있었습니다.저의 해결책은

if (Build.VERSION.SDK_INT >= 23) {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}

& 연결을 끊은 후에 통화를 종료합니다.

언급URL : https://stackoverflow.com/questions/17870189/android-4-3-bluetooth-low-energy-unstable

반응형