Android: Jak działają identyfikatory UUID Bluetooth?

81

Nie rozumiem, co oznacza identyfikator UUID Bluetooth. Czy identyfikatory UUID oznaczają protokoły (np. RFCOMM )? Jeśli tak, dlaczego te createRfcommSocketToServiceRecord()metody wymagają identyfikatorów UUID, skoro określają rfcomm bezpośrednio w swoich nazwach? Dlaczego przykładowy kod BluetoothChat ma pozornie dowolny, zakodowany na stałe identyfikator UUID?

Moje pytanie pojawia się, ponieważ zgodnie z tym pytaniem otrzymuję wyjątek wskaźnika zerowego, gdy urządzenia z systemem 4.0.4 próbują połączyć się (z zewnętrznym urządzeniem innym niż Android) za pomocą odbicia. Jednak rozwiązanie tego pytania nie działa dla mnie. UUID muuid = device.getUuids()[0].getUuid();podnosi wyjątek.

Edycja : rozwiązałem ten problem, zakodowując na stałe identyfikator UUID dla usługi portu szeregowego zgodnie z tą odpowiedzią (używając UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");).

Ponadto zastanawiam się, dlaczego muszę podać identyfikator UUID, aby utworzyć niezabezpieczone gniazdo rfcomm, używając, createInsecureRfcommSocketToServiceRecord(),ale nie używając metody odbicia.

Czy ktoś może mnie wyprostować?

ForeverWintr
źródło
Nigdy nie korzystałem z połączenia Bluetooth poza celami akademickimi, ale wiem, że UUID jest identyfikatorem urządzenia, czymś w rodzaju adresu urządzenia i pozostaje taki sam dla urządzenia.
noob
@Creator: To zaprzecza tej odpowiedzi: stackoverflow.com/a/4963069/1286571
ForeverWintr
3
Cóż, to wszystko, co wiedziałem o identyfikatorach UUID Bluetooth, możesz spróbować przeczytać ten plik PDF, aby lepiej zrozumieć protokoły Bluetooth i identyfikatory UUID - people.csail.mit.edu/rudolph/Teaching/Articles/PartOfBTBook.pdf
noob
Pytanie: Czy ma to jakieś konsekwencje, gdy telefon z Androidem nie obsługuje identyfikatora UUID z urządzenia zdalnego? (UUID nie jest wymieniony w systemie Android ... getUuids ())?
Orri
Hej hej hej! Chcę o coś zapytać, @ForeverWintr, czy mogę zdefiniować pojedynczy identyfikator UUID w moim własnym formacie i używać go na dwóch urządzeniach z Androidem? To znaczy, czy mogliby się komunikować?
gumuruh

Odpowiedzi:

7

W Bluetooth wszystkie obiekty są identyfikowane za pomocą identyfikatorów UUID. Obejmują one usługi, cechy i wiele innych rzeczy. Bluetooth utrzymuje bazę danych z przypisanymi numerami dla standardowych obiektów i przypisuje podzakresy dla dostawców (którzy zapłacili wystarczająco dużo za rezerwację). Możesz wyświetlić tę listę tutaj:

https://www.bluetooth.com/specifications/assigned-numbers/

Jeśli wdrażasz standardową usługę (np. Port szeregowy, klawiatura, zestaw słuchawkowy, itp.), Powinieneś użyć standardowego UUID tej usługi - pozwoli ci to na współpracę z urządzeniami, których nie stworzyłeś.

Jeśli wdrażasz usługę niestandardową, powinieneś wygenerować unikalne identyfikatory UUID, aby mieć pewność, że niekompatybilne urządzenia innych firm nie będą próbowały korzystać z Twojej usługi, myśląc, że jest to coś innego. Najłatwiej jest wygenerować losowe, a następnie zakodować wynik w swojej aplikacji (i oczywiście użyć tych samych identyfikatorów UUID w urządzeniach, które będą łączyć się z Twoją usługą).

David C.
źródło
Skąd mogę wziąć te UUID i dlaczego zawsze są to ciągi, które wydają się być przypadkowe?
Łukasz krzyż
Identyfikatory UUID są generowane zgodnie z RFC 4122. Do wyboru jest pięć różnych wersji UUID. Najpopularniejsze to wersja 1 (oparta na sygnaturze czasowej i adresie MAC) oraz wersja 4 (losowa). Zobacz także en.wikipedia.org/wiki/Universally_unique_identifier . Strona internetowa, która może generować identyfikatory UUID, to uuidgenerator.net . Jeśli jesteś członkiem Bluetooth SIG, zapewniają one algorytm generowania identyfikatorów UUID powiązanych z Twoim identyfikatorem członkostwa.
David C.
29

Identyfikator UUID służy do jednoznacznej identyfikacji informacji. Identyfikuje określoną usługę świadczoną przez urządzenie Bluetooth. Norma definiuje podstawowy BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB.

Urządzenia, takie jak czujniki medyczne, mogą świadczyć usługi, zastępując pierwsze osiem cyfr predefiniowanym kodem. Na przykład urządzenie, które oferuje połączenie RFCOMM, używa krótkiego kodu: 0x0003

Tak więc telefon z Androidem może połączyć się z urządzeniem, a następnie użyć protokołu wykrywania usług (SDP), aby dowiedzieć się, jakie usługi zapewnia (UUID).

W wielu przypadkach nie musisz używać tych stałych identyfikatorów UUID. W przypadku, gdy tworzysz aplikację do czatu, na przykład jeden telefon z systemem Android współdziała z innym telefonem z systemem Android, który korzysta z tej samej aplikacji, a zatem z tego samego UUID.

Możesz więc ustawić dowolny UUID dla swojej aplikacji, używając na przykład jednego z wielu generatorów losowych UUID w Internecie ( na przykład ).

GVillani82
źródło
Czyli pełny identyfikator UUID usługi RFCOMM to: 00000003-0000-1000-8000-00805F9B34FB?
gyozo kudor
1
Uwaga: podają krótką formę identyfikatora usługi, która jest 32-bitowa. Łączysz go z podstawowym UUID BT SIG 00000000-0000-1000-8000-00805F9B34FB, zastępując pierwsze 4 cyfry identyfikatora GUID. Dawny. RFCOMM to 0x0003, więc UUID dla usługi RFCOMM to 00030000-0000-1000-8000-00805F9B34FB
sam msft
22

Zwykle reprezentuje jakąś powszechną usługę (protokół) obsługiwaną przez urządzenie Bluetooth.

Tworząc własny serwer rfcomm (z listenUsingRfcommWithServiceRecord), powinieneś określić swój własny UUID, aby klienci, którzy się z nim łączą, mogli go zidentyfikować; jest to jeden z powodów, dla których createRfcommSocketToServiceRecordwymaga parametru UUID.

W przeciwnym razie niektóre popularne usługi mają ten sam identyfikator UUID, po prostu znajdź taki, którego potrzebujesz i użyj go.

Zobacz tutaj

nullpotent
źródło
3
to zwykle robi? Kiedy nie? Nie rozumiem, dlaczego, jeśli tworzę serwer RCOMM, nie użyłbym UUID RFCOMM.
ForeverWintr
1
Cóż, UUIDto uniwersalny identyfikator. RFCOMM jest tylko warstwą stosu protokołów Bluetooth i ma powiązany UUID zgodnie ze specyfikacją Bluetooth; i jest używany przez SDP, nie do końca wiadomo, do czego; ale zawsze możesz o tym przeczytać w specyfikacji. Teraz, jeśli tworzysz usługę na podstawie protokołu RFCOMM, musisz podać UUID, ponieważ jest on wymagany przez SDP, w przeciwnym razie Twoja usługa nie zostanie wykryta.
nullpotent
3
Znalazłem ten w sieci. Wszystko?? identyfikatory UUID dla BT. sviluppomobile.blogspot.de/2012/11/…
Orri
Link jest martwy - czy była to lista wspólnych identyfikatorów UUID?
user1725145
7

Identyfikator UUID jest podobny w pojęciu do numerów portów w Internecie. Jednak różnica między technologią Bluetooth a Internetem polega na tym, że w przypadku technologii Bluetooth numery portów są przypisywane dynamicznie przez serwer SDP (protokół wykrywania usług) podczas działania, w którym każdemu identyfikatorowi UUID nadawany jest numer portu. Inne urządzenia zapytają serwer SDP, który jest zarejestrowany pod zarezerwowanym numerem portu, o dostępne usługi na urządzeniu i odpowiedzą za pomocą różnych usług, które można odróżnić od siebie, rejestrując się pod różnymi identyfikatorami UUID.

Khaled Alanezi
źródło
4

UUID to tylko liczba. Nie ma to żadnego znaczenia, z wyjątkiem tworzenia po stronie serwera aplikacji na Androida. Następnie klient łączy się przy użyciu tego samego UUID.

Na przykład po stronie serwera możesz najpierw uruchomić uuid = UUID.randomUUID (), aby wygenerować liczbę losową, taką jak fb36491d-7c21-40ef-9f67-a63237b5bbea. Następnie zapisz to, a następnie na stałe zakoduj w swoim programie nasłuchującym w następujący sposób:

 UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea"); 

Twój program serwera Android będzie nasłuchiwał żądań przychodzących z tym UUID w następujący sposób:

    BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid);

