Java开发MQTT应用示例

Java开发MQTT应用示例

MQTT是用于在IoT设备和服务器之间移动数据的标准,所有主要的物联网平台,物联网云服务提供商以及许多物联网边缘网关和设备都支持与MQTT的连接。

技术开发 编程 技术框架 技术发展

 

Java开发MQTT应用示例

MQTT是用于在IoT设备和服务器之间移动数据的标准,所有主要的物联网平台,物联网云服务提供商以及许多物联网边缘网关和设备都支持与MQTT的连接。

MQTT简介

MQTT是用于在IoT设备和服务器之间移动数据的标准。MQTT最初由Andy Standford-Clark和Arlen Nipper于1999年开发,用于监视远程卫星连接上的石油和天然气管道,现已成为连接各种IoT设备的实际IoT标准。如今,所有主要的物联网平台,物联网云服务提供商以及许多物联网边缘网关和设备都支持与MQTT的连接。

MQTT是一种发布/订阅协议,该协议是轻量级的,并且需要最小的占用空间和带宽来连接IoT设备。与HTTP的请求/响应范例不同,MQTT是事件驱动的,并允许将消息推送到客户端。这种类型的体系结构使客户端彼此分离,以实现高度可扩展的解决方案,而无需数据生产者和数据使用者之间的依赖。

MQTT发布/订阅架构

MQTT的主要优点是:

  • 轻巧高效,可最大程度减少客户端和网络带宽所需的资源。

  • 启用设备和服务器之间的双向通信。此外,还可以将消息广播到事物组。

  • 可扩展到数百万个事物。

  • MQTT指定服务质量(QoS)级别以支持消息可靠性。

  • MQTT支持设备与服务器之间的持久性会话,从而减少了不可靠网络上所需的重新连接时间。

  • MQTT消息可以使用TLS加密并支持客户端身份验证协议。

MQTT用例

MQTT被用于许多行业和应用程序。HiveMQ已出版的多项产业的案例研究,如汽车(BMW),电信(自由全球),能源(复达欣),公共安全(海能达),连接产品(AWAIR,Matternet)和更多。

基本概念

MQTT的核心是MQTT代理和MQTT客户端。MQTT代理负责在发送方和合法接收方之间调度消息。MQTT客户端将消息发布到代理,其他MQTT客户端可以订阅代理以接收消息。每个MQTT消息都包含一个主题。MQTT客户端将消息发布到特定主题,而MQTT客户端订阅了他们想要接收的主题。MQTT代理使用主题和订户列表将消息调度到适当的MQTT客户端。

MQTT代理能够缓冲无法分派给未连接的MQTT客户端的消息。这对于网络连接不可靠的情况非常有用。为了支持可靠的消息传递,MQTT支持3种不同类型的服务质量消息:0-最多一次,1-至少一次,2-恰好一次。

MQTT规范有两个版本:MQTT 3.1.1和MQTT5。大多数商业MQTT代理现在支持MQTT 5,但是许多IoT管理的云服务仅支持MQTT 3.1.1。我们强烈建议新的IoT部署使用MQTT 5,因为这些新功能专注于更健壮的系统和云原生可伸缩性。

有关MQTT协议的更深入的描述,建议您阅读MQTT Essentials系列文章或查看随附的视频系列。MQTT 5 Essentials系列还提供了MQTT 5特定功能的深入介绍。

MQTT客户

有许多开源的MQTT客户端可用多种编程语言提供。HiveMQ提供了用Java开发的HiveMQ MQTT客户端。Eclipse Paho还提供C / C ++,Python和多种其他实现。可以在mqtt.org上找到MQTT客户端的详细列表。

MQTT经纪人

MQTT代理在开源,商业实施和托管云服务中提供。HiveMQ提供两个商业版本:HiveMQ Professional和HiveMQ Enterprise,一个托管云MQTT服务:HiveMQ Cloud,以及一个开放源代码版本:HiveMQ社区版。可以在mqtt.org上找到MQTT代理的详细列表。

示例实施

为了更好地说明MQTT的工作方式,我们提供一个简单的示例实现,该实现使用HiveMQ MQTT客户端和可用于实验的HiveMQ公共代理。

用例

在此示例中,我们将有一个连接到Raspberry Pi的温度和亮度传感器,该传感器会将传感器数据发送到MQTT代理。另一台设备将运行一个控制中心,该中心接收MQTT数据。



image.png

