bob体育app《物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 I

2019-12-07 23:21栏目:编程
TAG:

4.2.3    发送和选拔数据事例... 3

4.3.4    塑造筑组织商驱动对象

    有了合同命令之后,大家须求营造筑组织商驱动对象,SSIO框架援助自定义商讨也在于此,並且与设备驱动的接口相关联,在SSIO框架的高端应用中也开展了引用,营造那引对象相当的重点。代码如下:

internal class DeviceProtocol:ProtocolDriver
{
        public override bool CheckData(byte[] data)
        {
            if (data[0] == 0x55 && data[1] == 0xaa && data[data.Length - 1] == 0x0d)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public override byte[] GetCommand(byte[] data)
        {
            return new byte[] { data[3] };
        }

        public override int GetAddress(byte[] data)
        {
            return data[2];
        }

        public override byte[] GetHead(byte[] data)
        {
            return new byte[] { data[0], data[1] };
        }

        public override byte[] GetEnd(byte[] data)
        {
            return new byte[] { data[data.Length - 1] };
        }

        public override byte[] GetCheckData(byte[] data)
        {
            byte checkSum = 0;
            for (int i = 2; i < data.Length - 2; i++)
            {
                checkSum += data[i];
            }
            return new byte[] { checkSum };
        }

        public override string GetCode(byte[] data)
        {
            throw new NotImplementedException();
        }

        public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
           throw new NotImplementedException();
        }
}

     DeviceProtocol 协议驱动世袭自ProtocolDriver ,三个装置驱动只设有一个合计驱动,二个合计驱动能够存在八个协议命令(如61限令)。该类中的CheckData函数很关键,SSIO框架中的设备驱动基类引用了,首倘诺完毕人事教育育高校验选拔数据的完事性,是不是切合合同,进而决定了报纸发表状态:通讯常常、通讯中断、通信压抑、以致通信未知,分裂的电视发表状态也调整了调用设备驱动中的哪个函数接口:Communicate、CommunicateInterrupt、CommunicateError和CommunicateNone。

4.3.1    创设实时数据持久对象(不是必需)... 3

4.4    创设宿主程序

     三个轻便易行的设施驱动就已经付出好了,光有驱动还丰盛,那么大家依据SSIO框架再写几行代码,实现叁个宿主程序,把设备驱动实例化,放SSIO的服务实例中运作,完结串口和网络三种方法的报导交互作用,代码也特别容易。代码如下:

class Program
{
        static void Main(string[] args)
        {
            DeviceDriver dev1 = new DeviceDriver();
            dev1.DeviceParameter.DeviceName = "串口设备1";
            dev1.DeviceParameter.DeviceAddr = 0;
            dev1.DeviceParameter.DeviceID = "0";
            dev1.DeviceDynamic.DeviceID = "0";
            dev1.DeviceParameter.COM.Port = 1;
            dev1.DeviceParameter.COM.Baud = 9600;
            dev1.CommunicateType = CommunicateType.COM;
            dev1.Initialize("0");

            DeviceDriver dev4 = new DeviceDriver();
            dev4.DeviceParameter.DeviceName = "网络设备2";
            dev4.DeviceParameter.DeviceAddr = 0;
            dev4.DeviceParameter.DeviceID = "3";
            dev4.DeviceDynamic.DeviceID = "3";
            dev4.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev4.DeviceParameter.NET.RemotePort = 9600;
            dev4.CommunicateType = CommunicateType.NET;
            dev4.Initialize("3");

            IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "服务实例1",
                SocketMode = SocketMode.Tcp,
                ControlMode = ControlMode.Loop,
                CheckSameSocketSession = false,
                StartCheckPackageLength = false,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.SocketConnected+=server_SocketConnected;
            server.SocketClosed+=server_SocketClosed;
            server.Start();

            server.AddDevice(dev1);
            server.AddDevice(dev4);

            while ("exit"==Console.ReadLine())
            {
                 server.Stop();
            }
        }

        private static void server_SocketClosed(string ip, int port)
        {
            Console.WriteLine(String.Format("断开:{0}-{1} 成功", ip, port));
        }

