Android 4.3 Bluetooth Düşük Enerji kararsız


189

Şu anda Bluetooth Düşük Enerji (Nexus 4 üzerinde test) kullanacak bir uygulama geliştiriyorum. Android 4.3'teki resmi BLE API'leri ile başladıktan sonra, bir cihazı ilk kez bağladıktan sonra nadiren başarılı bir şekilde o cihaza veya başka bir cihaza bağlanabilir / iletişim kurabilirim.

Buradaki kılavuzu izleyerek , bir cihaza başarılı bir şekilde bağlanabilir, hizmetleri ve özellikleri tarayabilir ve herhangi bir sorun yaşamadan bildirimleri okuyabilir / yazabilir / alabilirsiniz. Ancak, bağlantıyı kestikten ve yeniden bağlandıktan sonra, genellikle hizmetleri / özellikleri tarayamıyorum veya bir okuma / yazma işlemini tamamlayamıyorum. Günlüklerde bunun neden olduğunu gösteren hiçbir şey bulamıyorum.

Bu gerçekleştiğinde uygulamayı kaldırmam, Bluetooth'u devre dışı bırakmam ve tekrar çalışmaya başlamadan önce telefonu yeniden başlatmam gerekiyor.

Bir cihazın bağlantısı kesildiğinde, BluetoothGatt nesnesinde close () öğesini çağırdığınızdan ve null olarak ayarladığımdan emin olun. Herhangi bir görüşün var mı?


DÜZENLEME:
Günlük dökümü: Bu günlükler için telefonumu köklendirdim ve /etc/bluetooth/bt_stack.conf içindeki ilgili öğelerin izleme düzeylerini artırdım

Başarılı bağlantı - Telefonu yeniden başlattıktan ve uygulamayı yükledikten sonra ilk girişim. Bağlantı kurabiliyorum, tüm hizmetleri / özellikleri keşfedebiliyorum ve okuma / yazma yapabiliyorum.

Başarısız Deneme 1 - Bu, yukarıdaki başarılı bağlantıyı kestikten sonraki bir sonraki denemedir. Görünüşe göre özellikleri keşfedebildim, ancak ilk okuma denemesi boş değer verdi ve kısa bir süre sonra bağlantı kesildi.

Başarısız Deneme 2 - Hizmetleri / özellikleri bile bulamadığım bir örnek.


DÜZENLEME 2:
Bağlanmaya çalıştığım aygıt TI'nin CC2541 yongasını temel alıyor. Oynamak için bir TI SensorTag (ayrıca CC2541'e dayanarak) aldım ve TI'nin dün SensorTag için bir android uygulaması yayınladığını keşfettim . Ancak, bu uygulama aynı sorunu var. Bunu diğer iki Nexus 4s'de aynı sonuçla test ettim: SensorTag'e bağlantı ilk veya ikinci kez başarılı oldu, ancak (günlüklere göre) daha sonra hizmetleri bulamıyor ve her türlü çökmeye neden oluyor. Bu özel çip ile ilgili bir sorun olup olmadığını merak etmeye başlıyorum?


Lütfen önyüklemeden sorunla karşılaşana kadar telefonunuzun tüm günlüklerini gönderin.
AAnkit

3
Samsung Galaxy S4'ü sızdırılmış Google sürüm Android 4.3 yüklü olarak kullanıyorum; bağlanma / bağlantıyı kesmenin sayısız zamanından sonra, hizmetleri keşfettiğimde rastgele 129 (GATT_INTERNAL_ERROR) alır ve durum 133 (GATT_ERROR) ile bir onConnectionStateChange alırım, state = BluetoothProfile.DEVICE_DISCONNECTED.
reTs

1
Bir veya iki kez kısa bir süre içinde birden fazla durum 129 ve 133 geri arama aldım ve cihazımı yeniden başlatana kadar BluetoothGattCallback'te hiçbir zaman geri arama alamadım (ancak tarama iyi).
reTs

1
TI yongaları (üzgünüm modellerini bilmiyorum) ve Nordic yongaları olan bir cihaz kullanarak yaklaşık on cihazla test ettiğimi unutmayı unutmayın. İskandinav
çipli

