ESP32-S3的MQTT实战

        昨天,我们讲了socket通信,当服务器和客户端建立起连接时,就可以互相通信了。在互联网应用大多使用WebSocket接口来传输数据。而在物联网的应用中,常常出现这种情况:海量的传感器,需要时刻保持在线,传输数据量非常低,有着大量用户使用。如果仍然使用socket作为通信,那么服务器的压力和通讯框架的设计随着数量的上升将变得异常复杂!

        那么有无一个框架协议来解决这个问题呢,答案是有的。那就是 MQTT(消息队列遥测传输)

实验讲解:

        MQTT 是 IBM 1999 年提出的,和 HTTP 一样属于应用层,它工作在 TCP/IP协议族上,通常还会调用 socket 接口。是一个基于客户端 - 服务器的消息发布 / 订阅传输协议。其特点是协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M )通信和物联网(IoT )。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
从上图可以看到, MQTT 通信的角色有两个,分别是服务器和客户端。服务器只负责中转数据,不做存储;客户端可以是信息发送者或订阅者,也可以同时是两者。具体如下图:
确定了角色后是如何传输数据呢?下表示 MQTT 最基本的数据帧格式,例如温度传感器发布主题“Temperature ”编号 , 消息是“ 25 ”(表示温度)。那么所有订阅了这个主题编号的客户端(手机应用)就会收到相关信息,从而实现通信。如下表所示:
        由于特殊的发布/ 订阅机制,服务器不需要存储数据(当然也可以在服务器的设备上建立一个客户端来订阅保存信息),因此非常适合海量设备的传输。
发布者(publish)代码:
'''
实验名称:MQTT通信
版本:v1.0
日期:2022.4
作者:01Studio
说明:编程实现MQTT通信,实现发布数据。
MQTT助手:http://www.tongxinmao.com/txm/webmqtt.php#collapseOne
'''
import network,time
from simple import MQTTClient #导入MQTT板块
from machine import SoftI2C,Pin,Timer
from ssd1306 import SSD1306_I2C#初始化相关模块
i2c = SoftI2C(sda=Pin(42), scl=Pin(40))#WIFI连接函数
def WIFI_Connect():WIFI_LED=Pin(46, Pin.OUT) #初始化WIFI指示灯wlan = network.WLAN(network.STA_IF) #STA模式wlan.active(True)                   #激活接口start_time=time.time()              #记录时间做超时判断if not wlan.isconnected():print('connecting to network...')wlan.connect('FM-674614', '12345678') #输入WIFI账号密码while not wlan.isconnected():#LED闪烁提示WIFI_LED.value(1)time.sleep_ms(300)WIFI_LED.value(0)time.sleep_ms(300)#超时判断,15秒没连接成功判定为超时if time.time()-start_time > 15 :print('WIFI Connected Timeout!')breakif wlan.isconnected():#LED点亮WIFI_LED.value(1)#串口打印信息print('network information:', wlan.ifconfig())return Trueelse:return False#发布数据任务
def MQTT_Send(tim):client.publish(TOPIC, 'Hello 01Studio!')#执行WIFI连接函数并判断是否已经连接成功
if WIFI_Connect():SERVER = 'mq.tongxinmao.com'PORT = 18830CLIENT_ID = 'pyWiFi-ESP32-S2' # 客户端IDTOPIC = '/public/01Studio/1' # TOPIC名称client = MQTTClient(CLIENT_ID, SERVER, PORT)client.connect()#开启RTOS定时器,编号为-1,周期1000ms,执行socket通信接收任务tim = Timer(-1)tim.init(period=1000, mode=Timer.PERIODIC,callback=MQTT_Send)    #1000ms也就是每1s就发送一次
订阅者( subscribe )代码:
'''
实验名称:MQTT通信
版本:v1.0
日期:2021.8
作者:01Studio
说明:编程实现MQTT通信,实现订阅(接收)数据。
'''
import network,time
from simple import MQTTClient #导入MQTT板块
from machine import SoftI2C,Pin,Timer
from ssd1306 import SSD1306_I2C#初始化相关模块
i2c = SoftI2C(sda=Pin(42), scl=Pin(40))#WIFI连接函数
def WIFI_Connect():WIFI_LED=Pin(46, Pin.OUT) #初始化WIFI指示灯wlan = network.WLAN(network.STA_IF) #STA模式wlan.active(True)                   #激活接口start_time=time.time()              #记录时间做超时判断if not wlan.isconnected():print('connecting to network...')wlan.connect('FM-674614', '12345678') #输入WIFI账号密码while not wlan.isconnected():#LED闪烁提示WIFI_LED.value(1)time.sleep_ms(300)WIFI_LED.value(0)time.sleep_ms(300)#超时判断,15秒没连接成功判定为超时if time.time()-start_time > 15 :print('WIFI Connected Timeout!')breakif wlan.isconnected():#LED点亮WIFI_LED.value(1)#串口打印信息print('network information:', wlan.ifconfig())return Trueelse:return False#设置MQTT回调函数,有信息时候执行
def MQTT_callback(topic, msg):print('topic: {}'.format(topic))print('msg: {}'.format(msg))#接收数据任务
def MQTT_Rev(tim):client.check_msg()#执行WIFI连接函数并判断是否已经连接成功
if WIFI_Connect():SERVER = 'mq.tongxinmao.com'PORT = 18830CLIENT_ID = 'pyWiFi-ESP32-S2' # 客户端IDTOPIC = '/public/01Studio/1' # TOPIC名称client = MQTTClient(CLIENT_ID, SERVER, PORT) #建立客户端对象client.set_callback(MQTT_callback)  #配置回调函数client.connect()client.subscribe(TOPIC) #订阅主题#开启RTOS定时器,编号为1,周期300ms,执行socket通信接收任务tim = Timer(1)tim.init(period=300, mode=Timer.PERIODIC,callback=MQTT_Rev)

