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!
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
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
@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