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