1
Bu sorunun hala Samsung Galaxy S5'te ( G900VVRU2BOG5 ve G900VVRU2BOA8 derleme sürümünde) var olduğunu doğrulayabilirim . Verileri Ayarlar> Uygulama Yöneticisi >> Tümü >> Bluetooth'dan silersem , şimdilik çalışır.
IronBlossom

Yanıtlar:


184

Önemli uygulama ipuçları

(Belki de Android OS güncellemeleri nedeniyle bu ipuçlarından bazıları gerekli değildir.)

  1. Android 4.3 ile Nexus 4 gibi bazı cihazların mevcut bir gatt örneği kullanarak bağlanması 45+ saniye sürer . Geçici çözüm: Bağlantı kesme sırasında her zaman ağ geçidi örneklerini kapatın ve her bağlantıda yeni bir ağ geçidi örneği oluşturun.
  2. Aramayı unutma android.bluetooth.BluetoothGatt#close()
  3. İçinde yeni bir iplik başlatın onLeScan(..) ve ardından bağlayın. Sebep: Android 4.3 ile Samsung Galaxy S3'te aynı iş parçacığında BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)içeri çağırılırsa her zaman başarısız olur LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)(en azından JSS15J.I9300XXUGMK6'yı oluşturmak için)
  4. Çoğu cihaz reklamları filtreler
  5. android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) Belirli hizmet UUID'lerini filtrelemek için parametre ile birlikte kullanılmasa iyi olur, çünkü bu Android 4.3 ile tamamen Samsung Galaxy S3'te kırılmıştır ve genel olarak 128bit UUID'lerde çalışmaz .
  6. Gatt her zaman tek bir komutu işleyebilir . Birkaç komut birbiri ardına kısa süre çağrılırsa, ilki gatt uygulamasının eşzamanlı yapısı nedeniyle iptal edilir.
  7. Android 5'li modern cihazlarda bile, Wifi'nın bluetooth'a ve tersine karıştığını görüyorum. Son çare olarak, bluetooth'u stabilize etmek için wifi'yi kapatın.

Yeni başlayanlar için eğitim

Yeni gelenler için oldukça iyi bir giriş noktası bu video eğitimi olabilir: Android için Bluetooth Akıllı Uygulamalar Geliştirme http://youtu.be/x1y4tEHDwk0

Aşağıda açıklanan sorun ve geçici çözüm muhtemelen işletim sistemi güncellemeleriyle giderildi

Geçici çözüm: Uygulamamı bunu "sabitleyebilir" ...

  1. Kullanıcıya "Bluetooth'u Yeniden Başlat" ayarı veriyorum. Bu ayar etkinleştirilirse, BLE yığınının kararsız hale geldiğini gösteren bazı noktalarda Bluetooth'u yeniden başlatırım. Örneğin, startScan yanlış döndürürse. ServiceDiscovery başarısız olursa iyi bir nokta olabilir. Bluetooth'u kapatıp açıyorum.
  2. Başka bir ayar "WiFi'yi kapat" ı sağlıyorum. Bu ayar etkinleştirilirse, uygulama çalışırken uygulamam Kablosuz özelliğini kapatır (ve daha sonra tekrar açar)

Bu çalışma, follwoing deneyimlerine dayanıyor ...

  • Bluetooth'u yeniden başlatmak çoğu durumda BLE ile ilgili sorunları gidermeye yardımcı olur
  • Wifi'yi kapatırsanız, BLE yığını çok daha kararlı hale gelir. Ancak, wifi açık olan çoğu cihazda da iyi çalışıyor.
  • Wifi özelliğini kapatırsanız, Bluetooth'u yeniden başlatmak çoğu durumda cihazı yeniden başlatmanıza gerek kalmadan BLE yığınını tamamen kurtarır.

33
Google, bunu şimdi düzeltmelisin. Etrafında bu iş (artı çünkü işe yaradı yaptım) saçma.
Chris Herbert

4
Bazen, hizmet bulma durumu 0 ile başarılı olur (sorun olmadığı varsayılarak), ancak karakteristik okumalar NULL değerleri verir, çünkü aslında gerçekte bağlı değildir veya özellikler keşfedilmemiştir (bunu günlükte görüyorum: 11-01 18:37: 32.131: WARN / BluetoothGatt (20119): İşlenmeyen istisna: java.lang.NullPointerException)
Lo-Tan

