Zastanawiam się nad możliwością bezpośredniego używania bonjour przez Bluetooth w systemie iPhone OS 3.0 lub nowszym bez korzystania z GameKit. Czy ktokolwiek może podać jakieś przykłady?Bonjour przez Bluetooth BEZ Gamekit?
Odpowiedz
Jeśli Bluetooth jest włączony, na wystarczająco nowym urządzeniu (3G i wyżej, lub odpowiednik iPoda lub iPada) i nowiutkim systemie operacyjnym (3.1 widocznie), Bonjour automatycznie będzie działał za pośrednictwem Bluetooth przy użyciu adresów lokalnych łącza (168,25. *). Wtedy zwykle używasz protokołu TCP/UDP.
(Pod maską, jestem całkiem pewny GameKit wykorzystuje Bonjour-over-IP-over-Bluetooth).
Sypposedly publikowanie/przeglądanie odbywa się w warstwie Bluetooth, ale jeśli ktoś publikuje usługi Bonjour i inne przeglądarki do niego, ustanawiane jest automatyczne połączenie IP over Bluetooth.
Wszelkie przykłady Bonjour powinny automatycznie działać.
Czy wiesz, która usługa Bluetooth jest używana i jak można rozmawiać z urządzeniami z systemem iOS z systemem Linux, Mac lub własnym wbudowanym urządzeniem wyposażonym w układ Bluetooth? –
@ IvanVučica: Wydaje mi się, że to Bluetooth PAN, ale słyszałem, że usługa jest również reklamowana przez Bluetooth, a PAN nie jest uruchamiany, chyba że jest to konieczne. –
Mam niektóre z moich obserwacji tutaj: http://stackoverflow.com/questions/8070998/using-ios-gamekits-bluetooth-bonjour-with-other-platforms Jednak potrzebuję szczegółów technicznych. Ma zapach PAN, ale reklamowano go w nieco inny sposób, tylko po to, by wyglądał tak, jakby nie był PAN. Nie miałem jednak okazji jeszcze powąchać protokołu. –
Wystarczy ogłosić usługi, podobnie jak tc. has said below:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
Z iOS5 jednak przejdźmy-call-it "Bluetooth Bonjour" jest domyślnie wyłączona, więc trzeba użyć C API zadeklarowanej w <dns_sd.h>
.
DNSServiceRef serviceRef;
DNSServiceRegister(&serviceRef, // sdRef
kDNSServiceFlagsIncludeP2P, // interfaceIndex
0, // flags
NULL, // name
"_http._tcp", // regtype
NULL, // domain
NULL, // host
1291, // port
0, // txtLen
NULL, // txtRecord
NULL, // callBack,
NULL // context
);
To tylko część zapowiedzi; Rozdzielanie jest nieco bardziej skomplikowane. Proponuję zapoznać się z następującymi przykładami z Apple:
- SRVResolver - pokazuje, w jaki sposób można sprawdzić usługę przy użyciu API zadeklarowanej w
<dns_sd.h>
. Kieruje na OS X, ale zawiera klasę o nazwieSRVResolver
, którą możesz używać na iOS tak łatwo, jak możesz jej używać w OS X. Aby iOS 5 Bluetooth P2P działał, zaktualizuj połączenie doDNSServiceQueryRecord()
, aby przekazaćkDNSServiceFlagsIncludeP2P
jakointerfaceIndex
. (UWAGA! Ten przykład nie istnieje w zestawie OS X 10.8. Można go znaleźć w dokumentach 10.6 i 10.7. W wersji 10.8 istnieje przykład DNSSDObjects, ale nie wyglądałem dokładnie tak, jak to robi.) - WiTap - o ile nie zależy ci na obsłudze Bluetooth w systemie iOS 5, wystarczy spojrzeć na przykład o nazwie WiTap, który demonstruje nie tylko piękne API Objective-C, ale także sposób tworzenia serwera przy użyciu Interfejsy API CFSocket (cienkie opakowania wokół gniazd BSD). Spójrz na to, nawet jeśli używasz SRVResolver, aby zobaczyć, jak korzystać z interfejsu API opartego na C od
<dns_sd.h>
.
Po ogłoszeniu lub rozwiązaniu usługi używasz zwykłych gniazd BSD do słuchania lub łączenia się. Pisząc serwer, możesz chcieć najpierw listen()
na porcie 0 (zero), a następnie zapytać, który losowy dostępny port został Ci przydzielony. Po zapytaniu o to ogłosić ten port zamiast stałego. Dokładnie to robi przykład WiTap (ale z interfejsem CFSocket API zamiast interfejsu API gniazda BSD).
Aby uzyskać więcej informacji na temat gniazd BSD, wystarczy pobrać Google samouczek.
Uwaga: informacje o iOS 5 pochodzą z firmy Apple: Technical Q&A QA1753.
Jestem zaskoczony, że nie wspomniałeś o [AsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) w dowolnym miejscu .. polecasz za/przeciw temu ? lub używanie wyżej wymienionych interfejsów API powinno wystarczyć? – abbood
@abbood: Nie używałem AsyncSocket. Jeśli jednak ogłosisz usługę opisaną w mojej odpowiedzi, system operacyjny uruchomi usługę Bluetooth PAN, która będzie mogła łączyć dwa urządzenia z systemem iOS. Umożliwia to ustanowienie połączenia TCP lub UDP przez Bluetooth zamiast tylko WiFi lub GSM. W jaki sposób zamierzasz go założyć (bezpośrednio gniazda BSD lub poprzez opakowanie takie jak AsyncSocket) - to w rzeczywistości nieistotne. :-) –
Przeczytaj ten artykuł: Bonjour przez Bluetooth na iOS 5.0 https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315
Jest to znany problem w IOS 5.0 i musi zostać rozwiązany przy użyciu API na niższym poziomie: DNSSDObjects.
W swojej edycji z 11 marca 2012 r. Całkowicie zmieniłeś pytanie. Po otrzymaniu trzech odpowiedzi i po powiązaniu z innymi pytaniami, jest to zła praktyka i sprawia, że wydaje się, że ludzie, którzy ci odpowiedziały, teraz są chaotyczni, dostarczając niezwiązanych odpowiedzi. Czy mógłbyś zamiast tego zadać NOWE pytanie? :-) –