        private static void server_SocketConnected(string ip, int port)
        {
            Console.WriteLine(String.Format("连接:{0}-{1} 成功",ip, port));
        }

        private static void server_AddDeviceCompleted(string devid, string devName, bool isSuccess)

        {
            Console.WriteLine(devName+",增加:"+isSuccess.ToString());
        }

        private static void server_DeleteDeviceCompleted(string devid, string devName, bool isSuccess)
        {
            Console.WriteLine(devName + ",删除:" + isSuccess.ToString());
        }
    }
}

     那几个代码大家都能看精晓,具体的操纵格局大家接下去会挨个介绍。在创设宿主程序的时候,切忌对劳务实例那样引用:server.ChannelManager、server.ControllerManager、server.DeviceManager。就算提供了如此的接口,首借使为着SSIO框架之中选拔的,不需求大家单独去操作这几个接口。有的网络朋友是这么的写的,那么就产生了贰个纯的通讯IO框架,那么就失去了SSIO框架自己的股票总值。作为三回开采者,只须求安装设备驱动的参数,以致向服务实例中加进或删除设备就能够了,其余具有的运作总体付出SSIO框架来成功。

 

4.3.3    创设发送和深入分析公约命令对象

    与器材进行交互作用会涉及到不菲交互作用式的下令或指令代码,而那些命令在SSIO框架内是以商业事务命令对象的款型存在,大体蕴含八个部:实行命令接口、打包发送数据接口、深入分析接受数据接口等。

    针对地方的报纸发表左券,有一个61发令,那么大家就足以依附61限令为命名营造三个商酌命令对象,包含发送数据和分析数据部分。即使有任何命令代码,推而广之。代码如下:

internal class DeviceCommand:ProtocolCommand
{
        public override string Name
        {
            get { return "61"; }
        }

        public override void ExcuteCommand<T>(T t)
        {
            throw new NotImplementedException();
        }

        public override byte[] Package<T> (string code, T1 t1,T2 t2)
        {
            //发送:0x55 0xaa 0x00 0x61 0x61 0x0d
            byte[] data = new byte[6];
            data[0] = 0x55;
            data[1] = 0xaa;
            data[2] = byte.Parse(code);
            data[3] = 0x61;
            data[4] = this.ProtocolDriver.GetCheckData(data)[0];
            data[5] = 0x0d;
            return data;
        }

        public override dynamic Analysis<T>(byte[] data, T t)
        {
            Dyn dyn = new Dyn()
            //一般下位机是单片的话,接收到数据的高低位需要互换,才能正常解析。
            byte[] flow = BinaryUtil.SubBytes(data, 4, 4, true);
            dyn.Flow = BitConverter.ToSingle(flow, 0);
            byte[] signal = BinaryUtil.SubBytes(data, 8, 4, true);
            dyn.Signal = BitConverter.ToSingle(signal, 0);
            return dyn;
        }

}

     创设筑组织议命令必要全部持续自ProtocolCommand,依照电视发表合同规定,Name属性重回61,作为十分重要字;Package是包裹要送的数码消息;Analysis对应着接受数据之后张开分析操作。宛如此三个简短的协商命令驱动就创设变成了。

4.1           概述... 2

4.如开采风姿洒脱套装置驱动,同临时间扶持串口和网络通信

《连载 | 物联网框架ServerSuperIO教程》- 3.装置驱动介绍

4.3.1    营造实时数据长久对象(不是必得)

1.透过再次回到数据的简报左券,有流量和数字信号七个动态变量,大家要求制造多个动态指标实体类,首要用于合同驱动与道具驱动之间的数码人机联作。代码如下:

public class Dyn
{
        private float _Flow = 0.0f;
        /// <summary>
        /// 流量
        /// </summary>
        public float Flow
        {
            get { return _Flow; }
            set { _Flow = value; }
        }
        private float _Signal = 0.0f;
        /// <summary>
        /// 信号
        /// </summary>
        public float Signal
        {
            get { return _Signal; }
            set { _Signal = value; }
        }
}

  2.大家主要的做事是要创设二个实时数据悠久对象类,实时缓存数据新闻,也足以把该实时数据音信保存到数据库中或别的存款和储蓄媒质。实时多少长久对象类的代码如下:

