文档章节

weaving-socket (物联网,工业设备)二进制字节通讯协议的支持详解

dreamsfly
 dreamsfly
发布于 2017/07/20 18:38
字数 1557
阅读 741
收藏 1

架构的代码获取地址

http://t.cn/R5pS8up

 

物联网客户端的(二进制)通讯协议详解

此文讲解了,如何编写架构未提供客户端模块的设备语言 应该按照什么样的协议标准编写传输内容。

和服务端如何解析发送这些内容。

1.协议详解

头指令

N段的长度

N段

内容

1bit(固定长度)

1bit(固定长度)

不固定长度

不固定长度

 

头指令:

从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则,看看整个协议的内容到底有多长

如果当前的的值太少了,则吧队列的下一组数据合并到这组数的后面,如果

当前数值太多,则把多余的数值,合并到下组数据的最前面。然后把当前的数值存入临时变量中。从列队中删除这组数据。

最后把正确的数据,拆开分成,头指令和具体内容。

 

 

   按字节发送的服务端使用方法

 

首先使用服务端架构的时候,要先了解基本用法,可以参照

https://my.oschina.net/u/2476624/blog/893783

这个教程内容。

再次基础上,只需要做一些小小的变动。

在最新更新的运行器中,选择BYTESCOKET,意思就是按字节发送的SOCKET的。

选择后

会需要填写一个完整的命名空间与类名。

,可以在运行器项目中创建一个类文件

创建的类需要继承 IDataparsing 接口,此接口有4个方法要实现,可以参考

 

最后,后端的处理逻辑就和

https://my.oschina.net/u/2476624/blog/893783

讲的一摸一样了。

 

© 著作权归作者所有

共有 人打赏支持
dreamsfly

dreamsfly

粉丝 24
博文 6
码字总数 12763
作品 2
郑州
CTO(技术副总裁)
【重大更新】开源跨平台物联网通讯框架ServerSuperIO 2.0(SSIO)下载

更新具体细节参见:[更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程! 声明:公司在建设工业大数据平台,SSIO正好能派上用场,所以抓紧时间进行了...

唯笑志在
2016/08/17
0
0
《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明 《连载...

唯笑志在
2016/11/20
0
0
《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明 《连载...

唯笑志在
2016/11/18
0
0
详解物联网的中间件:为何说它是不可或缺的?

互联网的大规模普及,拉近了人与人之间的交流,而不同国家人与人之间的交往也变得密切起来。由于彼此使用的语言不通,为了能够互相交流,我们需要将不同种的交流语言转换成对方可识别的信息,...

玄学酱
04/20
0
0
《物联网框架ServerSuperIO教程》-21.终端控制传感器或设备,形成回路控制。附:demo源代码

21.1 概述 ServerSuperIO以前所做的工作逐步为形成回路控制或级联控制打下基础,例如:服务连接器和设备驱动连接器的开发与应用。总之,是通过多种形式下发命令控制设备(驱动)或传感器,云...

唯笑志在
2017/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

负载均衡的解决方案有哪些

负载均衡器服务可满足大型组织的需求,支持所有数据中心和跨数据中心高可靠性场景。 本地负载均衡,通过附带或者未附带持久性覆盖选项,Incapsula支持各种负载均衡算法,以优化服务器之间的流...

上树的熊
13分钟前
1
0
Java实现在线打开word文档加盖印章/盖章/签名功能

前言: 我们知道,大型一点的OA办公系统都会有很多在线处理office办公文档的需求。其中有一点也基本绕不开,那就是为文档盖章或添加手写签名来保护文档,让被盖章的文档不再被编辑。 在Java中...

山里的红杏
20分钟前
4
0
js控制输入正负数,小数点后保留两位

//限制数字function clearNoNum(obj){ //修复第一个字符是小数点 的情况. if(obj.value !=''&& obj.value.substr(0,1) == '.'){ obj.value=""; } obj.value ...

一直在成长的程序猿
23分钟前
1
0
动态代理

具体场景 为了使代理类与被代理类对第三方有相同的函数,代理类与被代理类一般实现一个公共的interface,定义如下 public interface Subject { void rent(); void hello(String s)...

wuyiyi
26分钟前
0
0
时间字段

我们看看这几个数据库中(mysql、oracle和sqlserver)如何表示时间 mysql数据库:它们分别是 date、datetime、time、timestamp和year。date :“yyyy-mm-dd”格式表示的日期值 time :“hh:...

DemonsI
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部