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数据。
第一步是创建发布传感器数据的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应用程序。