物联网框架ServerSuperIO教程,设备驱动介绍

ca88会员登录中心 2
ca88会员登录中心

1.C#跨平台物联网通信框架ServerSuperIO(SSIO)介绍

《连载 | 物联网框架ServerSuperIO教程》- 三.器具驱动介绍,物联网框架

1.C#跨平台物联网通信框架ServerSuperIO(SSIO)介绍

《连载 | 物联网框架ServerSuperIO教程》一.四种简报形式机制。

《连载 | 物联网框架ServerSuperIO教程》2.劳务实例的安插参数表达

 

叁.三    1回开辟,常用接口

   
RunDevice抽象类承袭自IRunDevice接口,本质上来说,一回开荒只须要承袭RunDevice抽象类就足以了。RunDevice已经成功了设备驱动在ServerSuperIO框架下主题的尺度。那么在承接RunDevice抽象类的时候,所急需一回开拓的劳作十分的小,只须求关怀协议和管理数据业务本人,对于框架的内部运行机制能够配备、调整机制内部自行管理。

    3回开辟常用的接口,项目表示如下图:

ca88会员登录中心 1

    
那是多少个按协议规则落成实时收到文件数量的配备驱动,ReceiveFileDriver承接自RunDevice抽象类,是道具驱动的基本接口;Protocol是自定义商业事务接口,包罗发送数据协构和接收数据协议,实例化后在ReceiveFileDriver接口的IProtocolDriver属性中回到;不光要有商榷接口,在会谈里边还要有发号施令,那么Command正是琢磨中的自定义命令,那个体协会议命令规定了发送数据和接到分析数据,协议命令不仅仅囊括一个,依照专门的学问供给,设备驱动能够分包五个切磋命令,以成功与实业硬件的互相;Parameter自定义参数接口,每一个设备对象自己的参数不1致,实例化后在ReceiveFileDriver接口的IDeviceParameter属性中回到;Dynamic是自定义实时数据暂时缓存接口,能够把分析后的实时数据目前存款和储蓄在那一个目的里,,实例化后在ReceiveFileDriver接口的IDeviceDynamic属性中回到,那些目的不是必要求兑现的,ServerSuperIO内部并从未直接引用。

    
以上是从项目角度大意解说了亟待写哪几类代码,ReceiveFileDriver设备驱动要求贰回开辟写的代码,如下暗指图:

ca88会员登录中心 2

1)       
Initialize:初叶化设备驱动接口,在这里能够开始化协议驱动、设备参数和装置的实时数据等目的,以及成就部分其余的操作。

二)        DeviceDynamic:实时数据对象接口属性,不是必须兑现。

三)        DeviceParameter:参数数据对象接口属性,必须兑现。

四)        Protocol:协议驱动接口,很入眼,必须贯彻。

5)       
DeviceType:设备项目,一般指普通设备,虚拟设备适用于优良意况,必须达成。

陆)        ModelNumber:设备驱动的无可比拟编号,一般必须兑现。

七)       
GetConstantCommand:固定重临发送数据的接口,一般再次回到读实时数据命令,在SendCache里未有命令的时候,会调用该接口,必须兑现。

8)       
Communicate:通信正常,会把数据再次来到到那么些接口,影响通信状态为Protocol接口中的CheckData函数,校验接收到数码的完整性。

玖)       
CommunicateInterrupt:通信中断代表未有吸收到其余数据,会调用那些接口,影响通信状态为Protocol接口中的CheckData函数,校验接收到多少的完整性。

10)   
CommunicateError:通信困扰代表收到到数码,不过并未有校验准确,会调用这一个接口,影响通信状态为Protocol接口中的CheckData函数,校验接收到数量的完整性。

11)   
CommunicateNone:通信未知,代表该装置驱动对应的IO通道COM未有展开或NET没有有效连接。

1二)    UnknownIO:未知IO通道,COM未有打开或NET未有管用连接。

一叁)    CommunicateStateChanged:每趟通信状态改造后会调用那几个接口函数。

