其次节           技术选型与介绍… 52.2.

目       录

1.[连载]《C#报导(串口和网络)框架的计划性和实现》

1.[连载]《C#简报(串口和网)框架的规划以及落实》

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

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

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

前言… 1

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

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

第一段           系统架构… 3

3.C#工业物联网与集成系统解决方案的技巧路线(数据源、数据搜集、数据上传与接受、ActiveMQ、Mongodb、WebApi、手机App)

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

1.1           硬件构架图… 3

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

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

1.2           组件构架图… 4

 

 

仲节           技术选型与介绍… 5

目       录

目       录

2.1           开发环境… 5

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

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

2.2           数据源… 5

前言… 1

前言… 1

2.3           数据采集… 5

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

第一回           终端/交互场景… 3

2.4           数据上传服务… 6

1.1           终端设备… 3

1.1           终端设备… 3

2.5           消息中间件… 6

1.2           通讯机制… 3

1.2           通讯机制… 3

2.6           数据接受服务… 6

其次节           ActvieMQ应用场景… 4

老二章节           ActvieMQ应用场景… 4

2.7           数据存储… 6

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

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

2.8           数据接口… 7

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

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

2.9           Web业务系统… 7

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

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

2.10        手机移动终端App. 7

老三章           假定场景分析… 16

老三段           假定场景分析… 16

第三章           Demo的介绍… 8

3.1           通讯层… 16

3.1           通讯层… 16

3.1           目录介绍… 8

3.2           数据业务层… 16

3.2           数据业务层… 16

3.2           Demo调试… 8

3.3           综述… 16

3.3           综述… 16

 

 

 

前言

前言

前言

   
2000年后,互联网在中原的大千世界上轰轰烈烈的上进,在此行当竞争中比的是加速度。我分明的记忆《世界是均等的》中生如此同样截话:在非洲,羚羊每天早起睡醒时,它知道自己必飞得较最好抢之狮子还赶忙,否则就会见给吃少;狮子每天早晨睡醒时,它知道自己要赶上跑得极度缓慢的剑羚,否则便会见吃饿死;不管而是狮子还是羚羊,当太阳升起时,你尽好开端跑!我们跑的即10差不多年的日里,互联网技术带来了各行各来的进步,同时也囊括了各行各来。

    
互联网技术既进步的特别成熟了,各种开源之代码、框架和缓解方案等。鉴于互联网技术的通用性,势必为外世界延展。不管是工业4.0,还是互联网+ 
工业,互联网技术于工业领域传导也是必的。

    
互联网技术既提高的好成熟了,各种开源之代码、框架和化解方案等。鉴于互联网技术的通用性,势必为另外世界延展。不管是工业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)   
数据完整性:允许数据不够,一般以原来数据基础及的增量数据是可以允许丢失的;不同意数据不够,一般脉冲数据是休允许数据丢失的。

1.1    终端设备

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

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

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

(4)   
数据完整性:允许数据不够,一般以原先数据基础及的增量数据是足以允许丢失的;不同意数据不够,一般脉冲数据是休允许数据丢失的。

   
数据的流可以表现,现金的流动可以增加GDP。技术之进化就是生产力的升级换代,将来集团结构与涉及吗定发生转移。不管是否懂得技术技能、是否知道管理,思维方式不弯得会让淘汰。

1.2    通讯机制

(1)主动请求数据:服务器端主动下命令于终端,让谁上污染数据、上传什么数据还由劳动器端决定。

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

1.2    通讯机制

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

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

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

仲章节     ActvieMQ应用场景

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

第二段     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);
            }
        }

2.1    发布/订阅(Publish/Subscribe)

    
一个信息发布者在某个一个主题上披露信息,所有订阅该主题的订阅都见面接收一模一样之消息,这种模式是平对准大多之涉,如下图:

图片 2

发布端代码:

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    硬件构架图

 图片 3

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

   
生产者生产了一样片香皂,消费者购了该块香皂,使用完毕了,就以斯世界上信息了,生产者与顾客之间的干有同样种偶然性,这是一对一的涉及,如下图:

 图片 4

生产端代码:

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

 

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

   
生产者生产了一致片香皂,消费者买了该块香皂,使用完毕了,就当斯世界上信息了,生产者和顾客中的关联在一样栽偶然性,这是相当的干,如下图:

 图片 5

生产端代码:

 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    组件构架图

 图片 6

 

2.3    请求/应答(Request/Response)

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

 图片 7

客户端代码:

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

            }
        }

2.3    请求/应答(Request/Response)

要-应答的通信方式使用非常宽泛,客户端向劳动端上传实时数或者参数,服务端处理了事后,要回去确认消息,这种相互关系要下图:

 图片 8

客户端代码:

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、服务端与指定某个终端双向互动频繁之状,特别是劳务端实时发送设备校准命令的事态,这种气象信息队列是未使报道框架的。

3.1    通讯层

    
通讯层是否可就此信息队列(ActiveMQ)?这个问题在于两上面:1、如果终端设备有嵌入式硬件,甚至要C51开发之,那么在系统融为一体与物联的经过被,就事关到兼容性的题材。显然与信息队列进行衔接是千篇一律宗头痛的从业,用C51写一个属的叫不是不容许,但是倘若评估工作量和安宁。2、服务端与指定某个终端双向互动频繁的情事,特别是劳务端实时发送设备校准命令的景,这种景象信息队列是匪若报道框架的。

2.2    数据源

   
数据源也就是发生多少的物,也有人将这块统称为传感器,但是自以为是叫法不顶准确,所以我一般将这块统称为数据源。

   
数据源包括的始末很多,例如:各类传感器、大中小型设备、硬件电路、软件组件等。各类数据源的报导协议不同、通讯链路不同、通讯机制不同,在没有统一标准的场面下,这部分之做事于要。因为发了数码后,你的事体体系才起利用的值。

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

3.2    数据业务层

    
服务端接收至数码后,完全可采用信息队列的生产者和买主模式处理数据,对网的事体展开解耦。

    
下发命令也得由此信息队列,这样好统一控制端的接口,再由通讯框架下到指定的极端。

3.2    数据业务层

    
服务端接收至数量后,完全可行使信息队列的劳动者和顾客模式处理多少,对网的事体进行解耦。

    
下发命令也可透过信息队列,这样可以统一控制端的接口,再由通讯框架下到指定的极。

2.3    数据收集

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

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

3.3    综述

    
综合考虑,建议于通讯层使用通讯框架,对于设备的IO状态和报道状态能够及时反馈,通讯效率也是会抱保持的;对于数据业务层,建议不要在通讯框架内开展处理,可以使信息队列,配合通讯框架下。

    整体架构图如下:

图片 9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

章获得了群友支持:

图片 10

 

3.3    综述

    
综合考虑,建议在通讯层使用通讯框架,对于设备的IO状态及简报状态会立即反馈,通讯效率为是会拿走保障的;对于数据业务层,建议不用在通讯框架中开展拍卖,可以利用信息队列,配合通讯框架下。

    整体架构图如下:

图片 11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文章获得了群友支持:

图片 12

 

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)运行效果图

 图片 13

(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

相关文章