基于Android的機頂盒CAS系統(tǒng)的開發(fā)
從圖2可以看出此TS流中的CAT表中含有ca_descriptor描述符,并可以得出ECM的ca_pid為0x0562。而從圖3中可以看出,PMT表中含有的EMM表的ca_pid為0xoffe。此時就可以設置操作demod來分配filter通道,過濾出EMM、ECM表的section_descriptor_table,來取得CA有關的信息。如果用戶要流暢地播放節(jié)目,機頂盒(Set_Top Box,STB)就要不斷地獲得密文CW送入智能卡中,從整個解碼過程中可以把整個CAS終端子系統(tǒng)分為3個模塊:EMM解析模塊、ECM解析模塊、智能卡任務模塊。Android系統(tǒng)采用的是Linux內(nèi)核,保留了posix的pthread、message、memory pool等通用的API,所以在設計3個模塊時,可以使用pthread_create()創(chuàng)建任務模塊;使用msgget()創(chuàng)建消息,實現(xiàn)3個任務模塊的通信與同步。
2.1 EMM任務模塊
由圖1可知,TS流經(jīng)tuner調(diào)諧,把高頻載波去掉,再經(jīng)過demod解調(diào),就可以根據(jù)PES包的PID號和TABLEID號設置其里面的filter。一般來說一個demod含有多個filter,在系統(tǒng)啟動開始就會分配PAT表的filter,有PAT表的setction descriptor的描述就可以得到PMT表的PID,此時同樣分配PMT表的filter。如果此節(jié)目是加密節(jié)目,在其段描述符中就會含有EMM表的PID號,一旦找到EMM的PID號,就可以為EMM表分配filter。如果EMM里面的CA信息版本號和智能卡存儲的CA信息版本號一致,就舍棄此EMM;如果不一致,就重新改寫智能卡里面的CA用戶的信息。EMM任務模塊流程如圖4所示。本文引用地址:http://m.butianyuan.cn/article/154097.htm
在EMM任務模塊中,通過CAS_EMM_TASK()函數(shù)創(chuàng)建任務,在CAS_EMM_TASK()中調(diào)用CAS_EMM_ReceiveMessage()函數(shù)來接收EMM filter發(fā)送過來的CA信息。在沒有EMM流時,EMM任務一直掛起,而一旦filter發(fā)現(xiàn)EMM表,就會把EMM的CA信息發(fā)送到EMM任務中,同時關掉filter,避免其未處理完此EMM,而又接收新的EMM。此時EMM任務從掛起進入就緒態(tài),從而處理來自filter的EMM信息,處理完之后再次分配EMM的filter。
2.2 ECM任務模塊
通過解瀆CAT表可知,此節(jié)目表是否加密,如果加密則設置相應ECM的filter過濾出對應的ECM表,此時結合智能卡中存儲的EMM的CA信息,就可以判斷出用戶是否對此節(jié)目授權,若授權則取出智能卡中的SK業(yè)務密鑰,找出對應的奇偶控制字(CW),送入到智能卡中,通過智能卡系統(tǒng)解密出CW,送入到STB中實現(xiàn)數(shù)據(jù)、視頻、音頻的解碼。整個過程如圖5所示。
在ECM任務模塊中,通過CAS_ECM_TASK()創(chuàng)建線程任務,在其內(nèi)部調(diào)用CAS_ECM_ReceiveMessage()函數(shù)接收來自ECM的filter過濾出的CA信息;此時通過CAS_CARD_ReadMessage()讀取智能卡內(nèi)部用戶授權信息,來判斷ECM是否有效且取出對應的密文的CW;而用CAS_ECM_Send To Card()函數(shù)把密文CW送入到智能卡中解密,解密出明文CW;用CAS_CW_SendToSTB()函數(shù)送入到機頂盒,此時解復用模塊接收到明文CW就可以得到解碼加密流了。
評論