esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器
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 MQTTClientSERVER = "192.168.0.13"
PORT = 1883CLIENT_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 MQTTClientSERVER = "mqtt.eclipse.org"
PORT = 1883CLIENT_ID = "my_client_id"
USERNAME = "my_username"
PASSWORD = "my_password"TOPIC = b"test/topic"SERVER = "192.168.0.13"
PORT = 1883CLIENT_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代码有时候会出错
发现黏贴代码到后面就乱了,估计是黏贴长度超限导致的,减少黏贴长度,问题解决。
相关文章:

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器
MQTT介绍 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,旨在设备之间进行通信,尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1: 优点ÿ…...

OceanBase 升级过程研究(4.2.1.6-4.2.1.8)
模拟业务 使用benchmark加载10仓数据模拟业务场景 升级方法 使用滚动升级方式来进行OB升级。该方法前提是OB集群必须满足官方规定的高可用架构(如果 Zone 个数小于 3,滚动升级时则无法构成多数派), 滚动升级的原理就是轮流完成每个ZONE的升级工作,由于…...
ubuntu下怎么设置机器程序开机自启?
在 Ubuntu 中,可以通过多种方法设置程序或脚本在系统启动时自动运行。以下是几种常见方法: 方法 1:使用 crontab crontab 是一个定时任务管理工具,可以用来设置程序在开机时自动运行。 1. 打开终端,编辑当前用户的 …...
Cesium 相机系统
Cesium 的相机系统是其 3D 地球渲染引擎的重要组成部分,它控制用户在虚拟地球上的视图和交互体验。Cesium 的相机系统具备灵活性和强大的功能,允许开发者自定义视图、导航和交互方式。以下是 Cesium 相机系统的主要特点和功能: 1. 相机的基本…...

数据结构(基本概念及顺序表——c语言实现)
基本概念: 1、引入 程序数据结构算法 数据: 数值数据:能够直接参加运算的数据(数值,字符) 非数值数据:不能够直接参加运算的数据(字符串、图片等) 数据即是信息的载…...

ZYNQ程序固化——ZYNQ学习笔记7
一、ZYNQ启动过程 二、 SD卡启动实操 1、对ZYNQ进行配置添加Flash 2、添加SD卡 3、重新生成硬件信息 4、创建vitis工程文件 5、勾选板级支持包 6、对系统工程进行整体编译,生成两个Debug文件,如图所示。 7、插入SD卡,格式化为 8、考入BOOT.…...

labview使用报表工具从数据库导出数据
之前写了一篇labview从数据库导出数据到excel电子表格,但是是基于调用excel的activeX控件,有时候会有一些bug,就比如我工作机就无法显示方法,后面大哥指点才知道没有的原因是excel安装不完整。像我的工作机就没有这个选项。就需要…...

#define定义宏(2)
大家好,今天给大家分享两个技巧。 首先我们应该先了解一下c语言中字符串具有自动连接的特点。注意只有将字符串作为宏参数的时候才可以把字符串放在字符串中。 下面我们来讲讲这两个技巧 1.使用#,把一个宏参数变成对应的字符串。 2.##的作用 可以把位…...

CentOS网络配置
上一篇文章:VMware Workstation安装Centos系统 在CentOS系统中进行网络配置是确保系统能够顺畅接入网络的重要步骤。本文将详细介绍如何配置静态IP地址、网关、DNS等关键网络参数,以帮助需要的人快速掌握CentOS网络配置的基本方法和技巧。通过遵循本文的…...

基于vue框架的的网上宠物交易管理系统46sn1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,宠物分类,宠物信息 开题报告内容 基于Vue框架的网上宠物交易管理系统开题报告 一、研究背景 随着互联网技术的飞速发展和人们生活水平的提高,宠物已成为许多家庭的重要成员。宠物市场的繁荣不仅体现在实体店的遍地开…...

MySQL数据库:SQL语言入门 【2】(学习笔记)
目录 2,DML —— 数据操作语言(Data Manipulation Language) (1)insert 增加 数据 (2)delete 删除 数据 truncate 删除表和数据,再创建一个新表 (3…...

MySQL深度剖析-索引原理由浅入深
什么是索引? 官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点的说,数据库索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…...

路径规划——RRT-Connect算法
路径规划——RRT-Connect算法 算法原理 RRT-Connect算法是在RRT算法的基础上进行的扩展,引入了双树生长,分别以起点和目标点为树的根节点同时扩展随机树从而实现对状态空间的快速搜索。在此算法中以两棵随机树建立连接为路径规划成功的条件。并且&…...

数据科学与SQL:如何计算排列熵?| 基于SQL实现
目录 0 引言 1 排列熵的计算原理 2 数据准备 3 问题分析 4 小结 0 引言 把“熵”应用在系统论中的信息管理方法称为熵方法。熵越大,说明系统越混乱,携带的信息越少;熵越小,说明系统越有序,携带的信息越多。在传感…...

Redis/Codis性能瓶颈揭秘:网卡软中断的影响与优化
目录 现象回顾 问题剖析 现场分析 解决方案 总结与反思 1.调整中断亲和性(IRQ Affinity): 2.RPS(Receive Packet Steering)和 RFS(Receive Flow Steering): 近期,…...

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)
文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…...
PostgreSQL高可用Patroni安装(超详细)
目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…...

mcu之,armv7架构,contex-M4系列,时钟树,中断,IO架构(一)
写这篇文章的目的,是记录一下arm架构的32mcu,方便记忆芯片架构原理,方便我展开对,BootLoader的研究。 arm架构,时钟树,先做个记录,有空写。...
论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区)
目录 论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区) 基于区块链的去中心化云制造服务选择方法 一、核心内容概述 二、核心创新点及原理与理论 三、实验与理论分析 PBFT(实用拜占庭容错) 论文解析:基于区块链的去中心化服务选择,用于QoS感知的…...

详细解析STM32 GPIO引脚的8种模式
目录 一、输入浮空(Floating Input):GPIO引脚不连接任何上拉或下拉电阻,处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉(Inpu…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...