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…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
