21
votes

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 ?

3
In your edit of March 11th 2012, you have completely changed the question. After receiving three answers and after being linked to from other questions, that's bad practice and makes it seem as if people who kindly answered to you are now rambling, providing unrelated answers. Could you please ask a NEW question, instead? :-)Ivan Vučica

3 Answers

20
votes

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:

  • SRVResolver - demonstrates how you can look up a service using API declared in <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.)
  • WiTap - as long as you don't actually care about Bluetooth support on iOS 5, just look at the example called WiTap, which demonstrates not only the beautiful Objective-C API, but also how you can create a server using CFSocket APIs (thin wrappers around BSD sockets). You'll want to look at this even if you are using SRVResolver to see how to use C-based API from <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.

5
votes

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.

2
votes

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.