从以上代码可以看到发布者和订阅者的编程方式相近,另外本实验需要一个MQTT 服务器( Broker ),这里使用的是跟我们将用到的 MQTT 在线网络助手同一个服务器和端口。
为了方便测试,我们可以使用 MQTT 网络助手进行调试。这里推荐一个在线
MQTT 网络调试助手: http://www.tongxinmao.com/txm/webmqtt.php#collapseOne
打开上面网址,即可看到 MQTT 在线调试助手。可以配置基本信息,这里完
全默认即可,点击连接。
我们先测试“发布者”代码。将“发布者”代码下载到开发板,然后在 MQTT
助手中订阅主题修改为: '/public/01Studio/1' (跟代码发布的主题一致), QOS
0 即可。然后点击订阅主题。
订阅后运行开发板 publish 发布程序,可以看到最下方接收框收到来自开发
板发布的信息。
“订阅者”代码测试方法跟“发布者”相反。将“订阅者”代码下载到开
发板,然后在电脑 MQTT 助手中发布主题修改为: '/public/01Studio/1' (跟代码发
布的主题一致。)在下方空白框输入“ Hello 01Studio! ”。
开发板运行“订阅者”代码,成功连接后回到 MQTT 助手点击【发布】按钮
发布信息,可以在开发板的 REPL 看到接收到的订阅信息“ Hello 01Studio! ”被打
印出来了(数据格式为字节数据)。

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

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

相关文章

微信小程序[黑马笔记]

简介 常用组件 视图组件 <!--pages/list/list.wxml--><scroll-view class"container1" scroll-y><view>A</view><view>B</view><view>A</view></scroll-view><!--pages/list2/list.wxml--><swiper …

❤mac使用Idea工具

❤mac使用Idea工具 1、安装 直接跳过&#xff0c;文章有 &#xff08;点击跳转&#xff09; 给自己的mac系统上安装java环境 2、使用 快捷键 Command , 系统首选项 设置Idea连接数据库 打开右侧的database&#xff08;或菜单里&#xff09;连接数据库&#xff0c;根据提…

ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types]

编译环境 Apple M1 Pro Sonoma 14.1.2 编译的时候出现如下报错&#xff1a; libavcodec/aarch64/h264dsp_init_aarch64.c:84:38: error: incompatible function pointer types assigning to h264_weight_func (aka void (*)(unsigned char *, long, int, int, int, int)) from…

Ubuntu中的 Everything 搜索软件 ==> fsearch

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 在 Windows 中&#xff0c;我经常使用 Everything 来进行文件搜索&#xff0c;搜索效率比 Windows 自带的高出千百倍。 那么在 Ubuntu 系统中&#xff0c;有没有类似的软件呢&#xff1f;那必须有&#xff0c;它就是 FSearch 。…

安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲配置流程

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

libVLC 制作一款精美的播放器

1.简介 本文将简单介绍使用libVLC制作一款精美的播放器。 开发环境:Visual Studio + Qt插件。 Qt版本:Qt5.9。 libVLC版本:3.0.20。 以下是运行界面效果图:截取其中几张。 右键菜单,功能还是比较齐全。 2.ui界面构成 接下来简单介绍一下ui界面构成。 主界面由播放树…

