【4858.com】以及扩大宿主程序和配备工具,集成到NuGet程序包管理器

By admin in 4858.com on 2019年4月12日

一、更新内容

一、更新内容

物联网框架ServerSuperIO(SSIO)更新、以及扩大宿主程序和布局工具,详细介绍,serversuperiossio

一、更新内容

1.修改*Server类,以及承继关系。
二.增加IRunDevice的IServerProvider接口继承。
3.修复扩展COM设备驱动只怕导致的可怜。
4.修复网络发送数据恐怕引发的分外。
五.到家协商驱动器。

6.修改协议驱动接口。
7.修改协议命令接口。
八.修复协议命令,抽象基类景况下的那多少个BUG。

九.日增协商接口GetPackageLength,数据交互更加灵活。
拾.修复1些BUG。
11.优化代码。

二、GetPackageLength接口的使用

    
那个接口重要的使用情况是:当协议中有请求发送数据长度的指令,例如先向服务器发送数据包长度命令,获得再次来到分明后,再发送实际数目包音信。在连接发送大块数据的时候,例如文件内容、系列化后的始末等,内容有希望包蕴协议的头和尾,会潜移默化数据包的完整性。首要用来互动三番五次的较大数额块内容。

      一.接口参数

  /// <summary>
        /// 获得应该接收的数据长度,如果当前接收的数据小于这个返回值,那么继续接收数据,直到大于等于这个返回长度。如果接收数据超时,则直接返回当前已经接收的数据。
        /// </summary>
        /// <param name="data">接收的数据</param>
        /// <param name="channel">IO通道,用于返回确认数据</param>
        /// <param name="readTimeout">返回读数据超时间隔时间</param>
        /// <returns></returns>
        public abstract int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout);

      二.接口使用

         (一)设置配置参数

 IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "服务1",
                SocketMode = SocketMode.Tcp,
                ControlMode = ControlMode.Loop,
                CheckSameSocketSession = false,
                StartCheckPackageLength = true, //开启检测数据包长度
                NetReceiveBufferSize = 20,
            });

          (2)接口代码

        public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
            if (data == null || data.Length <= 0)
                return 0;

            readTimeout = 2000;

            if (CheckData(data))
            {
                try
                {
                    int length = BitConverter.ToInt32(new byte[] {data[3], data[4], data[5], data[6]}, 0);

                    byte[] okBytes = System.Text.Encoding.ASCII.GetBytes("ok");
                    int num = channel.Write(okBytes);
                    if (num > 0)
                    {
                        Console.WriteLine("返回数据");
                    }
                    return length;
                }
                catch (Exception)
                {

                    return 0;
                }
            }
            else
            {
                Console.WriteLine("校验错误");
                return 0;
            }
        }

 三、增加宿主程序(ServerSuperIO.Host)

