0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Cheetah模板为ESP8266构建配置系统

454398 来源:工程师吴畏 2019-07-26 11:04 次阅读

ESP8266的上诉

过去,我做过几个基于Arduino的项目,通常是网络连接,主要是在各种物联网中。自从几年前引入ESP8266模块以来,我更频繁地使用这些电路板有四个主要原因:

集成Wi-Fi

紧凑尺寸

经济实惠

以Arduino为中心的开发环境

我使用ESP8266实现的所有应用程序的通用是需要一些配置,包括Wi-Fi连接数据,应用程序的管理员凭据,在大多数情况下是MQTT代理的地址和用于接收命令的一些MQTT主题,以及发布状态或测量数据。

对通用配置系统的需求

对于我的前几个项目,所有这些配置都是硬编码的,因为构建只需要在我自己的房子里工作。但很快我不得不重新配置Wi-Fi连接,因为出于安全考虑,我决定将所有IoT设备移到一个单独的子网中。

必须移动每个设备,并且必须更改固件并将其下载到设备。然后我建造了多个小型温度计,ESP-01和DS18B20安装在一个盒子上,用于两个LR20电池,我放在房子的每个房间。显然,来自不同设备的测量需要是可区分的。因此,它们要么使用设备所在的房间来注释测量值,要么使用包含有关位置信息的不同MQTT主题。

对于硬编码配置,我不得不反复修改每个设备的固件。这种持续的修改是当我对硬编码方法不满意并寻求引入动态配置系统的方法时。

我的第一种方法是硬编码配置结构,一个带有表单反映的小网页这个配置结构和一些代码用于解析通过表单传递的数据,将其放入结构并将其存储在ESP8266的EEPROM中。

但是,这种方法对我尝试的下一个设备不起作用修改。该设备包含D1 Mini模块和两个红/绿LED。它放在我的前门,显示房子里的所有窗户是否都关闭(红灯:一些窗户打开,绿灯:所有窗户都关闭),这也需要一些配置 - 事实上不同的配置。因此,配置不再是硬编码,而是具有结构的系统。再次,另一个问题。

猎豹模板

在我的“日常工作”中那时候,我正在研究一种基于模型的软件开发方法,其中代码是从模型中的信息生成的,我记得几年前我用过的Python包:猎豹模板。使用此模板引擎,您可以编写要获取的文本,并将Python变量作为占位符放在每个位置,需要一些动态文本:

tConfigBlock configBlock;

const uint32_t MAGIC = $magic;

const char* CONFIG_SSID = “$confWifiSsid”;

extern ESP8266WebServer webServer;

在这个小片段中,我有C变量(或实际上) ,在C代码常量中)对于魔术值(或多或少是配置结构的信息版本)和Wi-Fi网络的SSID,ESP8266应在AP模式下打开以进行初始配置。

必须处理此代码段的模板引擎会将占位符$ magic和$ confWifiSsid替换为Python变量的内容。

除了使用简单替换占位符之外,您可以做的不仅仅是猎豹:

typedef struct {

#for $configItem in $configItems

#if $configItem.type == ‘C’

char ${configItem.key}[$configItem.length];

#else if $configItem.type == ‘I’

uint32_t $configItem.key;

#end if

#end for

} tConfigBlock;

extern const uint32_t MAGIC;

extern tConfigBlock configBlock;

extern const char* CONFIG_SSID;

void configServeIndex();

void configServeGetConfiguration();

void showConfiguration();

//(This is the complete template for the configuration.h file.)

有条件和循环。您可以迭代容器的项目,也可以根据条件插入文本。

这些是我在基于ESP8266/Arduino的应用程序的通用配置系统中使用的Cheetah的主要功能:变量替换,循环和条件。

项目的输入文件

让我们看一下项目特定的输入文件,它描述了实际项目的配置结构:

