当前位置: 首页 > news >正文

【物联网】mqtt初体验

文章目录

  • 安装EMQX
  • java集成
    • 添加依赖
    • mqtt配置参数
    • 发布组件
    • 订阅组件
    • 测试接口
    • 接口测试

最近在了解物联网云平台方面的知识,解除了mqtt协议,只看书籍难免有些枯燥,所以直接试验一下,便于巩固理论知识。
broker服务器操作系统:centos7
broker服务程序:EMQX
虚拟机IP地址:192.168.89.82

安装EMQX

在自己的虚拟机环境下进行安装,按照EMQX官方资料操作即可,步骤如下:

[root@centos7-82 ~]# cd /usr/src
[root@centos7-82 src]# wget https://www.emqx.com/zh/downloads/broker/5.0.17/emqx-5.0.17-el7-amd64.tar.gz
[root@centos7-82 src]# mkdir -p emqx
[root@centos7-82 src]# tar -zxvf emqx-5.0.17-el7-amd64.tar.gz -C emqx
[root@centos7-82 src]# ./emqx/bin/emqx start

启动后,控制台日志如下:
在这里插入图片描述
可以看下emqx端口:
在这里插入图片描述浏览器访问地址如下:http://192.168.89.82:18083/ 默认的用户名密码为admin、public,第一次登录后会首先要求修改密码。

java集成

为了快速体验,直接一个springboot工程里既有发布客户端也有订阅客户端。

添加依赖

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

mqtt配置参数

mqtt.broker=tcp://192.168.89.82:1883
mqtt.username=admin
mqtt.password=admin

发布组件

