I am currently using GCDAsyncUdpSocket to send multicast datagrams over wifi between iOS devices.
The Code is pretty simple..
Client
self.socket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
//omitted error checking
[self.socket bindToPort:12345 error:&err];
[self.socket joinMulticastGroup:@"224.0.1.1" error:&err];
[self.socket beginReceiving:&err];
Server
self.multicastSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSData *d = [@"hello" dataUsingEncoding:NSUTF8StringEncoding];
[self.multicastSocket sendData:d toHost:@"224.0.1.1" port:12345 withTimeout:-1 tag:11];
This works well over wifi. How do I make it work over bluetooth as well? I have googled a bunch and can't find anything... Do I need to create two separate sockets? One bound to the wifi interface and another to the bluetooth interface?
EDIT: or am I confused about something fundamental? This must be possible. GameKit's GKSession does exactly this, right?
I think you are missing the BT stack access which enables BT over ip protocol. Also, multicast relies on a network device (router) to manage these groups and registrations. BT requires a concept of ZeroConf networks (which can also work for wifi), but is managed in a peer to peer manner. Have a look at Bonjour or Dnssd for an implementation closer to the socket level than GameKit.
You are very close. You can find pointers to useful information in this StackOverflow question or you can use a library such as HHServices that wraps this functionality.
I honestly have tried this route with little luck, but I hope this points you in the right direction. Let me know if you've figured it out!
来源:https://stackoverflow.com/questions/11621553/how-to-use-gcdasyncudpsocket-for-multicast-over-wifi-and-bluetooth