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
    +关注

    关注

    51

    文章

    966

    浏览量

    49008
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) ESP8285/ESP8266芯片案例

    本,两者可以共用同一套SDK,只是ESP8285内部集成了1MBFlash,SPIMode设置DOUT,而ESP8266则需要外接Flash,并且是Din模式。除此之外,ESP828
    的头像 发表于 11-21 15:37 4052次阅读
    晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) <b class='flag-5'>ESP</b>8285/<b class='flag-5'>ESP8266</b>芯片案例

    ESP8266ESP32开发板常见的2种下载方式

    ESP32和ESP8266是性价比很高而且使用较为广泛的的Wi-Fi模块,在物联网(IoT)领域的DIY项目中可以首先考虑这2款产品。 两款芯片都属于32位处理器。ESP32是低功耗双核80MHz
    的头像 发表于 11-10 20:30 335次阅读
    <b class='flag-5'>ESP8266</b>和<b class='flag-5'>ESP</b>32开发板常见的2种下载方式

    在蜂鸟处理器上进行RT-Thread+ESP8266 wifi模块开发

    本队伍编号CICC3042,本文介绍在蜂鸟处理器上运行RT-Thread实时操作系统,并进行ESP8266wifi模块开发。 在蜂鸟配套的sdk中提供了RT-Thread的移植 https
    发表于 10-31 09:02

    ESP8266ESP32开发板常见的2种下载方式

    协议,完整的 TCP/IP 协议栈以及蓝牙协议栈。用户可以使用这两款模块现有的设备添加WIFI联网功能或蓝牙(ESP32),轻松的构建独立的网络控制器和远程控制监控设备。 ESP8266
    发表于 10-24 18:04

    esp8266 udp server 端口监听错误的原因?

    1、使用esp8266 at组件+sal socket实现使用udpserver_sample.c demo代码 udp server,通信失败 2、跟踪代码发现 packegs 里面
    发表于 09-23 07:03

    请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗

    请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
    发表于 09-17 12:06

    ESP8266】进入透传模式后,数据间隔怎么调整,

    01.TCP客户端用ESP8266透传模式发送数据是10ms发送一次,(连续发送) 02.TCP服务器接收到的数据是200ms左右接收一次,数据未丢失,但是更新不及时; 03.通过TCP调试助手已
    发表于 09-15 10:16

    rtt连接ESP8266报错(AT+CIPDNS_CUR?),固件版本2.3.0.0,是什么原因导致的?

    不知道我这个固件版本挺新的,为什么不支持报错(AT+CIPDNS_CUR?) 大佬们那个固件版本支持AT+CIPDNS_CUR?的,可以给我一个支持(AT+CIPDNS_CUR?)的固件包吗.但是固件版本是2.3.0.0的吗,我使用的是esp8266_12F
    发表于 09-12 07:21

    【RA-Eco-RA6M4开发板评测】——4.使用ESP8266获取任意城市的天意预报

    手头上有一个ESP8266,闲置了很久,突然想起来可以和RA6M4开发板连接起来,使用AT指令来获取网络天气预报,于是就把它们连接起来。就有了这个帖子。 开始创建工程,打开 RA smart 配置
    发表于 07-23 19:50

    STM32+esp8266连接机智云,上传温湿度数据并控制继电器开关(平台配置、代码生成、代码移植)

    本教程将详细介绍如何将STM32微控制器与ESP8266Wi-Fi模块连接到机智云平台,实现温湿度数据的上传与继电器的远程控制。通过此过程,您将学会如何配置机智云平台,烧录ESP8266固件,移植
    的头像 发表于 07-15 18:54 748次阅读
    STM32+<b class='flag-5'>esp8266</b>连接机智云,上传温湿度数据并控制继电器开关(平台<b class='flag-5'>配置</b>、代码生成、代码移植)

    单片机实例项目:ESP8266串口WIFI

    单片机实例项目:ESP8266串口WIFI,推荐下载!
    发表于 06-03 21:01

    基于STM32 HAL库与标准库的esp8266接入机智云方案(二)

    在《基于STM32HAL库与标准库的esp8266接入机智云方案(一)》中,我们详细介绍了硬件连接和机智云客户端的创建。本篇将重点讲解如何下载代码、分析下载的代码,并直接使用这些代码连接机智云。同时
    的头像 发表于 05-28 18:02 1116次阅读
    基于STM32 HAL库与标准库的<b class='flag-5'>esp8266</b>接入机智云方案(二)

    ESP8266烧录与机智云一键配网教程

    ESP8266模块因其低成本和高性能,广泛应用于智能家居和工业自动化等领域。机智云平台提供了一键配网功能,简化了设备的联网过程。本教程将详细介绍如何使用ESP8266进行烧录,并通过机智云实现一键配
    的头像 发表于 05-24 11:04 1553次阅读
    <b class='flag-5'>ESP8266</b>烧录与机智云一键配网教程

    零知开源——ESP8266+MPU6050 实现运动姿态检测

    零知ESP8266的I2C通信        在运动姿态检测、机器人平衡控制、VR头戴设备等应用中,MPU6050(三轴加速度计+三轴陀螺仪)是一个常见的姿态传感器。而ESP8266作为一款低功耗
    的头像 发表于 02-20 17:54 2807次阅读
    零知开源——<b class='flag-5'>ESP8266</b>+MPU6050 实现运动姿态检测

    ESP8266笔记-07.ESP8266ESP TOUCH

    可以从Smart Config的官方文档中可以看到ESP8266支持4种SmartConfig模式,其实是3种,有一种是混合的。 我们先采用第一种协议,也就是ESPTOUCH协议进行连接,具体的代码
    发表于 12-30 10:37