Mac下使用homebrew管理多版本mysql同时启动

Mac下使用homebrew管理多版本mysql同时启动 思路 给每个版本分配不同的数据目录和配置文件即可 本文尝试了使用 brew 安装管理多个MySQL版本&#xff0c;同时运行、直接切换 安装 如果已有数据文件请自行备份以及使用 安装 mysql 5.7 brew install mysql5.7在 /opt/home…

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务&#xff0c;例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件&#xff0c;你需要掌握以下&#xff1a; 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

Spring 2.x整合Activiti 7

https://www.cnblogs.com/dw3306/p/16121810.html 整合在线编辑 https://blog.csdn.net/weixin_41039677/article/details/117947327 引入依赖 <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId…

Git系列:Git Branch 用法总结

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Docker数据管理与Dockerfile镜像创建

前言 在容器化环境中&#xff0c;如何有效地管理和持久化数据成为了开发人员和运维团队面临的挑战之一&#xff1b;另一方面&#xff0c;镜像的创建是构建容器化应用的基础。优化的镜像设计可以提高部署效率和应用性能&#xff0c;减少资源消耗和运行成本。本文将介绍 Docker …

纯血鸿蒙APP实战开发——预渲染实现Web页面瞬开效果

介绍 为了便于大家在使用本案例集时能够更详细的了解各个案例&#xff0c;本案例基于Web预渲染实现了案例介绍功能&#xff0c;即应用右下角的问号icon。 效果图预览 使用说明 因为直接加载的线上README&#xff0c;因此本功能需联网使用点击icon&#xff0c;即会弹出对应案…

后端端口也可以直接在浏览器访问

比如在浏览器输入http://localhost:8078/hello/helloword访问的是后端的 RestController RequestMapping("/hello") public class HelloWord {RequestMapping("/helloword")public String helloWord(){return "hello word";} }浏览器将会返回

react之state深入浅出

第二章 - 添加交互 把一系列 state 更新加入队列 设置组件 state 会把一次重新渲染加入队列。但有时你可能会希望在下次渲染加入队列之前对 state 的值执行多次操作。为此&#xff0c;了解 React 如何批量更新 state 会很有帮助。 react 会对state 更新进行批处理 在下面的…

论文阅读之MMSD2.0: Towards a Reliable Multi-modal Sarcasm Detection System

文章目录 论文地址主要内容主要贡献模型图技术细节数据集改进多视图CLIP框架文本视图图像视图图像-文本交互视图 实验结果 论文地址 https://arxiv.org/pdf/2307.07135 主要内容 这篇文章介绍了一个名为MMSD2.0的多模态讽刺检测系统的构建&#xff0c;旨在提高现有讽刺检测系…

【无人机路径规划】基于A算法求解无人机三维路径规划问题matlab源码

无人机路径规划 无人机路径规划是指为无人机制定一个最佳的飞行路径&#xff0c;使其能够有效地完成特定任务或达到目标位置。路径规划通常涉及以下几个方面&#xff1a; 地图和环境建模&#xff1a;首先需要对飞行区域进行地图建模&#xff0c;包括地形、障碍物、限制区域等…

B+tree - B+树深度解析+C语言实现+opencv绘图助解

Btree - B树深度解析C语言实现opencv绘图助解 1. 概述2. Btree介绍3. Btree算法实现3.1 插入分裂 3.2 删除向右借位&#xff08;左旋&#xff09;向左借位&#xff08;右旋&#xff09;合并 3.3 查询和遍历3.3.1 查询3.3.2 遍历 3.4 优化优化1(匀key)优化2(升级key)优化3(拓展兄…

vue3 vite 路由去中心化(modules文件夹自动导入router)

通过路由去中心化可实现多人写作开发&#xff0c;不怕文件不停修改导致的冲突&#xff0c;modules中的文件可自动导入到index.js中 // 自动导入模块 const files import.meta.globEager(./modules/**.js); const modules {} for (const key in files) {modules[key.replace…

Android 开发工具使用

c调试 在NDK调试的时候&#xff0c;如果找不到 符号的话&#xff0c;我们可以在调试配置中添加符号地址的全路径一直到根目录&#xff1a;&#xff0c;xxx/armeabi-v7a&#xff1a; You must point the symbol search paths at the obj/local/ directory. This is also not a …

【Vue】如何使用Webpack实现打包操作

一、Webpack介绍 Webpack最主要的作用就是打包操作&#xff0c;由两个核心部分构成分别是“出口”与“入口”。wbepack是现在比较热门的打包工具了&#xff0c;它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。说的直白一点&#xff0c;通过webpac…