@Component
public class PublishSample {private static final Logger log = LoggerFactory.getLogger(PublishSample.class);@Autowiredpublic MqttPropertiesConfig mqttPropertiesConfig;public void sentMsg(String content, String clientId, String topic, int qos){try {MqttClient mqttClient = new MqttClient(mqttPropertiesConfig.getBroker(), clientId, new MemoryPersistence());// 连接参数MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();// 设置用户名和密码mqttConnectOptions.setUserName(mqttPropertiesConfig.getUsername());mqttConnectOptions.setPassword(mqttPropertiesConfig.getPassword().toCharArray());mqttConnectOptions.setConnectionTimeout(60);mqttConnectOptions.setKeepAliveInterval(60);// 连接mqttClient.connect(mqttConnectOptions);// 创建消息并设置 QoSMqttMessage message = new MqttMessage(content.getBytes());message.setQos(qos);// 发布消息mqttClient.publish(topic, message);log.info("Message published");log.info("topic: {}", topic);log.info("message content: {}", content);// 关闭连接mqttClient.disconnect();// 关闭客户端mqttClient.close();} catch (MqttException e) {throw new RuntimeException(e);}}}

订阅组件

@Component
public class SubscribeSample {private static final Logger log = LoggerFactory.getLogger(SubscribeSample.class);@Autowiredpublic MqttPropertiesConfig mqttPropertiesConfig;public void subTest(String clientId, String topic, int qos){try {MqttClient client = new MqttClient(mqttPropertiesConfig.getBroker(), clientId, new MemoryPersistence());// 连接参数MqttConnectOptions options = new MqttConnectOptions();options.setUserName(mqttPropertiesConfig.getUsername());options.setPassword(mqttPropertiesConfig.getPassword().toCharArray());options.setConnectionTimeout(60);options.setKeepAliveInterval(60);// 设置回调client.setCallback(new MqttCallback() {public void connectionLost(Throwable cause) {log.info("connectionLost: {}", cause.getMessage());}public void messageArrived(String topic, MqttMessage message) {log.info("topic: {}", topic);log.info("Qos: {}", message.getQos());log.info("message content: {}", new String(message.getPayload()));}public void deliveryComplete(IMqttDeliveryToken token) {log.info("deliveryComplete---------{}", token.isComplete());}});client.connect(options);client.subscribe(topic, qos);} catch (Exception e) {e.printStackTrace();}}
}

测试接口

@RestController
public class TestController {private static final Logger log = LoggerFactory.getLogger(TestController.class);@Autowiredpublic PublishSample publishSample;@Autowiredpublic SubscribeSample subscribeSample;/*** 发布接口* @param content* @return*/@RequestMapping("sent")public String sent(String content){String clientId = "lizx_pub_client1";int qos = 0;String topic = "mqtt/test";log.info("sent");publishSample.sentMsg(content, clientId, topic, qos);return "success";}/*** 模拟订阅客户端1* @return*/@RequestMapping("sub1")public String sub1(){String clientId = "lizx_sub_client1";int qos = 0;String topic = "mqtt/test";log.info("sub1");subscribeSample.subTest(clientId, topic, qos);return "success";}/*** 模拟订阅客户端2* @return*/@RequestMapping("sub2")public String sub2(){String clientId = "lizx_sub_client2";int qos = 0;String topic = "mqtt/test";log.info("sub2");subscribeSample.subTest(clientId, topic, qos);return "success";}
}

接口测试

直接简单浏览器两个标签页分别输入:
http://127.0.0.1:8080/sub1
http://127.0.0.1:8080/sub2
然后再打开一个标签页输入:
http://127.0.0.1:8080/sent?content=Hello%20MQTT
后台日志如下:

2023-02-14 16:19:39.970  INFO 5708 --- [nio-8080-exec-1] com.lizx.emqx.client.web.TestController  : sub1
2023-02-14 16:19:46.651  INFO 5708 --- [nio-8080-exec-2] com.lizx.emqx.client.web.TestController  : sub2
2023-02-14 16:19:50.384  INFO 5708 --- [nio-8080-exec-3] com.lizx.emqx.client.web.TestController  : sent
2023-02-14 16:19:50.697  INFO 5708 --- [nio-8080-exec-3] c.lizx.emqx.client.sample.PublishSample  : Message published
2023-02-14 16:19:50.698  INFO 5708 --- [nio-8080-exec-3] c.lizx.emqx.client.sample.PublishSample  : topic: mqtt/test
2023-02-14 16:19:50.703  INFO 5708 --- [izx_sub_client2] c.l.emqx.client.sample.SubscribeSample   : topic: mqtt/test
2023-02-14 16:19:50.703  INFO 5708 --- [izx_sub_client1] c.l.emqx.client.sample.SubscribeSample   : topic: mqtt/test
2023-02-14 16:19:50.705  INFO 5708 --- [nio-8080-exec-3] c.lizx.emqx.client.sample.PublishSample  : message content: Hello MQTT
2023-02-14 16:19:50.705  INFO 5708 --- [izx_sub_client2] c.l.emqx.client.sample.SubscribeSample   : Qos: 0
2023-02-14 16:19:50.705  INFO 5708 --- [izx_sub_client1] c.l.emqx.client.sample.SubscribeSample   : Qos: 0
2023-02-14 16:19:50.706  INFO 5708 --- [izx_sub_client2] c.l.emqx.client.sample.SubscribeSample   : message content: Hello MQTT
2023-02-14 16:19:50.706  INFO 5708 --- [izx_sub_client1] c.l.emqx.client.sample.SubscribeSample   : message content: Hello MQTT

相关文章:

【物联网】mqtt初体验

文章目录安装EMQXjava集成添加依赖mqtt配置参数发布组件订阅组件测试接口接口测试最近在了解物联网云平台方面的知识&#xff0c;解除了mqtt协议&#xff0c;只看书籍难免有些枯燥&#xff0c;所以直接试验一下&#xff0c;便于巩固理论知识。 broker服务器操作系统&#xff1a…...

2023年阿里云活动有哪些实例规格的云服务器?如何选择这些实例规格

2023年阿里云活动有哪些实例规格的云服务器&#xff1f;新手用户通过阿里云活动选购阿里云服务器的时候实例规格应该怎么选&#xff0c;因为同配置的云服务器往往有多种不同是规格的云服务器可供选择&#xff0c;而且不同实例规格的云服务器之间价格差别还比较大&#xff0c;因…...

深入理解 Handler(java 层 + native 层)

文章目录回顾线程消息队列时怎样实现的消息是怎么传递的&#xff1f;Handle 的延迟消息是怎么处理的&#xff1f;IdleHandler 的原理主线程进入了 Looper 循环为什么没有 ANR&#xff1f;消息屏障是什么&#xff1f;回顾 之前学习过Handler相关的基础知识&#xff0c;今天再学…...

初步认识操作系统(Operator System)

操作系统一&#xff0c;冯诺依曼体系结构内存的重要作用二&#xff0c;操作系统的概念三&#xff0c;设计操作系统的目的三&#xff0c;操作系统在计算机体系中的定位四&#xff0c;操作系统是如何进行管理的一&#xff0c;冯诺依曼体系结构 在众多计算机相关的书籍中&#xff…...

Android—HTTPS部署自签名证书

一、生成自签名私有证书单向认证&#xff08;只需要服务端证书&#xff09; 生成server_ks.jks服务端密钥配置到服务端生成server.cer服务端证书配置到客户端 双向认证&#xff08;还需要客户端证书&#xff0c;和信任证书&#xff09; 生成client_ks.jks客户端密钥配置到客户…...

java基于springboot+vue微信小程序的学生健康管理

任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于Java语言、微信小程序技术设计并实现了学生健康管理小程序。系统主要包括系统首页、个人中心、学生管理、健康档案管理、体检报告管理、健康评估管…...

金三银四丨黑蛋老师带你剖析-漏洞岗

作者丨黑蛋病毒岗之前我们简单看了看二进制逆向岗位和漏洞岗&#xff0c;今天我们来看一看病毒岗位&#xff0c;就单纯看二进制病毒岗位和漏洞岗位&#xff0c;其所需要的基础知识是差不多的&#xff0c;在Windows平台上&#xff0c;无非就是汇编&#xff0c;C语言&#xff0c;…...

pinia实战 购物车(自定义插件实现pinia持久化)

目录 一、实例 二、需求 三. 代码解析 shop.vue shop.ts 四、持久化插件 插件介绍 持久化实现思路 一、实例 二、需求 单选全选功能&#xff0c;并且可以互相联动 小计功能 总计功能 商品加减&#xff0c;数量为零时不能在减 三. 代码解析 shop.vue 1.获取shop模块实…...

idea使用本地代码远程调试线上运行代码---linux环境

场景&#xff1a; 之前介绍过windows环境上&#xff0c;用idea进行远程调试那么在linux环境下实战一下 环境&#xff1a; linux 测试应用&#xff1a;使用docker部署的platform-multiappcenter-base-app-1.0.0-SNAPSHOT.jar 应用 测试应用端口&#xff1a;19001 测试工具&…...

Java 基础面试题——集合

目录1.Java 有哪些常用容器&#xff08;集合&#xff09;&#xff1f;2.Collection 和 Collections 有什么区别&#xff1f;3.List、Set、Map 之间的区别是什么&#xff1f;4.HashMap 的长度为什么是 2 的 N 次方&#xff1f;源码中是如何保证的&#xff1f;5.HashMap 和 Hasht…...

编程思想、方法论和架构模式的应用

概要编程思想是指在编写代码时所采用的基本思维方式和方法论。分类编程思想分类&#xff1a;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;&#xff1a;把数据和对数据的操作封装在一起&#xff0c;通过类和对象的概念实现模块化、可重…...

Vue|事件处理

事件处理1. 事件使用1.1 事件绑定1.2 事件参数2. 事件修饰符2.1 阻止默认事件2.2 阻止事件冒泡2.3 事件只允许触发一次2.4 事件捕获2.5 操作当前元素2.6 行为立即执行无需等待回调3. 键盘事件4. 本章小结4.1 事件使用小结4.2 事件修饰符小结4.3 键盘事件小结1. 事件使用 1.1 事…...

css书写方式

目录标题一、css是什么&#xff1f;二、css的书写方式1、行内样式【不推荐使用&#xff0c;太固定】2、页面样式&#xff08;又叫内联样式&#xff09;3、外联样式【店家推荐】4、import与link标签的区别一、css是什么&#xff1f; css(cascade style sheet)是用来装饰和装扮页…...

Python网络爬虫 学习笔记(2)BeaufitulSoup库

文章目录BeautifulSoup库的基本介绍HTML标签的获取和相关属性HTML文档的遍历prettify()方法使用BeautifulSoup库对HTML文件进行内容查找信息的标记的相关概念&#xff08;非重点&#xff09;find_all()方法&#xff08;重点&#xff09;综合实例&#xff1a;爬取软科2022中国大…...

JavaScript------内建对象

一、解构赋值 1、数组的解构 1.1、解构赋值 const arr ["孙悟空", "猪八戒", "沙和尚"];let a, b, c;[a, b, c] arr; // 等同于 [a, b, c] ["孙悟空", "猪八戒", "沙和尚"] 1.2、声明同时解构 let [d, e…...

React + Redux 处理异步请求

redux 处理异步请求 方式一:在 componentDidmount 中直接进⾏请求,在将数据同步到 redux 创建 Store 仓库 import {createStore } from redux;const defaultState = {banners: [] }const reducer =...

揭秘涨薪50%经验:从功能测试到自动化测试,我是如何蜕变的?

本人在今年互联网大环境如此严峻的情况下&#xff0c;作为一个刚毕业不到一年的初级测试&#xff0c;赶在“金三银四”依然拿到了一些面试机会&#xff0c;并且成功拿下4家公司的offer&#xff0c;其中不乏互联网大厂&#xff0c;而且最高总包给到了接近double&#xff08;无炫…...

【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能

【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能 【论文原文】&#xff1a;A New Local Transformation Module for Few-shot Segmentation 【作者信息】&#xff1a;Yuwei Yang, Fanman Meng, Hongliang Li, Qingbo Wu,Xiaolong Xu an…...

补充前端面试题(二)

#$set数据变化视图不更新问题, 当在项目中直接设置数组的某一项的值&#xff0c;或者直接设置对象的某个属性值&#xff0c;这个时候&#xff0c;你会发现页面并没有更新。这是因为 Object.defineProperty()限制&#xff0c;监听不到变化。解决方式&#xff1a;this.$set(你要改…...

JavaScript原型、原型链、原型方法

文章目录原型和原型链prototype、 __ proto __ 、constructor原型链原型方法instanceOfhasOwnPropertyObject.create()、new Object()总结原型和原型链 prototype、 __ proto __ 、constructor 首先我们看下面一段代码 // 构造函数Personfunction Person(name, age) {this.na…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...