esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器

news2025/1/17 23:14:30

MQTT介绍

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,旨在设备之间进行通信,尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。

MQTT v3.1.1:

  • 优点:
    • 成熟和广泛支持:作为较早的版本,v3.1.1 得到了广泛的实现和支持,包括各种客户端库和服务器(代理)。
    • 稳定性:由于长时间的使用,v3.1.1 版本的稳定性和可靠性得到了验证。
    • 资源消耗低:设计上考虑了低带宽和低功耗设备,因此非常适合物联网(IoT)应用。
  • 缺点:
    • 功能限制:与 v5 相比,v3.1.1 缺少一些高级功能,如消息的精确一次性传递(Exactly-Once Delivery)和用户属性(User Properties)。
    • 可扩展性:v3.1.1 的一些限制可能使得在某些高级场景下的使用受到限制。

MQTT v5:

  • 优点:
    • 增强的功能:v5 引入了许多新特性,包括消息的精确一次性传递、用户属性、共享订阅(Shared Subscriptions)、动态消息过滤(Dynamic Message Filters)等,这些特性提高了协议的灵活性和可扩展性。
    • 更好的错误处理:v5 提供了更详细的错误代码,有助于客户端更好地理解和处理错误情况。
    • 改进的会话恢复:v5 改进了会话恢复机制,使得客户端可以在断开连接后更快地恢复状态。
  • 缺点:
    • 兼容性问题:由于是较新的版本,v5 的支持可能不如 v3.1.1 广泛,这可能导致与旧系统或客户端的不兼容问题。
    • 实现复杂性:新特性的引入可能增加了实现的复杂性,对于资源受限的设备来说,这可能是一个挑战。

总的来说,MQTT v3.1.1 由于其成熟度和广泛支持,仍然是许多应用的首选。而 MQTT v5 提供了更多的高级功能和更好的错误处理,适合需要这些特性的新应用。选择哪个版本取决于具体的应用需求、资源限制以及对新特性的需求。随着时间的推移,v5 的支持和采用可能会增加,从而减少兼容性问题。

mqtt服务器软件Mosquitto

当前比较流行的mqtt服务器是:Mosquitto、EMQTT、HiveMQ等,经过短暂的了解,最终决定使用Mosquitto。

FreeBSD下安装

pkg install mosquitto

安装好后提示:

Message from mosquitto-2.0.18:

The mosquitto MQTT Python driver is now provided by net/py-paho-mqtt

FreeBSD下启动服务,若没有写入rc.conf文件,则启动时需要加上onestart

sudo service mosquitto start
sudo service mosquitto onestart

Ubuntu下安装

安装服务器

sudo apt install mosquitto

安装客户端

sudo apt install mosquitto-clients

启动并配置服务

以Ubuntu下为例。

启动服务

可以使用service启动服务:

​sudo service mosquitto start

当然一开始不知道,直接使用运行mosquitto命令启动了服务: 

mosquitto

1731855204: Warning: Unable to drop privileges to 'mosquitto' because this user does not exist. Trying 'nobody' instead.

1731855204: mosquitto version 2.0.18 starting

1731855204: Using default config.

1731855204: Starting in local only mode. Connections will only be possible from clients running on this machine.

1731855204: Create a configuration file which defines a listener to allow remote access.

1731855204: For more details see https://mosquitto.org/documentation/authentication-methods/

1731855204: Opening ipv4 listen socket on port 1883.

1731855204: Opening ipv6 listen socket on port 1883.

1731855204: mosquitto version 2.0.18 running

后来才知道可以用service启动和停止服务

后来发现端口只绑定了本地ip,要绑定0.0.0.0,则需要修改配置。

客户端测试:

首先在服务器本机测试

执行mosquitto_sub客户端侦听服务:

mosquitto_sub -t "mytopic"

执行mosquitto_pub发布信息

另一个终端执行:

mosquitto_pub -t "mytopic" -m "Hello, MQTT!!"
1731855866: New connection from 127.0.0.1:29987 on port 1883.
1731855866: New client connected from 127.0.0.1:29987 as auto-E0721C4C-5B09-EF6C-E3B3-892DBEDC9C05 (p2, c1, k60).
1731855866: Client auto-E0721C4C-5B09-EF6C-E3B3-892DBEDC9C05 disconnected.

 就会发现刚才的信息Hello, MQTT!!被侦听端收到了:

mosquitto_sub -t "mytopic"
Hello, MQTT!!

发送消息的详细命令:

mosquitto_pub -t "mytopic" -m "Hello, MQTTexitlast1" -h "192.168.0.13"

设置了用户验证后,就需要带用户名和口令参数,比如

mosquitto_pub -t "mytopic" -m "Hello, MQTT!!" -h 192.168.0.13 -u ral -P ral

修改mosquitto配置

添加用户

在/etc/mosquitto目录下修改配置文件,修改mosquitto.conf文件,加入这样两句:

allow_anonymous false
password_file /etc/mosquitto/passwd

执行mosquitto_passwd创建用户ral并写入/etc/mosquitto/passwd文件:

sudo mosquitto_passwd -c /etc/mosquitto/passwd ral
Password: 
Reenter password: 

这样发送和接收信息都需要用户验证。

修改绑定服务到0.0.0.0 

在/etc/mosquitto/conf.d目录里创建bindip.conf文件,加入这一句:

bind_address 0.0.0.0

这样服务就能监听0.0.0.0 ,也就是其它非本机也可以连它。

 如果原来ufw防火墙没有放开,那么需要放开1883端口:

sudo ufw allow 1883

 这时候再测试一下信息:

mosquitto_pub -t 'mytopic' -m 'ehllo' -u 'ral' -P 'ral'

客户端应该能接收到信息:

mosquitto_sub -t "mytopic"
Hello, MQTT!!

重启mosquitto服务

每次修改mosquitto配置后,都要重启服务

sudo service mosquitto restart

带用户验证的测试

消息接收:

# 带上用户验证
mosquitto_sub -t "mytopic" -u 'ral' -P 'ral'
# 或是带上地址
mosquitto_sub -t "mytopic" -u 'ral' -P 'ral'  -h '192.168.0.13'

消息发送:

# 带用户验证的消息发送
mosquitto_pub -t 'mytopic' -m 'hello world' -u 'ral' -P 'ral'
# 带上服务器ip地址
mosquitto_pub -t 'mytopic' -m 'hello world2' -u 'ral' -P 'ral' -h '192.168.0.13'

接收端接收到信息:

mosquitto_sub -t "mytopic" -u 'ral' -P 'ral'  -h '192.168.0.13'
hello world

证明配置设置的正确,服务器一切正常! 

esp32c3开发板配置

esp32c3开发板烧录micropython 交互环境,参见:esp32c3安装micropython环境-CSDN博客

烧录好固件,启动开发板,进入micropython交互环境。参见:esp32-c3开发板开箱第一步:连上usb口看log信息-CSDN博客

开发板启动wifi连上网

交互界面里执行下面代码连wifi,注意wifi的名字和密码需要根据实际情况修改:

import network
import time
nic = network.WLAN(network.STA_IF)
nic.active(True)
# nic.scan()
if not nic.isconnected():
    nic.connect("wifi名字", "wifi密码")
    print("Waiting for connection...")
    while not nic.isconnected():
        time.sleep(1)


print(nic.ipconfig("addr4"))

 如果能输出网络信息,那么就证明连上了wifi

>>> print(nic.ipconfig("addr4"))
('192.168.0.104', '255.255.255.0')

开发板接收mqtt消息代码

 继续执行esp32c3开发板里的micropython代码:

from umqtt.simple import MQTTClient

# 定义 MQTT 代理的地址和端口
SERVER = "192.168.0.13"
PORT = 1883

# 定义客户端 ID、用户名和密码
CLIENT_ID = "my_client_id"
USERNAME = "ral"
PASSWORD = "ral"