public class DeviceDyn:DeviceDynamic
{
        public DeviceDyn() : base()
        {
            Dyn=new Dyn();
        }
        public override string GetAlertState()
        {
            throw new NotImplementedException("无报警信息");
        }
        public override object Repair()
        {
            return new DeviceDyn();
        }
        public Dyn Dyn { get; set; }
}

     DeviceDyn 类世袭自DeviceDynamic,因为各种硬件装备的告急新闻有很大大概不均等,所以GetAlertState函数可以实该效能,不过SSIO框架并从未直接引用;那一个类精气神儿上是八个足以类别化,在不加互斥的意况下恐怕变成文件损坏,所以Repair能够达成修复效果与利益,在DeviceDynamic基类里福衢寿车了该意义;别的,达成DeviceDynamic基类自带八个函数,Save函数用于持久化(系列化)此类的音讯,Load用于获取(反类别化)此类的新闻,在器械驱动中能够应用。

4.2.1    发送读实时数据命令左券... 2

4.2.2    解析实时数据合同

    下位机选拔到读实时数据命令后,并校验成功,再次来到实时数据,校验和为从“从机地址”起首的拉长和,不包罗“数据报头”、“校验和”和“契约停止”。

    选择数据帧如下:

帧结构

数码报头

从机地址

指令代码

流量

信号

校验和

和煦停止

0x55

0xAA

 

0x61

浮点型

浮点型

 

0x0D

字节数

1

1

1

1

4

 

4

1

1

4.2.1    发送读实时数据命令合同

     计算机发送0x61下令为读实时数据命令,共发送6个字节,校验和为从“从机地址”开端的拉长和,不包涵“数据报头”、“校验和”和“左券甘休”。

     发送指令数据帧如下:

帧结构

数码报头

从机地址

命令代码

校验和

共谋甘休

0x55

0xAA

 

0x61

 

0x0D

字节数

1

1

1

1

1

1

  

《物联网框架ServerSuperIO教程》-4.如开采生龙活虎套装置驱动,同一时间支持串口和互联网通信。附:以往协理Windows 10 IOT,win10iot

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

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

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

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

 

注:ServerSuperIO有望被移植到Windows 10 IOT上,那么未来有希望付出生龙活虎套设备驱动,能够分段在服务端、嵌入式设备中,将造成完整的解决方案。

      以往风度翩翩度调试通过一些代码,还得需求生龙活虎段时间,经常都以夜里干,时间也会有限。如下图:

bob体育app 1

 

目       录

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.3.4    构建协商驱动对象

    有了合同命令之后,我们必要创设筑协会谈商讨驱动对象,SSIO框架扶持自定义磋商也在于此,何况与设施驱动的接口相关联,在SSIO框架的尖端应用中也拓宽了援用,创设那引对象很关键。代码如下:

internal class DeviceProtocol:ProtocolDriver
{
        public override bool CheckData(byte[] data)
        {
            if (data[0] == 0x55 && data[1] == 0xaa && data[data.Length - 1] == 0x0d)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public override byte[] GetCommand(byte[] data)
        {
            return new byte[] { data[3] };
        }

        public override int GetAddress(byte[] data)
        {
            return data[2];
        }

        public override byte[] GetHead(byte[] data)
        {
            return new byte[] { data[0], data[1] };
        }

        public override byte[] GetEnd(byte[] data)
        {
            return new byte[] { data[data.Length - 1] };
        }

        public override byte[] GetCheckData(byte[] data)
        {
            byte checkSum = 0;
            for (int i = 2; i < data.Length - 2; i++)
            {
                checkSum += data[i];
            }
            return new byte[] { checkSum };
        }

        public override string GetCode(byte[] data)
        {
            throw new NotImplementedException();
        }

        public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
           throw new NotImplementedException();
        }
}

     DeviceProtocol 公约驱动世袭自ProtocolDriver ,贰个配备驱动只存在一个共谋驱动,三个共谋驱动能够存在七个协议命令(如61下令)。该类中的CheckData函数很主要,SSIO框架中的设备驱动基类援引了,主倘诺瓜熟蒂落校验选拔数据的完事性,是不是适合合同,进而决定了报纸发表状态:通信不荒谬、通信中断、通信苦闷、甚至通讯未知,不相同的简报状态也决定了调用设备驱动中的哪个函数接口:Communicate、CommunicateInterrupt、CommunicateError和CommunicateNone。

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

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

