(物聯(lián)網(wǎng),工業(yè)設備)二進制字節(jié)通訊協(xié)議的支持詳解

2018-11-27 14:08 更新

架構的代碼獲取地址

http://t.cn/R5pS8up

物聯(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

講的一摸一樣了。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號