Gniazdo BluetoothSocket = server.accept ();

Walker Rowe
źródło
1

Podsumowując: UUidsłuży do jednoznacznej identyfikacji aplikacji. Każda aplikacja ma unikalnyUUid

Więc używaj tego samego UUiddla każdego urządzenia

aykut
źródło
0

UUID to skrót od Universally Unique Identifier. UUID to prosta 128-bitowa cyfra, która jest wyjątkowo rozpowszechniona na całym świecie.

Bluetooth wysyła dane bezprzewodowo i wszystkie pobliskie urządzenia mogą je odbierać. Załóżmy, że czasami trzeba wysłać ważne pliki przez Bluetooth, a wszystkie znajdujące się w pobliżu urządzenia mają do nich dostęp. Dlatego po sparowaniu z innymi urządzeniami po prostu udostępniają one numer UUID i dopasowują się przed udostępnieniem plików. Gdy wysyłasz dowolny plik, Twoje urządzenie zaszyfruje ten plik za pomocą odpowiedniego identyfikatora UUID urządzenia i udostępni w sieci. Teraz wszystkie urządzenia Bluetooth w zasięgu mogą uzyskać dostęp do zaszyfrowanego pliku, ale wymagały prawidłowego numeru UUID. Tak więc tylko właściwe urządzenia UUID mają dostęp do zaszyfrowania pliku, a inni odrzucą przyczynę nieprawidłowego UUID.

Krótko mówiąc, możesz użyć UUID jako tajnego hasła do udostępniania plików między dwoma dowolnymi urządzeniami Bluetooth.

Karan Nassa
źródło