Mi chiedo la possibilità di utilizzare direttamente bonjour su bluetooth in iPhone OS 3.0 o versioni successive senza utilizzare GameKit. Qualcuno può fornire qualche esempio?Bonjour su bluetooth SENZA Gamekit?
risposta
Se Bluetooth è abilitato, su un dispositivo abbastanza nuovo (3G o superiore, o equivalente iPod o iPad) e un SO abbastanza nuovo (3.1 apparentemente), Bonjour funzionerà automaticamente tramite Bluetooth utilizzando indirizzi locali di collegamento (168.254. *). Quindi usi normalmente TCP/UDP.
(Sotto il cofano, sono abbastanza sicuro GameKit utilizza Bonjour-over-IP-over-Bluetooth.)
Sypposedly la pubblicazione/navigazione avviene a livello di Bluetooth, ma se si pubblica un servizio Bonjour e l'altro lo cerca, viene stabilita una connessione automatica IP-over-Bluetooth.
Qualsiasi esempio di Bonjour dovrebbe funzionare automaticamente.
Sapete quale servizio Bluetooth viene utilizzato e in che modo è possibile parlare con dispositivi iOS con Linux, Mac o il proprio dispositivo incorporato dotato di un chip Bluetooth? –
@ IvanVučica: Credo che sia un PAN Bluetooth, ma ho sentito che il servizio è anche pubblicizzato tramite bluetooth e il PAN non viene avviato a meno che non sia necessario. –
Ho dettagliato alcune delle mie osservazioni qui: http://stackoverflow.com/questions/8070998/using-ios-gamekits-bluetooth-bonjour-with-other-platforms Tuttavia, ho bisogno di dettagli tecnici. Ha un odore di PAN, ma pubblicizzato in un modo leggermente diverso, solo per far sembrare che non sia PAN. Non ho ancora avuto la possibilità di annusare il protocollo, comunque. –
Basta annunciare il servizio, proprio come tc. has said below:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
Con iOS5, tuttavia, Mettiamoci-call-it "Bluetooth Bonjour" è disabilitata di default, quindi bisogna utilizzare l'API C dichiarata in <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
);
Questa è solo la parte dell'annuncio; la risoluzione è un po 'più complessa. Vi consiglio di dare un'occhiata ai seguenti esempi di Apple:
- SRVResolver - dimostra come è possibile cercare un servizio utilizzando API dichiarata in
<dns_sd.h>
. Mira a OS X, ma include una classe denominataSRVResolver
che puoi utilizzare su iOS con la stessa facilità con cui puoi utilizzarla su OS X. Perché iOS P2P Bluetooth P2 funzioni, aggiorna la chiamata aDNSServiceQueryRecord()
per passarekDNSServiceFlagsIncludeP2P
comeinterfaceIndex
. (NOTA: Questo esempio non sembra esistere in OS X 10.8 docset. Può essere trovato in documenti 10.6 e 10.7. In 10.8, c'è l'esempio DNSSDObjects, ma non ho visto esattamente cosa fa.) - WiTap - finché non ti interessa il supporto Bluetooth su iOS 5, guarda l'esempio chiamato WiTap, che dimostra non solo la bellissima API Objective-C, ma anche come puoi creare un server usando API CFSocket (involucri sottili attorno ai socket BSD). Dovresti dare un'occhiata a questo anche se stai usando SRVResolver per vedere come usare l'API basata su C da
<dns_sd.h>
.
Dopo aver annunciato o risolto il servizio, si utilizzano normali socket BSD per l'ascolto o la connessione. Quando si scrive un server, si potrebbe anche voler prima listen()
sulla porta 0 (zero), quindi interrogare quale porta disponibile a caso è stata assegnata a voi. Dopo aver effettuato una query, annuncia questa porta anziché una fissa. Questo è esattamente ciò che sta facendo l'esempio WiTap (ma con l'API CFSocket invece dell'API socket BSD).
Per ulteriori informazioni sui socket BSD, solo Google in giro per un tutorial.
Nota: le informazioni su iOS 5 provengono da Apple Technical Q&A QA1753.
Sono sorpreso che tu non abbia menzionato [AsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) ovunque .. ti consigli per/contro di essa ? o usare le API sopra menzionate dovrebbe essere sufficiente? – abbood
@abbood: non ho usato AsyncSocket. Tuttavia, finché si annuncia un servizio come descritto nella mia risposta, il sistema operativo attiva un servizio PAN Bluetooth che può connettere due dispositivi iOS. Ciò consente di stabilire una connessione TCP o UDP tramite Bluetooth invece solo WiFi o GSM. Come farai effettivamente a stabilirlo (direttamente socket BSD o tramite un wrapper come AsyncSocket) - che in realtà è irrilevante. :-) –
Leggi questo articolo: Bonjour tramite Bluetooth su iOS 5.0 https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315
Si tratta di un problema noto in IOS 5.0 e deve essere risolto utilizzando l'API di livello inferiore: DNSSDObjects.
Nella modifica dell'11 marzo 2012, la domanda è stata completamente modificata. Dopo aver ricevuto tre risposte e dopo essere stato collegato da altre domande, è una cattiva pratica e sembra che le persone che gentilmente ti hanno risposto stiano vagando, fornendo risposte non correlate. Potresti chiedere una NUOVA domanda, invece? :-) –