Android cihazı BLE (Bluetooth Low Energy) üzerinden bir iOS cihazına bağlama


82

Android'in yeni Bluetooth Low Energy API'sini kullanan bir uygulama yapmaya çalışıyorum . Bunun için API seviyesi 18 ile gelen BLE örneğiyle başladım .

Android'in bir Çevre Birimi gibi davranamayacağını okurken, Android telefonu merkezi moda getirip etrafındaki BLE cihazları tarıyorum . Bu amaçla, bir Kalp Sensörünü simüle eden bir İskandinav Platformu ile bazı testler yaptım. Her şey mükemmel bir şekilde çalışıyor!

Bundan sonra, bir iPhone (iOS 7 beta 4) seçip onu Periferik bir şekilde yerleştirmeye ve bir önceki test gibi bir Kalp Atış Hızı sensörünü simüle etmeye çalışıyorum. Android uygulaması cihazı görebilir ve ona bağlanabilir. Ancak bağlantı aktif olduktan sonra 2 cihaz birbirlerinden 3-4 saniye içinde kesilir. Buna ek olarak, Android tarafında explorServices () 'i çağırdığımda hiçbir geri arama tetiklenmiyor! Bazı durumlarda, iOS Bluetooth çipi Kapalı olsa bile Android cihazı "Bağlandı" olayını alır. Bu çok tuhaf. Bunu kanıtlamak için Nordic Board'u Merkezi moda getirdim ve iOS cihazına sorunsuz bir şekilde bağlanabildim.

Ne olabilirdi? Android veya iOS'ta, bir Android'den bir iOS'a veya tersine bağlanmaya izin vermeyen bazı sınırlamalar var mı?

Teşekkürler.

DÜZENLEME: Bazı zorlu testlerden sonra, AOSP sayfasında bir sorun ortaya çıkardım. Bu kontrol edilebilir burada


2
Belgelere göre, Android DOES, bir sunucu olarak (örneğin bir Kalp Atış Hızı monitörü) çalışmayı desteklese de, kişinin oluşturduğu değerler sahte olacaktır. Öte yandan, örnek yoktur, belgeler size yanlış şeyler yapmanızı söyler ve reklam başlatmanın bir yolu yoktur (belgeler yapabileceğinizi söylese de).
Brian Reinhold

Haklısın. BluetoothGattServer ile ilgili belge hatasını zaten buldum. GattServer örneğine getProfileProxy yöntemiyle sahip olamazsınız (belgede söylendiği gibi), ancak BluetoothManager.openGattServer () öğesinden yapabilirsiniz. Google'a zaten bir sorun olarak bildirildi. Her neyse, evet Android bir GattServer olarak hareket edebilir ancak reklam veremez. İlginizi çekiyorsa, zaten test ettim ve 2 cihazın kullanımından sonra, uzaktan kumanda Android'den açığa çıkan Gatt sunucularını görebilir. Bu soruyla ilgili sorun raporumu görmek için ilk cevabın yorumlarını kontrol edin.
edoardotognoni

Evet, ben de buna tökezledim ve bu konuya iki sentimi ekledim. Artık reklam veremeyen bir Termometre sunucum var, bu yüzden onu kullanamıyorum.
Brian Reinhold

Sizinkiyle neredeyse aynı olan bir ileti dizisini açtım: stackoverflow.com/questions/18410081/… Bulduğunuz tüm çözümler için bu ileti dizisini izleyeceğim.
afrederick

Sorunun DÜZENLE bölümünde yayınladığım Android sayısını okuyun. Bu sürecin neden başarısız olduğunu açıkça açıklıyor. Bunun bir Android hatası olduğunu düşünüyoruz. Temelde, sabit bir BLE kanalı üzerinden izin verilmeyen bir mesaj gönderiyor. Sanırım yapabileceğimiz tek şey yeni bir Android sürümünü beklemek :(
edoardotognoni

Yanıtlar:


7

Referans için bir özet ekleme:

Ne olabilirdi? Android veya iOS'ta, bir Android'den bir iOS'a veya tersine bağlanmaya izin vermeyen bazı sınırlamalar var mı?

ConnectGatt (...) çağırarak çift modlu (BLE ve BR / EDR) cihaz olarak tanıtılan bir GATT sunucusuna bağlanırken, dahili olarak eklenen TRANSPORT_AUTO bayrağı, Android'i BR / EDR moduna ( bağlantı ) varsayılan yapar .

Aşağıdaki geçici çözümler mümkündür:

  1. Çevre tarafı: Uygun bayrakları ( bağlantı ) ayarlayarak BR / EDR özelliklerinin reklamını durdurun
  2. Merkezi taraf: Yansımayı kullanarak connectGatt () 'ın gizli sürümünü çağırarak taşıma parametresini açıkça TRANSPORT_LE olarak ayarlayın

Misal:

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);    
   ... 
}

Düzenle 4/2016

Arbel Israeli'nin yorumda belirttiği gibi , Google , Android M'de aktarımı belirtmeye izin veren , connectGatt'ın (...) aşırı yüklenmiş bir sürümünü tanıttı .


Teşekkürler, bu benim için işe yarıyor, android M'de Google'ın bir taşıma değişkeni alan connectGatt yöntemi için bir aşırı yükleme eklediğini unutmayın: connectGatt (Bağlam bağlamı, boolean autoConnect, BluetoothGattCallback geri araması, int aktarım)
arbel03

1
Bu ipucu için teşekkürler, bu yüzden sonunda onu uygun hale getirdiler.
Dominik Gebhart

2

Oldukça basit, basit bir çalışma örneği yazdım ve bunu Github'a açık kaynak olarak ekledim: https://github.com/GitGarage . Şimdiye kadar yalnızca bir Android Nexus 9 ve bir iPhone 5s ile test edildi, ancak bir Nexus 6 ve çeşitli iPhone türleriyle de çalışacağını tahmin ediyorum. Şimdiye kadar açıkça bir Android ve bir iPhone arasında iletişim kuracak şekilde ayarlandı, ancak çok daha fazlasını yapmak için ince ayar yapılabileceğini düşünüyorum.


2

Belki biraz gecikebilir, ama belki ağrınız biraz geçebilir;)

Platformlar arası BLE bağlantıları (iOS <-> Android) ile çok fazla deneme yaptık ve hala birçok uyumsuzluk ve bağlantı sorunu olduğunu öğrendik. Android'in istikrarsızlığının yanı sıra, bugün itibariyle hala birçok Android cihazının BLE Çevre Birimi modunu desteklemediğini de dikkate almalısınız.

Bu nedenle, kullanım durumunuz özellik odaklıysa ve yalnızca temel veri alışverişine ihtiyacınız varsa, sıfırdan oluşturmanıza gerek kalmadan sizin için çapraz platform iletişimi sağlayabilecek Çerçeveler ve Kitaplıklar'a bakmanızı öneririm.

Örneğin: http://p2pkit.io veya yakındaki google

Feragatname: Uepaa için çalışıyorum, Android ve iOS için p2pkit.io geliştiriyorum.



0

iOS Cihazlar her zaman bir çevre birimi veya merkezi olabilir, ancak Android cihazlar nadiren olamaz. iOS cihazınız bir çevre birimi ve android bir merkezi olmalıdır. Çevre biriminin bir sunucu ve merkezi bir istemci olduğunu düşünebiliriz Bu basittir.

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.