前言
最近有些時(shí)間塞琼,隨便記起來(lái)之前關(guān)于upnp技術(shù)的現(xiàn)實(shí)止喷,想想需要好好整理一下胰蝠。2016年做了一個(gè)項(xiàng)目有這種需求:將手機(jī)本地音樂(lè)或者其他第三方的音樂(lè)資源送到一款智能音樂(lè)播放設(shè)備進(jìn)行播放塞茅,當(dāng)時(shí)就懵逼啦亩码!最后也是通過(guò)網(wǎng)上找資料棋品實(shí)現(xiàn)的,雖然功能實(shí)現(xiàn)了野瘦,但是感覺(jué)現(xiàn)在有必要整理一番描沟,順便講講心得哈!
正文
DLNA鞭光,這里就借用百度百科上的吧:
DLNA的全稱是DIGITAL LIVING NETWORK ALLIANCE(數(shù)字生活網(wǎng)絡(luò)聯(lián)盟)吏廉, 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Living Network Alliance) 由索尼惰许、英特爾迟蜜、微軟等發(fā)起成立、旨在解決個(gè)人電腦啡省,消費(fèi)電器娜睛,移動(dòng)設(shè)備在內(nèi)無(wú)線網(wǎng)絡(luò)和有線網(wǎng)絡(luò)的互聯(lián)互通,使得數(shù)字媒體和內(nèi)容服務(wù)的無(wú)限制的共享和增長(zhǎng)成為可能卦睹,目前成員公司已達(dá)280多家畦戒。
UPnP
通用即插即用(英語(yǔ):Universal Plug and Play,簡(jiǎn)稱UPnP)是由“通用即插即用論壇”(UPnP? Forum)推廣的一套網(wǎng)絡(luò)協(xié)議结序。該協(xié)議的目標(biāo)是使家庭網(wǎng)絡(luò)(數(shù)據(jù)共享障斋、通信和娛樂(lè))和公司網(wǎng)絡(luò)中的各種設(shè)備能夠相互無(wú)縫連接,并簡(jiǎn)化相關(guān)網(wǎng)絡(luò)的實(shí)現(xiàn)。UPnP通過(guò)定義和發(fā)布基于開放垃环、因特網(wǎng)通訊網(wǎng)協(xié)議標(biāo)準(zhǔn)的UPnP設(shè)備控制協(xié)議來(lái)實(shí)現(xiàn)這一目標(biāo)邀层。
網(wǎng)上資料其實(shí)現(xiàn)在也越來(lái)越多了,但是個(gè)人覺(jué)得遂庄,作為iOS開發(fā)能用系統(tǒng)原生方案寥院,何必使用第三方呢,可能是我比較喜歡原生的吧涛目!
整個(gè)upnp的實(shí)現(xiàn)需要三個(gè)要素:
1秸谢、渲染器(播放視頻、播放音樂(lè)的設(shè)備)
2霹肝、服務(wù)(DMS)估蹄,其實(shí)就是設(shè)備提供的服務(wù),比如我這個(gè)音樂(lè)播放器提供播放音樂(lè)服務(wù)沫换,具體設(shè)備提供哪些服務(wù)還得看設(shè)備
3臭蚁、控制點(diǎn),作為遙控裝置使用讯赏,可尋找 DMS 上可播放的媒體檔案垮兑,并指定到可播放該內(nèi)容的終端播放裝置進(jìn)行播放的動(dòng)作。
關(guān)于具體的詳細(xì)介紹我就不多講了待逞,可以參考這個(gè)人寫的,我今天的任務(wù)是將封裝好的dlna工具分享給大家哈网严。
干貨
YPnP管理者:YMUpnpManager
@interface YMUpnpManager : NSObject
+ (instancetype)manager;
功能總體上分為兩大類:
1识樱、通過(guò)發(fā)送upd消息進(jìn)行設(shè)備搜索
2、對(duì)搜索到的設(shè)備進(jìn)行各種功能演示震束,比如設(shè)置URI資源怜庸,播放等等操作,
3垢村、輔助方法
/**
選擇具體的設(shè)備割疾,
在真實(shí)場(chǎng)景中,可能存在有多個(gè)服務(wù)設(shè)備嘉栓,這個(gè)時(shí)候必須選中一個(gè)進(jìn)行接下來(lái)的交互宏榕,
如果這步?jīng)]有進(jìn)行,則接下來(lái)的步驟將無(wú)法進(jìn)行
*/
- (void)selectedDevice:(YMUpnpDevice*)device;
在數(shù)據(jù)請(qǐng)求中侵佃,沒(méi)有按照網(wǎng)上很多很low的代理方式進(jìn)行回調(diào)麻昼,而是使用了block的方式,因?yàn)檫@里在針對(duì)數(shù)據(jù)回調(diào)上使用代理是非常不合理的馋辈,在程序設(shè)計(jì)上使用block也比較順手抚芦,更加注重“一呼即答”設(shè)計(jì)理念。
針對(duì)網(wǎng)上缺失的訂閱方面的資源進(jìn)行補(bǔ)充(只經(jīng)過(guò)理論測(cè)試哈)
/**
發(fā)送訂閱消息
@param time 訂閱事件
@param callBack 回調(diào)地址
@param serverType 服務(wù)類型
接收回調(diào)會(huì)在內(nèi)部建立一個(gè)http server,需要保存sid
*/
- (void)sendSubcirbeWithTime:(int)time callBack:(NSString*)callBack serverType:(YMUpnpServerType)serverType result:(void(^)(BOOL success))result;
/**
續(xù)訂某項(xiàng)服務(wù)
注意:要在之前訂閱的時(shí)間之前發(fā)起,否則無(wú)效
@param time 續(xù)訂的時(shí)間
@param serverType 服務(wù)類型
*/
- (void)contractSubscirbeWithTime:(int)time serverType:(YMUpnpServerType)serverType result:(void(^)(BOOL success))result;
/**
移除訂閱
@param serverType 服務(wù)類型
*/
- (void)removeSubscirbeWithServerType:(YMUpnpServerType)serverType result:(void(^)(BOOL success))result;
將手機(jī)變成DMS實(shí)現(xiàn)具體的itunes音樂(lè)和本地phone服務(wù)操作
點(diǎn)擊這里查看相關(guān)介紹哈
1叉抡、首先我之前的項(xiàng)目是借助Platinum.frame框架實(shí)現(xiàn)的
2尔崔、啟動(dòng)服務(wù)
/**
啟動(dòng)itunes音樂(lè)服務(wù)
*/
- (void)intendStartItunesMusicServerWithServerName:(NSString *)theName {
[self initUPnP];
itunesServer = [[PLT_MediaServerObject alloc] initServerSelfDelegateWithServerName:theName];
itunesDMSDelegate = [[ItunesMusicDMSDelegate alloc] init];
[itunesServer setDelegate:itunesDMSDelegate];
[upnp addDevice:itunesServer];
}
photo服務(wù)啟動(dòng)
/**
啟動(dòng)圖片server
*/
- (void)intendStartIOSPhotoServerWithServerName:(NSString *)theName {
[self initUPnP];
// photoServer = [[PLT_MediaServerObject alloc] initServerSelfDelegateWithServerName:theName];
// photoDMSDelegate = [[PhotoDMSDelegate alloc] init];
// [photoServer setDelegate:photoDMSDelegate];
// [upnp addDevice:photoServer];
}
只有啟動(dòng)服務(wù)后,才會(huì)有服務(wù)點(diǎn)褥民,這些是系統(tǒng)自帶的季春。
上面代碼比較陳舊,有需要的可以自行找下那個(gè)Platinum.frame哈轴捎,我這個(gè)項(xiàng)目寫的比較亂鹤盒,不想整理了
注意點(diǎn)
對(duì)于某種的設(shè)備進(jìn)行什么操作,雖然可以通過(guò)獲取設(shè)備詳細(xì)的服務(wù)來(lái)獲取侦副,但是針對(duì)一些實(shí)際開發(fā)場(chǎng)景侦锯,你會(huì)對(duì)你的設(shè)備有哪些功能會(huì)不知道嗎?所以秦驯,demo中的一些功能也只是大眾化的操作尺碰,這些upnp指令都是固定的,具體需要用到其他功能译隘,需要根據(jù)設(shè)備的實(shí)現(xiàn)亲桥。