TDEngine数据包的详细说明
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是符合標準的,防止作弊重復(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
若類型為數(shù)組類型
至此,數(shù)據(jù)解析完成
項目地址
TDEngine
td_proto rust 實現(xiàn)
td_proto cpp 實現(xiàn)
轉(zhuǎn)載于:https://my.oschina.net/tickbh/blog/681079
總結(jié)
以上是生活随笔為你收集整理的TDEngine数据包的详细说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2加入自定义的actionV
- 下一篇: python【5】-生成式,生成器