C#工业物联网和集成系统解决方案的技巧路线(数据源、数据搜集、数据上传与收、ActiveMQ、Mongodb、WebApi、手机App)工业物联网或体系集成中应用信息队列(ActiveMQ,C#的demo)的场面全面剖析。

目       录

1.[连载]《C#通讯(串口和网)框架的统筹及贯彻》

工业物联网与集成系统解决方案的技巧路线… 1

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

前言… 1

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

率先节           系统架构… 3

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

1.1           硬件构架图… 3

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

1.2           组件构架图… 4

 

其次章           技术选型与介绍… 5

目       录

2.1           开发环境… 5

工业物联网或系集成中应用信息队列(ActiveMQ)的场面全面分析… 1

2.2           数据源… 5

前言… 1

2.3           数据采集… 5

首先节           终端/交互场景… 3

2.4           数据上传服务… 6

1.1           终端设备… 3

2.5           消息中间件… 6

1.2           通讯机制… 3

2.6           数据接收服务… 6

其次段           ActvieMQ应用场景… 4

2.7           数据存储… 6

2.1           发布/订阅(Publish/Subscribe)… 4

2.8           数据接口… 7

2.2           生产者/消费者(Producer/Consumer)… 7

2.9           Web业务系统… 7

2.3           请求/应答(Request/Response)… 10

2.10        手机移动终端App. 7

其三段           假定场景分析… 16

第三章           Demo的介绍… 8

3.1           通讯层… 16

3.1           目录介绍… 8

3.2           数据业务层… 16

3.2           Demo调试… 8

3.3           综述… 16

 

 

前言

前言

   
2000年以后,互联网在神州之世上大肆的开拓进取,在是行业竞争着于之是加速度。我清楚的记《世界是同的》中起如此平等段落话:在非洲,羚羊每天早起苏醒时,它知道好必须飞得较最好抢之狮子还赶忙,否则即会见让吃少;狮子每天朝醒来时,它掌握好必须赶上跑得极其缓慢的剑羚,否则就是会给饿死;不管你是狮子还是羚羊,当阳光升起时,你无与伦比好起来跑!我们跑的当下10大多年的时间里,互联网技术带来了各行各来的发展,同时为包括了各行各来。

    
互联网技术一度进步的大熟了,各种开源之代码、框架和缓解方案等。鉴于互联网技术之通用性,势必为其他领域延展。不管是工业4.0,还是互联网+ 
工业,互联网技术向工业领域传导也是必之。

   
2006年常常,工业行业还以大规模采用电话线进行数据传和远程帮助。网络技术日趋的于通往各行各业传导,工业行业也以向上,局域网、光纤以最好网、WIFI\3G\4G等业已使非常常见了。互联网技术于推动制造业发展的而,也牵动了过多柜之与时俱进,升级技能、提供再好的服务。

    
所以,对于工业者的采用场景的技术储备和技巧路线调研为是通常工作十分重点的一致局部,为企业的横向和纵向发展提供技能平台与保持,当然为在领导之视野。

   
我们在思索,后互联网时代将何以发展?将是互联网以及五行深度融合的过程,例如现在隔三差五受提及的物联网,我看它实质上是工业互联网,是做技能及互联网技术无缝衔接。不管是叫物联网或工业互联网,未来事物及物的彼此、物和人之互动将无法避免。硬件与软件的一起发展,更快之有助于了之过程,例如:智能芯片的前进、嵌入式操作系统的前进、智能传感器的进化相当。

先是节     终端/交互场景

   
任何技术都是吧作业服务,而工作是发一定的运场景。离开了贯彻环境去讲技术是从未实际意义的,解决实际问题如果同时能够保证一定丰富日子外之安静是咱拼命贯彻的靶子。同时要打多个角度来设想问题,以及做出平衡。

   
大数目、分布式、云计算相当于为当坐惊人的速前进,有些人唯恐觉得这些事物离开我们活还比久。但是不要是这么的,距离2006年只不过10年左右,现在的前进却是原先您无法想像的,而这种加速度之腾飞法,2年之升华或是若过去10年之迈入之和。不管这些技能现在是不是会生,但是这种趋势是无能为力转移之。

1.1    终端设备

(1)   
终端种类:嵌入式硬件/传感器、PC机(监测站、大型监控装置等)、手机极等。

(2)   
交互方式:单为交互,数据上传,可能服务端会发生返确认信息,证明数据就接到了;双向互动,服务端不仅仅会回到确认信息,同时还要积极下发给指定终端命令信息,例如:控制硬件装置机械动作命令、修改硬件配备参数命令、以及补传相关数据信息命令等等。