2
@ Lo-Tan Beklediğim hizmet dahil edilmişse, her zaman servis keşfinden sonra kontrol ederim. Ayrıca, servis bulmanın herhangi bir sonuç vermesinden de emin olamazsınız. Bazen geri arama almıyorum. Bu yüzden servis keşfi için bir zaman aşımı uyguladım.
OneWorld

2
Deneyimlerim: Samsung S3 (4.3), yukarıdaki 2. paragrafta açıklandığı gibi bir Gatt istemcisini kapattıktan sonra başarıyla yeniden bağlandı; Nexus 4 ve 7 (4.4.2) kullanarak BL adaptörünü yeniden başlatarak bile bağlantı kesildikten sonra tekrar bağlanamadım, ancak 2 dakika sonra otomatik olarak yeniden
bağlanabilir

1
Herkes android.bluetooth.BluetoothGatt'ın CİHAZ , PER SÜRECİ veya PERIOD ( yalnızca tüm süreçlerde) için bekleyen bir GATT işlemini gerçekleştirebileceğini doğrulayabilir . CİHAZ BAŞINA olduğunu düşünüyorum, ancak bu sorun o kadar muck'lenmiş ki, aksi takdirde beni şaşırtmayacaktı. Sınırlama yalnızca CİHAZ BAŞINA ise, o zaman birden fazla eşzamanlı işlemi gerçekleştirebilen OS / Cihaz, bu sorunun tamamen BluetoothAdapter örneğinde işletim sisteminin her işlemi (bazı tüm süreçlerde tek bir ton).
swootarafından

18

WIFI'ı KAPATMA:

WIFI'ı kapatmanın özellikle Google Nexus'ta Bluetooth 4.0'ı daha kararlı hale getirdiğini de doğrulayabilirim (Nexus 7'm var).

Sorun

Ben geliştiriyorum uygulama olmasıdır ihtiyacı hem WIFI ve sürekli Bluetooth LE tarama . Bu yüzden WIFI'ı kapatmak benim için bir seçenek değildi.

Ayrıca, sürekli Bluetooth LE taramasının aslında WIFI bağlantısını öldürebileceğini ve WLE adaptörünün BLE tarama AÇIK olana kadar herhangi bir WIFI ağına yeniden bağlanamamasını sağlayabildiğini fark ettim . (Mobil ağlar ve mobil internet hakkında emin değilim).
Bu kesinlikle aşağıdaki cihazlarda oldu:

  • Nexus 7
  • Motorola Moto G

Ancak WIFI ile BLE tarama oldukça kararlı görünüyordu:

  • Samsung s4
  • HTC One

Geçici çözümüm

Ben için ble taramak kısa bir süre 3-4 saniye sonra 3-4 saniye boyunca tarama KAPATIN . Sonra tekrar AÇIK.

  • Bir BLE cihazına bağlanırken her zaman BLE taramasını KAPALI konuma getiriyorum.
  • Bir aygıtın bağlantısını kestiğimde, taramayı yeniden başlatmadan önce yığını sıfırlamak için BLE'yi yeniden başlatıyorum (adaptörü KAPATIN ve sonra AÇIK konuma getirin).
  • Ayrıca keşfederken servicesveya characteristicsbaşarısız olduğunda BLE'yi sıfırlarım .
  • Uygulamanın bağlanması gereken bir cihazdan reklam verileri aldığımda (bağlantı kuramadan 500 kez söyleyelim - bu yaklaşık 5-10 saniyelik reklam) BLE'yi tekrar sıfırlarım.

Bir cihazın bağlantısı kesildikten sonra BLE'yi yeniden başlattığımı söylediniz. Varsayalım, kullanıcı dosyayı bluetooth bağlantısı üzerinden aktarıyorsa. Ardından, Bluetooth aktarımının istediğiniz zaman başarısız olmasına neden olacaksınız.
Rahul Rastogi

1
"adaptörü önce KAPAT ve sonra AÇIK" ile ne demek istiyorsun?
Marian Paździoch

Kabul ediyorum, Wifi ve Bluetooth birlikte Moto
G'deki

@ MarianPaździoch, "adaptörü KAPAT ve sonra AÇIK" konuma getirerek @ benka, BluetoothAdapter anlamına gelir
Anup

9