4.1    概述

     作为物联网通信框架,断定要帮助种种报纸发表链路,在多样报纸发表链路的根基上造成四种通信左券的交互作用,比如:Modbus、自定义共同商议等等。不过,有叁个标题:针对同意气风发台硬件配备或传感器,完毕串口和网络二种简报情势的数码采撷和决定,是还是不是要分头写代码?倘诺从现实角度解析,同大器晚成硬件,它要完结的作业逻辑确定是平等的,所以ServerSuperIO物联网框架,允许开辟黄金时代套设备驱动,同期扶持串口和网络三种简报情势的竞相。

     通信一点也不细略、交互作用很简单、业务相当的轻易……假使把数不清轻易的标题合在一同,那么就变得不轻易了,所以要有四个框架性的事物,重新把好多主题素材变得轻巧。

4.3.2    构建参数数据长久对象... 5

4.3    开拓设备驱动

4.3           开拓设备驱动... 3

4.2    通信合同规定

    在成就叁个器材驱动的花销此前,首先要知道它的广播发表协议,好比三人沟通的语言相像。针对电视发表公约,大家自定义贰个简约交互作用格局,只是发送命令,提取数额新闻。

4.4           营造宿主程序... 12

4.3.2    创设参数数据长久对象

    平常的话硬件设施会有读参数的授命,那么重返来的参数也亟需开展长久化存款和储蓄,並且每台器材的参数都可能差异等,在那提供贰个可增添的接口。在此个通信契约中并不曾提到到设备参数相关的商业事务表明,不过我们也必要创设一个参数数据长久对象类,可以不写任何扩大的参数属性,在SSIO框架对参数的接口进行了引用,那是必需举办了办事。代码如下:

public class DevicePara:ServerSuperIO.Device.DeviceParameter
{
        public override object Repair()
        {
            return new DevicePara();
        }
}

     DevicePara世襲自DeviceParameter类,情状与实时数据持久对象肖似,能够参数。

4.3    开拓设备驱动

4.5    运维效果

 bob体育app 2

 

1.[连载]《C#简报(串口和互联网)框架的安顿与完毕》

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

2.行使SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)创设系统的完整方案

3.C#工业物联网和集成系统应用方案的技艺路子(数据源、数据搜罗、数据上传与选取、ActiveMQ、Mongodb、WebApi、手提式有线话机App)

5.ServerSuperIO开源地址:

