http://stackoverflow.com/questions/10101935/how-to-find-the-ip-address-of-the-active-airplay-device
你必须使用NSNetServiceBrowser 来查找支持该协议的设备。我曾经查找过打印机,类似如下代码:
_netServiceBrowser= [[NSNetServiceBrowser alloc]init];
_netServiceBrowser.delegate= self;
[_netServiceBrowsersearchForServicesOfType:@"_pdl-datastream._tcp"inDomain:@"local."];
对于你想查找的协议,你需要改变@"_pdl-datastream._tcp"部分,你可以在这里找到一张协议列表[1]:
协议 | 服务类型 | 备注 |
AppleTalk 文件协议(AFP) | _afpovertcp._tcp | OSX 10.2以后,在系统偏好设置的共享面板中,可以通过设置使用“文件共享”服务 。 OSX10.2以后支持从Finder 中浏览AFP服务器 。 |
Network 文件系统 (NFS) | _nfs._tcp | OSX10.2以后支持从Finder 中浏览NFS服务器 。 |
WebDAV 文件系统(WEBDAV) | _webdav._tcp | 支持从Finder 中浏览 WebDAV 服务器 ,由于一个 bug (r. 3171023)的存在, 当双击一个被发现的服务器时,会导致连接失败。 |
文件传输协议 (FTP) | _ftp._tcp | OS X 10.2.2以后,在系统偏好设置->共享面板中,可以通过设置来访问FTP服务。 OS X 10.3以后支持从Finder 中浏览FTP服务器。 Mac OS X 10.3以后也支持从终端设备浏览FTP服务器。 |
安全 Shell (SSH) | _ssh._tcp | OS X 10.3以后在系统偏好设置->共享面板中,可以进行远程登录。 OS X 10.3开始支持从终端程序中登录SSH服务器。 |
远程 Apple事件 | _eppc._tcp | OS X 10.2以后,通过系统偏好设置->共享来开启 远程 Apple事件 。 |
超文本传输协议 (HTTP) | _http._tcp | OS X 10.2.4以后,通过系统偏好设置->共享->个人 Web 共享来设置用户站点目录 。Safari 可浏览web服务器。 |
远程登录 (TELNET) | _telnet._tcp | OS X 10.3以后,当 Telnet 启用, xinetd 会通过 Bonjour 进行广播。OS X 10.3以后支持从终端浏览 Telnet服务器。 |
并行后台打印 (LPD/LPR) | _printer._tcp | Mac OS X 10.2以后支持从打印中心浏览 LPR打印机。要创建 Bonjour 打印机,请参考 Bonjour 打印指南。 |
互联网打印协议 (IPP) | _ipp._tcp | OS X 10.2以后支持从打印中心浏览 IPP 打印机。 要创建 Bonjour 打印机,请参考 Bonjour 打印指南。 |
PDL Data Stream (Port 9100) | _pdl-datastream._tcp | OS X 10.2以后支持从打印中心浏览 PDL DataStream 打印机。 要创建 Bonjour 打印机,请参考 Bonjour 打印指南。 |
远程 I/O USB 打印机协议 | _riousbprint._tcp | 通过 Airport Extreme 基站去共享打印机。 从OS X 10.3开始,打印机安装工具可以浏览 AirPort Extreme 共享出来的打印机(通过 远程 I/O USB 打印机协议 )。 |
数字音频访问协议 (DAAP) | _daap._tcp | 比如 iTunes 的音乐共享。从 iTunes 4.0开始,iTunes可以广播和查找DAAP服务器。 |
数字图片访问协议 (DPAP) | _dpap._tcp | 比如 iPhoto 的照片共享。 从iPhoto 4.0开始, iPhoto可以广播和查找 DPAP 服务器。 |
iChat 实时消息协议 | _ichat._tcp | 从OS X 10.2开始,在内置的iChat1.0中使用。该协议在iChatAV中已被当前的新协议替代。见后。 Used by iChat 1.0 which shipped with Mac. This service is now deprecated with the introduction of the "presence" service in iChat AV. See below. |
iChat 实时消息协议 Protocol | _presence._tcp | 从OS X 10.3开始,在内置的iChat AV中使用。 |
图形捕获共享 | _ica-networking._tcp | 从OS X 10.3开始,用于视频捕捉程序以共享摄像头。 |
AirPort 基站 | _airport._tcp | OS X 10.2以后为AirPort 管理工具所用,用于查找和设置AirPort 基站(双网卡)以及 AirPort Extreme 基站。 |
Xserve RAID | _xserveraid._tcp | 为 Xserve RAID 管理工具所用,用于查找和设置 Xserve RAID 硬件。 |
分布式编译器 | _distcc._tcp | 用于Xcode的分布式编译功能。 |
苹果密码服务器 | _apple-sasl._tcp | OS X Server 10.3 以后为开发室目录密码服务器所用。 |
工作组管理器 | _workstation._tcp | OS X 10.2以后为开放式目录所用,用于广播服务。 OS X Server 10.2以后,支持从工作组管理器中查找该服务。 |
服务器管理 | _servermgr._tcp | OS X 10.3开始, OS X服务器广播该服务。 OS X Server 10.3开始,支持从服务器管理中浏览该服务。 |
远程音频输出协议 (RAOP) | _raop._tcp | 比如AirTunes。AirPort Express基站会广播该服务。从iTunes4.6开始,iTunes 会查找该服务。 |
然后,你应该实现这个协议:
#pragma mark - NSNetServiceBrowserDelegate
-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser*)aNetServiceBrowser{
//prepare the start of the search
}
-(void)netServiceBrowser:(NSNetServiceBrowser*)aNetServiceBrowser didFindService:(NSNetService *)aNetServicemoreComing:(BOOL)moreComing{
//Find a service, remember that after that youhave 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 *)[dataInbytes];
ipString = [NSString stringWithFormat:@"%s",
inet_ntoa(socketAddress->sin_addr)]; ///problem here
return ipString;
}
- (void)netServiceDidResolveAddress:(NSNetService*)sender
{
//delegate of NSNetService resolution process
[_addresses addObject:[selfgetStringFromAddressData:[sender.addresses objectAtIndex:0]]];
[self.tableView reloadData];
}
[1] 译者注:这张列表中没有列出 airplay 服务。但苹果公司2012年9月向 iana 注册了 airplay 服务(作为 TCP 协议子集),你可以在 iana的网站上查询到这个注册。因此对 airplay ,它的服务类型可以用字符串 @"_airplay._tcp" 来表示。airplay 仅是AppleTV 服务之一,此外 AppleTV 还具有以下服务:
_raop._tcp、_sleep-proxy._udp、_touch-able._tcp、_appletv-v2._tcp