导读:
本文集主要讲的是,dlna的投屏底层的原理,以及一步步的教你实现,对网络图片/视频或者本地的图片/视频的投屏到电视盒子上面(demo里面用的是电信的悦me盒子)
PS由于第一次接触投屏,我只讲我自己的理解,以及自己项目里面的所使用的功能模块,如有理解不到位的,可以一起交流学习下。🐶🐶🐶
主要参考:
说明:
对于投屏功能,本文主要是利用的iOS DLNA投屏功能了解一下,里的框架,感谢作者的源码。
我是根据作者的代码,新增了一些实际需要的方法,以及实现了可讲本地图片、视频投影到盒子上面。
具体的代码见gitHubDemo里面的具体的包括实现都有具体的实现
我们从upnp中文文档,可大致可得出下面的流程
1.寻址
2.发现
3.描述
4.控制、事件、展示
下面我结合悦me盒子来做具体的描述
1.寻址:设备通过寻址来获得一个网络地址 (具体的说明见upnp中文文档)
这是设备和路由完成的
2.发现
当设备已经有自己的ip地址(步骤1),那么怎么样才能获取到设备呢?
我们可以通过udp请求,来喊话
发现设备:搜索请求消息字符串
NSData * sendData = [[self getSearchString] dataUsingEncoding:NSUTF8StringEncoding];
[_udpSocket sendData:sendData toHost:ssdpAddres port:ssdpPort withTimeout:-1 tag:1];
其中:getSearchString为:
[NSString stringWithFormat:
@"M-SEARCH * HTTP/1.1\r\nHOST: %@:%d\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: %@\r\nUSER-AGENT: iOS UPnP/1.1 mccree/1.0\r\n\r\n",
ssdpAddres,
ssdpPort,
serviceType_AVTransport];
-----
ssdpAddres --> @"239.255.255.250";
ssdpPort --> 1900;
serviceType_AVTransport -->@"urn:schemas-upnp-org:service:AVTransport:1";
通过upd来发送消息,此时在同一个局域网的设备,会收到该消息,然后返回自己的设备信息,下面是悦me盒子返回的示例
HTTP/1.1 200 OK
Location: http://192.168.124.43:1266/
Cache-Control: max-age=1800
Server: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2
EXT:
USN: uuid:skyworth&208B3756FFED&192.168.124.43::urn:schemas-upnp-org:service:AVTransport:1
ST: urn:schemas-upnp-org:service:AVTransport:1
Date: Thu, 24 Jan 2019 02:38:18 GMT
3.描述 我们发现了设备,看第2步只会返回一些基本的信息,我们还需要去获取设备的详细的信息
我们通过向步骤2拿到的location发送get请求
get:http://192.168.124.43:1266/
返回信息如下:
{type:1 name:root xml:"
1
0
urn:schemas-upnp-org:device:MediaRenderer:1
YuemeTV
GeniusGitHub
https://github.com/geniusgithub
GeniusGitHub AV Media Renderer D