第一步是创建发布传感器数据的MQTT客户端。在此示例中,我们将使用温度计和亮度传感器。我们还将使用HiveMQ公共代理,该代理是可公开访问的MQTT代理,用于试验MQTT。

public class Sensor {


    public static void main(String[] args) throws InterruptedException {

        // 1. create the client

        final Mqtt5Client client = Mqtt5Client.builder()

                .identifier("sensor-" + getMacAddress()) // use a unique identifier

                .serverHost("broker.hivemq.com") // use the public HiveMQ broker

                .automaticReconnectWithDefaultConfig() // the client automatically reconnects

                .build();


        // 2. connect the client

        client.toBlocking().connectWith()

                .willPublish()

                    .topic("home/will")

                    .payload("sensor gone".getBytes())

                    .applyWillPublish()

                .send();


        // 3. simulate periodic publishing of sensor data

        while (true) {

            client.toBlocking().publishWith()

                    .topic("home/brightness")

                    .payload(getBrightness())

                    .send();


            TimeUnit.MILLISECONDS.sleep(500);


            client.toBlocking().publishWith()

                    .topic("home/temperature")

                    .payload(getTemperature())

                    .send();


            TimeUnit.MILLISECONDS.sleep(500);

        }

    }


    private static byte[] getBrightness() {

        // simulate a brightness sensor with values between 1000lux and 10000lux

        final int brightness = ThreadLocalRandom.current().nextInt(1_000, 10_000);

        return (brightness + "lux").getBytes(StandardCharsets.UTF_8);

    }


    private static byte[] getTemperature() {

        // simulate a temperature sensor with values between 20°C and 30°C

        final int temperature = ThreadLocalRandom.current().nextInt(20, 30);

        return (temperature + "°C").getBytes(StandardCharsets.UTF_8);

    }

}

上面的代码段执行以下操作:

它创建MQTT客户端。使用唯一标识符很重要。我们使用自动重新连接,因为传感器的互联网连接可能不稳定。

它将客户端连接到broker.hivemq.com。如遗嘱所述,如果传感器失去连接,则经纪人会自动发布“传感器消失”消息。

然后,它定期发布(模拟)亮度和温度数据。

第2步-实施订阅客户端

下一步是实现订阅客户端,该客户端将使用主题home/temperature和中的值home/brightness。


public class ControlCenter {


    public static void main(String[] args) {

        // 1. create the client

        final Mqtt5Client client = Mqtt5Client.builder()

                .identifier("controlcenter-" + getMacAddress()) // use a unique identifier

                .serverHost("broker.hivemq.com") // use the public HiveMQ broker

                .automaticReconnectWithDefaultConfig() // the client automatically reconnects

                .build();


        // 2. connect the client

        client.toBlocking().connectWith()

                .cleanStart(false)

                .sessionExpiryInterval(TimeUnit.HOURS.toSeconds(1)) // buffer messages

                .send();


        // 3. subscribe and consume messages

        client.toAsync().subscribeWith()

                .topicFilter("home/#")

                .callback(publish -> {

                    System.out.println("Received message on topic " + publish.getTopic() + ": " +

                            new String(publish.getPayloadAsBytes(), StandardCharsets.UTF_8));

                })

                .send();

    }

}

上面的代码段执行以下操作:

它创建MQTT客户端。MQTT客户端实例的初始化几乎与传感器相同,只是我们将其controlcenter-用作客户端ID的前缀。

它将客户端连接到broker.hivemq.com。当控制中心离线时,我们使用1小时的会话到期间隔来缓冲消息。

它从开始就订阅客户端所有主题,home因此我们#在主题过滤器中使用多级通配符。所有到达的消息均带有主题和有效内容。当传感器失去连接时,它将打印主题home/will和有效载荷“传感器消失”。

下一步

现在,您对MQTT有了很好的介绍,我们建议以下内容:

阅读MQTT Essentials和MQTT 5 Essentials系列文章,以了解有关MQTT的更多技术细节。

试用HiveMQ以获得动手经验。下载我们的HiveMQ商业版评估许可证。我们还拥有HiveMQ MQTT客户端,用于轻松测试MQTT系统的MQTT CLI,以及入门指南。

联系HiveMQ讨论您对MQTT和IoT消息传递的要求。我们的专家拥有丰富的经验,可以帮助公司构建可靠且可扩展的IoT应用程序。

技术开发 编程 技术框架 技术发展