# 大衍物联 **Repository Path**: z4zr/large-derivative-linkage ## Basic Information - **Project Name**: 大衍物联 - **Description**: 这个框架的主要作用是解析各种协议,只要有协议,你就使用我这个框架! 因为再数据解析中,有不同的协议类型,注册包,数据包,安全验证包。我这个框架里,使用责任链模式,支持不同协议搭配使用! 因为协议众多,为了可扩展,搭配使用多种协议时,自己要新建项目,不要改动原有的东西。对修改封闭,对扩展开放,这是设计原则! 在解析数据的时候,发送数据帧与返回数据帧的格式要定好,我们是在硬件层之上做工作! - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 26 - **Created**: 2022-07-25 - **Last Updated**: 2022-07-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 大衍物联网 开源目的:尽可能接入更多的传输层协议,编解码硬件自身的帧数据! 项目优势:只是做网络层服务,不涉及到具体的业务逻辑,只是做信息的编解码服务,入手较简单,较快。在硬件编解码过程中,封装了一些类型与字节数组的转换,使用注解编程,代码可读性较强,扩展性更为自由,并且支持帧中包含帧!网络层与硬件交互,网络层与平台交互,都有唯一一个对应的接口,层次感较强! 概要说明 1:网络层与平台交互: ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170110_82d0bc44_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170124_f01892ea_817305.png "屏幕截图.png") 平台与网络中心交互的时候,指令是一一对应的,一个指令一个结果,泛型继承PlatformAttachDTO,含义是需要携带设备ID。 2:网络层与硬件交互: ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170144_1725e19d_817305.png "屏幕截图.png") 与硬件交互,要发送二进制数组,因为在设备接入的时候,要保存设备的ID,作为接入标识! 这个接口的含义是,向某一设备发送二进制指令,得到二进制指令的返回值。 3:网络层帧的编解码 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170211_cc47f803_817305.png "屏幕截图.png") 模仿FastJson,编码的时候传入对象信息,生成对应的二进制数组。 解码的时候,传输二进制数组信息和对象信息,会赋给对象数值。 注解支持帧中帧编码解码 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170224_cf830a84_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170237_4964a43a_817305.png "屏幕截图.png") 支持帧中帧,@EncoderField 代表编码,@DecodeerField代表解码。该层Frame是最外层的Frame,在某些字段上,既支持编码又支持解码。 1:编码注解: ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170253_a55048b6_817305.png "屏幕截图.png") Sequence: 序列号,解析字段从前到后,1,2,3,4,5。按照顺序解析 Field:字段类型,byte[]编码后的字段类型 Len: 字段所占有的byte[]长度 Reverse:二进制字段是否反转,不反转解析的是1234,反转后解析的值是4321 Allow:该字段是否允许解析,可以不要,但是为了统一格式,保留了 Note: 备注,不起到任何作用,只是一个说明标注 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170312_461a8d74_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170327_fb740752_817305.png "屏幕截图.png") 支持的字段类型。Frame类型,对应的编解码格式都是一个对象,支持帧中帧! 2:解码注解 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170338_13f618cb_817305.png "屏幕截图.png") Sequence 按顺序解析1,2,3,4,5 Field 解析后的字段类型 Method 截取二进制数组的方法 Param 截取二进制数组的参数 Reverse 是否反转 Note 笔记,不做说明 Method,param要搭配使用,代表的是截取多少长度的byte[]数组 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170351_1eb78ca6_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170401_76925bc2_817305.png "屏幕截图.png") 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端口正在充电,其他端口空闲 ) 1:编写对应的Model ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170419_1871629f_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170428_d45385a3_817305.png "屏幕截图.png") 2:对应的Controller ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170439_004a4745_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170451_da21adb7_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170506_dd22e848_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170521_0f2759e8_817305.png "屏幕截图.png") 使用锁的阻塞特性,实现同步效果,返回给平台对应的byte[]。 3:对应的Device: ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170531_c52b4794_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170543_b3b979d6_817305.png "屏幕截图.png") 设备收到帧数据后,确定是否为平台下发数据,如果是使用锁的阻塞性,赋值到通道数据容器里,然后解锁,平台下发的阻塞状态就被唤醒,获取到通道数据容器内的数据。 其他Controller 在流程封装好后,扩展就很方便,示例如下 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170551_24605444_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170600_17b5caba_817305.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2022/0720/170609_5045244b_817305.png "屏幕截图.png") 这样子扩展,就可以完成其他对应的平台发送设备回复的指令!