Nexus cihazınızın cihazla eşlendiğinden emin olun. İletişimin düzgün çalışıp çalışmadığını doğrulayamıyorum, ancak yeniden başlatmadan bir kereden fazla bağlanabileceksiniz. İlk bağlantı eşleştirme gerektirmiyor gibi görünüyor, ancak sonraki tüm girişimler yapıyor.

Hizmet bulmayı sınadığımda ve okuma ve yazma isteklerini yeniden başlatmadan ağladığımda birkaç gün içinde bu yanıtı güncelleyeceğim.

DÜZENLEME: Görünüşe göre eşleştirilmiş değilse sorunlara neden olan bir geliştirme ürün yazılımı sürümünü (sensör) test ediyordum. En son üretim bellenim derlememiz 2540'lar ve 2541'lerde iyi çalışır.

EDIT: Nexus 7 2013'te WiFi kapatıldığında bağlantıların daha kararlı olduğunu fark ettim. Bunun başkalarına yardım edip etmediğini bilmek istiyorum.

EDIT: Eşleştirme ile geriye sahip gibi görünüyor. Eşleştirilmediğinde her şey iyi çalışır. Eşleştirdikten sonra, OP ile aynı semptomları yaşıyorum. Bunun ürün yazılımımızla veya Android BLE API'sı ile ilgili olup olmadığı henüz bilinmiyor. Bunu test ediyorsanız dikkatli olun çünkü eşleştirildikten sonra, bu yayının 3b'sinde açıklanan bir hata nedeniyle eşleştiremeyebilirsiniz .


Herhangi bir manuel eşleştirme veya yeniden başlatma olmadan bir CC2541 cihazına sürekli olarak bağlanıyorum ve yeniden bağlanıyorum.
dgel

Benim düşünceme göre, eşleştirme gerekli değildir. Resmi dokümanlar eşleştirme hakkında yorum yapmazlar. Ayrıca herhangi bir eşleştirme olmadan yazma, okuma, karakteristik değişiklik bildirimi yapabilirim. Ancak, kısa bir süre için. Şimdi yine titrek ... SAMSUNG BLE SKD v2.0 da eşleştirme gerektirmedi ve oldukça iyi çalıştı.
OneWorld

3
Onaylayabilirim, Wifi kapatıldıktan sonra daha kararlı. Herkes bunu denemeli.
OneWorld

1
Eşleştirmenin gerekip gerekmediği, cihaz uygulamasına bağlıdır. nrf8002 cihazları eşleştirmeyi gerektirir ve Samsung 2.0 ve 1.2 API'lerinin her ikisi de bunu destekledi. Resmi bir api desteğinin, bir ble cihazı eşleştirdikten sonra eşleştirmeyle ilgili sorunlar yaşıyor gibi görünüyor, eşleştirmeyi imkansız görünüyor!
Chris Herbert

2
Eşleştiremediğim için bir işim var. 1) bt menünüze gidin, eşleştirmeyi seçin, ble cihazını alandan kaldırın veya güçlendirin, bt menüsünde ble cihazı seçin ve eşleştirmeye ve başarısız olmaya çalışacak, ardından bluetooth'u sıfırlayacaktır. Sıfırlandıktan sonra cihazın eşleştirmesi kaldırılır.
Chris Herbert

7

Bazı modellerde bir kusur var: https://code.google.com/p/android/issues/detail?id=180440

Öte yandan benim durumumda sorun, bağlantımın onDestroy yönteminde düzgün kapatılmamış olmasıydı. Doğru kapanıştan sonra, wifi'nin açık veya kapalı olması fark etmeksizin benim için sorun mevcut değil.

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

Neden closegerekli?
IgorGanapolsky

3
Bluetooth'u birden çok kez bağlamak istediğinizde, doğru kapatma prosedürü Anahtar'dır. Deneyimlerime göre, Ble bağlantınızı ayrı bir UNBOUND hizmetinde çalıştırırsanız en iyi sonucu verir, böylece elle başlatabilir ve durdurabilirsiniz. Ve mConnectedGatt.disconnect (); ble_device = null; inDestroy () içinde. Benim durumumda bu model sorunsuz çalışıyor.
medTech

4

Benzer bir sorunla karşı karşıyaydım. Düzeltmem

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

& bağlantı kesildikten sonra kapatılıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.