2013-04-25 12 views
5

Obecnie próbuję połączyć się z wieloma urządzeniami BLE za pomocą BlueZ 5.0 i Linux. Mam jeden adapter BLE hosta i zmodyfikowałem gatttool, aby połączyć i wykonać tę funkcję. Jeśli uruchomię instancję zmodyfikowanego gatttoolu, pomyślnie połączę się i otrzymam dane z powiadomień z urządzenia BLE. Jeśli uruchomię kolejną instancję zmodyfikowanego gatttoolu i połączę się z innym urządzeniem BLE, ta aplikacja zacznie otrzymywać powiadomienia z obu urządzeń BLE, a początkowa aplikacja nie będzie już odbierać żadnych danych. Sądzę, że jest to spowodowane konfiguracją gniazd, gdzie obie aplikacje konfigurują swoje gniazda do tego samego adresu i PSM (najnowsza instancja odbiera dane, podczas gdy druga jest głodzona). Czy istnieje sposób, aby temu zapobiec? Idealnie, chcę, aby jedna aplikacja łączyła się z wieloma urządzeniami. Zakładam, że aplikacja może mieć tylko jedno gniazdo z tego powodu, że wiele gniazd będzie mieć ten sam problem, co wiele instancji powyżej. Moje urządzenie BLE to pilot TI CC2540 działający jako monitor pracy serca.Wiele połączeń BLE przy użyciu Linuksa i Bluez 5.0

+0

Czy tego nie chcesz? Jeśli chcesz, aby jedna aplikacja łączyła się z wieloma urządzeniami, możesz to zrobić za pośrednictwem pojedynczego gniazda. Wierzę, że każda wiadomość przychodzi z adresem urządzenia BT, więc możesz go powiązać z odpowiednim urządzeniem. –

+0

Teraz rozumiem, że powinienem użyć jednego gniazda. Do oddzielenia danych należy użyć uchwytu połączenia ACL. Mam trudności z dostępem do tego uchwytu za pośrednictwem BlueZ. gniazdo (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) tworzy gniazdo. connect (skarpety, (struct sockaddr *) i addr, sizeof (addr)) łączą gniazdo. Uzyskiwanie dostępu do uchwytu za pomocą ioctl (socket, HCIGETCONNINFO, cr) zwraca errno 2 (brak pliku). Adres docelowy jest poprawny. Moje utworzone powyżej gniazdo zwraca wartość 5, podczas gdy socket = hci_open_dev (dev_id) zwraca wartość 6. Czy istnieje lepszy sposób na uzyskanie tego uchwytu. – user2321427

+1

Metoda ioctl (socket, HCIGETCONNINFO, cr) działa dobrze dla klasycznych urządzeń bluetooth, ale nie dla urządzeń BLE. Potrzebuję metody dostępu do uchwytu danych ACL dla urządzenia BLE do celów parowania danych. Czy to możliwe w BlueZ? – user2321427

Odpowiedz

2

Zacząłem odpowiedź więc może mam więcej miejsca ...

używam kombinacji Python i C, aby mój kod do pracy, więc mój „Kod” może wyglądać zabawne, bo to może być z którejkolwiek. Ponadto użyłem Bluez 4, ponieważ 5 nie obsługuje jądra, z którego korzystałem. Daj mi znać, jeśli wystąpi problem i mogę wyjaśnić.

Wygląda na to, że istnieje kilka sposobów robienia rzeczy, ale ostatecznie otworzyłem oddzielne gniazda dla różnych zadań. Ty możesz otworzyć pojedyncze gniazdo, a następnie ustawić opcje gniazd, aby wyłączyć filtrowanie i powinieneś pobrać wszystkie pakiety w jednym miejscu. Jednak to był mój pierwszy sposób na zrobienie tego i odkryłem, że moje połączenia umrą w ciągu kilku sekund.

Aby wyszukać połączenia, otworzyłem socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI), a następnie wykonałem bind na urządzeniu 0. (dostępna jest funkcja o nazwie hci_get_route w celu uzyskania dostępnego numeru urządzenia). Następnie można zadzwonić pod numer hci_le_set_scan_parameters, aby ustawić opcje, setsockopt(SOL_HCI, HCI_FILTER, filter), aby uzyskać tylko zdarzenia skanowania LE, a następnie zadzwonić pod numer hci_le_set_scan_enable, aby włączyć skanowanie.

Każde połączenie Urządzenie zostało wykonane z socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP) które następnie powiedzieć, aby połączyć się z konkretnym urządzeniem poprzez wywołanie connect na gnieździe z struct sockaddr_l2 który ma szczególną adres urządzenia w nim. Na tym gnieździe powinieneś otrzymywać tylko pakiety z tego urządzenia. (jedno zastrzeżenie ... Zauważyłem, że mój klucz nie zezwala na połączenie podczas aktywnego skanowania. Musiałem to tymczasowo wyłączyć tuż przed podłączeniem, a następnie włączyć je ponownie. W przeciwnym razie dostałem błąd BUSY od errno)

Powiedziawszy to wszystko, chociaż ... Myślę, że sposób, w jaki należy zrobić wszystko w Bluezie 5, to korzystanie z DBUS. Niestety to nie była opcja dla tego, co robiłem. Funkcje, o których wspomniałem, są we wspólnej bibliotece, która najwyraźniej nie jest instalowana domyślnie w wersji 5 (musisz jawnie poprosić o zainstalowanie go pod numerem configure). Przestali domyślnie instalować udostępnioną bibliotekę, ponieważ chcieli zachęcić użytkowników do korzystania z DBUS.

+0

Chciałbym początkowo rozwiązać ten problem, nie korzystając z DBUS. Muszę pobrać uchwyt związany z przychodzącymi danymi gniazda, aby móc powiązać dane z poprawnym połączeniem. Wywołanie ioctl (socket, HCIGETCONNINFO, cr) nie działa dla urządzeń BLE. Czy masz dostęp do informacji o uchwytach związanych z połączeniem i danymi przychodzącymi? – user2321427

+0

Nie jestem pewien, czy rozumiem ... Czy nie inicjujesz połączenia? Czy nie miałbyś już w tej sprawie do czynienia i nie wiesz, co łączyłeś? –

+1

Kiedy wykonuję connect (socket, (struct sockaddr *) i addr, sizeof (addr)) zwracana jest wartość 0, która wskazuje, że zostało nawiązane połączenie z gniazdem. Jeśli uruchomię hcidump w tym samym czasie, widzę, że uchwyt 1025 jest przypisany do połączenia. Dalsze transakcje danych dla tego połączenia używają tego uchwytu. Próbuję uzyskać dostęp do tego uchwytu. – user2321427

1

Połączyliśmy kod z hcitool i gatttool. Kod działa dobrze dla 2 urządzeń (skan, hci_le_create_conn i gatt_connect). Uważam, że nie ma ograniczeń co do liczby używanych urządzeń.

1 Start cmd_lescan (from hcitool.c) 
2.For each device scanned - 
     cmd_lecc (from hcitool.c) 
     gatt_connect (from gatttool.c) 

W ten sposób jeden proces może zarządzać wieloma urządzeniami BLE.Nie musimy wyłączać skanowania, wystarczy zignorować wiadomości nie reklamowe:

 if (meta->subevent != 0x02) 
       continue; 

Dzięki i czekamy na komentarze.

+0

Czy możesz wyjaśnić, dlaczego robisz dwa połączenia z tym samym urządzeniem przy użyciu cmd_lecc i GATT_connect? – abhiarora

Powiązane problemy