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

讲的一摸同样了。

相关文章
相关标签/搜索