2010-10-02 21 views
21

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?

+3

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? :-) –

Odpowiedz

2

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ć.

+1

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? –

+0

@ 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. –

+2

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. –

20

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 nazwie SRVResolver, 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 do DNSServiceQueryRecord(), aby przekazać kDNSServiceFlagsIncludeP2P jako interfaceIndex. (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.

+0

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

+0

@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. :-) –

Powiązane problemy