如何查找有效的AirPlay设备的IP地址?

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值