此文讲解了,如何编写架构未提供客户端模块的设备语言 应该按照什么样的协议标准编写传输内容。后端
和服务端如何解析发送这些内容。数组
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
讲的一摸同样了。