物联网&集成本领(.NET卡塔尔国 QQ群54256083

10 IOT,win10iot 1.C#跨平台物联网通信框...

4.3.3    创设发送和深入分析左券命令对象... 5

4.3.5    营造设备驱动对象

     上边的底工子作都做完以往,以后就创设设备驱动的中坚部分,相当于SSIO框架与设施驱动对接、和睦、调节的唯风姿罗曼蒂克接口,写完这一个接口,设备驱动就足以在SSIO上直接运转了,并且与硬件设施开展相互。直接上代码:

public class DeviceDriver:RunDevice
{
        private DeviceDyn _deviceDyn;
        private DevicePara _devicePara;
        private DeviceProtocol _protocol;
        public DeviceDriver() : base()
        {
            _devicePara = new DevicePara();
            _deviceDyn = new DeviceDyn();
            _protocol = new DeviceProtocol();
        }

        public override void Initialize(string devid)
        {
            this.Protocol.InitDriver(this.GetType(),null);
            //初始化设备参数信息
            _devicePara.DeviceID = devid;//设备的ID必须先赋值,因为要查找对应的参数文件。
            if (System.IO.File.Exists(_devicePara.SavePath))
            {
                //如果参数文件存在,则获得参数实例
                _devicePara = _devicePara.Load<DevicePara>();
            }
            else
            {
                //如果参数文件不存在,则序列化一个文件
                _devicePara.Save<DevicePara>(_devicePara);
            }

            //初始化设备实时数据信息
            _deviceDyn.DeviceID = devid;//设备的ID必须先赋值,因为要查找对应的实时数据文件。
            if (System.IO.File.Exists(_deviceDyn.SavePath))
            {
                //参数文件存在,则获得参数实例
                _deviceDyn = _deviceDyn.Load<DeviceDyn>();
            }
            else
            {
                //如果参数文件不存在,则序列化一个文件
                _deviceDyn.Save<DeviceDyn>(_deviceDyn);
            }
        }

        public override byte[] GetConstantCommand()
        {
            return this.Protocol.DriverPackage<String>("0", "61", null);
        }

        public override void Communicate(ServerSuperIO.Communicate.IRequestInfo info)
        {
            Dyn dyn = this.Protocol.DriverAnalysis<String>("61", info.Data, null);
            if (dyn != null)
            {
                _deviceDyn.Dyn = dyn;
            }
            OnDeviceRuningLog("通讯正常");
        }

        public override void CommunicateInterrupt(ServerSuperIO.Communicate.IRequestInfo info)
        {
            OnDeviceRuningLog("通讯中断");
        }

        public override void CommunicateError(ServerSuperIO.Communicate.IRequestInfo info)
        {
            OnDeviceRuningLog("通讯干扰");
        }

        public override void CommunicateNone()
        {
            OnDeviceRuningLog("通讯未知");
        }

        public override void Alert()
        {
            return;
        }

        public override void Save()
        {
            try
            {
                _deviceDyn.Save<DeviceDyn>(_deviceDyn);
            }
            catch (Exception ex)
            {
                OnDeviceRuningLog(ex.Message);
            }
        }

        public override void Show()
        {
            List<string> list=new List<string>();
            list.Add(_devicePara.DeviceName);
            list.Add(_deviceDyn.Dyn.Flow.ToString());
            list.Add(_deviceDyn.Dyn.Signal.ToString());
            OnDeviceObjectChanged(list.ToArray());
        }

        public override void UnknownIO()
        {
            OnDeviceRuningLog("未知通讯接口");
        }

        public override void CommunicateStateChanged(ServerSuperIO.Communicate.CommunicateState comState)
        {
            OnDeviceRuningLog("通讯状态改变");
        }

        public override void ChannelStateChanged(ServerSuperIO.Communicate.ChannelState channelState)
        {
            OnDeviceRuningLog("通道状态改变");
        }

        public override void Exit()
        {
            OnDeviceRuningLog("退出设备");
        }

        public override void Delete()
        {
            OnDeviceRuningLog("删除设备");
        }

        public override object GetObject()
        {
            throw new NotImplementedException();
        }

        public override void ShowContextMenu()
        {
            throw new NotImplementedException();
        }

        public override IDeviceDynamic DeviceDynamic
        {
            get { return _deviceDyn; }
        }

        public override IDeviceParameter DeviceParameter
        {
            get { return _devicePara; }
        }

        public override IProtocolDriver Protocol
       {
            get { return _protocol;}
        }

        public override DeviceType DeviceType
        {
            get { return DeviceType.Common; }
        }

        public override string ModelNumber
        {
            get { return "serversuperio"; }
        }

        public override System.Windows.Forms.Control DeviceGraphics
        {
            get { throw new NotImplementedException(); }
        }
}

    实时动态数据对象_deviceDyn、参数数据对象_devicePara、公约驱动对象_protocol分别提要求接口:DeviceDynamic、DeviceParameter和Protocol,为SSIO提供可引用的底工属性参数。

     Initialize是设备驱动开头化的函数接口,在此个接口实现八个重大专门的学业:初叶化协议驱动和参数性的音信。通过this.Protocol.InitDriver(this.GetType(卡塔尔,null卡塔尔(英语:State of Qatar);代码可以加载全体合同命令到协商驱动的缓存中,以便实时调用。当然这里边也足以张开任何方面包车型地铁行事,不过注意对那么些的管理。

     DeviceType那一个是装备的类型,平时钦定为Common就好了。别的函数接口作用已经在《物联网框架ServerSuperIO教程-3.设备驱动介绍》中详尽介绍了,请参见。

4.3.1    营造实时数据长久对象(不是必需)

1.由此重回数据的广播发表合同,有流量和频限信号多少个动态变量,大家需求成立叁个动态目的实体类,首要用来合同驱动与设施驱动之间的数额人机联作。代码如下:

public class Dyn
{
        private float _Flow = 0.0f;
        /// <summary>
        /// 流量
        /// </summary>
        public float Flow
        {
            get { return _Flow; }
            set { _Flow = value; }
        }
        private float _Signal = 0.0f;
        /// <summary>
        /// 信号
        /// </summary>
        public float Signal
        {
            get { return _Signal; }
            set { _Signal = value; }
        }
}

  2.大家第朝气蓬勃的劳作是要创建三个实时数据悠久对象类,实时缓存数据新闻,也可以把该实时数据音信保存到数据库中或其余存款和储蓄媒介物。实时数量长久对象类的代码如下:

public class DeviceDyn:DeviceDynamic
{
        public DeviceDyn() : base()
        {
            Dyn=new Dyn();
        }
        public override string GetAlertState()
        {
            throw new NotImplementedException("无报警信息");
        }
        public override object Repair()
        {
            return new DeviceDyn();
        }
        public Dyn Dyn { get; set; }
}

     DeviceDyn 类继承自DeviceDynamic,因为每一个硬件配备的报告急察方新闻有非常的大概率不平等,所以GetAlertState函数能够实该功用,可是SSIO框架并不曾一向引用;那些类精气神儿上是三个能够类别化,在不加互斥的气象下恐怕以致文件损坏,所以Repair可以变成修复效应,在DeviceDynamic基类里金玉锦绣了该意义;此外,实现DeviceDynamic基类自带五个函数,Save函数用于长久化(类别化)此类的新闻,Load用于获取(反系列化)此类的新闻,在配备驱动中得以选择。

4.2.1    发送读实时数据命令合同

     Computer发送0x61命令为读实时数据命令,共发送6个字节,校验和为从“从机地址”开首的增加和,不包罗“数据报头”、“校验和”和“合同结束”。

     发送指令数据帧如下:

帧结构

数码报头

从机地址

命令代码

校验和

左券截止

0x55

0xAA

 

0x61

 

0x0D

字节数

1

1

1

1

1

1

  

4.5    运转作效果果

 bob体育app 3

 

1.[连载]《C#简报(串口和网络)框架的规划与贯彻》

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

2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)创设系统的欧洲经济共同体方案

3.C#工业物联网和集成系统技术方案的本领门路(数据源、数据搜罗、数据上传与吸取、ActiveMQ、Mongodb、WebApi、手提式有线电话机App)

5.ServerSuperIO开源地址:

物联网&集成技能(.NET卡塔尔国 QQ群54256083

4.2.2    剖判实时数据公约

    下位机选用到读实时数据命令后,并校验成功,再次来到实时数据,校验和为从“从机地址”开首的丰硕和,不包括“数据报头”、“校验和”和“公约甘休”。

    接受数据帧如下:

帧结构

数码报头

从机地址

一声令下代码

流量

信号

校验和

合同甘休

0x55

0xAA

 

0x61

浮点型

浮点型

 

0x0D

字节数

1

1

1

1

4

 

4

1

1

4.3.2    营造参数数据漫长对象

    日常的话硬件器材会有读参数的指令,那么重返来的参数也急需张开长久化存款和储蓄,而且每台道具的参数都恐怕不平等,在这提供一个可扩展的接口。在此个通信合同中并从未关系到设备参数相关的协商表明,不过大家也亟需成立二个参数数据悠久对象类,能够不写任何扩张的参数属性,在SSIO框架对参数的接口举行了援用,这是必得开展了劳作。代码如下:

public class DevicePara:ServerSuperIO.Device.DeviceParameter
{
        public override object Repair()
        {
            return new DevicePara();
        }
}

     DevicePara世襲自DeviceParameter类,情状与实时数据长久对象相符,能够参数。

 

4.如开采豆蔻梢头套设备驱动,同有时候帮忙串口和网络通信

版权声明:本文由bob体育app发布于编程,转载请注明出处:bob体育app《物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 I