static IServerFactory _serverFactory = null;
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            ConsoleUtil.SetConsoleCtrlHandler(new ConsoleUtil.ControlCtrlDelegate(HandlerRoutine), true);
            bool success = true;
            Console.WriteLine("正在初始化服务程序......");
            IObjectBuilder builder = new TypeCreator();
            _serverFactory = new ServerFactory();
            try
            {
                GlobalConfig gc = GlobalConfigTool.Load();
                foreach (ServerSuperIO.Config.Server serverCfg in gc.Servers)
                {
                    IServer server = _serverFactory.CreateServer(serverCfg.ServerConfig);
                    server.AddDeviceCompleted += server_AddDeviceCompleted;
                    server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
                    server.Start();
                    _serverFactory.AddServer(server);

                    foreach (Config.Device devCfg in serverCfg.Devices)
                    {
                        try
                        {
                            IRunDevice runDev = builder.BuildUp<IRunDevice>(devCfg.AssemblyFile, devCfg.Instance);

                            runDev.DeviceParameter.DeviceID = devCfg.DeviceID;
                            runDev.DeviceDynamic.DeviceID = devCfg.DeviceID;
                            runDev.CommunicateType = devCfg.CommunicateType;
                            runDev.Initialize(devCfg.DeviceID);

                            if (server.AddDevice(runDev) != devCfg.DeviceID)
                            {
                                Console.WriteLine("增加设备:" + devCfg.DeviceID + " 失败!");
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            continue;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                success = false;
                Console.WriteLine(ex.Message);
            }

            if (success)
            {
                Console.WriteLine("初始化服务程序完成");
            }

            while ("exit" == Console.ReadLine())
            {
                _serverFactory.RemoveAllServer();
                break;
            }
        }

        private static bool HandlerRoutine(int ctrlType)
        {
            if (ctrlType == 0 || ctrlType == 2)
            {
                _serverFactory.RemoveAllServer();
            }
            return false;
        }
}

 四、增加配置工具(ServerSuperIO.Tool)

【4858.com】以及扩大宿主程序和配备工具,集成到NuGet程序包管理器。壹.充实服务,如下图:

4858.com 1

 

二.扩大设备,如下图:

4858.com 2

 

三.单击树型菜单,修改配置属性。

4858.com 3

 

1.[连载]《C#报道(串口和网络)框架的宏图与落到实处》

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

二.选取SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)创设系统的总体方案

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

伍.ServerSuperIO开源地址:

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

 

壹、更新内容 一.修改*Server类,以及承继关系。…

      物联网涉及到种种设备、各种传感器、各个数据源、各样协商,并且很难统一,那么就要有贰个结构性的框架化解这么些难题。SSIO就是依照一时半刻进步的等级和求实实情的结缘产物。

1.修改*Server类,以及承继关系。
2.增添IRunDevice的IServerProvider接口继承。
三.修复增添COM设备驱动可能导致的相当。
四.修复互连网发送数据恐怕引发的11分。
5.宏观商业事务驱动器。

1.修改*Server类,以及承继关系。
2.扩展IRunDevice的IServerProvider接口继承。
叁.修复扩展COM设备驱动或许导致的可怜。
肆.修复网络发送数据大概引发的格外。
伍.全面协商驱动器。

      各类数据音信,如下图:

陆.改动协议驱动接口。
7.改动协议命令接口。
八.修复协议命令,抽象基类景况下的可怜BUG。

陆.修改协议驱动接口。
7.修改协议命令接口。
捌.修复协议命令,抽象基类景况下的不胜BUG。

4858.com 4

九.日增协商接口GetPackageLength,数据交互越来越灵活。
10.修复1些BUG。
1壹.优化代码。

玖.日增协商接口GetPackageLength,数据交互越来越灵活。
10.修复1些BUG。
11.优化代码。

 

style=”font-size: 18px;”>2、GetPackageLength接口的施用

style=”font-size: 18px;”>2、GetPackageLength接口的应用

 

    
那么些接口首要的使用情状是:当协议中有请求发送数据长度的授命,例如先向服务器发送数据包长度命令,得到再次来到显明后,再发送实际多少包音讯。在连年发送大块数据的时候,例如文件内容、类别化后的始末等,内容有相当的大希望包罗协议的头和尾,会影响数据包的完整性。首要用来互动三番五次的较大数据块内容。

    
这些接口首要的应用情状是:当协议中有请求发送数据长度的下令,例如先向服务器发送数据包长度命令,得到重返分明后,再发送实际数目包消息。在接连发送大块数据的时候,例如文件内容、种类化后的始末等,内容有希望含有协议的头和尾,会潜移默化数据包的完整性。重要用来互动一而再的较大数目块内容。

         
消除方案,合营SIO使用:

      一.接口参数

      壹.接口参数

4858.com 5

  /// <summary>
        /// 获得应该接收的数据长度,如果当前接收的数据小于这个返回值,那么继续接收数据,直到大于等于这个返回长度。如果接收数据超时,则直接返回当前已经接收的数据。
        /// </summary>
        /// <param name="data">接收的数据</param>
        /// <param name="channel">IO通道,用于返回确认数据</param>
        /// <param name="readTimeout">返回读数据超时间隔时间</param>
        /// <returns></returns>
        public abstract int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout);
  /// <summary>
        /// 获得应该接收的数据长度,如果当前接收的数据小于这个返回值,那么继续接收数据,直到大于等于这个返回长度。如果接收数据超时,则直接返回当前已经接收的数据。
        /// </summary>
        /// <param name="data">接收的数据</param>
        /// <param name="channel">IO通道,用于返回确认数据</param>
        /// <param name="readTimeout">返回读数据超时间隔时间</param>
        /// <returns></returns>
        public abstract int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout);

