此文講解了,如何編寫架構未提供客戶端模塊的設備語言 應該按照什麼樣的協議標準編寫傳輸內容。後端
和服務端如何解析發送這些內容。數組
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,在內容中體現)
心跳包:心跳包是從服務器發出的,因此客戶端不須要發送心跳包,
客戶端須要接受心跳包,並將心跳包過濾。
心跳包爲,單字節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字符的的二進制形式。能夠是本身定義的值
|
心跳:服務端架構自帶,無需定義:
客戶端只須要按照 特殊協議,心跳包的解析方法就能夠了。
其中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
講的一摸同樣了。