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