一、SSIO特点

      贰.接口使用

      2.接口使用

  • 轻型高质量通讯框架,适用于种种应用场,轮询情势、自作者控制情势、并发形式和单例方式。
  • 不仅是通信框架,是装备驱动、IO通道、控制格局场景的调和机制。
  • 扶助协议驱动器,能够按标准写标准协议和自定义合计。
  • 扶助发送数据缓存器,援救命令缓存重发和按优先级别发送。
  • 援助协议过滤器,按规则筛选数据,并且能够承受接口,自定义过滤情势。
  • 帮忙接收数据缓存器,能够缓存不相符过滤器的数据,和下次接收数据实行拼接。
  • 协理按设备命令优先级别进行调度设施,有限支撑有高级别命令的驱动及时发送。
  • 支撑三个配备驱动,同时扶助串口和互联网两种简报情势,能够监视IO通道数据。
  • 援助贰个配备驱动,在互连网通信时得以协理TCP
    Server和TCP Client二种工作方式。
  • 资助多设备共享同一IO通道举行电视发表。
  • 支撑定时清理超时的互连网IO通道。
  • 支撑显得视图接口,满足不相同展现必要。
  • 支撑服务组件接口,可以自定义完结OPC服务、4-20mA输出、LED大屏显示、短信服务、以及多效益网关服务。
  •  扶助创造多服务实例,完结分化工作的拆分。
  •  补助跨平台陈设,能够运作在Linux和Windows系统。

         (壹)设置配置参数

         (一)设置配置参数

二、SSIO发布到NuGet平台

 IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "服务1",
                SocketMode = SocketMode.Tcp,
                ControlMode = ControlMode.Loop,
                CheckSameSocketSession = false,
                StartCheckPackageLength = true, //开启检测数据包长度
                NetReceiveBufferSize = 20,
            });
 IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "服务1",
                SocketMode = SocketMode.Tcp,
                ControlMode = ControlMode.Loop,
                CheckSameSocketSession = false,
                StartCheckPackageLength = true, //开启检测数据包长度
                NetReceiveBufferSize = 20,
            });

4858.com 6

          (2)接口代码

          (二)接口代码

三、搜索SSIO

        public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
            if (data == null || data.Length <= 0)
                return 0;

            readTimeout = 2000;

            if (CheckData(data))
            {
                try
                {
                    int length = BitConverter.ToInt32(new byte[] {data[3], data[4], data[5], data[6]}, 0);

                    byte[] okBytes = System.Text.Encoding.ASCII.GetBytes("ok");
                    int num = channel.Write(okBytes);
                    if (num > 0)
                    {
                        Console.WriteLine("返回数据");
                    }
                    return length;
                }
                catch (Exception)
                {

                    return 0;
                }
            }
            else
            {
                Console.WriteLine("校验错误");
                return 0;
            }
        }
        public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
            if (data == null || data.Length <= 0)
                return 0;

            readTimeout = 2000;

            if (CheckData(data))
            {
                try
                {
                    int length = BitConverter.ToInt32(new byte[] {data[3], data[4], data[5], data[6]}, 0);

                    byte[] okBytes = System.Text.Encoding.ASCII.GetBytes("ok");
                    int num = channel.Write(okBytes);
                    if (num > 0)
                    {
                        Console.WriteLine("返回数据");
                    }
                    return length;
                }
                catch (Exception)
                {

                    return 0;
                }
            }
            else
            {
                Console.WriteLine("校验错误");
                return 0;
            }
        }

4858.com 7

style=”font-size: 18px;”> 3、扩大宿主程序(ServerSuperIO.Host)

style=”font-size: 18px;”> 3、扩充宿主程序(ServerSuperIO.Host)

style=”font-size: 18px;”>四、安装SSIO

