HEBUT 視頻系統BMTP協議分析

交互過程

對於數據流和控制流,BMTP協議都使用了服務器的1680端口,實際上這個端口在網頁javascript腳本中是給出的。例如:

diskList[0] = new CDiskObj(1,'disk_vodserv_1',1,'vodserv_1','202.113.112.139:1680');

可以看到,這裏的javascript語句提供了服務器地址和提供服務的端口號。爲了簡便,可以將端口號1680與域名vod.hebut.edu.cn硬編碼到程序代碼中。

總體流程:

  • 獲取視頻信息

BMTP協議的請求類似於一個HTTP請求,例如:

GET / HTTP/1.0
Accept: */*
User-Agent: BMTPAgent
Host: VOD
...
PID:111
SID:1
DID:1
PFG:1
MGC:*************
...

上面的請求中包含五個關鍵值:pid,sid,did,pfg,mgc。MGC是由pid,sid,did,pfg帶入字符串求取md5 hash而得到的。pid,sid,did,pfg四個值是節目信息網頁中的javascript給出的,例如:

sitcomList[0] = new CSitcomObj(7437,1507,1,'[CQMF]士兵突擊.國語中字.01.V-vb','',1,1,1,0,0,'00:00:00','00:00:00');

CSitcomObj的第2、3個參數分別是pid與sid,did、pfg經測試始終設置爲did=1,pfg=0即可。然後通過計算hash值,僞代碼如下:

mgc=md5("boful+pid=%d;sid=%d;did=%d;fil=;pfg=%d;truran",pid,sid,did,pfg);

將構造好的請求發送到服務器,可以獲得一個長度爲332字節的信息,結構如下:

struct{
    char MGC_DW[6];
    char nop1[6];
    uint32 cid;
    uint32 usn;
    char nop2[32];
    char time[20];
    char videoname[88];
    char fileext[8];
    char nop4[203];
} 

在大數端的cpu上,可以直接套用上面的數據結構。某些ARM/MIPS CPU可能需要自行重組cid與usn。

  • 控制命令

在BMTP協議中存在3種控制命令,在WAY=1時,由MTD=1、2或3來控制1. MTD=1 即獲取媒體信息2. MTD=2 Client每隔三秒發送一次,猜想用來確定連接狀態。例如:

GET / HTTP/1.0
Accept: */*
User-Agent: BMTPAgent
Host: VOD
UGT:NETPLAYER
WAY:1
MTD:2

3. MTD=3 定位文件位置。例如:

GET / HTTP/1.0
Accept: */*
User-Agent: BMTPAgent
Host: VOD
UGT:NETPLAYER
WAY:1
MTD:3
SPL:0
SPH:0

在MTD=1或MTD=3的數據包發送後,數據流可以打開並獲取數據。服務器通過cid和usn的值來確定session。爲了處理方便,強制發送一個定位請求可以使後面的處理方便些。傳輸數據的連接通過發送如下數據可以開始接收文件內容:

GET / HTTP/1.0
Accept: */*
User-Agent: BMTPAgent
Host: VOD
UGT:NETPLAYER
WAY:2
FPT:1
CID:...
USN:...
STT:...

另外需要注意的是,服務器在發送實際數據之前會有48個字節的響應,包括8字節響應上面的數據的請求,和40字節對MTD=3定位請求的響應。所以略過48個字節之後就可以把內容寫入文件了。

編程接口

  • C# vodd命名空間

C#命名空間聲明瞭三個類:downloader、constructor和MediaInfoParser。給出一個典型代碼

downloader t = new downloader(1507, 1, 1, 0);
t.GetMediaInfo();
t.Config.filepos = 614736;
t.OnDlding += new ProcessDelegate(OnProcess);
t.OnDlded+=new ProcessDelegate(OnProcessed);
t.SaveToFile("c:\\" + t.Config.videoname + t.Config.fileext);

通過調用constructor的成員和MediaInfoParser,可以實現更靈活的操作。

另外需要注意的是,服務器可能對每一個MTD=1的請求都分配了session資源,所以在不準備下載相應文件時,不應該發出相應的請求,以免服務器壓力過大。

  • C 庫函數

測試程序

兩個用來測試的應用程序:下載。測試截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章