ESPNow2Mqtt:一个为ESP32系列简单高效实现高速的MQTT通信的解决方案

文摘   2024-11-07 00:01   湖南  

引言

在物联网应用中,电池供电的设备通常需要与MQTT服务器进行通信,但WiFi连接的高功耗会严重影响电池寿命。ESPNow2Mqtt库应运而生,它利用ESP-Now技术,可以在100毫秒内完成MQTT通信,实现低功耗、高效的物联网数据传输。

架构概述

ESPNow2Mqtt库采用了一种独特的设计架构,将设备与MQTT服务器之间的通信桥接到一个称为“网关”的中间层。该库提供了两个核心对象:

  • • EspNow2MqttClient: 设备端对象,用于发送数据到MQTT服务器,以及从MQTT服务器接收数据。

  • • EspNow2MqttGateway: 网关端对象,负责接收设备发送的数据并将其发布到MQTT服务器,同时监听MQTT服务器的订阅,并将数据转发给相应的设备。

设计理念

ESPNow2Mqtt库的设计基于ESP-Now协议,并在此基础上引入了以下关键要素:

  • • 自定义加密: 为了突破ESP-Now协议限制,库中采用了自定义的加密算法,基于ChaCha加密,实现更加安全的数据传输。

  • • 轻量级协议: 库中定义了一种基于nanopb的简单协议,可以高效地查询和写入MQTT主题。

  • • 限制消息大小: 为了适应ESP-Now协议的限制,库中将消息大小限制在200字节,并支持每个请求最多5个发布或订阅操作。

MQTT主题设计

ESPNow2Mqtt库采用了一种简化的MQTT主题命名方式,以节省带宽,并确保设备与网关之间的通信高效且安全。主题结构如下:

EspNow/clientId/name

其中:

  • • EspNow: 固定名称,用于标识ESPNow通信。

  • • clientId: 设备在初始化时指定的唯一标识符。

  • • name: 设备自定义的主题名称。

简易示例:闪烁LED

以下代码展示了使用ESPNow2Mqtt库控制LED灯闪烁的简单示例:

#include <Arduino.h>
#include <EspNow2MqttClient.hpp>

#define LED 2

byte sharedKey[16]={10,200,23,4,50,3,99,82,39,100,211,112,143,4,15,106};
byte sharedChannel =8;
uint8_t gatewayMac[6]={0xA4,0xCF,0x12,0x25,0x9A,0x30};
EspNow2MqttClient client =EspNow2MqttClient("testLib", sharedKey, gatewayMac, sharedChannel);

void setup() {
pinMode(LED, OUTPUT);
  client.init();
}

void loop() {
digitalWrite(LED, HIGH);
  client.doSend("ON","led");
delay(1000);
digitalWrite(LED, LOW);
  client.doSend("OFF","led");
delay(1000);
}

设备端功能

ESPNow2MqttClient对象提供了以下功能:

  • • 发送数据: 使用doSend()方法将数据发送到指定的MQTT主题。

  • • 订阅数据: 使用doSubscribe()方法订阅指定的MQTT主题,并接收主题内容的更新。

  • • ping测试: 使用doPing()方法测试ESP-Now连接。

  • • 组合消息: 使用doMultiple()方法发送多条消息,包括发送数据、订阅数据和ping测试。

网关端功能

ESPNow2MqttGateway对象提供以下功能:

  • • 接收设备数据: 接收设备发送的数据,并将其发布到MQTT服务器。

  • • 监听MQTT订阅: 监听MQTT服务器的订阅,并将订阅数据转发给相应的设备。

总结

ESPNow2Mqtt库为开发人员提供了一种简单高效的解决方案,能够在低功耗设备上实现高速的MQTT通信。该库的设计理念、功能特点以及示例代码可以帮助用户轻松构建基于ESP-Now的物联网应用,并显著提升电池供电设备的续航能力。

项目地址:https://github.com/eccnil/ESPNow2Mqtt


DIY太阳系
分享嵌入式系统知识,写精华文章!
 最新文章