1四)   
ChannelStateChanged:IO通道状态改造后会调用这么些接口函数,COM是张开或关闭,NET是接连或断开。

15)   
Save:保存数据函数接口,设备驱动施行到生命周期最终会调用这一个接口,以完结对数码的保存。

1陆)   
Alert:报告警察方函数接口,数据管理落成后,对数码开始展览推断,以成功报告警察方功效。

一七)   
Show:展现数据函数接口,数据管理到位后,对数码举办展示,是SIO保留下去的接口函数,以后扩充使用。

1八)    Exit:当设备驱动退出时调用该函数接口,举例:宿主程序退出时。

1玖)   
Delete:删除设备驱动调用该函数接口,是SIO保留下来的接口函数,适用于有界面UI的使用场景,未来扩充使用。

20)    DeviceGraphics:视图接口,是SIO保留下去的接口函数,现在扩充使用。

2一)   
GetObject:获得数量对象,以往计划为服务接口供数据支撑,未来从未有超过实际际用处。

2二)   
ShowContextMenu:显示上下文菜单,是SIO保留下来的接口函数,现在扩充使用。

 

1.[连载]《C#报纸发表(串口和网络)框架的设计与完毕》

2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍

2.动用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)创设系统的全部方案

3.C#工业物联网和集成系统解决方案的技巧路径(数据源、数据搜罗、数据上传与吸收、ActiveMQ、Mongodb、WebApi、手提式无线话机App)

伍.ServerSuperIO开源地址:

物联网&集成技巧(.NET) QQ群54256083

 

下1篇:开荒设备驱动。

3.1    概述

    
定位ServerSuperIO(SSIO)为物联网通信框架,正是因为那个框架是以“设备”(驱动)为主干创设,“设备”是泛指传感器、下位机、PC机等各种数据源,数据源有和好的报纸发表协议或数额传输格式;ServerSuperIO并不是以IO通道为基本构建的框架,可是ServerSuperIO有很好的简报才干,完全能够陈设在服务端,并且帮助四个服务实例,以及能够在Linux下运作。

《连载 |
物联网框架ServerSuperIO教程》1.肆种简报方式机制。

叁.3    一次开拓,常用接口

   
RunDevice抽象类承袭自IRunDevice接口,本质上来说,2回开辟只供给承袭RunDevice抽象类就足以了。RunDevice已经做到了道具驱动在ServerSuperIO框架下中央的条件。那么在承袭RunDevice抽象类的时候,所急需三回开拓的行事非常小,只需求关爱协构和处理数据业务本人,对于框架的中间运维机制能够配备、调解机制内部自行管理。

    贰遍开采常用的接口,项目表示如下图:

1.[连载]《C#通信(串口和网络)框架的设计与落到实处》

2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍

2.施用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)营造系统的总体方案

3.C#工业物联网和集成系统化解方案的手艺路径(数据源、数据搜罗、数据上传与接收、ActiveMQ、Mongodb、WebApi、手提式有线电话机App)

伍.ServerSuperIO开源地址:

物联网&集成才干(.NET) QQ群ca88会员登录中心,54256083

 

下1篇:开荒设备驱动。

| 物联网框架ServerSuperIO教程》-
三.设备驱动介绍,物联网框架
壹.C#跨平台物联网通信框架ServerSuperIO(SSIO)介绍 《连载 |
物联网框架…

 

三.二    接口定义

  
ServerSuperIO的“设备”统一接口定义为IRunDevice,那是在框架之中运行、调治、与IO通道合作的唯壹接口。代码定义如下:

public interface IRunDevice: IServerProvider,IVirtualDevice
    {
        #region 函数接口

        /// <summary>
        /// 初始化设备,加载设备驱动的头一件事就是初始化设备
        /// </summary>
        /// <param name="devid"></param>
        void Initialize(string devid);

        /// <summary>
        /// 保存原始的byte数据
        /// </summary>
        /// <param name="data"></param>
        void SaveBytes(byte[] data, string desc);

        /// <summary>
        /// 获得发送数据的命令,如果命令缓存中没有命令,则调用获得实时数据函数
        /// </summary>
        /// <returns></returns>
        byte[] GetSendBytes();

        /// <summary>
        /// 如果当前命令缓存没有命令,则调用该函数,一般返回获得设备的实时数据命令,
        /// </summary>
        /// <returns></returns>
        byte[] GetConstantCommand();

        /// <summary>
        /// 发送IO数据接口
        /// </summary>
        /// <param name="io"></param>
        /// <param name="senddata"></param>
        int Send(IChannel io, byte[] senddata);

        /// <summary>
        /// 读取IO数据接口
        /// </summary>
        /// <param name="io"></param>
        /// <returns></returns>
        byte[] Receive(IChannel io);

        /// <summary>
        /// 接收数据信息,带过滤器
        /// </summary>
        /// <param name="io"></param>
        /// <param name="receiveFilter"></param>
        /// <returns></returns>
        IList<byte[]> Receive(IChannel io, IReceiveFilter receiveFilter);

        /// <summary>
        /// 同步运行设备(IO)
        /// </summary>
        /// <param name="io">io实例对象</param>
        void Run(IChannel io);

        /// <summary>
        /// 同步运行设备(byte[])
        /// </summary>
        /// <param name="key"></param>
        /// <param name="channel"></param>
        /// <param name="revData">接收到的数据</param>
        void Run(string key, IChannel channel, IRequestInfo ri);

        /// <summary>
        /// 如果通讯正常,这个函数负责处理数据
        /// </summary>
        /// <param name="info"></param>
        void Communicate(IRequestInfo info);

        /// <summary>
        /// 通讯中断,未接收到数据
        /// </summary>
        void CommunicateInterrupt(IRequestInfo info);

        /// <summary>
        /// 通讯的数据错误或受到干扰
        /// </summary>
        void CommunicateError(IRequestInfo info);

        /// <summary>
        /// 通讯未知,默认状态(一般不用)
        /// </summary>
        void CommunicateNone();

        /// <summary>
        /// 检测通讯状态
        /// </summary>
        /// <param name="revdata"></param>
        /// <returns></returns>
        CommunicateState CheckCommunicateState(byte[] revdata);

        /// <summary>
        /// 报警接口函数
        /// </summary>
        void Alert();

        /// <summary>
        /// 保存解析后的数据
        /// </summary>
        void Save();

        /// <summary>
        /// 展示
        /// </summary>
        void Show();

        /// <summary>
        /// 当通讯实例为NULL的时候,调用该函数
        /// </summary>
        void UnknownIO();

        /// <summary>
        /// 通讯状态改变
        /// </summary>
        /// <param name="comState">改变后的状态</param>
        void CommunicateStateChanged(CommunicateState comState);

        /// <summary>
        /// 通道状态改变
        /// </summary>
        /// <param name="channelState"></param>
        void ChannelStateChanged(ChannelState channelState);


        /// <summary>
        /// 当软件关闭的时间,响应设备退出操作
        /// </summary>
        void Exit();

        /// <summary>
        /// 删除设备的响应接口函数
        /// </summary>
        void Delete();

        /// <summary>
        /// 可以自定义返数据对象,用于与其他组件交互
        /// </summary>
        /// <returns></returns>
        object GetObject();

        /// <summary>
        /// 设备定时器,响应定时任务
        /// </summary>
        void OnRunTimer();

        /// <summary>
        /// 显示上下文菜单
        /// </summary>
        void ShowContextMenu();

        /// <summary>
        /// 显示IO监视器的窗体
        /// </summary>
        void ShowMonitorDialog();

        /// <summary>
        /// 在IO监视器上显示byte[]数据
        /// </summary>
        /// <param name="data"></param>
        /// <param name="desc"></param>
        void ShowMonitorData(byte[] data, string desc);
        #endregion

        #region 属性接口
        /// <summary>
        /// 默认程序集ID,用于存储临时对象
        /// </summary>
        object Tag { set; get; }

        /// <summary>
        /// 同步对象,用于IO互拆
        /// </summary>
        object SyncLock { get; }

        /// <summary>
        /// 实时数据持久接口
        /// </summary>
        IDeviceDynamic DeviceDynamic { get; }

        /// <summary>
        /// 设备参数持久接口
        /// </summary>
        IDeviceParameter DeviceParameter { get; }

        /// <summary>
        /// 协议驱动
        /// </summary>
        IProtocolDriver Protocol { get; }

        /// <summary>
        /// 是否开启时钟,标识是否调用OnRunTimer接口函数。
        /// </summary>
        bool IsRunTimer { set; get;}

        /// <summary>
        /// 时钟间隔值,标识定时调用DeviceTimer接口函数的周期
        /// </summary>
        int RunTimerInterval { set; get; }

        /// <summary>
        /// 设备的类型
        /// </summary>
        DeviceType DeviceType { get;  }

        /// <summary>
        /// 设备编号
        /// </summary>
        string ModelNumber { get;}

        /// <summary>
        /// 设备运行权限级别,如果运行级别高的话,则优先发送和接收数据。
        /// </summary>
        DevicePriority DevicePriority { get;set;}

        /// <summary>
        /// 设备的通讯类型
        /// </summary>
        CommunicateType CommunicateType { get;set;}

        /// <summary>
        /// 标识是否运行设备,如果为false,调用运行设备接口时直接返回
        /// </summary>
        bool IsRunDevice{ get;set;}

        /// <summary>
        /// 是否释放资源
        /// </summary>
        bool IsDisposed { get; }

        /// <summary>
        /// 显示视图
        /// </summary>
        Control DeviceGraphics { get;}
        #endregion

        #region 事件接口

        /// <summary>
        /// 发送数据事件
        /// </summary>
        event SendDataHandler SendData;

        /// <summary>
        /// 发送数据事件,对SendDataHandler事件的封装
        /// </summary>
        /// <param name="senddata"></param>
        void OnSendData(byte[] senddata);

        /// <summary>
        /// 设备日志输出事件
        /// </summary>
        event DeviceRuningLogHandler DeviceRuningLog;

        /// <summary>
        /// 运行监视器显示日志事件,对DeviceRuningLogHandler事件的封装
        /// </summary>
        void OnDeviceRuningLog(string statetext);

        /// <summary>
        /// 串口参数改变事件
        /// </summary>
        event ComParameterExchangeHandler ComParameterExchange;

        /// <summary>
        /// 串口参数改变事件,对COMParameterExchangeHandler事件的封装
        /// </summary>
        void OnComParameterExchange(int oldcom, int oldbaud, int newcom, int newbaud);

        /// <summary>
        /// 设备数据对象改变事件
        /// </summary>
        event DeviceObjectChangedHandler DeviceObjectChanged;
        /// <summary>
        /// 数据驱动事件,对DeviceObjectChangedHandler事件的封装
        /// </summary>
        void OnDeviceObjectChanged(object obj);

        ///// <summary>
        ///// 删除设备事件
        ///// </summary>
        //event DeleteDeviceCompletedHandler DeleteDeviceCompleted;
        ///// <summary>
        ///// 删除设备事件,对DeleteDeviceHandler事件的封装
        ///// </summary>
        //void OnDeleteDeviceCompleted();
        #endregion
}

