开源目的:尽可能接入更多的传输层协议,编解码硬件自身的帧数据!
项目地址:https://gitee.com/big_coffee_market/large-derivative-linkage
项目优势:只是做网络层服务,不涉及到具体的业务逻辑,只是做信息的编解码服务,入手较简单,较快。在硬件编解码过程中,封装了一些类型与字节数组的转换,使用注解编程,代码可读性较强,扩展性更为自由,并且支持帧中包含帧!网络层与硬件交互,网络层与平台交互,都有唯一一个对应的接口,层次感较强!
平台与网络中心交互的时候,指令是一一对应的,一个指令一个结果,泛型继承PlatformAttachDTO,含义是需要携带设备ID。
与硬件交互,要发送二进制数组,因为在设备接入的时候,要保存设备的ID,作为接入标识! 这个接口的含义是,向某一设备发送二进制指令,得到二进制指令的返回值。
模仿FastJson,编码的时候传入对象信息,生成对应的二进制数组。
解码的时候,传输二进制数组信息和对象信息,会赋给对象数值。
支持帧中帧,@EncoderField 代表编码,@DecodeerField代表解码。该层Frame是最外层的Frame,在某些字段上,既支持编码又支持解码。
Sequence: 序列号,解析字段从前到后,1,2,3,4,5。按照顺序解析
Field:字段类型,byte[]编码后的字段类型
Len: 字段所占有的byte[]长度
Reverse:二进制字段是否反转,不反转解析的是1234,反转后解析的值是4321
Allow:该字段是否允许解析,可以不要,但是为了统一格式,保留了
Note: 备注,不起到任何作用,只是一个说明标注
支持的字段类型。Frame类型,对应的编解码格式都是一个对象,支持帧中帧!
Sequence 按顺序解析1,2,3,4,5
Field 解析后的字段类型
Method 截取二进制数组的方法
Param 截取二进制数组的参数
Reverse 是否反转
Note 笔记,不做说明
Method,param要搭配使用,代表的是截取多少长度的byte[]数组
Length 定长,param = 4,代表从左到右截取的长度就是4.
Tail 到倒数第几位,假设总长度是12,param = 1。那么截取的长度就是11.
Untils 直到某一个字符,假设待解析的数组为 0x01,0x02,0x03,0x80,0x07,0x09
Param = 0x80,截取的长度是3,param = 0x07截取的长度是4
解析顺序都是从左到右依次解析!
读取设备每个端口的状态
服务器读取设备每个端口当前的状态。
数据方向:
模块——设备
命令:
CMD |
0x01 |
数据(上面表示数据含义,下面表示示例数据):
NULL |
0x00 |
参数 |
是否必填 |
说明 |
NULL |
是 |
固定为0x00 |
回复数据(上面表示数据含义,下面表示示例数据):
PORT_NUM |
PORT1_STATUS |
PORT2_STATUS |
… |
0x03 |
0x02 |
0x01 |
… |
参数 |
是否必填 |
说明 |
PORT_NUM |
是 |
设备端口数量 |
PORT_STATUS |
是 |
端口状态: 0x01:端口空闲;0x02:端口正在使用;0x03:端口禁用;0x04:端口故障。 |
示例:模块发送:EE 09 01 00 00 00 00 00 00 00 08
模块接收:66 13 01 00 00 00 00 00 00 0A 02 01 01 01 01 01 01 01 01 01 1B (1端口正在充电,其他端口空闲 )
使用锁的阻塞特性,实现同步效果,返回给平台对应的byte[]。
设备收到帧数据后,确定是否为平台下发数据,如果是使用锁的阻塞性,赋值到通道数据容器里,然后解锁,平台下发的阻塞状态就被唤醒,获取到通道数据容器内的数据。
在流程封装好后,扩展就很方便,示例如下
这样子扩展,就可以完成其他对应的平台发送设备回复的指令!
感谢支持