前言
其实吧,这个问题这么多年也折腾了好多次了,到不是说技术上有什么升级,纯属是过了一段时间又忘记怎么弄的了,毕竟年级大了,记性也下降了,已经不记得重复研究过几次了。现在有了博客,终于可以记录下来作为备忘录了,不过一直不太想写的原因:的确很难说有什么大的用处,毕竟我平时根本不看电视,所以即便实现了全媒体播放(手机,平板、电视、电脑不管在哪里都能直接看IPTV),但是实际上却鸟用没有,因为我不看。。不过今天刚好有点闲心,就趁机把这个写下来吧。
基本原理
IPTV的本质是什么呢?是组播(多播)协议。具体组播的详细工作原理就不展开讨论了,这可是一套协议,几句话说不清楚,感兴趣的话大家可以自行在网上搜索具体内容。如果用简单一句话来概括,可以认为是组播包就是:用单播包方式传播的广播包,只不过这个广播包只有特定的设备(位于相同的组播组)才能收到。所以为什么以前电信的电视机顶盒非要直接接在光猫上的IPTV口呢?因为这个接口才是属于IPTV的组播组,才能收到IPTV的组播包。而IPTV组播包还有一个特点,就是组播包肯定会达到所有的局端设备(ISP连接用户光猫的最近的数据接入设备),至于最后你家光猫的IPTV接口是否能加入IPTV的组播组,就要看你家是否开通了IPTV业务。
那么如果按这么说法,是不是只要我家开通了IPTV业务,那只要是支持组播协议的设备接到光猫的IPTV口上就可以收到IPTV包了呢?答案是不行,因为中间还有一步鉴权的步骤,就是为了防止你随便拿个设备接到IPTV口上就能看电视,毕竟如果不做控制,你拿个支持组播的二层交换机接到IPTV口上扩展一下,岂不是任意数量的支持组播的设备接到交换机上就能看IPTV了?那电信怎么卖同一个家庭第2个、第3个机顶盒?毕竟每多一个机顶盒每月就多20元收入呢。
所以新装IPTV的时候,电信工程师会上门开通,这个开通就是将你的电信机顶盒的信息(通常是mac地址)录入电信的后端系统里,使你的机顶盒成为合法公民,从而能够通过鉴权,通过IPTV口加入IPTV的主播组,最后才能收到电视节目。
至于鉴权的具体方式有多种,例如有的地方是pppoe拨号,有的地方是dhcp option的方式(比如成都电信),这个大家要自己确认下,一般网上本地有先驱者又写过文章的话就省了很多事,我是自己抓包分析的。
前面说了半天原理,那我要通过爱快来完成所谓IPTV"全媒体播放",就需要解决3个主要的问题:
1、鉴权问题
必须要瞒过电信,代替电信机顶盒通过电信的IPTV口的鉴权从而收到IPTV组播包。
2、协议转换问题
要将IPTV组播包转换成"全媒体播放"需要的方式。
3、各频道对应的组播地址的获取
其实要解决上面这3个问题,有个潜在的条件,就是你的路由器支持"多拨"。为什么呢?因为正常路由器只有一个wan口,这个wan口一定会接到光猫的数据口上(其实现在很多光猫已经不分数据口或者IPTV口了,每个口都可以当数据口或者IPTV口),而IPTV的鉴权,也需要路由器用一个wan口接到光猫的IPTV口上,所以至少需要2个wan口(本质上就是多线多拨)。当然,如果出口路由器不支持多拨,也可以单独用另一个路由器的wan口接光猫的IPTV口(当然前提是这个路由器支持IPTV的鉴权方式),然后lan口接到内网交换机这种方式来实现,不过这种方式比起用一个路由器就能实现的方式,明显技术含量就low多了,不配我无敌之名。
鉴权
鉴权有很多种方式,最常见的莫过于pppoe和dhcp了。相对来说,pppoe最简单,因为基本是个设备就支持pppoe,这个毫无门槛,如果你所在的地区IPTV的鉴权方式是pppoe的话,那么恭喜你,这一步就少了好多折腾。但是成都电信的IPTV偏偏是dhcp,而这个dhcp还不是通常的dhcp,还需要支持option 60和61。
如何确定你使用的IPTV是使用何种方式呢?最方便的方式莫过于在网上搜。。如果相同区域的人做过并且发了帖子,那恭喜你,就可以直接拿来用了。比如如果现在有成都电信IPTV的用户看到我这篇帖子,那就自然知道了鉴权方式,剩下的就只需要知道机顶盒的mac地址就可以了,而机顶盒的mac地址怎么知晓呢?把机顶盒翻过来,后面就写着呢。
不过我还是大概讲一下如何确定机顶盒的鉴权方式,这个需要有一定网络基础,要会抓包和分析包的内容。简单来说,可以将机顶盒连接到可以抓包的设备上,包括但不止于支持端口镜像的交换机,软路由,或者专用的设备,如下:
这个设备的介绍如下:
具体怎么用我就不说了,大家慢慢研究,我这里直接使用爱快自带的抓包工具,用wan3口模拟机顶盒,然后抓下机顶盒建立连接的过程给大家看看,因为我爱快用的是wan3口连接的光猫iptv口,所以抓包很简单,MAC地址我直接指定了机顶盒的地址,这样不会抓到不相干的包,如下图:
开始抓包以后把爱快的wan3口重连下,初始化鉴权过程,然后停止抓包:
点击文件下载,将抓的包下载到本地,用wireshark打开:
从上图中前面5个包的Protocol部分就能看出,是使用的dhcp的鉴权方式,那么这个dhcp包的特殊地方在哪里呢?大家可以看上图中下面部分的红框,有3个,分别是option 12的Host Name,option 61的Client identifier和option 60的Vendor class identifier,如下图:
大家记好上图中的Host Name后面的参数,Client Identifier后面是机顶盒的mac地址,而Vendor
class identifier的值记下来,这个很重要,成都电信是SCITV,四川其他地方我就不能确定了。
其中option 12好像不是必须的,所以要能通过IPTV的鉴权,路由器的DHCP功能起码要支持option 60和option 61,这个功能华硕路由器和爱快都可以,华硕路由器只支持option 60和61,爱快支持option 12,60,61。
华硕路由器:
爱快软路由:
所以如果你用的是爱快,又恰好是用的成都电信(或者四川电信)IPTV,那恭喜你,你可以直接一台爱快同时实现上网和看iptv了。
最终我爱快的DHCP option的参数设置如下:
上图中option 60填写你抓包获取到的值,成都电信IPTV就填SCITV,option 12填写你抓包获取到的值(不支持option12的路由器就不填了,这个貌似不是必须的),option 61就填写你机顶盒的mac地址就行了。
如果你区域的IPTV鉴权是pppoe,那就方便多了,直接输入用户名密码拨号就是,反正只要能成功获取IP(不是192.168.x.x这种地址,成都这边是10.x.x.x)就说明你已经通过了电信IPTV端的鉴权,加入了IPTV的组播组,并已经能够收到IPTV的包了。
协议转换
下一步就是如何将组播协议包转换成让"全媒体"都能播放的方式了,其实关键技术就一个:udpxy。
IPTV的组播包是udp协议的,udpxy是将udp协议的组播包转换成tcp协议的http单播包,这样就可以直接用http://软路由IP:端口/组播地址:端口的方式进行播放,例如我这里的cctv1的地址:
http://192.168.1.254:55555/udp/239.93.0.184:5140
。
在爱快里,打开udpxy很简单,在"高级应用"-"UDPXY"设置-"添加":
信号源接口,我这里是wan3,所以就选择wan3,服务端口随便填,比如这里我写55555,然后还有一个外网访问,如果你没公网地址或者有公网但是只想家里访问,这里就选择"否",否则想要外网访问就选是,最后点击最右方的确定即可。
各频道组播地址的获取
在上一节中我提到本地cctv1的地址经过udpxy转化后的地址是:http://192.168.1.254:55555/udp/239.93.0.184:5140
,这个链接前面部分很好理解,但是最后一部分的239.93.0.184:5140是怎么得来的呢?理论上来说,这个是抓包分析来的,本来这应该是整个解决方案最耗时间的一步,但是因为我已经整理好了成都电信IPTV的节目源(一些我觉得不好看的以及剔除了,还剩131个),所以成都电信IPTV的朋友就有福了,只需要直接下载我用的m3u文件,然后稍微修改下即可。
m3u格式的文本文件,格式类似如下:
#EXTM3U name="成都电信IPTV"
#EXTINF:-1, CCTV-1
http://192.168.1.254:55555/udp/239.93.0.184:5140
#EXTINF:-1, CCTV-1杜比
http://192.168.1.254:55555/udp/239.93.0.69:5140
#EXTINF:-1, CCTV-2
http://192.168.1.254:55555/udp/239.93.1.23:6000
#EXTINF:-1, CCTV-3
http://192.168.1.254:55555/udp/239.93.1.11:2223
#EXTINF:-1, CCTV-4
http://192.168.1.254:55555/udp/239.93.1.105:5140
#EXTINF:-1, CCTV-5
http://192.168.1.254:55555/udp/239.93.1.12:2224
#EXTINF:-1, CCTV-5+
http://192.168.1.254:55555/udp/239.93.1.36:8004
#EXTINF:-1, CCTV-6
http://192.168.1.254:55555/udp/239.93.1.13:2226
#EXTINF:-1, CCTV-7
http://192.168.1.254:55555/udp/239.93.1.67:5140
#EXTINF:-1, CCTV-8
http://192.168.1.254:55555/udp/239.93.1.14:2225
#EXTINF:-1, CCTV-9
http://192.168.1.254:55555/udp/239.93.1.24:5140
#EXTINF:-1, CCTV-10
http://192.168.1.254:55555/udp/239.93.1.28:5140
#EXTINF:-1, CCTV-11
http://192.168.1.254:55555/udp/239.93.0.102:5140
#EXTINF:-1, CCTV-12
http://192.168.1.254:55555/udp/239.93.1.30:8124
#EXTINF:-1, CCTV-13
http://192.168.1.254:55555/udp/239.93.0.99:5140
#EXTINF:-1, CCTV-少儿
http://192.168.1.254:55555/udp/239.93.1.29:6000
上面部分需要大家根据自家的情况修改路由器地址,端口以及最后的组播地址和端口部分。本文最后我会提供成都片区的m3u文件,有成都电信IPTV的朋友只需用自家路由器的地址端口替换下即可,其他地区的朋友就只能自己去找下了,反正不到万不得已还是不要自己去抓包分析,直接网上搜下有没有现成的吧,实在找不到自己又想看的,再说抓包分析这条路。
如何观看
讲道理,其实有了m3u文件以后已经可以直接观看了,比如用vlc播放器直接打开m3u文件:
不过较low,windows下用vlc可以,但是mac下却有更好的选择,那就是APTV:
是不是立马高大上了很多?关键iphone,ipad,macos,apple tv都是对应的版本,且是通过icloud同步,尼玛,这才是真正的全媒体播放。可以对应内网和外网生成2个m3u文件,一个供设备在内网使用,一个供设备在外网使用(把内网m3u里面的地址换成外网地址,当然,需要家宽有公网IP和配置了动态域名),灵活切换配置:
说实话,主要是不看电视,否则这种随时实地看电视的体验真的非常棒。
另外的单客户端播放IPTV解决方案
其实,在没有APTV之前,我也是不太接受用VLC之类的播放器直接打开m3u来看的,觉得太low了,那个时候,我是用其他方式实现了用一个客户端随时随地看电视,那就是emby自带的电视直播功能:
这种方式的好处有3个:
1、通过emby的客户端,iphone,ipad,mac,apple tv都可以播放电视,
2、支持节目指南:
3、可以录制节目:
从观看体验上来说其实还是不差的,只不过每次都要先打开emby,再打开电视直播,这个就有点让人不爽了,所以我现在抛弃emby全面转向了APTV,虽然我仍旧不看电视,主要的确没啥好看的。
成都电信IPTV节目源.m3u下载地址如下:
关键不能回看拉动进度条
那是回放的功能了吧,这肯定是不行的,只能正常的看电视节目。