《物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT
2016-10-31 11:53
676 查看
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。
《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍
注:ServerSuperIO有可能被移植到Windows 10 IOT上,那么将来有可能开发一套设备驱动,可以支行在服务端、嵌入式设备中,将形成完整的解决方案。
现在已经调试通过部分代码,还得需要一段时间,一般都是晚上干,时间也有限。如下图:
目 录
4.如开发一套设备驱动,同时支持串口和网络通讯... 2
4.1 概述... 2
4.2 通讯协议规定... 2
4.2.1 发送读实时数据命令协议... 2
4.2.2 解析实时数据协议... 3
4.2.3 发送和接收数据事例... 3
4.3 开发设备驱动... 3
4.3.1 构建实时数据持久对象(不是必须)... 3
4.3.2 构建参数数据持久对象... 5
4.3.3 构建发送和解析协议命令对象... 5
4.3.4 构建协议驱动对象... 6
4.3.5 构建设备驱动对象... 8
4.4 构建宿主程序... 12
4.5 运行效果... 15
通讯很简单、交互很简单、业务很简单……如果把很多简单的问题合在一起,那么就变得不简单了,所以要有一个框架性的东西,重新把众多问题变得简单。
发送指令数据帧如下:
接收数据帧如下:
接收(十六进制):0x55 0xaa 0x00 0x61 0x43 0x7a 0x00 0x00 0x43 0xb4 0x15 0x0d
流量数据为:250.00
信号数据为:360.00
2.我们主要的工作是要创建一个实时数据持久对象类,实时缓存数据信息,也可以把该实时数据信息保存到数据库中或其他存储媒质。实时数据持久对象类的代码如下:
DeviceDyn 类继承自DeviceDynamic,因为每个硬件设备的报警信息有可能不一样,所以GetAlertState函数可以实该功能,但是SSIO框架并没有直接引用;这个类本质上是一个可以序列化,在不加互斥的情况下可能造成文件损坏,所以Repair可以完成修复功能,在DeviceDynamic基类里实现了该功能;另外,实现DeviceDynamic基类自带两个函数,Save函数用于持久化(序列化)此类的信息,Load用于获得(反序列化)此类的信息,在设备驱动中可以使用。
DevicePara继承自DeviceParameter类,情况与实时数据持久对象类似,可以参数。
针对上面的通讯协议,有一个61指令,那么我们就可以根据61指令为命名构建一个协议命令对象,包括发送数据和解析数据部分。如果有其他命令代码,举一反三。代码如下:
构建协议命令需要全部继承自ProtocolCommand,根据通讯协议规定,Name属性返回61,作为关键字;Package是打包要送的数据信息;Analysis对应着接收数据之后进行解析操作。就这样一个简单的协议命令驱动就构建完成了。
DeviceProtocol 协议驱动继承自ProtocolDriver ,一个设备驱动只存在一个协议驱动,一个协议驱动可以存在多个协议命令(如61命令)。该类中的CheckData函数很关键,SSIO框架中的设备驱动基类引用了,主要是完成校验接收数据的完事性,是否符合协议,从而决定了通讯状态:通讯正常、通讯中断、通讯干扰、以及通讯未知,不同的通讯状态也决定了调用设备驱动中的哪个函数接口:Communicate、CommunicateInterrupt、CommunicateError和CommunicateNone。
实时动态数据对象_deviceDyn、参数数据对象_devicePara、协议驱动对象_protocol分别提供给接口:DeviceDynamic、DeviceParameter和Protocol,为SSIO提供可引用的基础属性参数。
Initialize是设备驱动初始化的函数接口,在这个接口完成两个主要工作:初始化协议驱动和参数性的信息。通过this.Protocol.InitDriver(this.GetType(),null);代码可以加载所有协议命令到协议驱动的缓存中,以便实时调用。当然这里边也可以进行其他方面的工作,但是注意对异常的处理。
DeviceType这个是设备的类型,一般指定为Common就好了。其他函数接口功能已经在《物联网框架ServerSuperIO教程-3.设备驱动介绍》中详细介绍了,请参考。
这个代码大家都能看明白,具体的控制模式我们接下来会一一介绍。在构建宿主程序的时候,切忌对服务实例这样引用:server.ChannelManager、server.ControllerManager、server.DeviceManager。尽管提供了这样的接口,主要是为了SSIO框架内部使用的,不需要我们单独去操作这些接口。有的网友是这样的写的,那么就变成了一个纯的通信IO框架,那么就失去了SSIO框架本身的价值。作为二次开发者,只需要设置设备驱动的参数,以及向服务实例中增加或删除设备就行了,其他所有的运行全部交给SSIO框架来完成。
1.[连载]《C#通讯(串口和网络)框架的设计与实现》
2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案
3.C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
5.ServerSuperIO开源地址:https://github.com/wxzz/ServerSuperIO
物联网&集成技术(.NET) QQ群:54256083
《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。
《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍
注:ServerSuperIO有可能被移植到Windows 10 IOT上,那么将来有可能开发一套设备驱动,可以支行在服务端、嵌入式设备中,将形成完整的解决方案。
现在已经调试通过部分代码,还得需要一段时间,一般都是晚上干,时间也有限。如下图:
目 录
4.如开发一套设备驱动,同时支持串口和网络通讯... 2
4.1 概述... 2
4.2 通讯协议规定... 2
4.2.1 发送读实时数据命令协议... 2
4.2.2 解析实时数据协议... 3
4.2.3 发送和接收数据事例... 3
4.3 开发设备驱动... 3
4.3.1 构建实时数据持久对象(不是必须)... 3
4.3.2 构建参数数据持久对象... 5
4.3.3 构建发送和解析协议命令对象... 5
4.3.4 构建协议驱动对象... 6
4.3.5 构建设备驱动对象... 8
4.4 构建宿主程序... 12
4.5 运行效果... 15
4.如开发一套设备驱动,同时支持串口和网络通讯
4.1 概述
作为物联网通讯框架,肯定要支持多种通讯链路,在多种通讯链路的基础上完成多种通讯协议的交互,例如:Modbus、自定义协议等等。但是,有一个问题:针对同一台硬件设备或传感器,完成串口和网络两种通讯方式的数据采集和控制,是否要分别写代码?如果从现实角度分析,同一硬件,它要完成的业务逻辑肯定是相同的,所以ServerSuperIO物联网框架,允许开发一套设备驱动,同时支持串口和网络两种通讯方式的交互。通讯很简单、交互很简单、业务很简单……如果把很多简单的问题合在一起,那么就变得不简单了,所以要有一个框架性的东西,重新把众多问题变得简单。
4.2 通讯协议规定
在完成一个设备驱动的开发之前,首先要知道它的通讯协议,好比两个人交流的语言一样。针对通讯协议,我们自定义一个简单交互方式,只是发送命令,提取数据信息。4.2.1 发送读实时数据命令协议
计算机发送0x61指令为读实时数据命令,共发送6个字节,校验和为从“从机地址”开始的累加和,不包括“数据报头”、“校验和”和“协议结束”。发送指令数据帧如下:
帧结构 | 数据报头 | 从机地址 | 指令代码 | 校验和 | 协议结束 | |
0x55 | 0xAA | | 0x61 | | 0x0D | |
字节数 | 1 | 1 | 1 | 1 | 1 | 1 |
4.2.2 解析实时数据协议
下位机接收到读实时数据命令后,并校验成功,返回实时数据,校验和为从“从机地址”开始的累加和,不包括“数据报头”、“校验和”和“协议结束”。接收数据帧如下:
帧结构 | 数据报头 | 从机地址 | 指令代码 | 流量 | 信号 | 校验和 | 协议结束 | |
0x55 | 0xAA | | 0x61 | 浮点型 | 浮点型 | | 0x0D | |
字节数 | 1 | 1 | 1 | 1 | 4 | 4 | 1 | 1 |
4.2.3 发送和接收数据事例
发送(十六进制):0x55 0xaa 0x00 0x61 0x61 0x0d接收(十六进制):0x55 0xaa 0x00 0x61 0x43 0x7a 0x00 0x00 0x43 0xb4 0x15 0x0d
流量数据为:250.00
信号数据为:360.00
4.3 开发设备驱动
4.3.1 构建实时数据持久对象(不是必须)
1.通过返回数据的通讯协议,有流量和信号两个动态变量,我们需要创建一个动态对象实体类,主要用于协议驱动与设备驱动之间的数据交互。代码如下:4.3.2 构建参数数据持久对象
一般来说硬件设备会有读参数的命令,那么返回来的参数也需要进行持久化存储,并且每台设备的参数都可能不一样,在此提供一个可扩展的接口。在这个通讯协议中并没有涉及到设备参数相关的协议说明,但是我们也需要创建一个参数数据持久对象类,可以不写任何扩展的参数属性,在SSIO框架对参数的接口进行了引用,这是必须进行了工作。代码如下:4.3.3 构建发送和解析协议命令对象
与设备进行交互会涉及到很多交互式的命令或指令代码,而这些命令在SSIO框架内是以协议命令对象的形式存在,大体包括三个部:执行命令接口、打包发送数据接口、解析接收数据接口等。针对上面的通讯协议,有一个61指令,那么我们就可以根据61指令为命名构建一个协议命令对象,包括发送数据和解析数据部分。如果有其他命令代码,举一反三。代码如下:
4.3.4 构建协议驱动对象
有了协议命令之后,我们需要构建协议驱动对象,SSIO框架支持自定义协议也在于此,并且与设备驱动的接口相关联,在SSIO框架的高级应用中也进行了引用,构建这引对象很关键。代码如下:4.3.5 构建设备驱动对象
上边的基础工作都做完之后,现在就构建设备驱动的核心部分,也就是SSIO框架与设备驱动对接、协调、调度的唯一接口,写完这个接口,设备驱动就可以在SSIO上直接运行了,并且与硬件设备进行交互。直接上代码:Initialize是设备驱动初始化的函数接口,在这个接口完成两个主要工作:初始化协议驱动和参数性的信息。通过this.Protocol.InitDriver(this.GetType(),null);代码可以加载所有协议命令到协议驱动的缓存中,以便实时调用。当然这里边也可以进行其他方面的工作,但是注意对异常的处理。
DeviceType这个是设备的类型,一般指定为Common就好了。其他函数接口功能已经在《物联网框架ServerSuperIO教程-3.设备驱动介绍》中详细介绍了,请参考。
4.4 构建宿主程序
一个简单的设备驱动就已经开发好了,光有驱动还不行,那么我们基于SSIO框架再写几行代码,完成一个宿主程序,把设备驱动实例化,放SSIO的服务实例中运行,完成串口和网络两种方式的通讯交互,代码也非常简单。代码如下:4.5 运行效果
1.[连载]《C#通讯(串口和网络)框架的设计与实现》
2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案
3.C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
5.ServerSuperIO开源地址:https://github.com/wxzz/ServerSuperIO
物联网&集成技术(.NET) QQ群:54256083
相关文章推荐
- 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT
- 【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动
- 【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动
- 开源物联网框架ServerSuperIO 3.0正式发布(C#),跨平台:Win&Win10 Iot&Ubuntu&Ubuntu Mate,一套设备驱动跨平台挂载,附:开发套件和教程。
- 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动数码管
- 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动
- 工业串口和网络软件通讯平台-快速构建自己的平台和开发设备
- 开源物联网框架ServerSuperIO 3.0正式发布(C#),跨平台:Win&Win10 Iot&Ubuntu&Ubuntu Mate,一套设备驱动跨平台挂载,附:开发套件和教程。
- 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动 8×8 点阵
- 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动
- 【工业串口和网络软件通讯平台(SuperIO)教程】八.SuperIO通讯机制与设备驱动对接的说明
- 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED
- 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动 8×8 点阵
- 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动
- 【工业串口和网络软件通讯平台(SuperIO)教程】八.SuperIO通讯机制与设备驱动对接的说明
- Epics下 使用asyn、StreamDevice实现串口/网络设备的驱动开发
- 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动
- Windows驱动开发WDM (14)- 分层驱动(设备栈,I/O栈)
- [Linux驱动开发] 网络设备之DM9000驱动架构分析
- 【驱动开发】Windows系统下枚举设备的几个函数