# 定义要订阅的主题
TOPIC = b"mytopic"

# 创建 MQTTClient 实例,并传递用户名和密码参数
client = MQTTClient(CLIENT_ID, SERVER, PORT, user=USERNAME, password=PASSWORD)

# 连接到 MQTT 代理
client.connect()

# 订阅主题
client.subscribe(TOPIC)

# 定义消息回调函数
def sub_cb(topic, msg):
    print("Received message: ", msg)


# 设置消息回调函数
client.set_callback(sub_cb)

# 进入消息循环
while True:
    client.wait_msg()

 中文会占用输入缓冲区大小,有点干扰输入,所以可以黏贴下面去掉中文注释的代码:

from umqtt.simple import MQTTClient

SERVER = "192.168.0.13"
PORT = 1883

CLIENT_ID = "my_client_id"
USERNAME = "ral"
PASSWORD = "ral"

TOPIC = b"mytopic"

client = MQTTClient(CLIENT_ID, SERVER, PORT, user=USERNAME, password=PASSWORD)

client.connect()

def sub_cb(topic, msg):
    print("Received message: ", msg)



client.set_callback(sub_cb)

client.subscribe(TOPIC)

while True:
    client.wait_msg()

不要一次黏贴一大段,可以2-3句黏贴,比如像这句:client = MQTTClient(CLIENT_ID, SERVER, PORT, user=USERNAME, password=PASSWORD) 比较长,就单独黏贴。

开发板运行后,用一个客户端发送消息 

# 本机
mosquitto_pub -t 'mytopic' -m 'hello world' -u 'ral' -P 'ral'
# 非本机
mosquitto_pub -t 'mytopic' -m 'hello world2' -u 'ral' -P 'ral' -h '192.168.0.13'

这时候开发板交互界面里就能接收到发送的信息了!

>>> while True:
...     client.wait_msg()
... 
Received message:  b'hello'
48

这样我们这次实践就完成了!

总结

总体是一次非常愉快的esp32c3开发板与mqtt服务器通信的实践操作。但是由于是第一次使用mosquitto,对它的配置不熟悉,同时也是第一次使用micropython里的mqtt模块(umqtt)进行通信,对它也不熟悉,所以这次实践中箭走了很多弯路,碰到很多问题,幸运的是都解决了。

mqtt服务器,用了半天时间选型为mosquitto,大约这就是眼缘吧,毕竟它是eclicps旗下的,而且FreeBSD还有它的pkg包。安装mosquitto后,需要修改其配置,比如添加用户和密码到指定的文件,修改绑定ip到0.0.0.0,在Ubuntu服务器ufw防火墙中放开1883端口。

esp32c3开发板这块,首先需要烧micropython交互环境的固件,然后usb串口登录到micropython的交互界面,输入python代码。先要配置好WiFi启动tcp/ip网络,然后就是调用umqtt模块进行侦听mqtt消息。micropython的缓冲区较小,不能像普通python里面那样一下子可以黏贴太长的代码段,这也需要注意。

调试

esp32c3上mqtt连接失败

其实这是一个大问题,后来是分解成几个小问题一一解决的。

>>> mqtt_client = connect_mqtt()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 3, in connect_mqtt

  File "umqtt/simple.py", line 66, in connect

OSError: [Errno 104] ECONNRESET

想起来了,原来是mqtt服务器跨了网段,为了简化测试,后来就用了linux客户端mosquitto_pub和mosquitto_sub -t "mytopic" 先进行测试。(其实esp32的网络模块是可以联网、跨网段通信的)

在同一网段开服务器,还是不行

原来是ufw防火墙没有放开,放开1883端口

sudo ufw allow 1883

发现没有绑定0.0.0.0,修改配置文件/etc/mosquitto/conf.d/bindip.conf,加入这句:

bind_address 0.0.0.0

然后重启服务

sudo service mosquitto restart

用客户端mosquitto_pub再测试有如下报错: 

