架構(gòu)的代碼獲取地址
物聯(lián)網(wǎng)客戶端的(二進(jìn)制)通訊協(xié)議詳解
此文講解了,如何編寫(xiě)架構(gòu)未提供客戶端模塊的設(shè)備語(yǔ)言 應(yīng)該按照什么樣的協(xié)議標(biāo)準(zhǔn)編寫(xiě)傳輸內(nèi)容。
和服務(wù)端如何解析發(fā)送這些內(nèi)容。
1.協(xié)議詳解
頭指令 N段的長(zhǎng)度 N段 內(nèi)容 1bit(固定長(zhǎng)度) 1bit(固定長(zhǎng)度) 不固定長(zhǎng)度 不固定長(zhǎng)度
頭指令:
從0x00-0xff,其中0xff和0x99為保留字段不得使用。
N段的長(zhǎng)度:
為N段的數(shù)據(jù)位的長(zhǎng)度,比如N段的數(shù)據(jù)為FF,此數(shù)據(jù)占用1位bit,則N段的長(zhǎng)度為1,如果N段數(shù)據(jù)為,0x100~0xffff,這個(gè)數(shù)據(jù)占位為2BIT,則N段的長(zhǎng)度為2,
如果N段的數(shù)據(jù)為0x10000~0xffffff,則占位3bit,N段的的長(zhǎng)度為3,依此類的。
N段:
1此段數(shù)據(jù)為內(nèi)容數(shù)據(jù)的長(zhǎng)度,內(nèi)容如果是1BIT那,N段的數(shù)值就是1,如果內(nèi)容是N bit位,N段的數(shù)據(jù)就是N。
內(nèi)容:
此段可自己定義想要的內(nèi)容可以是,十六進(jìn)制內(nèi)容,也可以是其他格式內(nèi)容,形式不固定,內(nèi)容不固定。
(在制作物聯(lián)網(wǎng)項(xiàng)目中,至少要把設(shè)備ID,在內(nèi)容中體現(xiàn))
2 特殊協(xié)議
心跳包:心跳包是從服務(wù)器發(fā)出的,所以客戶端不需要發(fā)送心跳包,
客戶端需要接受心跳包,并將心跳包過(guò)濾。
心跳包為,單字節(jié)0x99,客戶端如遇到單字節(jié)0X99,需要把接收時(shí)間調(diào)整到最新。接收到非心跳包也要更新接收時(shí)間。
客戶端如果超過(guò)60-90秒,未更新最新接收時(shí)間,則認(rèn)為連接超時(shí),需要重新連接。
內(nèi)置指令:
0xff,為服務(wù)內(nèi)置指令,此指令頭包含作用為
1.服務(wù)已滿員,需要連接其他服務(wù)、
2.獲取中間層的tokenID,如果用到中間轉(zhuǎn)發(fā)層的話,tokenid是唯一標(biāo)識(shí),否則不予以轉(zhuǎn)發(fā)也不能收到信息。
3.服務(wù)器其他通知或內(nèi)容。(可自定義)
示例
簡(jiǎn)單描述就是:
頭指令,是代表了一個(gè)CLASS類,每定義一個(gè)頭指令,后臺(tái)處理就要對(duì)應(yīng)一個(gè)CLASS
,我這里為了方便,全部定義為0X01,也就是后臺(tái)只需要用一個(gè)CLASS就能處理。
N段的長(zhǎng)度 N段 都是通過(guò)計(jì)算獲得的,不固定。
內(nèi)容是可以自己隨便定義的。
我這里定義的前兩個(gè)字節(jié),定義為具體的方法。你可以認(rèn)為是,你后端處理CLASS類的具體調(diào)用的某一個(gè)方法。
登錄(客戶端發(fā)送):
頭指令 N段的長(zhǎng)度 N段 內(nèi)容 0x01 通過(guò)計(jì)算N段的長(zhǎng)度 通過(guò)計(jì)算內(nèi)容的長(zhǎng)度 (固定2BIT-代表后端的登錄方法) 0X000A (N bit -設(shè)備ID編號(hào)) 例如設(shè)備ID編號(hào)是固定的8位4BIT 0x00000001
登錄組合示例:
0x01(頭指令) 0X01(0x0C的長(zhǎng)度) 0X6(后面內(nèi)容的長(zhǎng)度,十進(jìn)制就是12) 0X000A00000001
返回驗(yàn)證及令牌(客戶端接收):
頭指令 N段的長(zhǎng)度 N段 內(nèi)容 0x01 通過(guò)計(jì)算N段的長(zhǎng)度 通過(guò)計(jì)算內(nèi)容的長(zhǎng)度 (固定2BIT-代表后端的登錄方法) 0X000A (N bit -返回的TOKEN) 例如 固定8位4BIT 0x10000011
示例:
0x01(頭指令) 0X01(0x0C的長(zhǎng)度) 0X6(后面內(nèi)容的長(zhǎng)度,十進(jìn)制就是12) 0X000A10000011
查詢(客戶端/服務(wù)端-發(fā)送):
頭指令 N段的長(zhǎng)度 N段 內(nèi)容 0x01 通過(guò)計(jì)算N段的長(zhǎng)度 通過(guò)計(jì)算內(nèi)容的長(zhǎng)度 (固定2BIT-代表查詢的某個(gè)方法) 0X00A1 (N bit -登錄的令牌TOKEN) 例如 固定8位 0x10000011
查詢結(jié)果(客戶端/服務(wù)端-接收):
頭指令 N段的長(zhǎng)度 N段 內(nèi)容 0x01 通過(guò)計(jì)算N段的長(zhǎng)度 通過(guò)計(jì)算內(nèi)容的長(zhǎng)度 (固定2BIT-代表查詢的某個(gè)方法) 0X00A1 (N bit -返回的結(jié)果) 可以是UTF-8字符的的二進(jìn)制形式。可以是自己定義的值
心跳:服務(wù)端架構(gòu)自帶,無(wú)需定義:
客戶端只需要按照 特殊協(xié)議,心跳包的解析方法就可以了。
3發(fā)包例子
其中ConvertToByteList 是把INT類型,轉(zhuǎn)換長(zhǎng)BTYE[]數(shù)組,然后得到數(shù)組的長(zhǎng)度(占位)。
非常簡(jiǎn)單的組裝。2是頭部的固定2BIT,一個(gè)是頭指令,一個(gè)是N段的長(zhǎng)度。
解包例子
接收到數(shù)據(jù)如果第一位是0X99則消除它,然后將其他的內(nèi)容,增加到等待解包隊(duì)列。更新接收時(shí)間,防止出錯(cuò)。
解包隊(duì)列方法
發(fā)現(xiàn)第一位是0x99,則消除它
如果過(guò)濾后,字符大于2則,看看整個(gè)協(xié)議的內(nèi)容到底有多長(zhǎng)
如果當(dāng)前的的值太少了,則吧隊(duì)列的下一組數(shù)據(jù)合并到這組數(shù)的后面,如果
當(dāng)前數(shù)值太多,則把多余的數(shù)值,合并到下組數(shù)據(jù)的最前面。然后把當(dāng)前的數(shù)值存入臨時(shí)變量中。從列隊(duì)中刪除這組數(shù)據(jù)。
最后把正確的數(shù)據(jù),拆開(kāi)分成,頭指令和具體內(nèi)容。
按字節(jié)發(fā)送的服務(wù)端使用方法
首先使用服務(wù)端架構(gòu)的時(shí)候,要先了解基本用法,可以參照
https://my.oschina.net/u/2476624/blog/893783
這個(gè)教程內(nèi)容。
再次基礎(chǔ)上,只需要做一些小小的變動(dòng)。
在最新更新的運(yùn)行器中,選擇BYTESCOKET,意思就是按字節(jié)發(fā)送的SOCKET的。
選擇后
會(huì)需要填寫(xiě)一個(gè)完整的命名空間與類名。
,可以在運(yùn)行器項(xiàng)目中創(chuàng)建一個(gè)類文件
創(chuàng)建的類需要繼承 IDataparsing 接口,此接口有4個(gè)方法要實(shí)現(xiàn),可以參考
最后,后端的處理邏輯就和
https://my.oschina.net/u/2476624/blog/893783
講的一摸一樣了。
更多建議: