NetMsg為TDEngine傳輸數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)組成
包頭
數(shù)據(jù)的前12位為包頭
前4位為數(shù)據(jù)包的長度城舞,供數(shù)據(jù)讀取的時候獲取讀取的長度
接下來2位為seq_fd耻瑟,客戶端與網(wǎng)關(guān)服通訊時會保證包序是正常的帚桩,即下一個包的seq是符合標(biāo)準(zhǔn)的督笆,防止作弊重復(fù)發(fā)送包育叁,在網(wǎng)關(guān)服與邏輯服通訊時seq_fd表示網(wǎng)關(guān)服接受客戶端的fd值。邏輯服根據(jù)seq_fd值來獲取用數(shù)據(jù)包的來源用戶愁溜。
其它字段為預(yù)留字段疾嗅,后續(xù)可能有加密字段
包數(shù)據(jù)
包數(shù)據(jù)的第一個元素存儲的是一個str的值,也就是數(shù)據(jù)包的名稱冕象,可根據(jù)數(shù)據(jù)包的名稱獲取有幾個參數(shù)代承,參數(shù)的類型為何種類型,用以數(shù)據(jù)驗證渐扮。
接下來為若干個數(shù)據(jù)值论悴,數(shù)據(jù)為小端結(jié)構(gòu)
數(shù)據(jù)值解析
讀取字段
首先讀取字段頭,字段頭為兩個16進制的值墓律,第一個16進制為index膀估,第二個16進制對應(yīng)類型的pattern
若為map類型的數(shù)據(jù),第一個index用來解析對應(yīng)的key的字符串值只锻,對于其它類型index固定為0玖像,不作解析
第二個pattern類型則表示下一個值的數(shù)據(jù)類型,程序會根據(jù)pattern值進行下一步值的解析
類型解析
若類型為u8齐饮,i8,則會讀取后面1個字節(jié)做為值
若類型為u16笤昨,i16祖驱,則會讀取后面2個字節(jié)做為值
若類型為u32,i32瞒窒,則會讀取后面4個字節(jié)做為值
若類型為float捺僻,則會讀取后面4個字節(jié)做為i32值,然后把這個值除以1000得出float的值崇裁,float沒有用內(nèi)存直接做轉(zhuǎn)換匕坯,只保留了3位的精度,若精度要求高的請勿使用此類型拔稳,可在打包的時候轉(zhuǎn)成字符串葛峻,解析的時候做相應(yīng)的解析
若類型為str,raw巴比,則后面2個字節(jié)為字符串的長度术奖,再根據(jù)長度讀取相應(yīng)的字節(jié)做為字符串的值
若類型為map
- 遍歷字段頭礁遵,若頭為nil類型,則表示讀完map采记,退出循環(huán)佣耐,跳到5
- 根據(jù)字段頭,讀取相應(yīng)的類型
- 根據(jù)字段頭的index唧龄,從配置中讀取相應(yīng)的key兼砖,若配置中不存在key,則繼續(xù)執(zhí)行1
- 把key和相應(yīng)的值存到HashMap既棺,繼續(xù)執(zhí)行1
- 數(shù)據(jù)成功讀取
若類型為數(shù)組類型
- 得出對應(yīng)的子類型讽挟,如u8[]對應(yīng)的子類型為u8
- 遍歷讀取字段的值,若讀取到的類型為None援制,退出循環(huán)戏挡,跳到4
- 把讀取到的值存在Vector,繼續(xù)執(zhí)行1
- 數(shù)據(jù)成功讀取
至此晨仑,數(shù)據(jù)解析完成