织梦CMS - 轻松建站从此开始!

罗索

中国电信IPTV标准研究之机顶盒

jackyhwei 发布于 2011-09-24 20:05 点击:次 
拿这个盒子的目的是为了研究一下符合中国电信IPTV标准的前端,主要是视频服务器,认证服务器,EPG服务器。听起来有点奇怪,拿终端来研究前端,主要是因为不可能有一套前端系统摆在这里让我们研究,而协议是服务器和终端交互的,我就通过力图模拟一个让机顶盒能跑起来的
TAG:

研究中国电信的IPTV标准是为了“仿造”一个符合此标准的最小化前端系统,这样就可以利用符合中国电信IPTV标准的廉价盒子打造低成本的IPTV方案了。

昨天拿到了中国电信IPTV标准的盒子,中兴B600 V4A。拿这个盒子的目的是为了研究一下符合中国电信IPTV标准的前端,主要是视频服务器,认证服务器,EPG服务器。听起来有点奇怪,拿终端来研究前端,主要是因为不可能有一套前端系统摆在这里让我们研究,而协议是服务器和终端交互的,我就通过力图模拟一个让机顶盒能跑起来的前端开始研究。

先研究盒子,打开看看是什么芯片,STi5205,专门用于IPTV盒子的SoC,支持AVS,264等标清解码,支持USB,SATA等接口,CPU是SH的,主频266。芯片上连散热片都不需要。

然后是打开电源,进入到配置界面,按了半天遥控器,原来是按白色的设置键。需要输入密码,猜了半天,没有命中,上网查,说是上海有6321密码,试一下。。。进去了。

首先对机顶盒进行配置,地址什么的就不用多费唇舌了,重点是把主用认证服务器配置好,指向你要伪装的认证服务器的url,比如我的是:http://192.168.0.172:8080/auth。

接下来就是认证服务器需要做哪些事情了。机顶盒通过HTTP协议与认证服务器进行交互,因此首先需要做的就是安装一个web应用服务器,web应用服务器可 以选择的范围很大,我用的是web.py,因为它小巧易用。搭建好了web应用服务器,根据本文给出的抓包,进行web应用的编程即可。

认证服务器要做的主要是两个步骤,这里需要注意的就是必须在第二步的应答页面中正确的设置频道信息和业务信息,否则机顶盒会超时弹出一个号码为1302的错误窗口,使得点播和直播都不能正常显示。下面是认证的步骤:

  1. 机顶盒采用HTTPGET发送认证请求。
  2. 服务器响应机顶盒的认证请求,应答的时候给出挑战字;
  3. 机顶盒然后发送认证信息。
  4. 认证服务器“假装”认证通过,应答的时候给出频道信息和业务信息,并以javascript的方式实现频道信息和业务信息的设置。

以下是整个过程的抓包信息:

 
STB -> Server 认证请求
GET /auth?UserID=99993003&Action=Login HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; ztebw V1.0)
Host: 192.168.0.172:8080
Accept: **
Accept-Encoding: identity
Referer: http://192.168.0.172:8080/auth?UserID=99993003&Action=Login
Cookie: JSESSIONID=GtqFMKRN1V24Q9njJLfjy3C1kCNN5YbYXNbhLHK
QhDvlpJSL9znb!-92297067
Content-Type: application/x-www-form-urlencoded
Content-Length: 280

UserID=11&Authenticator=8301043A66F165BF84D8DEAAEB12A05B4706F8AD
D72739A610D7060400AFDE5CA0A3944F0E582CEB2B5DC280F9D0C3B8B78
3C576CBC9E2128E1EA00FF50DBFA6E4139BA8B4043536D464DFFD3179FF
87B3DCA8DE2F398B3F88EDF0940B002BB8E1544989404279758F9A4B6DD
85131216BE6543E9EF37BF1FD2DA99E3A4D4059

Server -> STB 认证通过,设置频道信息和业务信息:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 3178
Date: Wed, 17 Nov 2010 03:25:02 GMT
Server: CherryPy/3.1.2 WSGI Server

<html>
<head>
<title>auth</title>
<script language="javascript">
var channels=new Array();
channels[0]='ChannelID="00000002000000050000000000003163",ChannelName="CCTV-1",UserChannelID="90",ChannelURL="igmp://239.1.1.1:12345",TimeShift="0"
,ChannelSDP="",ChannelLogoStruct="",ChannelLogoURL="null",PositionX="0"
,PositionY="0",BeginTime="0",Interval="0",Lasting="0",ChannelType="1"
,ChannelPurchased="1"';