发送信息报错Connection Refused: not authorised.

mosquitto_pub -t "mytopic" -m "Hello, MQTTexitlast1" -h "192.168.0.13"

Connection error: Connection Refused: not authorised.

添加用户:

sudo mosquitto_passwd -c /etc/mosquitto/passwd ral
Password: 
Reenter password: 

在/etc/mosquitto目录下的mosquitto.conf文件中加入信息:

allow_anonymous false
password_file /etc/mosquitto/passwd

重启服务后测试: 

mosquitto_pub -t "mytopic" -m "Hello, MQTT!!" -h 192.168.0.13 -u ral -P ral

终于不报用户验证错了,现在报错:

esp32连mosquitto报错 Subscribe callback is not set

>>> client.subscribe(TOPIC)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "umqtt/simple.py", line 152, in subscribe

AssertionError: Subscribe callback is not set

是那段代码又问题,换代码:

from umqtt.simple import MQTTClient

SERVER = "mqtt.eclipse.org"
PORT = 1883

CLIENT_ID = "my_client_id"
USERNAME = "my_username"
PASSWORD = "my_password"

TOPIC = b"test/topic"

SERVER = "192.168.0.13"
PORT = 1883

CLIENT_ID = "my_client_id"
USERNAME = "ral"
PASSWORD = "ral"

TOPIC = b"mytopic"

client = MQTTClient(CLIENT_ID, SERVER, PORT, user=USERNAME, password=PASSWORD)

client.connect()

def sub_cb(topic, msg):
    print("Received message: ", msg)



client.set_callback(sub_cb)

client.subscribe(TOPIC)

while True:
    client.wait_msg()

这个代码就ok了!

esp32 micropython里黏贴python代码有时候会出错

发现黏贴代码到后面就乱了,估计是黏贴长度超限导致的,减少黏贴长度,问题解决。

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

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

相关文章

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作&#xff0c;先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…

linux文件与重定向

目录 一、共识原理 二、回顾C语言文件函数 1.fopen 2.fwrite 3.fclose 三、文件系统调用 1.open 2.write 3.访问文件的本质 4.stdin&&stdout&&stderror 5.文件的引用计数 四、重定向 1.文件描述符的分配规则 2. 输出重定向 3.重定向系统调用 4.…

CS DAC的Matlab建模与电路设计

在模拟电路设计的复杂世界里&#xff0c;每一个细节都至关重要。Current Steering DAC作为模拟数字转换的核心组件&#xff0c;其设计和性能优化一直是工程师们追求的目标。 “什么是Current Steering DAC&#xff1f; CS DAC通过控制电流源的开关&#xff0c;将数字输入信号…

网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机

