안드로이드 4.3 블루투스 저에너지 불안정
현재 블루투스 저에너지를 사용하는 애플리케이션을 개발 중입니다 (Nexus 4에서 테스트). Android 4.3에서 공식 BLE API를 시작한 후 처음으로 장치를 연결 한 후에는 해당 장치 또는 다른 장치에 다시 성공적으로 연결 / 통신 할 수없는 것으로 나타났습니다.
있는 안내서에 따라 문제없이 장치에 성공적으로 연결하고 서비스 및 특성을 검색하며 알림을 읽고 쓸 수 있습니다. 그러나 연결을 끊고 다시 연결 한 후 서비스 / 특성을 스캔하거나 읽기 / 쓰기를 완료 할 수없는 경우가 종종 있습니다. 왜 이런 일이 발생했는지 나타내는 로그에서 아무것도 찾을 수 없습니다.이 문제가 발생하면 응용 프로그램을 제거하고 Bluetooth를 비활성화 한 다음 전화를 다시 시작해야 작동합니다.장치가 연결 해제 될 때마다 BluetoothGatt 객체에서 close ()를 호출하고 null로 설정해야합니다. 통찰력이 있습니까?
편집 :
로그 덤프 :이 로그의 경우 휴대 전화를 근절하고 /etc/bluetooth/bt_stack.conf에서 관련 항목의 추적 수준을 올렸습니다.
-전화를 재부팅하고 앱을 설치 한 후 먼저 시도하십시오. 연결하고 모든 서비스 / 특성을 발견하고 읽고 쓸 수 있습니다.
위의 성공적인 연결에서 연결을 끊은 다음 시도입니다. 특성을 발견 할 수 있었지만 첫 번째 시도는 null 값을 반환하고 곧 연결이 끊어졌습니다.
서비스 / 특성을 발견 할 수없는 예입니다.
편집 2 :
연결하려는 장치는 TI의 CC2541 칩을 기반으로합니다. 나는 함께 놀 수있는
SensorTag (CC2541 기반)를 얻었고 TI가 어제 SensorTag 용
을 출시했음을 발견했습니다 . 그러나이 앱은
같은 문제가 있습니다.
동일한 결과로 두 개의 다른 Nexus 4에서 이것을 테스트했습니다. SensorTag에 대한 연결이 처음 또는 두 번 성공했지만 (로그에 따라) 이후에 서비스를 검색하지 못해 모든 종류의 충돌이 발생합니다. 이 특정 칩에 문제가 있는지 궁금해지기 시작했습니다.
중요한 구현 힌트
(아마도 이러한 힌트 중 일부는 Android OS 업데이트로 인해 더 이상 필요하지 않습니다.)
- Android 4.3 이 설치된 Nexus 4와 같은 일부 기기 는 기존 gatt 인스턴스를 사용하여 연결하는 데 45 초 이상 걸립니다 . 해결 방법 : 연결을 끊을 때 항상 gatt 인스턴스를 닫고 각 연결마다 새로운 gatt 인스턴스를 만드십시오.
- 전화하는 것을 잊지 마세요
android.bluetooth.BluetoothGatt#close()
- 내부에서 새 스레드
onLeScan(..)
를 시작한 다음 연결하십시오. 이유 : Android 4.3이 설치된 Samsung Galaxy S3의 동일한 스레드에서BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
호출되면 항상 실패합니다LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
(최소한 빌드 JSS15J.I9300XXUGMK6). - 대부분의 장치는 광고를 필터링합니다
-
android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
특정 서비스 UUID를 필터링하기 위해 매개 변수와 함께 사용하지 않는 것이 좋습니다. Android 4.3이 설치된 Samsung Galaxy S3에서 완전히 손상 되어 일반적으로 128 비트 UUID 에서 작동하지 않기 때문 입니다. - Gatt는 항상 한 번에 하나의 명령을 처리 할 수 있습니다 . 여러 명령이 차례로 호출되면 첫 번째 명령 은 gatt 구현의 동기 특성으로 인해 취소 됩니다.
- Android 5가 장착 된 최신 기기에서도 Wi-Fi가 블루투스를 방해하고 그 반대의 경우도 종종 있습니다. 최후의 수단으로, 와이파이를 끄고 블루투스를 안정화하십시오.
초보자를위한 튜토리얼
초보자를위한 OK 진입 점은이 비디오 자습서 일 수 있습니다. Android 용 Bluetooth Smart 응용 프로그램 개발
아래 설명 된 문제와 해결 방법은 아마도 OS 업데이트로 해결되었을 것입니다.
해결 방법 : 내 앱을 "안정화"할 수 있습니다 ...
- 사용자에게 "블루투스 다시 시작"설정을 제공합니다. 해당 설정이 활성화되어 있으면 BLE 스택의 시작이 불안정하다는 일부 지점에서 Bluetooth를 다시 시작합니다. 예를 들어 startScan이 false를 반환하는 경우 serviceDiscovery가 실패하는 경우에도 좋은 포인트입니다. 방금 Bluetooth를 껐다 켜십시오.
- 다른 설정 인 "WiFi 끄기"를 제공합니다. 해당 설정을 사용하면 앱이 실행될 때 내 앱이 Wi-Fi를 끈 다음 나중에 다시 켭니다.
이 해결 방법은 다음과 같은 경험을 바탕으로합니다.
- Bluetooth를 다시 시작하면 대부분의 경우 BLE 문제를 해결하는 데 도움이됩니다.
- Wi-Fi를 끄면 BLE 스택이 훨씬 안정적입니다. 그러나 Wi-Fi가 켜져있는 대부분의 기기에서도 제대로 작동합니다.
- Wifi를 끄면 Bluetooth를 다시 시작하면 대부분의 경우 장치를 재부팅하지 않고도 BLE 스택이 완전히 복구됩니다.
WIFI 끄기 :
WIFI를 사용 중지하면 특히 Google Nexus (Nexus 7이 있음)에서 Bluetooth 4.0이 더 안정적임을 확인할 수 있습니다.
문제
개발중인 응용 프로그램 에는 WIFI 와 지속적인 Bluetooth LE 스캐닝이 모두
필요
합니다 . 따라서 WIFI를 끄는 것은 나에게 선택 사항이 아닙니다.또한 나는
지속적인 블루투스 LE 스캔
이 실제로
WIFI 연결을 끊을
수 있으며 BLE 스캔이 ON 될 때까지
WIFI 어댑터가
WIFI 네트워크 에 다시 연결할 수 없다는 것을 깨달았습니다 . (모바일 네트워크와 모바일 인터넷에 대해 잘 모르겠습니다).
이것은 분명히 다음 장치에서 발생했습니다.
- 넥서스 7
- 모토로라 모토 G
그러나 WIFI를 사용하는 BLE 스캔은 다음과 같이 안정적으로 보입니다.
- 삼성 S4
- HTC 하나
내 해결 방법
I scan BLE for a short period of time 3-4 seconds then I turn scan OFF for 3-4 seconds. Then ON again.
- Obviously I always turn BLE scan OFF when I'm connecting to a BLE device.
- When I disconnect from a device I restart BLE (turn adapter OFF and then ON) to reset the stack before starting scan again.
- I also reset BLE when discovering
services
orcharacteristics
fails. - When I get advertisement data from a device that the app should connect to (lets say 500 times without being able to connect - thats about 5-10 seconds of advertising) I reset BLE again.
Make sure your Nexus is paired to the device. I can't verify whether or not the communication works properly, but you will be able to connect more than once without a reboot. It seems the first connect is not requiring pairing but all subsequent attempts do.
I will update this answer in a couple of days when I test service discovery and gatt read and write requests without a reboot.
EDIT: It turns out I was testing on a development firmware version (our sensor) that was causing issues if not paired. Our latest production firmware build works fine on the 2540s and 2541s.
EDIT: I did notice that on the Nexus 7 2013, connections are more stable when WiFi is turned off. I'd like to know if this helps anyone else.
EDIT: I seem to have had it backwards with pairing. Everything works fine when not paired. After pairing, I am experiencing the exact same symptoms as the OP. It's just not known yet if this is related to our firmware or the Android BLE API. Be careful if testing this because once paired, you may not be able to unpair due to a bug explained in 3b of this post.
In some models there is a defect: https://code.google.com/p/android/issues/detail?id=180440
On the other hand in my case the problem was, that my connection was not properly closed in onDestroy method. After correct closing, problem for me is not existing, not matter that wifi is turned on or off.
btGatt.disconnect();
btGatt.close();
I was facing a similar issue. My fix was
if (Build.VERSION.SDK_INT >= 23) {
mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}
& calling close after disconnect.
참고URL : https://stackoverflow.com/questions/17870189/android-4-3-bluetooth-low-energy-unstable
'programing' 카테고리의 다른 글
파일 중간에 특정 줄을 표시하는 빠른 유닉스 명령? (0) | 2020.05.15 |
---|---|
명령 줄의 숭고한 텍스트 (0) | 2020.05.15 |
PHP에서 변수의 존재를 테스트하는 가장 좋은 방법; (0) | 2020.05.15 |
코딩 측면에서 MVC, MVP 및 MVVM 디자인 패턴의 차이점은 무엇입니까? (0) | 2020.05.15 |
기존 CSV 파일에 팬더 데이터를 추가하는 방법은 무엇입니까? (0) | 2020.05.14 |