2013-04-25 23 views
5

Ş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

+0

İ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. –

+0

Ş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

+1

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

cevap

2

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.

+0

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

+0

Anladığımdan emin değilim ... Bağlantıyı başlatmıyor musunuz? Bu davada elinizde tutacak ve neye bağlı olduğunuzu bilmiyor musunuz? –

+1

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

1

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.

+0

Neden cmd_lecc ve GATT_connect kullanarak aynı cihaza iki bağlantı yaptığınızı açıklayabilir misiniz? – abhiarora