《连载 |
物联网框架ServerSuperIO教程》贰.劳务实例的安顿参数表明

3.1    概述

    
定位ServerSuperIO(SSIO)为物联网通信框架,正是因为这么些框架是以“设备”(驱动)为着力构建,“设备”是泛指传感器、下位机、PC机等每一项数据源,数据源有友好的电视发表协议或数额传输格式;ServerSuperIO并不是以IO通道为主干营造的框架,不过ServerSuperIO有很好的通信工夫,完全能够配备在服务端,并且协助两个劳务实例,以及可以在Linux下运作。

③.2    接口定义

  
ServerSuperIO的“设备”统1接口定义为IRunDevice,那是在框架之中运营、调节、与IO通道合作的无与伦比接口。代码定义如下:

public interface IRunDevice: IServerProvider,IVirtualDevice
    {
        #region 函数接口

        /// <summary>
        /// 初始化设备,加载设备驱动的头一件事就是初始化设备
        /// </summary>
        /// <param name="devid"></param>
        void Initialize(string devid);

        /// <summary>
        /// 保存原始的byte数据
        /// </summary>
        /// <param name="data"></param>
        void SaveBytes(byte[] data, string desc);

        /// <summary>
        /// 获得发送数据的命令,如果命令缓存中没有命令,则调用获得实时数据函数
        /// </summary>
        /// <returns></returns>
        byte[] GetSendBytes();

        /// <summary>
        /// 如果当前命令缓存没有命令,则调用该函数,一般返回获得设备的实时数据命令,
        /// </summary>
        /// <returns></returns>
        byte[] GetConstantCommand();

        /// <summary>
        /// 发送IO数据接口
        /// </summary>
        /// <param name="io"></param>
        /// <param name="senddata"></param>
        int Send(IChannel io, byte[] senddata);

        /// <summary>
        /// 读取IO数据接口
        /// </summary>
        /// <param name="io"></param>
        /// <returns></returns>
        byte[] Receive(IChannel io);

        /// <summary>
        /// 接收数据信息,带过滤器
        /// </summary>
        /// <param name="io"></param>
        /// <param name="receiveFilter"></param>
        /// <returns></returns>
        IList<byte[]> Receive(IChannel io, IReceiveFilter receiveFilter);

        /// <summary>
        /// 同步运行设备(IO)
        /// </summary>
        /// <param name="io">io实例对象</param>
        void Run(IChannel io);

        /// <summary>
        /// 同步运行设备(byte[])
        /// </summary>
        /// <param name="key"></param>
        /// <param name="channel"></param>
        /// <param name="revData">接收到的数据</param>
        void Run(string key, IChannel channel, IRequestInfo ri);

        /// <summary>
        /// 如果通讯正常,这个函数负责处理数据
        /// </summary>
        /// <param name="info"></param>
        void Communicate(IRequestInfo info);

        /// <summary>
        /// 通讯中断,未接收到数据
        /// </summary>
        void CommunicateInterrupt(IRequestInfo info);

        /// <summary>
        /// 通讯的数据错误或受到干扰
        /// </summary>
        void CommunicateError(IRequestInfo info);

        /// <summary>
        /// 通讯未知,默认状态(一般不用)
        /// </summary>
        void CommunicateNone();

        /// <summary>
        /// 检测通讯状态
        /// </summary>
        /// <param name="revdata"></param>
        /// <returns></returns>
        CommunicateState CheckCommunicateState(byte[] revdata);

        /// <summary>
        /// 报警接口函数
        /// </summary>
        void Alert();

        /// <summary>
        /// 保存解析后的数据
        /// </summary>
        void Save();

        /// <summary>
        /// 展示
        /// </summary>
        void Show();

        /// <summary>
        /// 当通讯实例为NULL的时候,调用该函数
        /// </summary>
        void UnknownIO();

        /// <summary>
        /// 通讯状态改变
        /// </summary>
        /// <param name="comState">改变后的状态</param>
        void CommunicateStateChanged(CommunicateState comState);

        /// <summary>
        /// 通道状态改变
        /// </summary>
        /// <param name="channelState"></param>
        void ChannelStateChanged(ChannelState channelState);


        /// <summary>
        /// 当软件关闭的时间,响应设备退出操作
        /// </summary>
        void Exit();

        /// <summary>
        /// 删除设备的响应接口函数
        /// </summary>
        void Delete();

        /// <summary>
        /// 可以自定义返数据对象,用于与其他组件交互
        /// </summary>
        /// <returns></returns>
        object GetObject();

        /// <summary>
        /// 设备定时器,响应定时任务
        /// </summary>
        void OnRunTimer();

        /// <summary>
        /// 显示上下文菜单
        /// </summary>
        void ShowContextMenu();

        /// <summary>
        /// 显示IO监视器的窗体
        /// </summary>
        void ShowMonitorDialog();

        /// <summary>
        /// 在IO监视器上显示byte[]数据
        /// </summary>
        /// <param name="data"></param>
        /// <param name="desc"></param>
        void ShowMonitorData(byte[] data, string desc);
        #endregion

        #region 属性接口
        /// <summary>
        /// 默认程序集ID,用于存储临时对象
        /// </summary>
        object Tag { set; get; }

        /// <summary>
        /// 同步对象,用于IO互拆
        /// </summary>
        object SyncLock { get; }

        /// <summary>
        /// 实时数据持久接口
        /// </summary>
        IDeviceDynamic DeviceDynamic { get; }

        /// <summary>
        /// 设备参数持久接口
        /// </summary>
        IDeviceParameter DeviceParameter { get; }

        /// <summary>
        /// 协议驱动
        /// </summary>
        IProtocolDriver Protocol { get; }

        /// <summary>
        /// 是否开启时钟,标识是否调用OnRunTimer接口函数。
        /// </summary>
        bool IsRunTimer { set; get;}

        /// <summary>
        /// 时钟间隔值,标识定时调用DeviceTimer接口函数的周期
        /// </summary>
        int RunTimerInterval { set; get; }

        /// <summary>
        /// 设备的类型
        /// </summary>
        DeviceType DeviceType { get;  }

        /// <summary>
        /// 设备编号
        /// </summary>
        string ModelNumber { get;}

        /// <summary>
        /// 设备运行权限级别,如果运行级别高的话,则优先发送和接收数据。
        /// </summary>
        DevicePriority DevicePriority { get;set;}

        /// <summary>
        /// 设备的通讯类型
        /// </summary>
        CommunicateType CommunicateType { get;set;}

        /// <summary>
        /// 标识是否运行设备,如果为false,调用运行设备接口时直接返回
        /// </summary>
        bool IsRunDevice{ get;set;}

        /// <summary>
        /// 是否释放资源
        /// </summary>
        bool IsDisposed { get; }

        /// <summary>
        /// 显示视图
        /// </summary>
        Control DeviceGraphics { get;}
        #endregion

        #region 事件接口

        /// <summary>
        /// 发送数据事件
        /// </summary>
        event SendDataHandler SendData;

        /// <summary>
        /// 发送数据事件,对SendDataHandler事件的封装
        /// </summary>
        /// <param name="senddata"></param>
        void OnSendData(byte[] senddata);

        /// <summary>
        /// 设备日志输出事件
        /// </summary>
        event DeviceRuningLogHandler DeviceRuningLog;

        /// <summary>
        /// 运行监视器显示日志事件,对DeviceRuningLogHandler事件的封装
        /// </summary>
        void OnDeviceRuningLog(string statetext);

        /// <summary>
        /// 串口参数改变事件
        /// </summary>
        event ComParameterExchangeHandler ComParameterExchange;

        /// <summary>
        /// 串口参数改变事件,对COMParameterExchangeHandler事件的封装
        /// </summary>
        void OnComParameterExchange(int oldcom, int oldbaud, int newcom, int newbaud);

        /// <summary>
        /// 设备数据对象改变事件
        /// </summary>
        event DeviceObjectChangedHandler DeviceObjectChanged;
        /// <summary>
        /// 数据驱动事件,对DeviceObjectChangedHandler事件的封装
        /// </summary>
        void OnDeviceObjectChanged(object obj);

        ///// <summary>
        ///// 删除设备事件
        ///// </summary>
        //event DeleteDeviceCompletedHandler DeleteDeviceCompleted;
        ///// <summary>
        ///// 删除设备事件,对DeleteDeviceHandler事件的封装
        ///// </summary>
        //void OnDeleteDeviceCompleted();
        #endregion
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图