Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find the IP-address of the active AirPlay device?

I am wondering if it´s possible to get the IP address of the airplay device my iOS app is currently using.

Either that, or the IP-addresses of all airplay capable devices on the network.

Thank you in advance!

EDIT: Although I now have an accepted answer, I´m interested in knowing how to get the IP of the currently playing airplay device.

like image 760
Nailer Avatar asked Apr 11 '12 07:04

Nailer


People also ask

How do I find my AirPlay device name?

Open the Settings application on your Apple TV. Navigate to the AirPlay section. Select the Name option. Change the name as desired, and select Done.

Does AirPlay have to be on same Wi-Fi?

To use AirPlay, devices don't need to be on the same network, or on any network at all. A device can discover Apple TV using Bonjour discovery, Bluetooth IP address advertisement, or peer-to-peer discovery.


1 Answers

What you have to use is NSNetServiceBrowser to do a search of the devices with the protocol. I have did the same with printers, my code looks like:

    _netServiceBrowser= [[NSNetServiceBrowser alloc] init];
    _netServiceBrowser.delegate= self;
    [_netServiceBrowser searchForServicesOfType:@"_pdl-datastream._tcp" inDomain:@"local."];

You have to change @"_pdl-datastream._tcp" for the protocol you want to search, you can find a list of the protocols here: http://developer.apple.com/library/mac/#qa/qa1312/_index.html

After that you have to write the functions of the protocol:

#pragma mark - NSNetServiceBrowserDelegate

-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser{
     //prepare the start of the search
}

-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing{
//Find a service, remember that after that you have to resolve the service to know the address

[_printers addObject:aNetService];
aNetService.delegate=self;
[aNetService resolveWithTimeout:5.0];

//More coming says if it has find more services, in case of more service are in queue wait to reload your interface
if (!moreComing) {
    [self.tableView reloadData];   
}
}

-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict{
//Do what you want in case of error
}

-(void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser{

//End search!
}

- (NSString *)getStringFromAddressData:(NSData *)dataIn {
//Function to parse address from NSData
struct sockaddr_in  *socketAddress = nil;
NSString            *ipString = nil;

socketAddress = (struct sockaddr_in *)[dataIn bytes];
ipString = [NSString stringWithFormat: @"%s",
            inet_ntoa(socketAddress->sin_addr)];  ///problem here
return ipString;
}

- (void)netServiceDidResolveAddress:(NSNetService *)sender
{
//delegate of NSNetService resolution process
[_addresses addObject:[self getStringFromAddressData:[sender.addresses objectAtIndex:0]]];
[self.tableView reloadData];
}

A web that can be useful: http://www.macresearch.org/cocoa-scientists-part-xxviii-bonjour-and-how-do-you-do

I hope it helps you

like image 62
Jpellat Avatar answered Sep 28 '22 02:09

Jpellat