引言
在物联网应用中,电池供电的设备通常需要与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