目录 网卡IP网络地址主机地址子网子网掩码网关默认网关 MACARPARP抓包分析 路由器NATNAPT 交换机 网卡 网卡(Network Interface Card&#xff0c;简称NIC)&#xff0c;也称网络适配器。 OSI模型&#xff1a; 1、网卡工作在OSI模型的最后两层&#xff0c;物理层和数据链路层。物…

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟&#xff0c;由于内部HSI存在较大的误差&#xff0c;因此我们在系统完成上电初始化&#xff0c;之后需要将STM32的时钟切换到外部HSE作为系统时钟&#xff0c;那么我…

基于Java Springboot滁州市特产销售系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0c;也能支持WebS…

Ubuntu22.04基于ROS2-Humble安装moveit2教程(亲测)

一、安装ROS2-Humble 1、参考&#xff1a;Ubuntu22.04安装ROS2-humble-CSDN博客 2、确保安装完成 source /opt/ros/humble/setup.bash 方法一&#xff1a;二进制安装 sudo apt install ros-humble-moveit* 方法二&#xff1a;安装源码编译 一、卸载二进制安装包 sudo a…

SpringBoot学习记录(三)之多表查询

SpringBoot学习记录&#xff08;三&#xff09;之多表查询 一、多表查询概述1、数据准备2、介绍3、分类 二、内连接三、外连接四、子查询1、标量子查询2、列子查询3、行子查询4、表子查询 三、案例1、准备环境2、需求实现3、&#xff08;附&#xff09;数据准备 一、多表查询概…

Ubuntu 的 ROS 操作系统 turtlebot3 SLAM仿真

引言 SLAM&#xff08;同步定位与地图构建&#xff09;在Gazebo仿真环境中的应用能够模拟真实机器人进行环境建图和导航。通过SLAM仿真&#xff0c;开发者可以在虚拟环境中测试算法&#xff0c;而不必依赖真实硬件&#xff0c;便于调试与优化。 Gazebo提供了多个虚拟环境&…

TCP连接秘籍:三次握手建立连接,四次挥手优雅告别

在数字通信的广阔天地中&#xff0c;TCP协议如同一座稳固的桥梁&#xff0c;连接着网络世界的每一个角落。它不仅确保了数据的可靠传输&#xff0c;还通过精细设计的连接建立与断开机制&#xff0c;展现了其无与伦比的优雅与智慧。TCP的三次握手&#xff0c;犹如初次相遇时的礼…

【惠州大亚湾】之维修戴尔服务器DELLR730XD

1&#xff1a;广东省惠州市大亚湾某游客服务中心来电报修1台DELL PowerEdge R730xd服务器无法正常开机的问题。听该负责描述这台服务器因为服务中心电力切换导致意外关机&#xff0c;来电后发现就无法正常开机了。所以找到我们希望配合维修。 2&#xff1a;该机器由于特别着急…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型&#xff1a;路由器、交换机、防火墙、无线控制器 默认用户名&#xff1a;cisco 默认密码&#xff1a;cisco 设备类型&#xff1a;网管型交换机 默认用户名&#xff1a;admin 默认密码&#xff1a;admin 02 华…

PH热榜 | 2024-11-18

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Momen 标语&#xff1a;快速搭建你的最小可行产品&#xff0c;然后扩展它&#xff0c;无需任何编程经验。 介绍&#xff…

LoFTR: Detector-Free Local Feature Matching with Transformers—特征点匹配算法系列

LoFTR: Detector-Free Local Feature Matching with Transformers 受到&#xff1a;受到开创性作品 SuperGlue 的启发 摘要总结&#xff1a; 提出了一种局部图像特征匹配的新方法。更为突出说明的是室内场景下的特征点的匹配问题。 不是依次执行图像特征检测、描述和匹配&#…

Percona XtraBackup备份docker版本mysql 5.7

my.cnf配置文件 [client] default_character_setutf8[mysqld] # 数据存储目录&#xff08;必须手动指定&#xff09; datadir/var/lib/mysql/data# 字符集 collation_server utf8_general_ci character_set_server utf8 # 二进制日志 server-id1 log_bin/var/log/mysql/binl…

Windows安装vcpkg教程(VS2022)

内容摘要&#xff1a; 本文详细介绍如何在Windows系统上使用 Git 克隆 vcpkg 仓库来安装vcpkg工具&#xff0c;并链接Visual Studio 2022。 目录 一、关于vcpkg 二、开发环境 三、安装Git 四、使用 Git 克隆 vcpkg 仓库 一、关于vcpkg vcpkg 是一个开源的 C 包管理工具&am…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的&#xff0c;当然&#xff0c;我肯定是很多年的计算机基础的&#xff0c;万变不离其宗。 现在web网站都流行所谓的前后端结构&#xff0c;不知不觉我也开始受到这个影响&#xff0c;以前都是前端直接操作…

智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建

hello~这里是维小帮&#xff0c;如有项目需求和技术交流欢迎大家私聊我们&#xff01;点击文章最下方获取智慧停车场方案~撒花&#xff01; 随着城市化进程的加速&#xff0c;停车难问题日益凸显。智能停车系统作为缓解停车压力的有效手段&#xff0c;其核心技术与架构的构建至…