2011-08-02 12 views
9

Szukałem w Internecie i nie widziałem nic na drodze do tego, jak dokładnie wdrożyć parowanie OOB. Miałem nadzieję, że ktoś tutaj wskaże mi jakiś przykładowy kod, który mi pomoże. Przykład czatu na stronie dla programistów Androida tak naprawdę nie zanurkował w ten sposób.Łączenie Bluetooth "poza pasmem" (OOB) w systemie Android?

Zasadniczo mam tablet z Androidem, który chcę bezpiecznie sparować z urządzeniem napisanym w języku C++, bez wbudowanego mechanizmu wyświetlania/IO. Tablet, który ma zostać sparowany, będzie działał jako interfejs GUI/IO, a ja wyślę wiadomość z powrotem i czwarta przez Bluetooth. Dlatego chcę bezpiecznie parować tablet z każdym urządzeniem za pomocą schematu parowania OOB.

Rozumiem pojęcie OOB, ale mam problem ze znalezieniem odpowiednich metod wywoływania podczas przeglądania strony android.developers.com dla mojego kodu klienta Android. Również patrząc na bluez rzeczy nie mogę znaleźć wiele, aby przejść do mojego napisanego serwera C++.

Podstawowym przypadkiem użycia jest podłączenie tabletu do urządzenia przez połączenie USB. Połączenie USB ułatwi przekazywanie kluczy/adresów MAC dla każdego urządzenia, a następnie wykorzystanie tej pary Bluetooth.

Potrafię wymyślić część USB, ale gdy już mam klucze i niezbędne informacje na temat klienta i serwera, nie mogę znaleźć prawidłowych metod wywoływania obu końców, aby pomyślnie i bezpiecznie się połączyć.

Mam już klienta/serwera rozmowę przez niepewne połączenie, tak naprawdę jedyną częścią, z którą mam problem jest faktyczne parowanie na obu końcach. Ponieważ raz jestem sparowany, mogę użyć secureRFComm, aby wykonać wszystkie moje przyszłe wiadomości.

Dziękuję każdemu, kto może pomóc!

Odpowiedz

2

Brak publicznych interfejsów API na Androind, aby umożliwić parowanie obiektów OOB. Jest to możliwe tylko wtedy, gdy możesz lub chcesz zmodyfikować stos BlueZ, aby odsłonić haki OOB do aplikacji. (Niezbędne zadanie)

Jaki mechanizm OOB planujesz użyć? NFC?

+0

Dzięki za odpowiedź Dennisa. Sposób wizualizacji uścisku dłoni polega na tym, że użytkownik połączy tablet z urządzeniem za pośrednictwem połączenia USB. Połączenie USB ułatwi przekazywanie kluczy/adresów MAC dla każdego urządzenia.Mając adres MAC każdego urządzenia, powinienem być w stanie sparować zestaw bluetooth ze sobą pragmatycznie zestawiony z odpowiednimi klawiszami. Wyglądało na to, że chodzi o parowanie OOB. To jest praca niestandardowa, a nie aplikacja planowana na rynek Android. Tak więc, jeśli nie jest to właściwy sposób obsługi tego typu parowania, jestem otwarty na sugestie dotyczące projektu. – Brian

+0

Przeszukuję dokumentację Androida i znalazłem kilka metod wymienionych jako @hide, które wydają się przydatne. Jedną z takich metod jest "createBondOutofBand". Czy jest to coś, do czego mogę się odwołać poprzez odbicie lub czy potrzebne są zmiany stosu BlueZ? Nadal nie jestem pewien, jak sobie z tym poradzić na serwerze, który nie jest androidem. Przez uchwyt rozumiem metody, które muszę wywołać w BlueZ, które pozwoliłyby parze serwerów OOB. Dzięki za pomoc! – Brian

+0

