Reputation: 1231
I am wondering the possibility of directly using bonjour over bluetooth in iPhone OS 3.0 or later without using GameKit. Can anyone provide any examples ?
Upvotes: 21
Views: 9871
Reputation: 9679
Just announce the service, just like tc. has said below:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
With iOS5, however, let's-call-it "Bluetooth Bonjour" is disabled by default, so you have to use the C API declared 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
);
This is just the announcement part; resolving is a bit more complex. I suggest you take a look at the following examples from Apple:
<dns_sd.h>
. Targets OS X, but includes a class called SRVResolver
which you can use on iOS as easily as you can use it on OS X. For iOS 5 Bluetooth P2P to work, update the call to DNSServiceQueryRecord()
to pass kDNSServiceFlagsIncludeP2P
as the interfaceIndex
. (NOTE! This sample does not seem to exist in OS X 10.8 docset. It can be found in 10.6 and 10.7 docsets. In 10.8, there's the DNSSDObjects example, but I didn't look exactly at what it does.)<dns_sd.h>
.After announcing or resolving your service, you use regular BSD sockets to listen or connect. When writing a server, you may even want to first listen()
on port 0 (zero), and then query which random available port was assigned to you. After querying for that, announce this port instead of a fixed one. That's exactly what WiTap example is doing (but with CFSocket API instead of BSD socket API).
For more info on BSD sockets, just Google around for a tutorial.
Note: information about iOS 5 comes from Apple's Technical Q&A QA1753.
Upvotes: 20
Reputation: 861
Read this article : Bonjour over Bluetooth on iOS 5.0 https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315
It is a known issue in IOS 5.0 and need to be resolved using lower level API : DNSSDObjects.
Upvotes: 5
Reputation: 33602
If Bluetooth is enabled, on a new-enough device (3G and above, or iPod equivalent, or iPad) and a new-enough OS (3.1 apparently), Bonjour will automatically work over Bluetooth using link-local addresses (168.254.*). Then you just use TCP/UDP normally.
(Under the hood, I'm pretty sure GameKit uses Bonjour-over-IP-over-Bluetooth.)
Sypposedly the publishing/browsing is done at the Bluetooth layer, but if one publishes a Bonjour service and the other browses for it, an automatic IP-over-Bluetooth connection is established.
Any Bonjour examples should automatically work.
Upvotes: 2