工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析

简介: 1.[连载]《C#通讯(串口和网络)框架的设计与实现》 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案 3.

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

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

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

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

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

 

目       录

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

前言... 1

第一章           终端/交互场景... 3

1.1           终端设备... 3

1.2           通讯机制... 3

第二章           ActvieMQ应用场景... 4

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

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

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

第三章           假定场景分析... 16

3.1           通讯层... 16

3.2           数据业务层... 16

3.3           综述... 16

 

前言

     互联网技术已经发展的很成熟了,各种开源的代码、框架和解决方案等。鉴于互联网技术的通用性,势必向其他领域延展。不管是工业4.0,还是互联网+  工业,互联网技术向工业领域传导也是必然的。

     所以,对于工业方面的应用场景的技术储备和技术线路调研也是日常工作很重要的一部分,为公司的横向和纵向发展提供技术平台和保障,当然也取决于领导的视野。

第一章     终端/交互场景

    任何技术都是为业务服务,而业务是有特定的应用场景。离开了实现环境去谈技术是没有实际意义的,解决实际问题而又能保证相当长时间内的稳定性是我们努力实现的目标。同时要从多个角度来考虑问题,以及做出平衡。

1.1    终端设备

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

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

(3)    设备管理:这里指的设备管理是说设备的状态,包括两个方面:设备IO状态和设备通讯状态。设备IO状态包括:IO打开和IO关闭。设备通讯状态包括:通讯中断、通讯干扰和通讯正常。为了判断故障,这里的逻辑关系是:IO打开的时候不一定代表通讯正常;IO关闭不一定代表通讯中断;通讯中断不一定代表IO关闭;通讯干扰不一定代表IO打开。

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

1.2    通讯机制

(1)主动请求数据:服务器端主动下发命令给终端,让谁上传数据、上传什么数据都由服务器端决定。

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

第二章     ActvieMQ应用场景

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

2.1    发布/订阅(Publish/Subscribe)

     一个信息发布者在某一个主题上发布消息,所有订阅该主题的订阅都会收到相同的消息,这种模式是一对多的关系,如下图:

发布端代码:

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.2    生产者/消费者(Producer/Consumer)

    生产者生产了一块香皂,消费者购买了该块香皂,使用完了,就在这个世界上消息了,生产者和消费者之间的关系存在一种偶然性,这是一对一的关系,如下图:

 

生产端代码:

 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.3    请求/应答(Request/Response)

请求-应答的通信方式应用很普遍,客户端向服务端上传实时数据或参数,服务端处理完之后,要返回确认信息,这种交互关系如下图:

 

客户端代码:

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

            }
        }

第三章     假定场景分析

     我们以系统建设过程中的构架来分析消息队列在两个层面的问题,通讯层和数据业务层。

3.1    通讯层

     通讯层是否可以用消息队列(ActiveMQ)?这个问题取决于两方面:1、如果终端设备有嵌入式硬件,甚至还是C51开发的,那么在系统集成和物联的过程中,就涉及到兼容性的问题。显然和消息队列进行对接是一件头痛的事,用C51写一个对接的驱动不是不可能,但是要评估工作量和稳定性。2、服务端与指定某个终端双向交互频繁的情况,特别是服务端实时发送设备校准命令的情况,这种情况消息队列是不如通讯框架的。

3.2    数据业务层

     服务端接收到数据后,完全可以使用消息队列的生产者和消费者模式处理数据,对系统的业务进行解耦。

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

3.3    综述

     综合考虑,建议在通讯层使用通讯框架,对于设备的IO状态和通讯状态能够及时反应,通讯效率也是能够得到保障的;对于数据业务层,建议不要放在通讯框架内部进行处理,可以使用消息队列,配合通讯框架使用。

    整体架构图如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文章得到了群友支持:

 

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
14天前
|
供应链 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第29天】本文将探讨新兴技术的发展趋势和应用场景,包括区块链技术、物联网技术和虚拟现实技术。我们将从这些技术的基本原理出发,分析它们在各个领域的应用前景和挑战,并提供一些代码示例来说明如何使用这些技术。通过本文,读者将了解到这些新兴技术的强大潜力和无限可能。
|
13天前
|
供应链 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第30天】随着科技的不断进步,新兴技术如区块链、物联网、虚拟现实等正在改变我们的生活。本文将探讨这些技术的发展趋势和应用场景,以及它们如何影响我们的日常生活和工作。我们将通过代码示例来展示这些技术的实际运用,并讨论其未来的发展方向。让我们一起探索这些令人兴奋的技术吧!
|
13天前
|
机器学习/深度学习 自然语言处理 物联网
深度学习入门:从理论到实践新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第30天】本文将介绍深度学习的基本原理和实践应用。我们将从深度学习的定义、历史和发展开始,然后深入探讨其工作原理和关键技术。接着,我们将通过一个简单的代码示例来展示如何实现深度学习模型。最后,我们将讨论深度学习在现实世界中的应用和挑战。无论你是初学者还是有经验的开发者,这篇文章都将为你提供深度学习的全面理解。
|
6天前
|
供应链 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【9月更文挑战第5天】随着科技的飞速发展,新兴技术如区块链、物联网、虚拟现实等正在改变我们的生活。本文将探讨这些技术的发展趋势和应用场景,以及它们如何影响我们的生活和工作。我们将通过实例和代码示例来深入了解这些技术的发展和应用。
22 5
|
13天前
|
供应链 监控 物联网
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第30天】随着科技的飞速发展,新技术如区块链、物联网、虚拟现实等正在改变我们的生活。这些技术不仅为我们提供了更便捷的生活体验,还为各行各业带来了革命性的变革。本文将对这些新兴技术的发展趋势和应用场景进行深入探讨,并给出代码示例。
|
16天前
|
物联网 区块链 vr&ar
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第27天】本文旨在探讨新兴技术的发展趋势和应用场景,特别是区块链技术、物联网技术和虚拟现实技术。我们将分析这些技术的基本原理,以及它们如何改变我们的生活和工作方式。我们将通过实例来展示这些技术的应用,并讨论它们对未来的影响。我们的目标是帮助读者更好地理解这些新兴技术,以便他们能够充分利用这些技术带来的机会。
|
19天前
|
分布式计算 搜索推荐 物联网
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
|
18天前
|
供应链 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第24天】本文旨在探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景。我们将深入分析这些技术的基本原理,以及它们如何改变我们的生活和工作方式。同时,我们也将通过实例来展示这些技术的应用,并预测它们在未来可能的发展方向。
|
11天前
|
存储 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第31天】本文将探讨新兴技术的发展趋势和应用场景,包括区块链技术、物联网技术和虚拟现实技术。我们将深入分析这些技术的优缺点,并探讨它们在现实世界中的实际应用。同时,我们还将提供一些代码示例,以帮助读者更好地理解这些技术。
|
11天前
|
供应链 算法 物联网
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第31天】本文将深入探讨新兴技术的发展趋势和应用,包括区块链技术、物联网、虚拟现实等。我们将分析这些技术的原理、特点以及在不同领域的应用场景,同时提供一些代码示例,帮助读者更好地理解和应用这些技术。