weaving-socket (物聯網,工業設備)二進制字節通信協議的支持詳解

架構的代碼獲取地址

http://t.cn/R5pS8up

 

物聯網客戶端的(二進制)通信協議詳解

此文講解了,如何編寫架構未提供客戶端模塊的設備語言 應該按照什麼樣的協議標準編寫傳輸內容。後端

和服務端如何解析發送這些內容。數組

1.協議詳解服務器

頭指令架構

N段的長度spa

N段.net

內容blog

1bit(固定長度)繼承

1bit(固定長度)教程

不固定長度token

不固定長度

 

頭指令:

從0x00-0xff,其中0xff和0x99爲保留字段不得使用。

N段的長度:

 爲N段的數據位的長度,好比N段的數據爲FF,此數據佔用1位bit,則N段的長度爲1,若是N段數據爲,0x100~0xffff,這個數據佔位爲2BIT,則N段的長度爲2,

若是N段的數據爲0x10000~0xffffff,則佔位3bit,N段的的長度爲3,依此類的。

N段:

1此段數據爲內容數據的長度,內容若是是1BIT那,N段的數值就是1,若是內容是N bit位,N段的數據就是N。

內容:

此段可本身定義想要的內容能夠是,十六進制內容,也能夠是其餘格式內容,形式不固定,內容不固定。

(在製做物聯網項目中,至少要把設備ID,在內容中體現)

 

 

2 特殊協議

心跳包:心跳包是從服務器發出的,因此客戶端不須要發送心跳包,

客戶端須要接受心跳包,並將心跳包過濾。

心跳包爲,單字節0x99,客戶端如遇到單字節0X99,須要把接收時間調整到最新。接收到非心跳包也要更新接收時間。

客戶端若是超過60-90秒,未更新最新接收時間,則認爲鏈接超時,須要從新鏈接。

內置指令:

0xff,爲服務內置指令,此指令頭包含做用爲

1.服務已滿員,須要鏈接其餘服務、

2.獲取中間層的tokenID,若是用到中間轉發層的話,tokenid是惟一標識,不然不予以轉發也不能收到信息。

3.服務器其餘通知或內容。(可自定義)

 

 

示例

簡單描述就是:

頭指令,是表明了一個CLASS類,每定義一個頭指令,後臺處理就要對應一個CLASS

,我這裏爲了方便,所有定義爲0X01,也就是後臺只須要用一個CLASS就能處理。

N段的長度

N段

都是經過計算得到的,不固定。

內容是能夠本身隨便定義的。

我這裏定義的前兩個字節,定義爲具體的方法。你能夠認爲是,你後端處理CLASS類的具體調用的某一個方法。

 

登陸(客戶端發送):

頭指令

N段的長度

N段

內容

0x01

經過計算N段的長度

經過計算內容的長度

(固定2BIT-表明後端的登陸方法)

0X000A

(N bit -設備ID編號)

例如設備ID編號是固定的8位4BIT

0x00000001

 

登陸組合示例:

0x01(頭指令)  0X01(0x0C的長度)  0X6(後面內容的長度,十進制就是12)  0X000A00000001

 

返回驗證及令牌(客戶端接收):

頭指令

N段的長度

N段

內容

0x01

經過計算N段的長度

經過計算內容的長度

(固定2BIT-表明後端的登陸方法)

0X000A

(N bit -返回的TOKEN)

例如 固定8位4BIT

0x10000011

 

示例:

0x01(頭指令)  0X01(0x0C的長度)  0X6(後面內容的長度,十進制就是12)  0X000A10000011

 

 

查詢(客戶端/服務端-發送):

頭指令

N段的長度

N段

內容

0x01

經過計算N段的長度

經過計算內容的長度

(固定2BIT-表明查詢的某個方法)

0X00A1

(N bit -登陸的令牌TOKEN)

例如 固定8位

0x10000011

 

 

查詢結果(客戶端/服務端-接收):

頭指令

N段的長度

N段

內容

0x01

經過計算N段的長度

經過計算內容的長度

(固定2BIT-表明查詢的某個方法)

0X00A1

(N bit -返回的結果)

能夠是UTF-8字符的的二進制形式。能夠是本身定義的值

 

 

 

 

心跳:服務端架構自帶,無需定義:

客戶端只須要按照 特殊協議,心跳包的解析方法就能夠了。

3發包例子

其中ConvertToByteList 是把INT類型,轉換長BTYE[]數組,而後獲得數組的長度(佔位)。

很是簡單的組裝。2是頭部的固定2BIT,一個是頭指令,一個是N段的長度。

 

 

解包例子

接收到數據若是第一位是0X99則消除它,而後將其餘的內容,增長到等待解包隊列。更新接收時間,防止出錯。

 

解包隊列方法

發現第一位是0x99,則消除它

若是過濾後,字符大於2則,看看整個協議的內容到底有多長

若是當前的的值太少了,則吧隊列的下一組數據合併到這組數的後面,若是

當前數值太多,則把多餘的數值,合併到下組數據的最前面。而後把當前的數值存入臨時變量中。從列隊中刪除這組數據。

最後把正確的數據,拆開分紅,頭指令和具體內容。

 

 

   按字節發送的服務端使用方法

 

首先使用服務端架構的時候,要先了解基本用法,能夠參照

http://www.javashuo.com/article/p-nnhrlzyz-kd.html

這個教程內容。

再次基礎上,只須要作一些小小的變更。

在最新更新的運行器中,選擇BYTESCOKET,意思就是按字節發送的SOCKET的。

選擇後

會須要填寫一個完整的命名空間與類名。

,能夠在運行器項目中建立一個類文件

建立的類須要繼承 IDataparsing 接口,此接口有4個方法要實現,能夠參考

 

最後,後端的處理邏輯就和

http://www.javashuo.com/article/p-nnhrlzyz-kd.html

講的一摸同樣了。

相關文章
相關標籤/搜索