种种数据音信,第三章           系统架构… 三

目       录

开源跨平台IOT通信框架ServerSuperIO,集成到NuGet程序包管理器,以及德姆o使用表达,iotnuget

     
物联网涉及到各个设施、各类传感器、各类数据源、各类协商,并且很难统壹,那么就要有1个结构性的框架化解这个难点。SSIO就是基于权且提高的等级和实际实情的组合产物。

      各个数码音讯,如下图:

**          消除方案,合营SIO使用:**

一、SSIO特点

  • 轻型高品质通讯框架,适用于种种应用场,轮询形式、自笔者控制情势、并发形式和单例情势。
  • 不只是电视发表框架,是设备驱动、IO通道、控制形式场景的调和机制。
  • 支持协议驱动器,能够按正式写标准协议和自定义磋商。
  • 支撑发送数据缓存器,辅助命令缓存重发和按事先级别发送。
  • 扶助协议过滤器,按规则筛选数据,并且可以继承接口,自定义过滤格局。
  • 支撑接收数据缓存器,能够缓存不相符过滤器的多少,和下次接收数据举行拼接。
  • 支撑按设备命令优先级别实行调度设施,保险有高级别命令的驱动及时发送。
  • 支撑一个设施驱动,同时帮助串口和互连网二种简报情势,可以监视IO通道数据。
  • 支撑二个装备驱动,在互连网通信时能够援助TCP Server和TCP
    Client三种工作格局。
  • 支撑多配备共享同1IO通道进行报导。
  • 辅助定时清理超时的网络IO通道。
  • 援救显得视图接口,满意差别展现必要。
  • 扶助服务组件接口,可以自定义实现OPC服务、4-20mA输出、LED大屏展现、短信服务、以及多职能网关服务。
  •  援救成立多服务实例,完毕区别工作的拆分。
  •  支持跨平台布置,能够运营在Linux和Windows系统。

二、SSIO发布到NuGet平台

图片 1

三、搜索SSIO

图片 2

四、安装SSIO

图片 3

五、事例代码(Demo)

    德姆o下载地址:https://github.com/wxzz/ServerSuperIO/tree/2.0

一.客户端(发送文书)

 

        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;
        }

 

 2.设备驱动

//设备驱动
 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();
        }
    }

 3.宿主程序

 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();
            }
}

 六、实验效果

 

      两日的日子,将近3GB的多寡新闻,稳定性、扩大性都不行正确。

图片 4

 

 

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

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

二.使用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)营造系统的完全方案

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

5.ServerSuperIO开源地址:https://github.com/wxzz/ServerSuperIO

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

http://www.bkjia.com/C\_jc/1151255.htmlwww.bkjia.comtruehttp://www.bkjia.com/C\_jc/1151255.htmlTechArticle开源跨平台IOT通讯框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用说明,iotnuget
物联网涉及到 各样装备、各类传感器、种种数据源…

工业物联网和集成系统化解方案的技艺路线… 一

前言… 1

率先章           系统架构… 三

壹.一           硬件构架图… 3

一.二           组件构架图… 四

第二章           技术选型与介绍… 5

二.一           开发环境… 五

2.2           数据源… 5

贰.3           数据采集… 5

二.4           数据上传服务… 陆

二.5           音信中间件… 陆

二.六           数据接受服务… 陆

二.7           数据存款和储蓄… 6

2.8           数据接口… 7

二.九           Web业务系统… 7

2.十        手提式无线电电话机移动终端App. 柒

第三章           Demo的介绍… 8

叁.壹           目录介绍… 八

3.2           Demo调试… 8

 