(3)   
设备管理:这里因的设施管理是说设备的状态,包括个别只地方:设备IO状态和配备通讯状态。设备IO状态包括:IO打开和IO关闭。设备通讯状态包括:通讯中断、通讯干扰和通讯正常。为了认清故障,这里的逻辑关系是:IO打开的上不必然意味着通讯正常;IO关闭不自然代表通讯中断;通讯中断不肯定意味着IO关闭;通讯干扰不必然代表IO打开。

(4)   
数据完整性:允许数据不够,一般在原数据基础及的增量数据是可以允许丢失的;不允许数据不够,一般脉冲数据是匪容许数据丢失的。

   
数据的流淌可以展现,现金的流可以多GDP。技术的前进就是生产力的晋升,将来社结构和关联啊必发生变化。不管是否知情技术技能、是否知情管理,思维方式不成形得会吃裁。

1.2    通讯机制

(1)主动请求数据:服务器端主动下命令于终端,让谁上传数据、上传什么数据都是因为劳务器端决定。

(2)被动接收数据:服务器端被动接受终端上传的数额,根据数据信息进行数量处理,以及返回确认消息。

   
下面对物联网和集成系统的化解方案的技能途径进行介绍,只针对技术选型和网流程,对于架构的演化以及技术哪个更好不做具体说明。只供应参考!!!

次节     ActvieMQ应用场景

    
信息队列比较多,本文为ActiveMQ为条例进行介绍,全部代码实现C#为主,主要考虑到大的使模式。事例代码下载:http://pan.baidu.com/s/1qXZ1sU4。

先是回     系统架构

    
架构图这块主要表达一个光景的结构化的意思,可以不绝标准,希望大家能知道。作为一个网来讲还连网络部署框架图,根据使用场景以及网环境不一样网络框架图也未一致,所以无在本文的讨论范围外。

2.1    发布/订阅(Publish/Subscribe)

    
一个消息发布者在有一个主题上公布消息,所有订阅该主题的订阅都见面接一模一样的音,这种模式是同一针对性大多的涉及,如下图:

图片 1

发布端代码:

static void Main(string[] args)
        {
            try
            {
                IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
                using (IConnection connection = factory.CreateConnection())
                {
                    using (ISession session = connection.CreateSession())
                    {
                        IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("Topic"));

                        string text = Console.ReadLine();
                        while (text!="exit")
                        {
                            ITextMessage msg = prod.CreateTextMessage();
                            msg.Text = text;
                            prod.Send(msg, Apache.NMS.MsgDeliveryMode.NonPersistent, Apache.NMS.MsgPriority.Normal, TimeSpan.MinValue);
                            Console.WriteLine("Sending: " + text);
                            System.Threading.Thread.Sleep(2000);
                        }
                    }
                }
                Console.ReadLine();
            }
            catch (System.Exception e)
            {
                Console.WriteLine("{0}", e.Message);
                Console.ReadLine();
            }
        }

 订阅端代码:

static void Main(string[] args)
        {
            try
            {
                IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
                using (IConnection connection = factory.CreateConnection())
                {
                    connection.ClientId = "testing listener1";
                    connection.Start();

                    using (ISession session = connection.CreateSession())
                    {
                        IMessageConsumer consumer = session.CreateDurableConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("Topic"), "testing listener1", null, false);
                        consumer.Listener += new MessageListener(consumer_Listener);
                        Console.ReadLine();
                    }
                    connection.Stop();
                    connection.Close();
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
        }

        static void consumer_Listener(IMessage message)
        {
            try
            {
                ITextMessage msg = (ITextMessage)message;
                Console.WriteLine("Receive: " + msg.Text);
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

1.1    硬件构架图

 图片 2

2.2    生产者/消费者(Producer/Consumer)

   
生产者生产了同等片香皂,消费者购置了该块香皂,使用了了,就在是世界上信息了,生产者和买主中的涉嫌是一样栽偶然性,这是相当的关联,如下图:

 图片 3

生产端代码:

 static void Main(string[] args)
        {
            try
            {
                IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
                using (IConnection connection = factory.CreateConnection())
                {
                    using (ISession session = connection.CreateSession())
                    {
                        IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("Queue"));

                        string text = Console.ReadLine();
                        while (text != "exit")
                        {
                            ITextMessage msg = prod.CreateTextMessage();
                            msg.Text = text;
                            prod.Send(msg, Apache.NMS.MsgDeliveryMode.NonPersistent, Apache.NMS.MsgPriority.Normal, TimeSpan.MinValue);
                            Console.WriteLine("Sending: " + text);
                            System.Threading.Thread.Sleep(2000);
                        }
                    }
                }
                Console.ReadLine();
            }
            catch (System.Exception e)
            {
                Console.WriteLine("{0}", e.Message);
                Console.ReadLine();
            }
        }

 消费端代码:

static void Main(string[] args)
        {
            try
            {
                IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
                using (IConnection connection = factory.CreateConnection())
                {
                    //connection.ClientId = "testing listener2";
                    connection.Start(); 
                    using (ISession session = connection.CreateSession())
                    {
                        IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("Queue"));
                        consumer.Listener += new MessageListener(consumer_Listener);
                        Console.ReadLine();
                    }
                    connection.Stop();
                    connection.Close();
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
        }

        static void consumer_Listener(IMessage message)
        {
            try
            {
                ITextMessage msg = (ITextMessage)message;
                Console.WriteLine("Receive: " + msg.Text);
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

 

1.2    组件构架图

 图片 4

 

2.3    请求/应答(Request/Response)

伸手-应答的通信方式利用非常常见,客户端向服务端上传实时数要参数,服务端处理完毕以后,要回确认信息,这种相互关系而下图:

 图片 5

客户端代码:

static void Main(string[] args)
        {
            IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
            try
            {
                using (IConnection connection = factory.CreateConnection())
                {
                    connection.Start();
                    using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
                    {
                        IDestination destination =  new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("client.messages");

                        IMessageProducer producer = session.CreateProducer(destination);
                        producer.DeliveryMode=MsgDeliveryMode.NonPersistent;

                        IDestination tempDest = session.CreateTemporaryQueue();
                        IMessageConsumer responseConsumer = session.CreateConsumer(tempDest);
                        responseConsumer.Listener += new MessageListener(consumer_Listener);

                        string text = Console.ReadLine();
                        while (text != "exit")
                        {
                            ITextMessage msg = session.CreateTextMessage();
                            msg.Text = text;
                            msg.NMSReplyTo = tempDest;
                            msg.NMSCorrelationID = DateTime.Now.ToString("yyyyMMddHHmmss");
                            producer.Send(msg, Apache.NMS.MsgDeliveryMode.NonPersistent, Apache.NMS.MsgPriority.Normal, TimeSpan.MinValue);
                            Console.WriteLine("Sending: " + text);
                            System.Threading.Thread.Sleep(2000);
                        }

                        Console.ReadLine();
                    }
                    connection.Stop();
                    connection.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }

        static void consumer_Listener(IMessage message)
        {
            try
            {
                ITextMessage msg = (ITextMessage)message;
                Console.WriteLine("Receive: " + msg.Text);
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

 服务端代码:

 private static ISession session;

        private static IMessageProducer replyProducer;
        static void Main(string[] args)
        {
            IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
            try
            {
                    IConnection connection = factory.CreateConnection();
                    connection.Start();
                    session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);

                    IDestination adminQueue = new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("client.messages");
                    replyProducer = session.CreateProducer();
                    replyProducer.DeliveryMode=MsgDeliveryMode.NonPersistent;

                    IMessageConsumer consumer = session.CreateConsumer(adminQueue);
                    consumer.Listener += new MessageListener(consumer_Listener);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }

        static void consumer_Listener(IMessage message)
        {
            try
            {
                ITextMessage response = session.CreateTextMessage();
                if (message is ITextMessage) {
                    ITextMessage txtMsg = (ITextMessage)message;
                    string messageText = txtMsg.Text;
                    response.Text = messageText;

                    Console.WriteLine("Receive:" + messageText);
                }

                response.NMSCorrelationID=message.NMSCorrelationID;

                replyProducer.Send(message.NMSReplyTo, response);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);

            }
        }

第二回     技术选型与介绍

章未介绍代码有,在Demo事例中有完的代码和注释,可以下载调试。

其三回     假定场景分析

    
我们坐体系建设过程遭到之构架来分析信息队列在点滴独面的题目,通讯层和数据业务层。

2.1    开发环境

支付语言:全部使用C#,配起少量底JS代码。

开发工具:除App部分,所有组件都运VS2012付出,App程序下VS2015开发,VS2015凡是一个顶尖开发工具工厂,在Win10操作系统及付出IoT嵌入式程序,也不曾问题。

操作系统:Windows
8.1,用习惯了啊不利,听说要停下服务了,不过还有人口当运用XP呢,不必担心。

3.1    通讯层

    
通讯层是否足以据此信息队列(ActiveMQ)?这个题目在两端:1、如果终端设备来嵌入式硬件,甚至要C51开发的,那么在系融为一体与物联的历程遭到,就干到兼容性的题材。显然和信息队列进行衔接是如出一辙项头痛的转业,用C51写一个连接的叫不是匪可能,但是倘若评估工作量和安宁。2、服务端与指定某个终端双向互动频繁的景,特别是劳务端实时发送设备校准命令的状况,这种情景信息队列是不设报道框架的。

2.2    数据源

   
数据源也不怕是产生多少的东西,也有人将这块统称为传感器,但是我当是叫法不极端可靠,所以自己一般将这块统称为数据源。

   
数据源包括的情节很多,例如:各类传感器、大中小型设备、硬件电路、软件组件等。各类数据源的报导协议不同、通讯链路不同、通讯机制不同,在未曾统一标准的状态下,这有些之做事于第一。因为来了数码以后,你的政工体系才产生利用的价。

   
数据源我是描摹了一个模块的稍序,包括串口通讯及网口通讯。至于报道协议,请参见《C#通讯(串口和网络)框架的筹划及实现(SuperIO)-
12.二次开发及利用》。

3.2    数据业务层

    
服务端接收至多少后,完全可采取信息队列的劳动者和顾客模式处理多少,对系的业务展开解耦。

    
下发命令也堪透过信息队列,这样可合控制端的接口,再由通讯框架下至指定的顶峰。

2.3    数据收集

    
数据搜集部分以的凡SuperIO框架,因为它支持串口和网口统一之插件式设备驱动开发,也就是说开发一个使得可以支持串口和网口通讯。另外,可扩展性比较高,可以大大削弱多少工作量。

    
开发了一个驱动程序,在SuperIO平台下多有限单叫实例,负责与数据源程序开展串口和网络通讯。

3.3    综述

    
综合考虑,建议在通讯层使用通讯框架,对于设备的IO状态及简报状态会立即反馈,通讯效率呢是能够获取保持的;对于数据业务层,建议不要放在通讯框架内进行拍卖,可以动用信息队列,配合通讯框架下。

    整体架构图如下:

图片 6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

章获得了群友支持:

图片 7

 

2.4    数据上传服务

    
数据上传服务是以SuperIO平台下开之,可以持续IAppService接口开发插件服务,并且挂载到SuperIO平台下运作,设备驱动采集结束数据后,可以经过接口传递至服务插件内,通过内存交互数据。如果涉嫌到数完全性的多少交互,可以通过介质进行多少交互,例如:数据库、文本文件等。

   
数据上传服务一直与消息中间件(ActiveMQ)进行互,再由AcitveMQ进行信息转发。数据上传服务实际是信息生产者的角色。

2.5    消息中间件

    
消息中间件采用ActiveMQ,需要配备Java运行条件。可用之消息中间件比较多,例如:RabbitMQ、ZeroMQ等。

    
根据使用场景不同,可以选的艺方案和技术途径吧非同等。消息中间件这块也完全可利用通讯组件来顶替,例如:Netty和SuperSocket。

2.6    数据接收服务

    
数据接收服务是以SuperIO平台下开之,可以延续IAppService接口开发插件服务,并且挂载到SuperIO平台下运作。

    
数据接受服务一直跟ActiveMQ进行互动,接收ActiveMQ转发过来的音信,实际上是信消费者之角色。

2.7    数据存储

   
数据存储采用的是MongoDB,不绝喜欢很如重叠的事物,而且免待ORM了,部署简单,可以以MongoVUE工具对数据库进行管理。如果是大拿,可以直接cmd。

2.8    数据接口

    数据接口采用Web
Api,符合RESTful风格的http协议,操作调用简单、方便。抛弃了WebService的Soap协议,更无选WCF框架。

    这块并无落实权力、安全治本。

2.9    Web业务系统

   
业务系统应用MVC框架,但是前端并无同后台的控制器进行互,而是同数码接口的WebAPI进行互动。前后端了分离。

2.10     手机活动终端App

    
手机移动端应用VS2015出,使用Xamarin框架进行付出,这个框架支持逾平台。Xamarin是独好对的物,唯一的毛病就是是用付费,对于中国IT人员来讲,这或多或少应当不是阻碍。

第三章     Demo的介绍

3.1    目录介绍

型目录介绍如下:

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

DeviceDemo:设备驱动,负责募集数据。

DeviceExport:数据输出组件,在Demo没有行使。

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消息中间件。

(2)    启动服务和顺序

    
启动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_Demo.sln解决方案,需要VS2012支出IDE,也堪改成VS2015工,重新编译。

    
启动SuperIO_App.sln解决方案,需要VS2015开销IDE,如果以VS自带的模拟器,需要实行<adb
connect
模拟器的IP>,才会将程序成安排到模拟器,并且进行调剂,否则VS工具一直处在部署阶段。

(3)运行效果图

 图片 8

(4)调试视频

   
youku视频不是极明了,请下载高清调试视频,地址:http://pan.baidu.com/s/1pJ7lZWf面临的【视频演示】。

 

 

笔者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

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

官方网址:http://www.bmpj.net

相关文章

admin

网站地图xml地图