Bluetooth SPP między Androidem a innym urządzeniem, pytania UUID i PIN

Próbuję zaimplementować aplikację na Androida do odbierania danych z urządzenia medycznego, ale nie mogę przejść przez proces wykrywania i sparować telefonu i urządzenia lub połączyć się ze sobą.

Opisujący wyrób medyczny: Urządzenie wykorzystuje Service Discovery Protocol (SDP) oraz Serial Port Profile (SPP). Rozpoczyna procedurę dochodzenia w celu wykrycia (do 10) otaczających punktów dostępu z dopasowanym filtrem COD i nazwą usługi. Następnie kolejno ustanawia połączenie (za pomocą procedury Page) z punktem dostępowym, sprawdzając kod PIN. Po dopasowaniu Pina dane są przesyłane. Po przesłaniu danych urządzenie czeka na potwierdzenie. Decyka jest master i inicjuje komunikację.

Nie mam kontroli nad wyrobem medycznym. Wszystko, co mogę zrobić, to uruchomić go i poczekać na procedurę opisaną powyżej (po pomiarze).

Aplikacja na Androida: Zacząłem od Bluetooth Chat Przykład na stronach programisty. Do tej pory zamieniłem UUID na 00001101-0000-1000-8000-00805f9b34fb aby używać SPP i ustawić nazwę usługi na odpowiednią nazwę. Mogę potwierdzić, że wydaje się to poprawne poprzez inspekcję usługi z komputera. Ponieważ urządzenie medyczne jest tym, które pyta i inicjuje komunikację, moja Służba używa metody BluetoothServerSocket i accept(), aby zacząć go słuchać.

  1. Na stronach programistów przeczytałem, że UUID musi pasować między aplikacjami próbującymi komunikować się. Ponieważ nie mogę ustawić żadnego UUID dla urządzenia medycznego, zastanawiam się, czy będzie to problem, czy wystarczy, że urządzenie medyczne używa profilu SP?

  2. Jeśli nazwa usługi i UUID są poprawne, a urządzenie medyczne rzeczywiście spróbuje połączyć się z moją usługą Bluetooth, która nasłuchuje połączeń, czy system Android poprosi mnie o ręczne wprowadzenie kodu PIN, aby móc sparować urządzenia (ponieważ urządzenie medyczne ma wstępnie ustawiony PIN)?

  3. Nie znalazłem nic w Android SDK API, które pozwala mi ustawić PIN dla mojej Usługi Bluetooth (w przypadku, gdy to jest, gdzie to się nie powiedzie), jest to możliwe?

Czytałem, że zwykle PIN jest generowany przez system w dzisiejszych czasach i tylko potwierdzenie użytkownika jest potrzebne. Chyba nie w moim systemie, ponieważ urządzenie jest nieco starsze.

Byłbym bardzo wdzięczny, gdybyś chciał podzielić się wiedzą, podpowiedziami, domysłami na temat czegokolwiek związanego z tym, co Opisałem powyżej! Z góry dzięki, Fredrik

EDIT:

Teraz mam urządzenie sparowane z bluegigą i komunikują się poprawnie. Teraz szukam kryteriów, które należy spełnić, aby urządzenie do ciśnieniowego podłączyć do mojego telefonu. Mogę sprawdzić, z komputera z Linuksem (sdptool search SP w terminalu), usługę Bluetooth dostarczaną przez bluegiga i porównać to z usługą Bluetooth, którą dostarczam na Androida. Wartości te są tym, co Dostaję:

~$ sdptool search SP

Dociekliwy ...

Szukam SP na 8C: 71: F8: E5: XX: XX . . .

Nazwa Usługi: 1808130054

Rechandle usługi: 0x10003

Lista ID klasy usług:

UUID 128: 00001101-0000-1000-8000-00805f9b34fb

Lista Deskryptorów Protokołu:

"L2CAP "(0x0100)

"RFCOMM" (0X0003)

Kanał: 13

´

Seaching dla SP on 00:07:80: 88: XX: XX . . .

Nazwa Usługi: 1808130054

Opis Usługi: 1808130054

Rechandle serwisu: 0x10005

Lista ID klasy usług:

"port szeregowy" (0x1101)

Lista Deskryptorów Protokołu:

"L2CAP "(0x0100)

"RFCOMM" (0X0003)

Kanał: 12

Baza Języków Lista Attr:

Code_ISO639: 0x656e

Enconding: 0x6a

Base_offset: 0x100

Pierwsze znalezione urządzenie to telefon (mac=8C:71...Google Nexus S) i drugi (mac=00: 07...) jest bluegiga . Zauważyłem, że na urządzeniu z Androidem nie ma opisu usługi. Myślę, że najważniejszą różnicą jest lista ID klasy usług. UUID 128 na Androida, ale zupełnie inny format opisujący to na bluegiga.
  1. Czy możliwa jest implementacja przy użyciu identyfikatorów klas usług z innym formatem niż UUID na Android?

  2. Czy można manipulować rekordem serwisowym zarejestrowanym w service discovery DB?

  3. Czy da się jakoś zaimplementować do Blueza bezpośrednio, używając natywnego programowania c / C++?

/Fredrik

Author: Fredricus, 2011-03-10

1 answers

Jeśli możesz podać nazwę / link do urządzenia medycznego (jeśli jest to urządzenie komercyjne), pomocne może być przeczytanie jego przewodnika, aby dowiedzieć się więcej na temat tego, co może się dziać. Oto kilka propozycji:

  1. Oprócz uuid portu szeregowego, każda usługa nad SPP może mieć niestandardowy uuid-przykład urządzenie medyczne może szukać usługi, z którą jest kompatybilne, używając tego niestandardowego UUID.
    Jeśli urządzenie medyczne obecnie łączy się z komputerem PC lub niektórymi inny punkt dostępu pomyślnie i przesyła dane, Możesz spróbować odczytać rekord SDP tego urządzenia i określić, jaki konkretny UUID oprócz SPP uuid jest używany, jeśli w ogóle, i użyć tego samego w swojej aplikacji również.

  2. Jeśli urządzenie medyczne nie jest w stanie znaleźć twojego telefonu / aplikacji, może to być spowodowane tym, że nie można go wykryć. Urządzenie z Androidem domyślnie nie jest wykrywalne nawet wtedy, gdy jesteś serwerem, będzie tylko podłączane i nie wykrywalne, możesz spróbować spraw, aby urządzenie było wykrywalne programowo lub za pomocą ustawień i sprawdź, czy urządzenie medyczne może znaleźć Twoje urządzenie. Zobacz tutaj- Włączanie możliwości wykrywania w Androidzie

  3. W przypadku parowania PIN urządzenie z systemem android powinno rozpocząć proces parowania, gdy urządzenie nieparowane próbuje się z nim połączyć, Możesz spróbować po zapoznaniu się z zaleceniami (1) i (2), Parowanie pinów jest używane, jeśli jedno z urządzeń jest przed wersją Bluetooth 2.1, nawet w nowszych urządzeniach 6-cyfrowy kod z pewną interwencją użytkownika / potwierdzeniem będzie wymagany przez telefon, aby umożliwić parowanie (jest to po prostu dobra polityka bezpieczeństwa , aby nie dopuścić do tego, aby stało się to automatycznie bez interwencji użytkownika), mam nadzieję, że parowanie będzie wymagało tylko pierwszego połączenia, później nie będzie wymagało żadnej interwencji użytkownika dla kolejnych połączeń.

 6
Author: Dennis Mathews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-11 21:07:04