基于Android的机顶盒CAS系统的开发
从图2可以看出此TS流中的CAT表中含有ca_descriptor描述符,并可以得出ECM的ca_pid为0x0562。而从图3中可以看出,PMT表中含有的EMM表的ca_pid为0xoffe。此时就可以设置操作demod来分配filter通道,过滤出EMM、ECM表的section_descriptor_table,来取得CA有关的信息。如果用户要流畅地播放节目,机顶盒(Set_Top Box,STB)就要不断地获得密文CW送入智能卡中,从整个解码过程中可以把整个CAS终端子系统分为3个模块:EMM解析模块、ECM解析模块、智能卡任务模块。Android系统采用的是Linux内核,保留了posix的pthread、message、memory pool等通用的API,所以在设计3个模块时,可以使用pthread_create()创建任务模块;使用msgget()创建消息,实现3个任务模块的通信与同步。
2.1 EMM任务模块
由图1可知,TS流经tuner调谐,把高频载波去掉,再经过demod解调,就可以根据PES包的PID号和TABLEID号设置其里面的filter。一般来说一个demod含有多个filter,在系统启动开始就会分配PAT表的filter,有PAT表的setction descriptor的描述就可以得到PMT表的PID,此时同样分配PMT表的filter。如果此节目是加密节目,在其段描述符中就会含有EMM表的PID号,一旦找到EMM的PID号,就可以为EMM表分配filter。如果EMM里面的CA信息版本号和智能卡存储的CA信息版本号一致,就舍弃此EMM;如果不一致,就重新改写智能卡里面的CA用户的信息。EMM任务模块流程如图4所示。本文引用地址://m.amcfsurvey.com/article/154097.htm
在EMM任务模块中,通过CAS_EMM_TASK()函数创建任务,在CAS_EMM_TASK()中调用CAS_EMM_ReceiveMessage()函数来接收EMM filter发送过来的CA信息。在没有EMM流时,EMM任务一直挂起,而一旦filter发现EMM表,就会把EMM的CA信息发送到EMM任务中,同时关掉filter,避免其未处理完此EMM,而又接收新的EMM。此时EMM任务从挂起进入就绪态,从而处理来自filter的EMM信息,处理完之后再次分配EMM的filter。
2.2 ECM任务模块
通过解渎CAT表可知,此节目表是否加密,如果加密则设置相应ECM的filter过滤出对应的ECM表,此时结合智能卡中存储的EMM的CA信息,就可以判断出用户是否对此节目授权,若授权则取出智能卡中的SK业务密钥,找出对应的奇偶控制字(CW),送入到智能卡中,通过智能卡系统解密出CW,送入到STB中实现数据、视频、音频的解码。整个过程如图5所示。
在ECM任务模块中,通过CAS_ECM_TASK()创建线程任务,在其内部调用CAS_ECM_ReceiveMessage()函数接收来自ECM的filter过滤出的CA信息;此时通过CAS_CARD_ReadMessage()读取智能卡内部用户授权信息,来判断ECM是否有效且取出对应的密文的CW;而用CAS_ECM_Send To Card()函数把密文CW送入到智能卡中解密,解密出明文CW;用CAS_CW_SendToSTB()函数送入到机顶盒,此时解复用模块接收到明文CW就可以得到解码加密流了。
评论