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 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代码有时候会出错

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【IDE】使用指南

定期更新实用技能&#xff0c;建议关注收藏点赞。 友情链接&#xff1a; 点击跳转常见代码编辑器的报错解决方案 目录 常用快捷键pycharm右下角边栏脚本头安装IDE的插件git配置TODO 代码编辑器里有许多小技巧&#xff0c;便于办公。本篇主要以pycharm,vscode等主流常用IDE为…

OpenGL入门009——漫反射在片段着色器中的应用

本节将在片段着色器中应用漫反射 文章目录 一些概念漫反射 实战简介dependenciesshadervsshader.fs utilsCube.cpp main.cppCMakeLists.txt最终效果 一些概念 漫反射 概述&#xff1a; 描述的是粗糙表面对光的反射&#xff0c;反射的光线相关各个方向均匀分布&#xff0c;与视…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…

MySQL win安装 和 pymysql使用示例

目录 一、MySQL安装 下载压缩包&#xff1a; 编写配置文件&#xff1a; 配置环境变量&#xff1a; 初始化服务和账户 关闭mysql开机自启&#xff08;可选&#xff09; 建议找一个数据库可视化软件 二、使用pymysql操作数据库 安装pymysql 示例代码 报错处理 一、My…

springboot基于微信小程序的停车场管理系统

摘 要 停车场管理系统是一种基于移动端的应用程序&#xff0c;旨在方便车主停车的事务办理。该小程序提供了便捷的停车和功能&#xff0c;使车主能够快速完成各项必要的手续和信息填写。旨在提供一种便捷、高效的预约停车方式&#xff0c;减少停车手续的时间和精力成本。通过该…

js:数组转换为字符串

1、使用join 通过join&#xff0c;将数组拼接&#xff0c;使用&#xff0c;进行分割 let array [a, b, c] let str array.join(,); console.log(str) 2、使用toString() const array [a, b, c] const string array.toString() console.log(string) 3、使用扩展运算符和…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号&#xff0c;可在npm官网&#xff1a;https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口&#xff0c;常见命令如下&#xff1a; 1、登录命令&#xff1a;npm login&#xff08;不用每次都重新登录&#xff0…

路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决

上一路由tip信息框不销毁问题解决 路由缓存篇问题描述及截图解决思路关键代码 路由缓存篇 传送门 问题描述及截图 路由缓存后跳转新路由时&#xff0c;上一个路由的tip信息框没销毁。 解决思路 在全局路由守卫中获取DOM元素&#xff0c;通过css去控制 关键代码 修改文…

uni-app 界面TabBar中间大图标设置的两种方法

一、前言 最近写基于uni-app 写app项目的时候&#xff0c;底部导航栏 中间有一个固定的大图标&#xff0c;并且没有激活状态。这里记录下实现方案。效果如下&#xff08;党组织这个图标&#xff09;&#xff1a; 方法一&#xff1a;midButton的使用 官方文档&#xff1a;ta…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…

xiaolin coding 图解网络笔记——基础篇

基础篇 Linux 系统是如何收发网络包的&#xff1f; 网络模型 为了使多种设备能通过网络相互通信&#xff0c;和为了解决不同设备在网络互连中的兼容性问题&#xff0c;国际标准化组织制定了开放式系统互连通信参考模型&#xff08;Open System Interconnection Reference Mo…

【vba源码】导入excel批注信息

Hi&#xff0c;大家好呀&#xff01; 又到了一周一分享的时间&#xff0c;上周繁忙的我都没有给大家直播&#xff0c;视频也没更新&#xff0c;那这周大家放心&#xff0c;都会给大家更新&#xff0c;今天我们来讲点啥呢&#xff1f;每周找优质的内容给大家更新是我最最痛苦的…

跨平台WPF框架Avalonia教程 十三

AutoCompleteBox 自动补全输入框 自动补全输入框提供了一个供用户输入的文本框和一个包含可能匹配项的下拉列表。下拉列表会在用户开始输入时显示&#xff0c;并且每输入一个字符&#xff0c;匹配项都会更新。用户可以从下拉列表中选择匹配项。 文本与可能项匹配的方式是可配…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…

力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归法&#xff08;方法二更好理解&#xff0c;个人更习惯方法二&#xff09; 前中后序均可&#xff0c;实际上没有中的处理 中左右&#xff0c;左中右&#xff0c;左右中&#xff0c;实际上都是左在前&#xff0c;所以遇到的第一个…

Nuget For Unity插件介绍

NuGet for Unity&#xff1a;提升 Unity 开发效率的利器 NuGet 是 .NET 开发生态中不可或缺的包管理工具,你可以将其理解为Unity的Assets Store或者UPM,里面有很多库可以帮助我们提高开发效率。当你想使用一个库,恰好这个库没什么依赖(比如newtonjson),那么下载包并找到Dll直接…

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

药房革新:Spring Boot中药实验管理系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…