@Brian: Parowanie OOB wymaga wartości Hash i Randomizer z każdego HCI Bluetooth (możesz również przeprowadzić jednokierunkowe uwierzytelnianie, jeśli tylko jedna strona może wysyłać dane, ale tak nie jest w tym przypadku). Zakładam, że otrzymasz swoje wartości ze strony Androida za pomocą ['readOutOfBandData'] (http://www.androidjavadoc.com/2.3/android/bluetooth/BluetoothAdapter.html#readOutOfBandData%28%29), ale ja nie" t rozwijać dla Androida, więc nie można niczego zweryfikować. – Hasturkun

10

Mam problem w 95% rozwiązany, ale trafiłem na mały blok drogowy. Najpierw zaktualizuję ten post bardziej konkretną odpowiedzią na oryginalne pytanie i na końcu opublikuję moje pytanie. Podsumowując, moim zadaniem jest użycie parowania poza pasmem (oob), aby bezpiecznie sparować tablet z Androidem za pomocą Honeycomb 3.2 z płytą beagle przez USB. Nie mogę przesłać konkretnego kodu, ale dam ci wszystkie niezbędne kroki, aby to zrobić.

Na płycie Beagle mam zainstalowany pakiet bluez 4.96 z zainstalowaną wtyczką dbusoob. Aby upewnić się, że to zostało poprawnie skonfigurowane, zainstaluj 2 klucze sprzętowe Bluetooth na płycie Beagle i uruchom kod testowy OOB znajdujący się w archiwum bluez w folderze testowym. To jest skrypt Pythona. Skrypt powinien pomyślnie sparować 2 klucze sprzętowe Bluetooth, jeśli nie, bluez prawdopodobnie nie jest poprawnie skonfigurowany.

Aby uzyskać komunikację USB z działającym tabletem, należy zainstalować mtpfs i mtp-tools. Służą one do zamontowania tabletu. Sposób, w jaki rozwiązałem uzyskiwanie informacji OOB pomiędzy dwoma urządzeniami, polegało na zamontowaniu tabletu na tablicy Beagle. Po zamontowaniu tabletu i tablicy Beagle można napisać plik z potrzebnymi informacjami.

Po stronie Androida OOB nie jest obsługiwany w publicznym interfejsie API, więc sprawy stają się trudne. Wierzę, że dzieje się tak dlatego, że Honeycomb 3.2 nie ma bluezowego stosu, który oficjalnie wspiera klejenie OOB, ale Google ma jakąś implementację zakodowaną.Wierzę w to, ponieważ jeśli spojrzysz na kod źródłowy piernika na potrzeby adaptera Bluetooth i klas urządzeń Bluetooth, możesz zobaczyć metody OOB dostępne, ale nie ujawnione przez udokumentowane API.

Metody te są nadal publiczne, dzięki czemu można je wywoływać za pomocą refleksji. Za pomocą refleksji można również uzyskać wszystkie sygnatury metod w klasie. W ten sposób zorientowałem się, jakie metody miałem do dyspozycji.

Pamiętaj jednak, że wiele z nich nie jest udokumentowanych i nie jest oczywiste, co niektórzy robią. Ważne do zapamiętania są: readOutOfBandData() w klasie adaptera i setDeviceOutOfandData() w klasie urządzeń.

Innym problemem, na który możesz natknąć się, jest zapisywanie danych oob do pliku na tablecie, który ma być odczytany przez tablicę Beagle. Ponieważ Android używa protokołu mtp, musisz zindeksować plik po zapisaniu go w wewnętrznej pamięci sdcard. Aby rozwiązać ten problem, należy skorzystać z klasy MediaScannerConnection i metody scanFile().

Mam nadzieję, że powyższe pomoże komukolwiek innemu z tym samym problemem.

Teraz na moje pytanie. Moja aplikacja na Androida działa świetnie, a mój kod płyty Beagle to przykład testooB, który został zaktualizowany tak, aby jeden koniec odczytywał informacje OOB z pliku. Teraz widzę, że po uruchomieniu wszyscy się świetnie widzą, ale na tablecie wciąż pojawia się komunikat, czy chcę sparować z urządzeniem xyz. Nie ma klawiszy ani cyfr. Po prostu pyta "Sparuj z urządzeniem XYZ" lub coś podobnego.

Po naciśnięciu "pair" wszystko jest sparowane z punktu widzenia tabletów, ALE skrypt Pythona zwraca, że ​​parowanie nie powiodło się. Skrypt Pythona na płycie Beagle wywołuje właściwą metodę wykonywania połączenia między urządzeniami. Nawet gdy mam androida zainicjować wywołanie createBond, widzę ten sam wynik. Mogę zagwarantować, że ustawiłem wymagane dane OOB na obu końcach przed próbą sparowania w obu przypadkach, więc wydaje się, że to nieprawda.

więc moje problemy, które mam nadzieję, że ktoś może mi pomóc to:

1) Dlaczego nawet dostać wiadomość na Androida, jeśli dane OOB jest prawidłowo wymieniać? Czy jest inny telefon, którego mi brakuje i na którym końcu?

2) Dlaczego skrypt python w desce Beagle zwraca paring nie powiodło się, mimo że klikam wyskakujące okienko "pair" wyświetlane na tablecie. Monitor tabletu i monitora bluesowego pokazują urządzenia jako sparowane. Znowu pochylam się nad myślą, że czegoś mi brakuje.

Dzięki innych, które mogą pomóc :)

EDIT:

dodać więcej informacji tutaj jest wyjście logcat:

D/UIBluetooth(4363): !!!!!! Start Bond !!!!!! 
D/BluetoothService(1703): Setting out of band data for: 00:02:76:24:C2:8F:[-37, -1, 65, -42, -121, -75, -60, -4, -47, -86, -88, 14, 64, 83, 16, 96]:[-112, 34, 121, -97, 15, -54, -83, - 
93, 104, -83, -124, -25, 89, 114, 66, 62] 
D/BluetoothBondState(1703): 00:02:76:24:C2:8F bond state 10 -> 11 (0) 
D/UIBluetooth(4363): createOobBond Successful 
V/BluetoothEventManager(2174): Received android.bluetooth.device.action.BOND_STATE_CHANGED 
D/BluetoothEventLoop(1703): Property Changed: Devices : 1 
D/BluetoothEventLoop(1703): Device property changed: 00:02:76:24:C2:8F property: Connected value: true 
I/BluetoothEventLoop.cpp(1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData 
I/BluetoothEventLoop.cpp(1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData 

Dwa ostatnie linia wydaje się być wyzwalania popup na Android albo sparuj/anuluj z urządzeniem w pytaniach. Chciałbym, żeby Android wiedział, że po prostu auto bond, a nawet nie pyta. Mogłabym zagubić telefon lub zrobić coś nie w porządku dla wszystkiego, co wiem. Ostatnią rzeczą, jaką robię w moim kodzie, jest stworzenie więzi, która wydaje się być oczywistym miejscem do wykonania ...

Dzięki za wszelkie sugestie!

+2

Czy mógłbyś gdzieś zamieścić swoje źródło? Pracowałem nad czymś bardzo podobnym, ale nie dotarłem zbyt daleko. –

+0

tak, możesz opublikować swoje źródło – shreyashirday

+0

Witaj, czy znalazłeś rozwiązanie tego problemu? Myślę, że wiele osób zmaga się z tym. – ymerdrengene

Powiązane problemy