前言

   
两千年之后,网络在神州的海内外上海高校四的升华,在这几个行业竞争中比的是加快度。我明显的纪念《世界是平的》中有那样一段话:在欧洲,羚羊天天上午醒来时,它知道自个儿必须跑得比最快的狮子还快,不然就会被吃掉;狮子每一天深夜醒来时,它了然自个儿必须追上跑得最慢的羚羊,不然就会被饿死;不管您是狮子还是羚羊,当阳光升起时,你最佳早先奔跑!大家奔跑的那拾多年的小时里,网络技术带来了各行各来的前进,同时也囊括了各行各来。

   
二〇〇五年时,工业行业还在大面积选择电话线进行数量传输和长途扶助。网络技术慢慢的在向各行各业传导,工业行业也在迈入,局域网、光导纤维以太网、WIFI\3G\4G等业已接纳很宽泛了。互连网技术在力促创立业发展的还要,也拉动了很多商店的与时俱进,升级技术、提供更好的服务。

   
大家在考虑,后互连网时期将怎么着升高?将是网络与五行深度融合的历程,例如现在常被提起的物联网,笔者觉得它实质上是工业互连网,是构建技能与网络技术无缝衔接。不管是叫物联网依然工业网络,今后物与物的互相、物与人的互动将不可能制止。硬件与软件的联手发展,更加快的有助于了这几个进度,例如:智能芯片的上扬、嵌入式操作系统的开拓进取、智能传感器的开拓进取等。

   
大数目、分布式、云计算等也在以惊人的进程前进,有些人只怕觉得这个事物离大家生存还相比较长久。不过毫无是那样的,距离200六年只不过十年左右,以往的上扬却是在此以前您不可能想像的,而这种加快度的开拓进取办法,贰年的进步大概是您过去10年的上进之和。不管那么些技巧未来是还是不是可以落地,可是那种倾向是无能为力转移的。

   
数据的流淌能够表现,现金的流动能够扩展GDP。技术的前行正是生产力的晋级,将来团队结构和关联也势必发生变化。不管是还是不是懂技术技能、是不是懂管理,思维方法不转变肯定会被淘汰。

   
上面对物联网和集成系统的缓解方案的技巧途径举行介绍,只对技术选型和种类流程,对于架构的演化以及技术哪个越来越好不做具体表达。只供参考!!!

首先章     系统架构

    
架构图那块首要表明叁个大约的结构化的情趣,能够不太规范,希望大家能够领略。作为三个类别来讲还包含网络布局框架图,依照使用场景和互连网环境差别互连网框架图也不雷同,所以不在本文的座谈范围内。

一.一    硬件构架图

 图片 5

1.二    组件构架图

 图片 6

 

第3章     技术选型与介绍

文章不介绍代码部分,在德姆o事例中有完整的代码和注释,能够下载调节和测试。

二.一    开发条件

支付语言:全部使用C#,配有微量的JS代码。

开发工具:除App部分,全数组件都选用VS2011开发,App程序选择VS20一5开支,VS20一五是一个特级开发工具工厂,在Win10操作系统上支出IoT嵌入式程序,也尚未难题。

操作系统:Windows
8.1,用习惯了也不易,据他们说要适可而止服务了,可是还有人在选取XP呢,不必顾虑。

2.2    数据源

   
数据源也正是发生多少的东西,也有人把这块统称为传感器,可是本身认为那一个叫法不太标准,所以小编一般把那块统称为数据源。

   
数据源包括的始末很多,例如:各个传感器、大中型小型型设备、硬件电路、软件组件等。各个数据源的通信协议分化、通信链路分化、通信机制不相同,在一向不统壹标准的情事下,这一部分的办事比首要。因为有了数码未来,你的事情体系才有应用的股票总值。

   
数据源作者是写了3个模块的小程序,包罗串口通信和网口通信。至于报导协议,请参见《C#简报(串口和互联网)框架的安插与落到实处(SuperIO)-
1二.3回开发及利用
》。

二.3    数据搜集

    
数据搜集部分应用的是SuperIO框架,因为它扶助串口和网口统一的插件式设备驱动开发,也正是说开发2个驱动能够支撑串口和网口通信。其它,可扩大性相比较强,能够大大减小工作量。

    
开发了多少个驱动程序,在SuperIO平台下扩大多个驱动实例,负责与数据源程序开始展览串口和互连网通信。

