MQTT和Java入门

MQTT(MQ遥测传输)是一种轻量级的发布/订阅消息传递协议。 MQTT在物联网应用程序中得到了广泛使用,因为它被设计为在占用空间小的系统上运行在远程位置。

MQTT 3.1是OASIS标准,您可以在http://mqtt.org/上找到所有信息。

本文将指导您完成运行第一个MQTT应用程序的各个步骤:

  1. 安装并启动MQTT代理
  2. 编写一个发布消息的应用程序
  3. 编写使用消息的应用程序

GitHub上提供了示例应用程序的源代码。

先决条件

  • Apache Maven 3.x
  • 吉特

安装并启动MQTT代理

您可以找到许多MQTT经纪人,在这个示例中,我将使用最常见的经纪人之一Mosquitto 。

您可以从二进制软件包下载并安装。 我已经使用Homebrew在Mac上安装了它:

$ brew install mosquitto

使用默认配置启动MQTT Broker

$ /usr/local/sbin/mosquitto

发布和使用消息

打开两个终端窗口,然后运行以下命令:

消耗

$ mosquitto_sub -h 127.0.0.1 -t iot_data

发布

$ mosquitto_pub -h 127.0.0.1 -t iot_data -m "Hello world"

您应该在消费者/订户窗口中看到消息Hello world

编写您的第一个MQTT应用程序

对于此示例,我将编写一个小型Java应用程序,因为它是我在全局项目中使用的语言。

Maven依赖

将Eclipse Paho依赖项添加到您的Maven项目中

<dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.1.0</version>
</dependency>

发布消息

发布消息非常容易,创建一个MqttClient并将其用于发布主题。

MqttClient client = new MqttClient("tcp://localhost:1883", MqttClient.generateClientId());
client.connect();
MqttMessage message = new MqttMessage();
message.setPayload("Hello world from Java".getBytes());
client.publish("iot_data", message);
client.disconnect();

您还有许多其他选项,可以在发布消息时使用的配置,例如安全性,服务质量(QoS)等。 但是在这篇文章中,我只想简单地展示发布和使用MQTT消息有多么容易。

消费信息

要使用消息,您需要实现org.eclipse.paho.client.mqttv3.MqttCallback ,它将接收消息并在Subscriber应用程序的MqttClient中使用此Callback类。

回调类:

public class SimpleMqttCallBack implements MqttCallback {public void connectionLost(Throwable throwable) {System.out.println("Connection to MQTT broker lost!");}public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {System.out.println("Message received:\n\t"+ new String(mqttMessage.getPayload()) );}public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {// not used in this example}
}

在订阅服务器应用程序中使用此回调类,如下所示:

MqttClient client=new MqttClient("tcp://localhost:1883", MqttClient.generateClientId());
client.setCallback( new SimpleMqttCallBack() );
client.connect();

像发布者一样,我使用的代理和客户端没有任何选择(QoS,安全性)。

生成并运行应用程序

1-获取示例代码

从GitHub克隆项目

$ git clone https://github.com/tgrall/mqtt-sample-java.git

2-使用Apache Maven构建项目:

这个项目是一个简单的Java应用程序,它使用Eclipse Paho库运行发布者和订阅者。

$ mvn clean package

为方便起见,示例程序项目被设置为使maven包目标生成单个可执行文件/mqtt-sample ,其中包括所有示例程序和依赖项。

3-运行订阅服务器

订阅者将接收并打印在iot_data主题上发布的所有消息。

$ ./target/mqtt-sample subscriber

4-运行发布者

使用以下命令运行发布者,第二个参数是要发布的消息

$ ./target/mqtt-sample publisher "My first MQTT message..."

结论

在本文中,您学习了如何:

  • 安装并启动MQTT经纪人Mosquitto
  • 创建用Java开发的发布者和订阅者

选择本文非常简单,可以快速运行您的第一个MQTT应用程序。 我写这篇文章是我正在从事的全球物联网项目的一部分,该项目将捕获设备数据,并使用MQTT和MapR Streams将其发布到MapR融合数据平台中。 这就是为什么我在应用程序中使用Java。 您可以使用任何MQTT客户端库来构建发布者和订阅者。

翻译自: https://www.javacodegeeks.com/2017/01/getting-started-mqtt-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数的命名空间

# 函数进阶 # a 1 # def func(): # print(a) # func()# 命名空间和作用域 # print() # input() # list # tuple#命名空间 有三种 #内置命名空间 —— python解释器# 就是python解释器一启动就可以使用的名字存储在内置命名空间中# 内置的名字在启动解释器的时候被加载进内…

在Linux环境下mysql的root密码忘记解决方法

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lxsym.blog.51cto.com/1364623/477027 MySQL密码的恢复方法之一 1&#xff0e;首先确认服务器出于安全的状态&#xff0c;也就是没有人能…

史迪仔的原型_星际宝贝三个版本对比,莉罗抛弃史迪仔,童年真的回不去了

星际宝贝这部动漫大家应该不陌生&#xff0c;以前为了看这部动漫&#xff0c;经常蹲着点打开电视&#xff0c;看到莉罗和626一天的烦恼都没了。星际宝贝可以说风靡全球&#xff0c;所以日漫还有国漫也不甘落后&#xff0c;纷纷和迪士尼完成了自己的星际宝贝&#xff0c;来跟宅编…

warning C4091: “typedef ”: 没有声明变量时忽略“_matcher”的左侧

C 警告 warning C4091: “typedef ”: 没有声明变量时忽略“_matcher”的左侧 typedef struct _matcher {int Idx1;int Idx2;double dis; };修改方法&#xff1a;删掉typedef &#xff0c;这是C语言的结构体&#xff0c;C 会自动分配。

C# 获取对象 大小 Marshal.SizeOf (sizeof 只能在不安全的上下文中使用)

C# 能否获取一个对象所占内存的大小&#xff1f; 今日&#xff0c;在项目重构的时候忽然想到一个问题&#xff0c;一个类哪些成员的增加&#xff0c;会影响一个类所占内存的大小&#xff1f;C#有没有办法知道一个对象占多少内存呢&#xff1f; 第一个问题&#xff1a;很快想到是…

警告warningC4018有符号/无符号不匹配

C警告 warning C4018: “<”: 有符号/无符号不匹配 警告代码如下&#xff1a;for (int i 0; i<matchePoints.size(); i){imagePoints1.push_back(keypoints1[matchePoints[i].Idx1].pt);imagePoints2.push_back(keypoints2[matchePoints[i].Idx2].pt);} 错误原因&…

tp5类的属性不存在_thinkPHP5.1框架中Request类四种调用方式示例

本文实例讲述了thinkPHP5.1框架中Request类四种调用方式。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1. 传统调用访问方式&#xff1a;http://127.0.0.1/demo/demo3/test?namekk&age22/*** Created by PhpStorm.* User: 10475* Date: 2018/8/27* Time: 22:59*…

设置 Linux 的 LD_LIBRARY_PATH 变量

我们在ubuntu图形界面下用eclipse写了一个动态库&#xff0c;到centos下调用时出现错误&#xff0c; error while loading shared libraries: libmysqlclientso.so.0: cannot open shared object file: No such file or directory 以为没装mysql-client&#xff0c;因为ub…

javaone_JavaOne 2012覆盖率

javaone年度Java盛会JavaOne于9月30日至10月4日在旧金山举行。 进行了许多有趣的演示&#xff0c;再次证明了健康的Java生态系统。 Java Code Geeks未能参加会议&#xff0c;但是我们的JCG合作伙伴Dustin Marx出席了会议&#xff0c;并且慷慨地提供了有关该事件的完整报道&…

第十二章 泛型

目录&#xff1a; 12.1 FCL中的泛型 12.2 泛型基础结构 12.3 泛型接口 12.4 泛型委托 12.5 委托和接口的逆变和协变泛型类型实参 12.6 泛型方法 12.7 泛型和其他成员 12.8 可验证性和约束 泛型时CLR和编程语言提供的一种特殊机制&#xff0c;它支持另一种形式的代码重用&#x…

memset()函数详解

1、头文件C中为<memory.h> 或 <string.h>C中为<cstring> 2、原型及作用 void *memset(void *s,int c,size_t n)其中&#xff0c;s是一个指针或数组&#xff0c;c是赋给s的值&#xff0c;n是将修改的s的长度&#xff0c;即s的前n个字节。作用&#xff1a;将已…

jq 如何让点击其他地方隐藏_详解jQuery除指定区域外点击任何地方隐藏DIV功能

本文主要介绍了jQuery除指定区域外点击任何地方隐藏p的相关资料,代码简单易懂&#xff0c;非常不错&#xff0c;具有参考借鉴价值&#xff0c;需要的朋友可以参考下&#xff0c;希望能帮助到大家。具体代码如下所示&#xff1a;$(body).click(function(e) {var target $(e.tar…

linux系统编程之进程(八):守护进程详解及创建,daemon()使用

一&#xff0c;守护进程概述 Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个用户程序提供服务…

您还在调试吗?

调试是“以交互方式运行程序/方法&#xff0c;在每个语句后中断执行流程并显示……的过程。”简而言之&#xff0c;它是一种非常有用的技术……对于一个糟糕的程序员而言。 或仍然在用C编写过程代码的老程序员。面向对象的程序员从不调试其代码-他们编写单元测试。 我的意思是&…

RESTful规范

本文目录 什么是RESTful RESTful API设计 基于Django实现 什么是RESTful REST与技术无关&#xff0c;代表的是一种软件架构风格&#xff0c;REST是Representational State Transfer的简称&#xff0c;中文翻译为“表征状态转移”REST从资源的角度类审视整个网络&#xff0c;它…

反向输出dna序列_蛋白质序列反向(逆向)翻译成DNA序列-在线工具

请粘贴蛋白质序列&#xff0c;如果需要输入多个序列&#xff0c;请以fasta格式输入&#xff0c;输入总长度不超过2万个字符。>testACDEFGHIKLMNPQRSTVWY*推荐使用IE 8.0以上、chrome或者Firefox等浏览器。请输入该蛋白来源物种的密码子使用表(GCG格式)&#xff0c;下表示大肠…

子函数的指针释放问题

C语言中遇到一个这样的问题&#xff1a;子函数中malloc了一个指针存储数据&#xff0c;作为该子函数的返回值&#xff0c;return到主函数。那么这个指针应该在哪里释放呢&#xff1f;显然不能在子函数里释放&#xff0c;否则返回值没有意义。这样就应该在主函数里释放&#xff…

利用cookie模拟登陆知乎

我们知道一些网站是需要账号密码才可以登陆的&#xff0c;例如知乎。而利用requests库里的get方法的headers参数可以达到这个目的 首先在知乎的网页上登陆自己的知乎账号&#xff0c;利用chrome的开发者工具&#xff08;F12&#xff09;可以捕获我们的get方法向浏览器提供的coo…

linux中fork()函数详解(原创!!实例讲解)

一、fork入门知识 一个进程&#xff0c;包括代码、数据和分配给进程的资源。fork&#xff08;&#xff09;函数通过系统调用创建一个与原来进程几乎完全相同的进程&#xff0c;也就是两个进程可以做完全相同的事&#xff0c;但如果初始参数或者传入的变量不同&#xff0c;两个进…

C++ vector的释放

项目上用到vector容器&#xff0c;没有手动释放&#xff0c;总是会在这里出现内存分配不成功的问题&#xff0c;因此对vector的释放了解了一下。初始代码如下&#xff1a; vector <float*> dets(nTotalLayers); //dets : 记录每层图像的 Hessian 行列式&#xff1b; for …