channels[1]='ChannelID="00000002000000050000000000003164",ChannelName="CCTV-x",UserChannelID="91",ChannelURL="rtsp://192.168.0.251/264.ts",TimeShift="0",ChannelSDP="",ChannelLogoStruct="",ChannelLogoURL="null"
,PositionX="0",PositionY="0",BeginTime="0",Interval="0",Lasting="0",ChannelType="1"
,ChannelPurchased="1"';
var serviceEntrys= new Array();

serviceEntrys[0] = URL="http://192.168.0.172:8080/iptvepg/serviceEntry.jsp?Action=1"
,HotKey="275",Desc=""
var EPGDomain="http://192.168.0.172:8080/iptvepg";
var UserToken = "99993003***b6aee9575084652610ed5";
var UserID = "99993003";
var UserGroup = "10001";
var EpgGroupNMB = "8";

function setEpgConfig() {
Authentication.CTCSetConfig("UserToken", UserToken);
document.IptvAuthenticationForm.debug.value = Authentication.CTCGetConfig("UserToken");
Authentication.CTCSetConfig("EpgGroupNMB", EpgGroupNMB);
Authentication.CTCSetConfig("TvmsResInterval", "60");
Authentication.CTCSetConfig("TvmsResService"
, "http://192.168.0.172:8080/rest_group/zte/result.jsp");
Authentication.CTCSetConfig("TvmsVerifyCode", "8005");
Authentication.CTCSetConfig("EPGDomain", "http://192.168.0.172:8080/iptvepg");
Authentication.CTCSetConfig("NTPDomain", "192.168.0.172");
Authentication.CTCSetConfig("ManagementDomain", "http://192.168.0.172");
document.IptvAuthenticationForm.debug.value
= Authentication.CTCGetConfig("ManagementDomain");
Authentication.CTCSetConfig("UpgradeDomain"
, "http://192.168.0.172:8080/iptvnm/stb/update.action");
}

function ConfigChannel(){
Authentication.CTCSetConfig("ChannelCount",""+channels.length);
for(var i=0;i<channels.length;i++){
    Authentication.CTCSetConfig("Channel",channels[i]);
}
}

function setServiceEntry(){
for(var i=0;i<serviceEntrys.length;i++){
Authentication.CTCSetConfig("ServiceEntry",serviceEntrys[i]);
}
}

function afterAuthEpg()
{
setEpgConfig();
ConfigChannel();
setServiceEntry();
var jumpAddr = EPGDomain+"?";
jumpAddr += ("UserToken="+UserToken+"&");
jumpAddr += ("UserID="+UserID+"&");
jumpAddr += ("UserGroupNMB="+UserGroup+"&");
jumpAddr += ("EPGGroupNMB="+EpgGroupNMB);
//window.location.href = jumpAddr;
var mp = new MediaPlayer();
var playerInstanceID = mp.getNativePlayerInstanceID();
//mp.setVideoDisplayMode(1);
document.IptvAuthenticationForm.debug.value = channels.length;
  mp.joinChannel(90);
}

function EPGDomainVisit(EPGDomainAddr)
{
window.location.href = EPGDomainAddr;
}

function UpgradeDomainVisit(UpgradeDomainAddr)
{
window.location.href = UpgradeDomainAddr;
}
</script>
</head>
<body bgcolor="transparent" onload=afterAuthEpg()>
<form action="ConfigUserInfoAction.do" name="IptvAuthenticationForm" method="post">
<input value="*" name="debug" size="40">
</form>
</body>
</html>

 

接下来直接调用mp.joinChannel(90)就进入了直播,其中mp是初始化的一个播放器,可参照中国电信的标准,90是设置一个直播频道,其实就是采用Rainbow(

http://www.doorsolutions.cn/redmine/boards/4/topics/17

)软件编码器推出的组播流。

至于点播就比较容易了,在页面中给出点播连接,直接点进去就可以了。

调试过程中遇到和需要注意的问题:

  1. 认证通过后的要点(甚至不需要认证通过)就是正确的设置频道列表和业务入口列表,否则会弹出一个提示连接服务器失败的窗口,错误号是1302,影响正常运行。
  2. 组播数据需要用rtp协议封装,否则中兴的盒子不能正常播放!!
  3. 音频编码采用ffenc_mp2,之前采用lamemp3enc的时候中兴的盒子不能正确解码音频!!!

后续需要做的工作就是熟悉中国电信标准的MediaPlayer对象的编程接口,实现产品化的直播和点播,也就是有必要的遥控器按键响应和OSD显示。

(灯少)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201109/15041.html]
本文出处:bbs.lmtw.com 作者:灯少
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容