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

2018-11-27 14:08 更新

架構(gòu)的代碼獲取地址

http://t.cn/R5pS8up

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

講的一摸一樣了。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)