二.四    数据上传服务

    
数据上传服务是在SuperIO平台下开发的,能够持续IAppService接口开发插件服务,并且挂载到SuperIO平台下运维,设备驱动采集完数据后,能够由此接口传递到劳动插件内,通过内部存款和储蓄器交互数据。假如波及到多少完全性的数据交互,能够透过介质进行数量交互,例如:数据库、文本文件等。

   
数据上传服务一直与新闻中间件(ActiveMQ)进行彼此,再由AcitveMQ实行消息转发。数据上传服务实际是音讯生产者的剧中人物。

2.伍    音信中间件

    
音讯中间件采取ActiveMQ,须要配备Java运维条件。可用的音信中间件比较多,例如:RabbitMQ、ZeroMQ等。

    
根据使用场景分歧,能够挑选的技能方案和技能路线也不雷同。音信中间件那块也截然能够利用通信组件来代替,例如:Netty和SuperSocket。

二.陆    数据接收服务

    
数据接受服务是在SuperIO平台下开发的,能够再而三IAppService接口开发插件服务,并且挂载到SuperIO平台下运作。

    
数据接收服务平素与ActiveMQ进行互动,接收ActiveMQ转载过来的音讯,实际上是音信消费者的剧中人物。

2.7    数据存款和储蓄

   
数据存储采取的是MongoDB,不太喜欢大而重叠的东西,而且不需求O途乐M了,布置不难,能够使用MongoVUE工具对数据库进行保管。假使是大咖,能够平昔cmd。

贰.八    数据接口

    数据接口选取Web
Api,符合RESTful风格的http协议,操作调用不难、方便。吐弃了WebService的Soap协议,更未曾选拔WCF框架。

    那块并未有完结权力、安全保管。

二.9    Web业务种类

   
业务连串使用MVC框架,不过前端并未与后台的控制器实行交互,而是与数码接口的WebAPI进行互动。前后端完全分离。

2.10     手机活动终端App

    
手提式有线电电话机移动端选拔VS20壹伍开发,使用Xamarin框架进行付出,这一个框架协理跨平台。Xamarin是个很不错的东西,唯一的弱项便是索要付费,对于中华夏族民共和国IT职员来讲,那或多或少应有不是障碍。

第三章     Demo的介绍

三.一    目录介绍

类别目录介绍如下:

ClientService:上传数据与互动组件。

Device德姆o:设备驱动,负责搜集数据。

DeviceExport:数据输出组件,在德姆o未有运用。

DeviceShowUI:数据突显视图组件,负责展现采集过来的多寡新闻。

FormTest:测试各部分的主工程。

ProtocolPackage:公用协议包。

ServerService:数据接收数据与互相组件。

SuperIO_App:移动APP端,需要VS2015打开。

SuperOPCClient:OPC客户端组件。

SuperOPCServer:OPC服务端组件。

TestDevice:模拟客户端测试程序。

WebAPI:WebAPI和Web业务端数据突显。

3.2    Demo调试

 下载地址:http://pan.baidu.com/s/1pJ7lZWf

(1)    下载DEMO和工具

    下载SuperIO v2.2.7\SuperIO_Demo
v2.rar;下载mongodb数据库;下载ActiveMQ音讯中间件。

(二)    运维服务和顺序

    
启动mongodb,mongodb-win32-x86_64-2008plus-3.0.3-1\start.bat,私下认可监听端口为:2222。

    
启动ActiveMQ服务,apache-activemq-5.12.0\bin\win64\activemq.bat,须要JAVA运转条件。

    
启动SuperIO_德姆o.sln化解方案,必要VS二零一一开发IDE,也得以转成VS2016工程,重新编写翻译。

    
启动SuperIO_App.sln消除方案,要求VS201五开发IDE,若是选拔VS自带的模拟器,要求实施<adb
connect
模拟器的IP>,才能把程序成功安插到模拟器,并且举办调剂,不然VS工具一贯处于陈设阶段。

(3)运维作效果果图

 图片 7

(四)调节和测试录制

   
youku摄像不是太知道,请下载高清调节和测试录像,地址:http://pan.baidu.com/s/1pJ7lZWf中的【录像演示】。

 

 

作者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:542560八叁

文书档案下载:http://pan.baidu.com/s/1pJ7lZWf

法定网站:http://www.bmpj.net