configItems = [

{“label”:“_”, “key”:“magic”, “type”:“I”, “default”: “”},

{“label”:“Config Username”, “key”:“confUser”, “type”:“C”, “length”:16, “default”:“admin”},

{“label”:“Config Password”, “key”:“confPasswd”, “type”:“C”, “length”:16, “default”:“geheim123”},

{“label”:“Wifi SSID”, “key”:“wifiSsid”, “type”:“C”, “length”:32, “default”:“test”},

{“label”:“Wifi Key”, “key”:“wifiKey”, “type”:“C”, “length”:64, “default”:“geheim”},

{“label”:“MQTT Broker”, “key”:“mqttBroker”, “type”:“C”, “length”:32, “default”:“broker.hottis.de”},

{“label”:“MQTT Username”, “key”:“mqttUser”, “type”:“C”, “length”:32, “default”:“RgbLed1”},

{“label”:“MQTT Password”, “key”:“mqttPass”, “type”:“C”, “length”:32, “default”:“geheim123”},

{“label”:“MQTT ClientId”, “key”:“mqttClientId”, “type”:“C”, “length”:32, “default”:“RgbLed1”},

{“label”:“MQTT Port”, “key”:“mqttPort”, “type”:“I”, “default”:8883},

{“label”:“MQTT Topic Color Command”, “key”:“mqttTopicColorCommand”, “type”:“C”, “length”:64, “default”:“IoT/RgbLed1/ColorCommand”},

{“label”:“MQTT Topic Command”, “key”:“mqttTopicCommand”, “type”:“C”, “length”:64, “default”:“IoT/RgbLed1/Command”},

{“label”:“MQTT DebugTopic”, “key”:“mqttDebugTopic”, “type”:“C”, “length”:64, “default”:“IoT/RgbLed1/Debug”},

{“label”:“DebugMode”, “key”:“debugMode”, “type”:“I”, “default”:0}

magic = 0xC0DE0006

appName = “ESP8266 based RgbLedLight”

这是另一个控制RGB LED的小型设备的输入。

关于魔术的一个词:每当配置存储在EEPROM中的幻数和生成到代码中的幻数不同,固件 - 特别是配置的结构 - 已更新,存储的配置无效。

在这种情况下,应用程序不会以“生产模式”启动,而是以“配置模式”启动。在配置模式下,它会在AP模式下打开自己的Wi-Fi,因为Wi-Fi客户端参数可能无效并且仅为配置网页提供服务。

您现在可以将移动智能手机连接到此单独的Wi-Fi,访问配置网页并执行应用程序的初始配置。稍后,一旦Wi-Fi客户端参数正确并且应用程序可以连接到您的家庭Wi-Fi,您仍然可以通过家庭Wi-Fi访问配置网页以及应用程序从本地DHCP服务器接收的地址。

以下是处理上述输入文件( ConfigDataStructure )并创建C文件 configuration.h 和 configuration.c 《的Python代码。 i》。

from Cheetah.Template import Template

from ConfigDataStructure import configItems, magic, appName

confWifiSsid = “espconfig”

params = {

“magic”:magic,

“appName”:appName,

“confWifiSsid”:confWifiSsid,

“configItems”:configItems

}

h_file = Template(file=“configuration_h.tmpl”, searchList=[params])

open(‘configuration.h’,‘w’).write(str(h_file))

c_file = Template(file=“configuration_c.tmpl”, searchList=[params])

open(‘configuration.cpp’,‘w’).write(str(c_file))

configuration.h包含带有配置数据的struct的typedef,configuration.c包含配置结构的实例化,生成的带有表单的网页,以及处理从表格传送的输入信息用于将其存储在EEPROM中。

应用程序代码

在应用程序代码中,配置struct variable configBlock可用于访问配置。

static void mqttReconnect() {

uint32_t currentMillis = millis();

static uint32_t lastMillis = 0;

// Loop until we‘re reconnected

if (!mqttClient.connected() && (currentMillis 》 (lastMillis + RECONNECT_DELAY))) {

lastMillis = currentMillis;

#ifdef DEBUG

Serial.print(“Attempting MQTT connection.。.”);

#endif

// Attempt to connect

//char clientId[128];

//snprintf(clientId, 127, “esp%s”, WiFi.macAddress().c_str());

if (mqttClient.connect(configBlock.mqttClientId, configBlock.mqttUser, configBlock.mqttPass)) {

#ifdef DEBUG

Serial.println(“connected”);

#endif

mqttClient.setCallback(callback);

// Once connected, publish an announcement.。.

mqttClient.publish(configBlock.mqttDebugTopic, “hello world”);

mqttClient.publish(configBlock.mqttDebugTopic, WiFi.localIP().toString().c_str());

subscribeApplication();

} else {

#ifdef DEBUG

Serial.print(“failed, rc=”);

Serial.print(mqttClient.state());

Serial.println(“ try again in 5 seconds”);

#endif

}

}

}

void mqttSetup() {

mqttClient.setServer(configBlock.mqttBroker, configBlock.mqttPort);

}

void mqttLoop() {

if (!mqttClient.connected()) {

mqttReconnect();

} else {

mqttClient.loop();

}

}

Gitlab上提供了该系统的所有代码,包括配置示例,模板和代码生成器。我在Gitlab页面上的几个项目中使用了这段代码。

此应用程序的后续步骤

这方法一直让我高兴。但是,我正在努力重构整个应用程序结构,以提取所有ESP8266和MQTT样板代码,以便能够将其作为子项目包含。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    45097
收藏 人收藏

    评论

    相关推荐

    ESP8266 太空人动画的 OLED 显示

    ESP8266 太空人动画的 OLED 显示
    的头像 发表于 10-08 15:06 294次阅读
    <b class='flag-5'>ESP8266</b> 太空人动画的 OLED 显示

    arduino(1)--ESP8266配置

    硬件准备 首先需要准备一个开发板,这里我准备的是淘宝购买的兼容arduino的ESP8266模块。 arduino配置 我使用的是arduino来编程实现,故需要下载对应的库文件,打开
    发表于 09-06 11:00

    STM32 ESP8266阿里云链接源码

    stm32F103C8T6 ESP8266 物联网电表 登录阿里云
    发表于 08-29 14:21 6次下载

    esp32和esp8266代码共用吗

    本文将介绍ESP32和ESP8266两款流行的微控制器在代码共用性方面的可能性与差异性。 一、引言 随着物联网技术的飞速发展,越来越多的智能设备开始进入我们的生活。其中,ESP32和ESP82
    的头像 发表于 08-19 18:23 1195次阅读

    esp8266esp32区别是什么

    以下是关于ESP8266ESP32的主要区别: 处理器和架构 : ESP8266 :使用一个Tensilica L106 80MHz的处理器,属于Xtensa架构。 ESP32 :使
    的头像 发表于 08-19 18:16 5512次阅读

    esp8266不烧录可以使用吗

    ESP8266是一款非常流行的Wi-Fi模块,广泛应用于物联网项目中。然而,如果不进行烧录,ESP8266将无法正常工作。 1. ESP8266简介 ESP8266是一款由Espres
    的头像 发表于 08-19 17:28 860次阅读

    esp8266wifi模块怎么连接手机

    ESP8266 : 使用USB转TTL模块将ESP8266模块与电脑连接。 通过串口调试助手发送AT指令配置ESP8266,包括设置WiFi模式
    的头像 发表于 08-19 17:27 3088次阅读

    EspTouch for IOS V3.0为什么配置不了ESP8266

    v0.22却可以成功的配置 而最新的espTouch for IOS V0.3 却配置不了ESP8266 请问要如何处理才能成功配置? 而且,
    发表于 07-15 08:16

    ESP8266_RTOS_SDK LWIP构建失败怎么解决?

    然后我克隆了 ESP8266_RTOS_SDK 的 release/v3.3 分支。这导致我的项目生成失败,并出现以下情况: 抄送构建/lwip/lwip/src/api/if_api.o 在
    发表于 07-09 08:01

    ESP8266_RTOS_SDK-v3.4的构建错误如何解决?

    我尝试将 SDK3.4 导入 Aithinker windows IDE 程序,然后构建它。不幸的是,我收到以下错误: LD /d/8266/ESP8266
    发表于 07-08 07:59

    如何为ESP8266构建自定义盾牌?

    我正在寻找某种如何为ESP8266构建自定义盾牌的指南。 到目前为止,我已经使用 NODEMCU 构建了功能原型,但我现在想简化事情并使其更小。 1. 是否有一些书面的、开放的硬件指南 (很好
    发表于 07-08 07:17

    ESP8266网络天气时钟OLED显示

    基于ESP8266实现网络获取天气和时钟并OLED显示
    的头像 发表于 06-28 04:46 1217次阅读
    <b class='flag-5'>ESP8266</b>网络天气时钟OLED显示

    国产低成本Wi-Fi SoC解决方案芯片ESP8266ESP8285对比差异

    ESP8266ESP8285对比差异 ESP8285相当于在ESP8266基础上多加了1/2MB Flash, ESP8285与
    的头像 发表于 05-17 11:44 1369次阅读
    国产低成本Wi-Fi SoC解决方案芯片<b class='flag-5'>ESP8266</b>与<b class='flag-5'>ESP</b>8285对比差异

    使用Wi-Fi ESP8266方案模组接入云平台

    ESP8266的模块芯片是基于无线通信协议的UARTWi-Fi透传模块芯片,支持802.11b/g/n的无线标准,并带有三种可选择的工作模式。ESP8266模块的控制是通过AT指令的形式控制,例如
    的头像 发表于 05-10 08:20 1871次阅读
    使用Wi-Fi <b class='flag-5'>ESP8266</b>方案模组接入云平台

    STM32、ESP8266与MQTT连接阿里云物联网的串口通信异常解析

    STM32、ESP8266与MQTT协议连接阿里云物联网平台时常见的串口通信异常介绍 在构建物联网应用时,STM32、ESP8266与MQTT协议的结合是实现设备与网络间稳定通信的关键。然而,在连接
    的头像 发表于 04-19 17:19 1480次阅读