static IServerFactory _serverFactory = null;
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            ConsoleUtil.SetConsoleCtrlHandler(new ConsoleUtil.ControlCtrlDelegate(HandlerRoutine), true);
            bool success = true;
            Console.WriteLine("正在初始化服务程序......");
            IObjectBuilder builder = new TypeCreator();
            _serverFactory = new ServerFactory();
            try
            {
                GlobalConfig gc = GlobalConfigTool.Load();
                foreach (ServerSuperIO.Config.Server serverCfg in gc.Servers)
                {
                    IServer server = _serverFactory.CreateServer(serverCfg.ServerConfig);
                    server.AddDeviceCompleted += server_AddDeviceCompleted;
                    server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
                    server.Start();
                    _serverFactory.AddServer(server);

                    foreach (Config.Device devCfg in serverCfg.Devices)
                    {
                        try
                        {
                            IRunDevice runDev = builder.BuildUp<IRunDevice>(devCfg.AssemblyFile, devCfg.Instance);

                            runDev.DeviceParameter.DeviceID = devCfg.DeviceID;
                            runDev.DeviceDynamic.DeviceID = devCfg.DeviceID;
                            runDev.CommunicateType = devCfg.CommunicateType;
                            runDev.Initialize(devCfg.DeviceID);

                            if (server.AddDevice(runDev) != devCfg.DeviceID)
                            {
                                Console.WriteLine("增加设备:" + devCfg.DeviceID + " 失败!");
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            continue;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                success = false;
                Console.WriteLine(ex.Message);
            }

            if (success)
            {
                Console.WriteLine("初始化服务程序完成");
            }

            while ("exit" == Console.ReadLine())
            {
                _serverFactory.RemoveAllServer();
                break;
            }
        }

        private static bool HandlerRoutine(int ctrlType)
        {
            if (ctrlType == 0 || ctrlType == 2)
            {
                _serverFactory.RemoveAllServer();
            }
            return false;
        }
}
static IServerFactory _serverFactory = null;
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            ConsoleUtil.SetConsoleCtrlHandler(new ConsoleUtil.ControlCtrlDelegate(HandlerRoutine), true);
            bool success = true;
            Console.WriteLine("正在初始化服务程序......");
            IObjectBuilder builder = new TypeCreator();
            _serverFactory = new ServerFactory();
            try
            {
                GlobalConfig gc = GlobalConfigTool.Load();
                foreach (ServerSuperIO.Config.Server serverCfg in gc.Servers)
                {
                    IServer server = _serverFactory.CreateServer(serverCfg.ServerConfig);
                    server.AddDeviceCompleted += server_AddDeviceCompleted;
                    server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
                    server.Start();
                    _serverFactory.AddServer(server);

                    foreach (Config.Device devCfg in serverCfg.Devices)
                    {
                        try
                        {
                            IRunDevice runDev = builder.BuildUp<IRunDevice>(devCfg.AssemblyFile, devCfg.Instance);

                            runDev.DeviceParameter.DeviceID = devCfg.DeviceID;
                            runDev.DeviceDynamic.DeviceID = devCfg.DeviceID;
                            runDev.CommunicateType = devCfg.CommunicateType;
                            runDev.Initialize(devCfg.DeviceID);

                            if (server.AddDevice(runDev) != devCfg.DeviceID)
                            {
                                Console.WriteLine("增加设备:" + devCfg.DeviceID + " 失败!");
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            continue;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                success = false;
                Console.WriteLine(ex.Message);
            }

            if (success)
            {
                Console.WriteLine("初始化服务程序完成");
            }

            while ("exit" == Console.ReadLine())
            {
                _serverFactory.RemoveAllServer();
                break;
            }
        }

        private static bool HandlerRoutine(int ctrlType)
        {
            if (ctrlType == 0 || ctrlType == 2)
            {
                _serverFactory.RemoveAllServer();
            }
            return false;
        }
}

4858.com 8

style=”font-size: 18px;”> 四、扩展计划工具(ServerSuperIO.Tool)

style=”font-size: 18px;”> 肆、扩展布署工具(ServerSuperIO.Tool)

5、事例代码(德姆o)

壹.充实服务,如下图:

一.充实服务,如下图:

   
德姆o下载地址:

4858.com 9

4858.com 10

一.客户端(发送文书)

 

 

 

2.充实设备,如下图:

二.扩张设备,如下图:

        static void SendFile()
        {
            if (!System.IO.File.Exists(_file))
            {
                Console.WriteLine("文件不存在:"+_file);
                return;
            }

            FileStream fs = null;
            try
            {
                Console.WriteLine("开始传输>>");

                string fileName=DateTime.Now.ToString("yyMMddHHmmss") + ".txt";
                int bufferSize = _sendBufferSize;
                byte[] sendBuffer = new byte[bufferSize];
                fs = new FileStream(_file, FileMode.Open,FileAccess.Read,FileShare.Read);

                long length = fs.Length;
                int count = 0;
                Stopwatch watch = new Stopwatch();
                watch.Start();
                while (length > 0)
                {
                    int sendNum = fs.Read(sendBuffer, 0, sendBuffer.Length);

                    byte[] package = GetDataPackage(fileName,sendBuffer, sendNum);

                    count+=_tcpClient.Client.Send(package, 0, package.Length, SocketFlags.None);

                    length -= sendNum;

                    float percent = ((fs.Length - length)/(float) fs.Length)*100.0f;
                    Console.WriteLine("已传:" + percent.ToString("0.00")  + "%");
                }
                watch.Stop();

                Console.WriteLine("传输完毕!总数:" + count.ToString()+",耗时:"+ watch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture));
            }
            catch
            {
                throw;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                    fs.Dispose();
                }
            }
        }

        static byte[] GetDataPackage(string fileName,byte[] sendBuffer, int sendNum)
        {
            byte[] sendPackage = new byte[sendNum + 24];
            sendPackage[0] = 0x35;
            sendPackage[1] = 0x35;

            string code = "0001";
            byte[] codeBytes = System.Text.Encoding.ASCII.GetBytes(code);
            Buffer.BlockCopy(codeBytes, 0, sendPackage, 2, 4);

            byte[] fileBytes= System.Text.Encoding.ASCII.GetBytes(fileName);
            Buffer.BlockCopy(fileBytes, 0, sendPackage, 6, 16);

            Buffer.BlockCopy(sendBuffer, 0, sendPackage, 22, sendNum);

            sendPackage[sendPackage.Length - 2] = 0x33;
            sendPackage[sendPackage.Length - 1] = 0x33;

            return sendPackage;
        }

4858.com 11

4858.com 12

 

 

 

 二.装置驱动

3.单击树型菜单,修改配置属性。

3.单击树型菜单,修改配置属性。

//设备驱动
 public class ReceiveFileDriver:RunDevice
    {
        private Dynamic _Dyn;
        private Parameter _Parameter;
        private Protocol _Protocol;
        public ReceiveFileDriver() : base()
        {
            _Dyn = new Dynamic();
            _Parameter = new Parameter();
            _Protocol = new Protocol();
        }

        public override void Initialize(int devid)
        {
            this.Protocol.InitDriver(this, new FixedHeadAndEndReceiveFliter(TransFileDriver.Protocol.Head, TransFileDriver.Protocol.End));    //初始化协议驱动
        }

        //省略......
}

//协议驱动,并处理数据
public class Command : ProtocolCommand
{
        public Command()
        {
        }
        public override string Name
        {
            get { return "writefile"; }
        }
        public override object Analysis(byte[] data, object obj)
        {
            try
            {
               //count += data.Length - 24;
               //Console.WriteLine(count.ToString()+","+data[0].ToString() + "," + data[data.Length - 1].ToString());

                string path = Path.Combine(Environment.CurrentDirectory, "rev");
                if (!System.IO.Directory.Exists(path))
                {
                    System.IO.Directory.CreateDirectory(path);
                }
                string fileName = System.Text.Encoding.ASCII.GetString(data, 6, 16);
                path=Path.Combine(path, fileName);
                using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                {
                    fs.Seek(fs.Length, SeekOrigin.Current);
                    byte[] content = new byte[data.Length - 24];
                    Buffer.BlockCopy(data, 22, content, 0, content.Length);
                    fs.Write(content, 0, content.Length);
                    fs.Flush();
                }

            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public override byte[] Package(string code, object obj)
        {
            throw new NotImplementedException();
        }
    }

4858.com 13

4858.com 14

 三.宿主程序

 

 

 static void Main(string[] args)
{

            ReceiveFileDriver dev = new ReceiveFileDriver();
            dev.DeviceParameter.DeviceName = "设备4";
            dev.DeviceParameter.DeviceAddr = 0;
            dev.DeviceParameter.DeviceCode = "0001";
            dev.DeviceParameter.DeviceID = 0;
            dev.DeviceDynamic.DeviceID = 0;
            dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev.DeviceParameter.NET.RemotePort = 9600;
            dev.CommunicateType = CommunicateType.NET;
            dev.Initialize(0);

            IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "接收文件服务",
                ListenPort = 6699,
                NetReceiveBufferSize = 2048,
                ControlMode = ControlMode.Self,
                SocketMode = SocketMode.Tcp,
                DeliveryMode = DeliveryMode.DeviceCode,
                StartReceiveDataFliter = true,
                ClearSocketSession = false,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.Start();

            server.AddDevice(dev);

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

1.[连载]《C#电视发表(串口和互联网)框架的规划与贯彻》

1.[连载]《C#广播发表(串口和网络)框架的宏图与贯彻》

 6、实验效果

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

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

 

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

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

      二日的时刻,将近3GB的数量音信,稳定性、扩展性都13分不易。

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

3.C#工业物联网和集成系统消除方案的技巧途径(数据源、数据收集、数据上传与吸收、ActiveMQ、Mongodb、WebApi、手提式有线电话机App)

4858.com 15

伍.ServerSuperIO开源地址:

伍.ServerSuperIO开源地址:

 

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

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

 

 

 

1.[连载]《C#通信(串口和网络)框架的筹划与实现》

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

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

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

五.ServerSuperIO开源地址:

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

发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有