四川長(zhǎng)虹網(wǎng)絡(luò)科技有限責(zé)任公司:熊建勇
隨著我國(guó)數(shù)字電視的普及,無(wú)論是廣電網(wǎng)絡(luò)的數(shù)字電視一體機(jī)、數(shù)字電視機(jī)頂盒還是三大運(yùn)營(yíng)商的iptv機(jī)頂盒已經(jīng)走進(jìn)了家家戶戶;而隨著數(shù)字電視業(yè)務(wù)的發(fā)展,軟件升級(jí)也越來(lái)越頻繁;龐大的用戶群同時(shí)進(jìn)行升級(jí)對(duì)前端網(wǎng)絡(luò)服務(wù)器具有非常大的壓力;常規(guī)的降壓方式是限制升級(jí)峰值,對(duì)用戶進(jìn)行分時(shí)段升級(jí),但此種方式必然要加大整體網(wǎng)絡(luò)的升級(jí)時(shí)長(zhǎng);如果不想進(jìn)行升級(jí)限流,必然要提升服務(wù)器的訪問(wèn)吞吐量;如何在不增加前端服務(wù)器硬件配置的前提下進(jìn)行吞吐量提升呢?本文的觀點(diǎn)是:優(yōu)化升級(jí)內(nèi)容,在實(shí)現(xiàn)相同升級(jí)功能的前提下,減少用戶對(duì)前端服務(wù)器的訪問(wèn);如何進(jìn)行升級(jí)內(nèi)容優(yōu)化,減少用戶對(duì)服務(wù)器的訪問(wèn),從升級(jí)數(shù)據(jù)處理的角度,本文分為以下三個(gè)模塊:升級(jí)內(nèi)容優(yōu)化、前端服務(wù)器廣播與訪問(wèn)處理、終端升級(jí);而終端升級(jí)被分為四個(gè)步驟:觸發(fā)升級(jí)、升級(jí)數(shù)據(jù)請(qǐng)求、升級(jí)數(shù)據(jù)校驗(yàn)與軟件寫(xiě)入四個(gè)部分。
如上述所說(shuō),本文需要通過(guò)優(yōu)化升級(jí)內(nèi)容達(dá)到提升升級(jí)效率、減少用戶對(duì)服務(wù)器的訪問(wèn),進(jìn)而達(dá)到提升吞吐量的目的;那么數(shù)字電視軟件升級(jí)的內(nèi)容有哪些呢?就目前而言數(shù)字電視軟件支持網(wǎng)絡(luò)訪問(wèn)功能的系統(tǒng)通常有兩種:linux操作系統(tǒng)與android操作系統(tǒng);這兩種操作系統(tǒng)都是以文件系統(tǒng)的方式存在,且就存儲(chǔ)方式而言都是采用分區(qū)存儲(chǔ)。相對(duì)的linux操作系統(tǒng)較android操作系統(tǒng)而言其容量會(huì)小很多。但無(wú)論哪種系統(tǒng),對(duì)整個(gè)數(shù)字電視系統(tǒng)進(jìn)行升級(jí)是必須要實(shí)現(xiàn)的功能,而整體升級(jí)則意味著非常高的數(shù)據(jù)訪問(wèn)量;而普通的軟件升級(jí)則可能升級(jí)其中某個(gè)分區(qū),或者某個(gè)分區(qū)中的部分文件;這些文件大小不一,有的文件可能很大,造成數(shù)據(jù)傳遞阻塞,有的文件又很小造成終端頻繁向服務(wù)器請(qǐng)求數(shù)據(jù);因此本文提出對(duì)升級(jí)內(nèi)容進(jìn)行優(yōu)化,就提就是制定數(shù)字電視升級(jí)包規(guī)則,以標(biāo)準(zhǔn)升級(jí)文件大小為基準(zhǔn),將所有的升級(jí)文件按預(yù)定的規(guī)則進(jìn)行打包,將零散的小文件打包成一個(gè)大小適合的大文件包,將容量超大的文件分割成指定大小的小文件包;因此終端向服務(wù)器請(qǐng)求的數(shù)據(jù)基本上都是近似大小的文件,從而達(dá)到請(qǐng)求數(shù)據(jù)大小與請(qǐng)求次數(shù)平衡;升級(jí)數(shù)據(jù)內(nèi)容分為三種:升級(jí)觸發(fā)包、升級(jí)文件內(nèi)容校驗(yàn)包與升級(jí)文件包。具體如下:
1.1.1 升級(jí)觸發(fā)包
具體包括:固定長(zhǎng)度升級(jí)觸發(fā)包標(biāo)志字符串,包長(zhǎng)度,硬件版本,升級(jí)軟件版本、軟件版本判斷模式、軟件版本差值、升級(jí)總臺(tái)數(shù),開(kāi)始序列號(hào)、結(jié)束序列號(hào),服務(wù)器地址、升級(jí)類(lèi)型、升級(jí)文件包個(gè)數(shù)、分區(qū)個(gè)數(shù)、分區(qū)描述子1、分區(qū)描述子2……分區(qū)描述子n、crc校驗(yàn)位;其中包長(zhǎng)度為硬件版本到包結(jié)束的長(zhǎng)度,包括文件包結(jié)尾的crc校驗(yàn)位長(zhǎng)度;crc校驗(yàn)位校驗(yàn)的區(qū)域?yàn)榘_(kāi)始到分區(qū)描述子n,對(duì)這個(gè)區(qū)間的內(nèi)容進(jìn)行crc計(jì)算。
軟件版本判斷模式:值為0,表示不判斷軟件版本,直接升級(jí);值為1,表示機(jī)頂盒軟件版本加軟件版本差值等于待升級(jí)版本;值為2,表示機(jī)頂盒軟件版本減去軟件版本差值等于待升級(jí)版本。
升級(jí)類(lèi)型:值為0,表示前臺(tái)強(qiáng)制升級(jí)。通過(guò)界面告知用戶機(jī)器必須升級(jí),進(jìn)入升級(jí)流程,然后開(kāi)始接收升級(jí)數(shù)據(jù),并顯示進(jìn)度,最后更新升級(jí)軟件再重啟(用戶無(wú)法選擇);值為1,表示后臺(tái)強(qiáng)制升級(jí)。后臺(tái)接收升級(jí)數(shù)據(jù),接收數(shù)據(jù)不提示用戶,直到升級(jí)數(shù)據(jù)準(zhǔn)備完畢,再提示用戶進(jìn)行升級(jí)并顯示進(jìn)度,然后更新升級(jí)軟件再重啟(用戶無(wú)法選擇);值為2,表示前臺(tái)非強(qiáng)制升級(jí)。提示用戶需要升級(jí),用戶可做如下選擇,立即升級(jí)(同升級(jí)類(lèi)型0)、下次開(kāi)機(jī)升級(jí)(進(jìn)入數(shù)據(jù)接受,并顯示接收進(jìn)度,接受完成不更新,在下次開(kāi)機(jī)時(shí)更新軟件)、不升級(jí);值為3,表示后臺(tái)非強(qiáng)制升級(jí)。后臺(tái)接收升級(jí)數(shù)據(jù),接收數(shù)據(jù)不提示用戶,直到升級(jí)數(shù)據(jù)準(zhǔn)備完畢,再提示用戶進(jìn)行升級(jí)。用戶可以選擇立即升級(jí)和下次開(kāi)機(jī)升級(jí)和不升級(jí)。
分區(qū)個(gè)數(shù):該次升級(jí)涉及的分區(qū)總個(gè)數(shù)。
分區(qū)描述子:包括分區(qū)ID號(hào),分區(qū)名字,分區(qū)文件模式,升級(jí)文件個(gè)數(shù)。
分區(qū)文件模式:值為0,表示單文件分區(qū),如boot,kernel等非文件系統(tǒng)分區(qū)(只讀文件系統(tǒng)作為單文件處理);值為1,表示多文件系統(tǒng)分區(qū),如非只讀文件系統(tǒng)ubi文件系統(tǒng)等。
1.1.2 升級(jí)文件內(nèi)容校驗(yàn)包
具體包括:固定長(zhǎng)度升級(jí)文件內(nèi)容校驗(yàn)包標(biāo)志字符串,包長(zhǎng)度,分區(qū)個(gè)數(shù),分區(qū)校驗(yàn)描述子1,分區(qū)校驗(yàn)描述子2……分區(qū)校驗(yàn)描述子n,crc校驗(yàn)位,包長(zhǎng)度字段包括分區(qū)個(gè)數(shù)加上crc校驗(yàn)位長(zhǎng)度;crc校驗(yàn)位校驗(yàn)包開(kāi)頭到分區(qū)校驗(yàn)描述子n。
分區(qū)校驗(yàn)描述子:包括分區(qū)ID,分區(qū)名字,升級(jí)文件總個(gè)數(shù),文件校驗(yàn)描述子1……文件校驗(yàn)描述子n。
文件校驗(yàn)描述子:文件名長(zhǎng)度,文件名,文件路徑長(zhǎng)度、文件路徑、壓縮后的文件長(zhǎng)度、壓縮后的文件crc校驗(yàn)值、原始文件長(zhǎng)度、原始文件crc校驗(yàn)值。
1.1.3 升級(jí)文件包
具體包括固定長(zhǎng)度升級(jí)文件包標(biāo)志字符串,包長(zhǎng)度,升級(jí)包序號(hào),分區(qū)個(gè)數(shù),分區(qū)描述子1……分區(qū)描述子n,包文件1數(shù)據(jù)(壓縮后)…包文件n數(shù)據(jù),CRC校驗(yàn)。
分區(qū)個(gè)數(shù):表示該升級(jí)包下有多少個(gè)分區(qū)的升級(jí)文件。
分區(qū)描述子:包括分區(qū)ID,分區(qū)名字,分區(qū)文件模式,分區(qū)文件總個(gè)數(shù),包_分區(qū)_文件個(gè)數(shù),包_分區(qū)_文件描述子1……包_分區(qū)_文件描述子n。
包_分區(qū)_文件描述子:
文件序號(hào),文件名長(zhǎng)度,文件名,文件路徑長(zhǎng)度,文件路徑,壓縮后的文件長(zhǎng)度,壓縮后的文件CRC,原始文件長(zhǎng)度,原始文件CRC,文件切割模式,文件切割個(gè)數(shù),文件切割描述子。
文件切割模式:值為0,表示文件較小,不需要切割;值為1,表示文件較大,需要切割為n個(gè)子段。
文件切割個(gè)數(shù):當(dāng)文件切割模式為0,則該值為1,即切割子段描述子里的內(nèi)容為正常文件信息。
文件切割描述子:包括文件子段序號(hào),子段數(shù)據(jù)長(zhǎng)度、子段CRC、子段數(shù)據(jù)偏移地址。
文件子段序號(hào):對(duì)應(yīng)文件切割個(gè)數(shù)1~n。當(dāng)升級(jí)文件包出現(xiàn)文件切割,那么切割子段要么出現(xiàn)在包的最后,要么出現(xiàn)在包的最前且后面還有空間容納小文件。因此,一個(gè)包只可能出現(xiàn)一次“文件切割模式”為1的情況。
升級(jí)包序號(hào):對(duì)應(yīng)規(guī)則1.1.1的升級(jí)文件包個(gè)數(shù)。
分區(qū)文件模式:同規(guī)則1.1.1定義。
升級(jí)文件總個(gè)數(shù):同規(guī)則1.1.2分區(qū)校驗(yàn)描述子下的升級(jí)文件總個(gè)數(shù),即1個(gè)分區(qū)下有多少個(gè)文件需要更新。
包文件模式:值為0:表示多文件組合(可以是1個(gè)文件也可以是多個(gè)文件);值為1,表示單文件切割(將1個(gè)很大的文件切割成多個(gè)小文件,并切放到不同的升級(jí)文件包)一個(gè)升級(jí)文件包可能包含多個(gè)升級(jí)文件,也可以是一個(gè)被切割的文件的一部分)。
當(dāng)前文件序號(hào):對(duì)應(yīng)升級(jí)文件總個(gè)數(shù),且為該包下的第一個(gè)文件的序號(hào)。
包文件個(gè)數(shù):該字段基于包文件模式。當(dāng)包文件模式為0,表示該包下有n個(gè)升級(jí)文件;后續(xù)跟隨的包文件描述子有n跟,且描述子內(nèi)的文件序號(hào)為正常的升級(jí)文件,且文件序號(hào)為s,s+1……s+n-1;當(dāng)包文件模式為1,文件S被切割成了n個(gè)小文件;后續(xù)跟隨的包文件描述子只有1個(gè),且描述子內(nèi)的文件序號(hào)為文件S的子段,且序號(hào)為1,2……n;(2到n在后續(xù)的升級(jí)文件包內(nèi),升級(jí)包序號(hào)+1到升級(jí)包序號(hào)+n-1)。
包文件描述子:包括文件序號(hào),文件名長(zhǎng)度,文件名,文件路徑長(zhǎng)度,文件路徑,壓縮后的文件長(zhǎng)度,壓縮后的文件CRC,原始文件長(zhǎng)度,原始文件CRC,文件開(kāi)始位置。
文件序號(hào):同包文件個(gè)數(shù)描述。
文件開(kāi)始位置:壓縮文件數(shù)據(jù)在整個(gè)升級(jí)文件包里的偏移位置。
包文件數(shù)據(jù):需要升級(jí)的文件被壓縮后的數(shù)據(jù);當(dāng)包文件模式為1時(shí),包文件數(shù)據(jù)只有一個(gè);即一個(gè)文件需要切割時(shí),那么這個(gè)文件所有切割的子段都將使用1個(gè)單獨(dú)升級(jí)文件包。
使用與規(guī)則1.1配套工具對(duì)各個(gè)分區(qū)的升級(jí)文件進(jìn)行封包處理。配置人員使用封包工具進(jìn)行升級(jí)參數(shù)設(shè)置:先設(shè)置每個(gè)升級(jí)文件包的大小(該大小為與服務(wù)器契合的最優(yōu)值)、然后設(shè)置升級(jí)觸發(fā)包所需要的硬件版本,升級(jí)軟件版本、軟件版本判斷模式、軟件版本差值、升級(jí)總臺(tái)數(shù),開(kāi)始序列號(hào)、結(jié)束序列號(hào),服務(wù)器地址、升級(jí)類(lèi)型等內(nèi)容控制升級(jí)方式與升級(jí)規(guī)模;然后依次按分區(qū)導(dǎo)入本分區(qū)需要升級(jí)的文件或文件包;封包工具會(huì)對(duì)所有分區(qū)的升級(jí)的文件按大小進(jìn)行組合,按照規(guī)則1.1.3的定義,將一些小的文件組合成一個(gè)升級(jí)文件包,然后將超大的文件拆分成符合要求的多個(gè)升級(jí)文件包,然后根據(jù)規(guī)則1.1.1計(jì)算出升級(jí)文件包個(gè)數(shù)、分區(qū)個(gè)數(shù)、分區(qū)描述子1、分區(qū)描述子2……分區(qū)描述子n等信息生成完整的升級(jí)觸發(fā)包;在封包工具進(jìn)行文件組合的同時(shí)也會(huì)依據(jù)1.1.2規(guī)則對(duì)原始文件信息、優(yōu)化后的文件信息等進(jìn)行記錄、計(jì)算并生成升級(jí)文件內(nèi)容校驗(yàn)包。
首先將升級(jí)觸發(fā)包、升級(jí)文件內(nèi)容校驗(yàn)包、所有升級(jí)文件包導(dǎo)入前端服務(wù)器;服務(wù)器循環(huán)向全網(wǎng)廣播升級(jí)觸發(fā)包以及升級(jí)文件內(nèi)容校驗(yàn)包;升級(jí)觸發(fā)包以較高頻率廣播,內(nèi)容校驗(yàn)包以較低頻率廣播;然后服務(wù)器等待終端數(shù)字電視發(fā)送升級(jí)數(shù)據(jù)請(qǐng)求及結(jié)果反饋。數(shù)據(jù)請(qǐng)求有三種:申請(qǐng)升級(jí)文件內(nèi)容校驗(yàn)包、模糊申請(qǐng)升級(jí)文件包、精確申請(qǐng)升級(jí)文件包。
申請(qǐng)升級(jí)文件內(nèi)容校驗(yàn)包:終端數(shù)字電視若在一定時(shí)間內(nèi)未捕獲到前端廣播的升級(jí)內(nèi)容校驗(yàn)包,則會(huì)向服務(wù)器發(fā)送內(nèi)容校驗(yàn)包請(qǐng)求;服務(wù)器監(jiān)聽(tīng)到該請(qǐng)求則單獨(dú)將升級(jí)內(nèi)容校驗(yàn)包發(fā)送給本機(jī)。
模糊申請(qǐng)升級(jí)文件包:終端數(shù)字電視在通過(guò)分析升級(jí)觸發(fā)包后會(huì)知道本次升級(jí)需要申請(qǐng)的升級(jí)文件包個(gè)數(shù)且需要申請(qǐng)所有的升級(jí)包;為降低終端數(shù)字電視向服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求的次數(shù),終端數(shù)字電視采用模糊申請(qǐng)的方式一次將所有的升級(jí)包數(shù)據(jù)進(jìn)行請(qǐng)求(若升級(jí)包數(shù)量巨大,可分為幾次請(qǐng)求,每次請(qǐng)求一定范圍內(nèi)的升級(jí)包);服務(wù)器在接收到該請(qǐng)求后,會(huì)分析該終端請(qǐng)求的數(shù)據(jù)包,并結(jié)合自身的資源分配情況,優(yōu)先發(fā)送瞬時(shí)請(qǐng)求量少的包,后續(xù)發(fā)送請(qǐng)求量大的包,使服務(wù)器資源處于相對(duì)均衡狀態(tài);如若終端請(qǐng)求的所有升級(jí)包均處于滿負(fù)荷狀態(tài),前端會(huì)視服務(wù)器資源情況,向終端發(fā)送可申請(qǐng)升級(jí)包信息。
精確申請(qǐng)升級(jí)文件包:當(dāng)終端數(shù)字電視長(zhǎng)時(shí)間接收不到某個(gè)升級(jí)包,則向服務(wù)器單獨(dú)請(qǐng)求該數(shù)據(jù)包;服務(wù)器監(jiān)聽(tīng)到該請(qǐng)求則單獨(dú)將升級(jí)內(nèi)容校驗(yàn)包發(fā)送給本機(jī)。
結(jié)果反饋:當(dāng)終端服務(wù)器完成升級(jí)或者升級(jí)勝敗均會(huì)向服務(wù)器發(fā)送升級(jí)結(jié)果,服務(wù)器根據(jù)該反饋結(jié)果更新數(shù)據(jù)庫(kù)中該終端的軟件版本及升級(jí)結(jié)果;該信息用于運(yùn)營(yíng)商掌握、分析全網(wǎng)終端數(shù)字電視的軟件狀態(tài)、分析升級(jí)過(guò)程中出現(xiàn)的問(wèn)題,更好的服務(wù)于全網(wǎng)終端用戶。
數(shù)字電視終端在運(yùn)行過(guò)程中會(huì)監(jiān)聽(tīng)監(jiān)控對(duì)應(yīng)的端口,當(dāng)檢測(cè)到服務(wù)器廣播的升級(jí)觸發(fā)包,將獲取該包并分析出內(nèi)容,然后根據(jù)本機(jī)的硬件版本、軟件版本等規(guī)則1.1.1定義的各字段來(lái)判斷本機(jī)是否符合升級(jí)要求;若符合升級(jí)要求,則去獲取升級(jí)內(nèi)容校驗(yàn)包并分析;若在一定時(shí)間內(nèi)未捕獲到升級(jí)內(nèi)容校驗(yàn)包,則向服務(wù)器單獨(dú)申請(qǐng)?jiān)摪?,服?wù)器會(huì)根據(jù)請(qǐng)求單獨(dú)將升級(jí)內(nèi)容校驗(yàn)包發(fā)送給本機(jī)(或者向終端發(fā)送可優(yōu)先請(qǐng)求的升級(jí)包)。
然后數(shù)字電視終端向服務(wù)器發(fā)送升級(jí)文件包請(qǐng)求;終端會(huì)通過(guò)分析升級(jí)觸發(fā)包后會(huì)知道本次升級(jí)需要申請(qǐng)的升級(jí)文件包個(gè)數(shù)且需要申請(qǐng)所有的升級(jí)包;且根據(jù)升級(jí)文件包個(gè)數(shù)來(lái)判定是一次模糊申請(qǐng)所有的升級(jí)包,還是分為多次模糊申請(qǐng),每次申請(qǐng)一定數(shù)量的升級(jí)包;然后等待服務(wù)器的反饋;若服務(wù)器資源充足則會(huì)發(fā)送申請(qǐng)范圍的升級(jí)包數(shù)據(jù),終端將該數(shù)據(jù)進(jìn)行保存;當(dāng)服務(wù)器資源不足則會(huì)發(fā)回可申請(qǐng)升級(jí)包信息,終端調(diào)整升級(jí)包請(qǐng)求,對(duì)升級(jí)請(qǐng)求循序進(jìn)行重新劃分,優(yōu)先請(qǐng)求服務(wù)器資源充足的升級(jí)包;在此過(guò)程中如若部分升級(jí)包超過(guò)指定時(shí)間或次數(shù)均未請(qǐng)求到,則進(jìn)入下一范圍的升級(jí)包請(qǐng)求;待所有模糊請(qǐng)求完成后對(duì)未收到的升級(jí)包進(jìn)行精準(zhǔn)請(qǐng)求。
當(dāng)所有的升級(jí)包均收到后,首先對(duì)數(shù)據(jù)進(jìn)行自身的準(zhǔn)確性驗(yàn)證,包括分區(qū)個(gè)數(shù)、各分區(qū)下的升級(jí)文件個(gè)數(shù)、包內(nèi)的文件長(zhǎng)度、文件crc等驗(yàn)證,確保收到的是一個(gè)準(zhǔn)確的升級(jí)包;其次按照規(guī)則1.1.3,定義,對(duì)包進(jìn)行分析,提取出的壓縮狀態(tài)的各分區(qū)的升級(jí)文件(包括還原被切割的文件),并與規(guī)則1.1.2定義的升級(jí)文件內(nèi)容校驗(yàn)包里相關(guān)的數(shù)據(jù)進(jìn)行比對(duì),若校驗(yàn)錯(cuò)誤則向服務(wù)器發(fā)送升級(jí)失敗、失敗步驟及原因,并結(jié)束升級(jí);若文件都正確,則將壓縮文件進(jìn)行解壓縮,得到原始狀態(tài)的升級(jí)文件,并與升級(jí)文件內(nèi)容校驗(yàn)包里的原始文件信息進(jìn)行比對(duì),若錯(cuò)誤則向服務(wù)器發(fā)送升級(jí)失敗及升級(jí)失敗的步驟及原因;若所有數(shù)據(jù)均正確則進(jìn)入軟件更新步驟。
數(shù)據(jù)接收完成后終端更具規(guī)則1.1.1定義的升級(jí)類(lèi)型信息,提示用戶選擇。無(wú)論立即升級(jí)升級(jí)還是開(kāi)機(jī)升級(jí),均需要進(jìn)行軟件更新。軟件更新按分區(qū)進(jìn)行,并根據(jù)分區(qū)文件模式信息得到分區(qū)文件的具體寫(xiě)入方法;通常單文件分區(qū)的操作方法為將整個(gè)分區(qū)擦除,然后寫(xiě)入該分區(qū)的文件;若分區(qū)為多文件系統(tǒng)分區(qū),則根據(jù)升級(jí)文件問(wèn)題的路徑,去替換原有路徑下的對(duì)應(yīng)文件。所有文件更新完成后,重啟數(shù)字電視,整個(gè)軟件升級(jí)完成。