使用 AirPlay 發送圖片


原文:http://livevision.us/wordpress/2011/02/16/airplay-without-private-api/

如果不是 Erica Sadun 的努力以及 AirPlayer、AirFlick、AirPDF以及 AirSay 這樣類似的工具的出現,我可能不會興起嘗試一把的念頭。在這篇文章中,我將演示創建一個 iOS app( camThis)將圖片發送到Apple TV,既不需要使用任何私有 API,也不需要越獄。我沒有提交到蘋果商店,但如果有任何新的消息我將隨時奉上。

更新:camThis 目前已被蘋果接受。

所需工具:

譯者注:這個鏈接中 AirPlayer的下載鏈接已經被刪除,讀者可以在此處下載: http://download.cnet.com/AirPlayer/3001-13632_4-75330532.html?spi=cc4808989275f217e583547fa2bef669

運行 AirPlayer:

  • 在本文中,我們將采取一點類似於欺騙的技巧,以便對 Apple TV 的網絡通信進行嗅探...下載並運行 AirPlayer。

譯者注:AirPlayer 已經不可用,請用其他類似軟件代替。

  • AirPlayer 通過廣播 _ariplay._tcp 消息並被 bonjour 發現,以此來偽裝成 Apple TV,因此你的 Mac 可以被看成一台 Apple TV 。
  • 當 AirPlayer 運行時,處於同一網絡中的 iOS 設備可以向 AirPlayer 推送圖片。

運行 Bonjour Browser: (download)

  • Bonjour Browser 是一個傑出的 Mac 應用程序,它能夠發現網絡中的所有bonjour 設備。
  • 我們只是用 Bonjour Browser 找出 Apple TV(AirPlayer) 的IP地址而已,因此我不會告訴你如何編寫一個 iOS bonjour 應用程序。

一旦獲得 IP 地址,請將地址+端口記下來(在下圖中,我用Mac 模擬出的AppleTV的IP地址和端口是 192.168.1.102:7000)。

BonjourBrowser

用Packet Peeper嗅探iOS Airplay 設備發出的網絡包:

  • Packet Peeper 是一個用於嗅探 Mac 上發出/接收到的網絡包的開源工具
  • 它支持 tcpdump 過濾器。我們將使用它來過濾網絡包,以便我們將注意力集中到 Apple TV的網絡包。
  • 當你開始一個回話后,你可以設置一個類似於 “tcp port 7000”之類的過濾器

選擇一張AirPlayer的圖片:

  • 如果一切順利,你會在照片應用程序的右上角看到一個 airplay的標記。

按下 airplay 按鈕。可以觀察到Packet Peeper中的監控到大量網絡包。

  • 一旦監控到網絡包,你可以選中會話中的所有網絡包,然后選擇 “View 菜單->View TCP Stream” ,結果類似下圖所示。

PacketPeeper results

  • 看到左邊的會話嗎?那是最開始從設備發向AppleTV的請求,請求交換客戶端/服務器關系。這就是大家所知的ReverseHTTP——沒錯,實際上它已經列入了  RFC 草案
  • 為了讓我的 iPhone app能夠初始化並處理ReverseHTTP,我頭疼了數個小時——但你沒有必要關心它,你只需關心諸如 /server-info,/photo之類的即可。

示例代碼:

  • ok, 現在你已經具備了所有條件,可以發送一張圖片到AppleTV了。
  • 假設使用ASIHTTPRequest框架。如果你不熟悉它,請參考 這里
  • 這是代碼 (簡單,不是嗎?)

- (void) sendUIImage {

UIImage *img = [UIImageimageNamed:@"test.png"];

NSData *data = UIImageJPEGRepresentation(img,1.0);

NSMutableData *mdata = [[[NSMutableData alloc]initWithData:data] autorelease];

 

NSLog(@"PUT photo...");

NSURL *url = [NSURLURLWithString:@"http://192.168.2.32:7000/photo"];

request = [ASIHTTPRequest requestWithURL:url];

[request setRequestMethod:@"PUT"];

[requestaddRequestHeader:@"User-Agent" value:@"MediaControl/1.0"];

[request setPostBody:mdata];

[requestsetShouldAttemptPersistentConnection:YES];

[request startSynchronous];

NSError *error = [request error];

if (!error) {

NSLog(@"success");

} else {

NSLog(@"%@",[errorlocalizedDescription]);

}

}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com