Şu anda BlueZ 5.0 ve Linux kullanarak birden fazla BLE cihazına bağlanmaya çalışıyorum. Bir ana BLE bağdaştırıcım var ve bu işlevi bağlamak ve gerçekleştirmek için gatttool'u değiştirdim. Değiştirilmiş gatttool örneğini çalıştırırsam, BLE aygıtından başarılı bir şekilde bildirim verilerini alır ve alır. Değiştirilmiş gatttool'un başka bir örneğini çalıştırırsam ve başka bir BLE aygıtına bağlanırsam, bu uygulama her iki BLE aygıtından bildirim verileri almaya başlar ve ilk uygulama artık herhangi bir veri almaz. Bunun her iki uygulamanın da soketlerini aynı adrese ve PSM'ye (en yeni örnek veriyi alırken diğeri açlıktan) yapılandırdığı yuva kurulumundan kaynaklandığına inanıyorum. Bu durumu önlemek için bir yolu var mı? İdeal olarak, birden fazla cihaza bağlanmak için bir uygulama istiyorum. Uygulamanın, birden çok soketin yukarıdaki çoklu örneklerle aynı soruna sahip olması nedeniyle yalnızca bir sokete sahip olabileceğini varsayalım. BLE cihazım, bir kalp atış monitörü olarak görev yapan bir TI CC2540 anahtarlıktır.Linux ve Bluez kullanılarak Çoklu BLE Bağlantıları 5.0
cevap
Ben bu yüzden daha fazla yer olabilir bir cevap başladı ...
Ben çalışmak benim kodu almak için Python ve C kombinasyonu kullanıyorum, olabilir, çünkü böylece benim "kod" komik görünebilir ya da Ayrıca, kullandığım çekirdeği desteklemeyen 5 numaralı Bluez'i kullandım. Bir sorun varsa lütfen bildirin ve açıklığa kavuşturabilirim.
Bazı işlemler yapmanın birkaç yolu var gibi görünüyor, ancak farklı görevler için ayrı soketini açtım. Siz tek bir soket açın ve ardından filtreleme işlemini kapatmak için soket seçeneklerini ayarlayın ve tüm paketleri tek bir yerde almalısınız. Ancak, bu benim ilk yapma yolumdu ve bağlantıların saniyeler içinde öleceğini keşfettim.
Bağlantıları taramak için bir socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
açtım ve 0
cihazında bind
yaptım. (kullanılabilir bir cihaz numarası almak için hci_get_route
adlı bir fonksiyon var) Daha sonra seçenekleri ayarlamak için setsockopt(SOL_HCI, HCI_FILTER, filter)
, setsockopt(SOL_HCI, HCI_FILTER, filter)
ve hci_le_set_scan_enable
taramayı açmak için 'u ayarlayabilirsiniz.
Her aygıt bağlantısı socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
ile yapıldı; bu durumda, belirli bir aygıta sahip olan bir struct sockaddr_l2
numaralı yuvada connect
numaralı telefonu arayarak belirli bir aygıta bağlanmayı söylüyorsunuz. Bu sokette sadece o cihazdan paketler almalısınız. (bir uyarı ... Aktif tarama gerçekleşirken dongle'm bir bağlantıya izin vermeyeceğini buldum. Bağlamadan önce geçici olarak kapatmak zorunda kaldım ve sonra tekrar açtım. Aksi halde errno'dan bir BUSY hatası aldım.
Bütün bunları söyledikten sonra ... Bluez 5'te her şeyi yapmanın yolunun DBUS kullanmak olduğunu düşünüyorum. Ne yazık ki, yaptığım şey için gerçekten bir seçenek değildi. Belirttiğim işlevler, varsayılan olarak 5'de varsayılan olarak yüklenmemiş olan paylaşılan kitaplıktadır (açık olarak configure
ile yüklenmesini istemeniz gerekir). Paylaşılan lib'i varsayılan olarak yüklemeyi bıraktıkları için, kullanıcıları DBUS'yi kullanmaya teşvik etmek istediler.
DBUS kullanmadan bu sorunu çözmek istiyorum. Verileri doğru bağlantıyla ilişkilendirebilmem için gelen soket verileriyle ilişkili tanıtıcıyı almam gerekiyor. Ioctl (soket, HCIGETCONNINFO, cr) araması BLE cihazları için çalışmaz. Bağlantı ve gelen verilerle ilişkili tanıtıcı bilgilere erişmek için bir yönteminiz var mı? – user2321427
Anladığımdan emin değilim ... Bağlantıyı başlatmıyor musunuz? Bu davada elinizde tutacak ve neye bağlı olduğunuzu bilmiyor musunuz? –
Bağlantı gerçekleştirdiğimde (socket, (struct sockaddr *) & addr, sizeof (addr)), soket bağlantısının yapıldığını gösteren 0 değeri döndürülür. Aynı anda hcidump çalıştırırsam, bu bağlantıya 1025'in atanmış olduğunu görüyorum. Bu bağlantı kullanımı için diğer veri işlemleri. Bu tanıtıcıya erişmeye çalışıyorum. – user2321427
Kodu hcitool ve gatttool'den bir araya getirdik. Kod 2 cihaz için iyi çalışıyor (tarama, hci_le_create_conn ve gatt_connect). Kullanılan cihaz sayısında bir sınırlama olmadığını düşünüyorum.
1 Start cmd_lescan (from hcitool.c)
2.For each device scanned -
cmd_lecc (from hcitool.c)
gatt_connect (from gatttool.c)
Bu şekilde, bir işlem birden fazla BLE aygıtını yönetebilir.
if (meta->subevent != 0x02)
continue;
Teşekkür ve yorumlar sabırsızlıkla: Biz taramayı kapatmak gerekmez, sadece sigara reklam mesajları göz ardı var.
Neden cmd_lecc ve GATT_connect kullanarak aynı cihaza iki bağlantı yaptığınızı açıklayabilir misiniz? – abhiarora
- 1. Çoklu bağlantı Ble
- 2. Yii çoklu veritabanı bağlantıları
- 3. DNXCORE 5.0 ve mysql/mariadb
- 4. Bluez Programlama
- 5. Linux Bluetooth sinyal gücü l2ping burada herhangi bir Linux BlueZ/BT uzmanları için
- 6. Android ve ICU 5.0
- 7. Çoklu veritabanı bağlantıları: schema_migrations yanlış veritabanında aranır
- 8. Bluez otomatik yeniden bağlanma aygıtları
- 9. Veritabanı Bağlantıları ve F #
- 10. MySQL süreçleri ve bağlantıları
- 11. UIAutomation ve Uzak Masaüstü Bağlantıları
- 12. Ble Beacon Gpio read/write
- 13. BLE (iBeacons) Trilateration
- 14. text BLE verisini görüntüleGörüntüleme
- 15. RSSI'den hesaplama BLE android
- 16. guzzle 5.0 postSonra hatası in laravel 5.0
- 17. ASP.NET 5.0
- 18. Android 5.0
- 19. KnockoutJS'de Href ve mailto bağlantıları
- 20. PHPMailer ve anonim TLS bağlantıları
- 21. Android BLE GATT_ERROR (133) aygıta bağlanmakta
- 22. L2CAP sunucusu IOBluetooth (osx bluetooth yığını) kullanılarak/istemci
- 23. Linux Crypto API ve linux/crypto.h - Dokümantasyon
- 24. Asmack giriş sorunu Android 5.0 ve üzeri
- 25. Yapı çekiç için android 5.0 (Nexus 5)
- 26. Android BLE readCharacteristic başarısız oluyor
- 27. Doctrine 2 Master/Slave bağlantıları
- 28. Web Sitesi bağlantıları site tanımlarında
- 29. eşleme bağlantıları
- 30. Xcode 5.0 NSUserdefaults, plist
İstediğiniz bu değil mi? Bir uygulamanın birden fazla cihaza bağlanmasını istiyorsanız, bunu tek bir soketten yapabilirsiniz. Her mesajın cihazın BT adresiyle birlikte geldiğine inanıyorum, böylece doğru cihazla ilişkilendirebilirsiniz. –
Şimdi anlıyorum ki bir soket kullanmalıyım. Verileri ayırmak için ACL bağlantı kolu kullanılmalıdır. BlueZ ile bu tanıtıcıya erişmekte zorlanıyorum. Soket (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) soketi oluşturur. (soket, (struct sockaddr *) & addr, sizeof (addr)) soketini bağlar. Ioctl (soket, HCIGETCONNINFO, cr) kullanarak tutamağa erişim errno 2 (dosya yok) döndürür. Hedef adresi doğru. Yukarıdaki oluşturulan soket 5 değerini döndürürken, socket = hci_open_dev (dev_id) 6 değerini döndürür. Bu tanıtımı elde etmek için daha iyi bir yol var mı. – user2321427
ioctl (socket, HCIGETCONNINFO, cr) yöntemi, klasik Bluetooth aygıtları için iyi çalışır, ancak BLE aygıtları için uygun değildir. Veri eşleme amacıyla bir BLE aygıtının ACL veri tanıtıcısına erişmek için bir yönteme ihtiyacım var. Bu BlueZ ile mümkün mü? – user2321427