在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Cheetah模板為ESP8266構(gòu)建配置系統(tǒng)

454398 ? 來(lái)源:工程師吳畏 ? 2019-07-26 11:04 ? 次閱讀

ESP8266的上訴

過(guò)去,我做過(guò)幾個(gè)基于Arduino的項(xiàng)目,通常是網(wǎng)絡(luò)連接,主要是在各種物聯(lián)網(wǎng)中。自從幾年前引入ESP8266模塊以來(lái),我更頻繁地使用這些電路板有四個(gè)主要原因:

集成Wi-Fi

緊湊尺寸

經(jīng)濟(jì)實(shí)惠

以Arduino為中心的開(kāi)發(fā)環(huán)境

我使用ESP8266實(shí)現(xiàn)的所有應(yīng)用程序的通用是需要一些配置,包括Wi-Fi連接數(shù)據(jù),應(yīng)用程序的管理員憑據(jù),在大多數(shù)情況下是MQTT代理的地址和用于接收命令的一些MQTT主題,以及發(fā)布狀態(tài)或測(cè)量數(shù)據(jù)。

對(duì)通用配置系統(tǒng)的需求

對(duì)于我的前幾個(gè)項(xiàng)目,所有這些配置都是硬編碼的,因?yàn)闃?gòu)建只需要在我自己的房子里工作。但很快我不得不重新配置Wi-Fi連接,因?yàn)槌鲇诎踩紤],我決定將所有IoT設(shè)備移到一個(gè)單獨(dú)的子網(wǎng)中。

必須移動(dòng)每個(gè)設(shè)備,并且必須更改固件并將其下載到設(shè)備。然后我建造了多個(gè)小型溫度計(jì),ESP-01和DS18B20安裝在一個(gè)盒子上,用于兩個(gè)LR20電池,我放在房子的每個(gè)房間。顯然,來(lái)自不同設(shè)備的測(cè)量需要是可區(qū)分的。因此,它們要么使用設(shè)備所在的房間來(lái)注釋測(cè)量值,要么使用包含有關(guān)位置信息的不同MQTT主題。

對(duì)于硬編碼配置,我不得不反復(fù)修改每個(gè)設(shè)備的固件。這種持續(xù)的修改是當(dāng)我對(duì)硬編碼方法不滿意并尋求引入動(dòng)態(tài)配置系統(tǒng)的方法時(shí)。

我的第一種方法是硬編碼配置結(jié)構(gòu),一個(gè)帶有表單反映的小網(wǎng)頁(yè)這個(gè)配置結(jié)構(gòu)和一些代碼用于解析通過(guò)表單傳遞的數(shù)據(jù),將其放入結(jié)構(gòu)并將其存儲(chǔ)在ESP8266的EEPROM中。

但是,這種方法對(duì)我嘗試的下一個(gè)設(shè)備不起作用修改。該設(shè)備包含D1 Mini模塊和兩個(gè)紅/綠LED。它放在我的前門,顯示房子里的所有窗戶是否都關(guān)閉(紅燈:一些窗戶打開(kāi),綠燈:所有窗戶都關(guān)閉),這也需要一些配置 - 事實(shí)上不同的配置。因此,配置不再是硬編碼,而是具有結(jié)構(gòu)的系統(tǒng)。再次,另一個(gè)問(wèn)題。

獵豹模板

在我的“日常工作”中那時(shí)候,我正在研究一種基于模型的軟件開(kāi)發(fā)方法,其中代碼是從模型中的信息生成的,我記得幾年前我用過(guò)的Python包:獵豹模板。使用此模板引擎,您可以編寫(xiě)要獲取的文本,并將Python變量作為占位符放在每個(gè)位置,需要一些動(dòng)態(tài)文本:

tConfigBlock configBlock;

const uint32_t MAGIC = $magic;

const char* CONFIG_SSID = “$confWifiSsid”;

extern ESP8266WebServer webServer;

在這個(gè)小片段中,我有C變量(或?qū)嶋H上) ,在C代碼常量中)對(duì)于魔術(shù)值(或多或少是配置結(jié)構(gòu)的信息版本)和Wi-Fi網(wǎng)絡(luò)的SSID,ESP8266應(yīng)在AP模式下打開(kāi)以進(jìn)行初始配置。

必須處理此代碼段的模板引擎會(huì)將占位符$ magic和$ confWifiSsid替換為Python變量的內(nèi)容。

除了使用簡(jiǎn)單替換占位符之外,您可以做的不僅僅是獵豹:

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.)

有條件和循環(huán)。您可以迭代容器的項(xiàng)目,也可以根據(jù)條件插入文本。

這些是我在基于ESP8266/Arduino的應(yīng)用程序的通用配置系統(tǒng)中使用的Cheetah的主要功能:變量替換,循環(huán)和條件。

項(xiàng)目的輸入文件

讓我們看一下項(xiàng)目特定的輸入文件,它描述了實(shí)際項(xiàng)目的配置結(jié)構(gòu):

configItems = [

{“l(fā)abel”:“_”, “key”:“magic”, “type”:“I”, “default”: “”},

{“l(fā)abel”:“Config Username”, “key”:“confUser”, “type”:“C”, “l(fā)ength”:16, “default”:“admin”},

{“l(fā)abel”:“Config Password”, “key”:“confPasswd”, “type”:“C”, “l(fā)ength”:16, “default”:“geheim123”},

{“l(fā)abel”:“Wifi SSID”, “key”:“wifiSsid”, “type”:“C”, “l(fā)ength”:32, “default”:“test”},

{“l(fā)abel”:“Wifi Key”, “key”:“wifiKey”, “type”:“C”, “l(fā)ength”:64, “default”:“geheim”},

{“l(fā)abel”:“MQTT Broker”, “key”:“mqttBroker”, “type”:“C”, “l(fā)ength”:32, “default”:“broker.hottis.de”},

{“l(fā)abel”:“MQTT Username”, “key”:“mqttUser”, “type”:“C”, “l(fā)ength”:32, “default”:“RgbLed1”},

{“l(fā)abel”:“MQTT Password”, “key”:“mqttPass”, “type”:“C”, “l(fā)ength”:32, “default”:“geheim123”},

{“l(fā)abel”:“MQTT ClientId”, “key”:“mqttClientId”, “type”:“C”, “l(fā)ength”:32, “default”:“RgbLed1”},

{“l(fā)abel”:“MQTT Port”, “key”:“mqttPort”, “type”:“I”, “default”:8883},

{“l(fā)abel”:“MQTT Topic Color Command”, “key”:“mqttTopicColorCommand”, “type”:“C”, “l(fā)ength”:64, “default”:“IoT/RgbLed1/ColorCommand”},

{“l(fā)abel”:“MQTT Topic Command”, “key”:“mqttTopicCommand”, “type”:“C”, “l(fā)ength”:64, “default”:“IoT/RgbLed1/Command”},

{“l(fā)abel”:“MQTT DebugTopic”, “key”:“mqttDebugTopic”, “type”:“C”, “l(fā)ength”:64, “default”:“IoT/RgbLed1/Debug”},

{“l(fā)abel”:“DebugMode”, “key”:“debugMode”, “type”:“I”, “default”:0}

magic = 0xC0DE0006

appName = “ESP8266 based RgbLedLight”

這是另一個(gè)控制RGB LED的小型設(shè)備的輸入。

關(guān)于魔術(shù)的一個(gè)詞:每當(dāng)配置存儲(chǔ)在EEPROM中的幻數(shù)和生成到代碼中的幻數(shù)不同,固件 - 特別是配置的結(jié)構(gòu) - 已更新,存儲(chǔ)的配置無(wú)效。

在這種情況下,應(yīng)用程序不會(huì)以“生產(chǎn)模式”啟動(dòng),而是以“配置模式”啟動(dòng)。在配置模式下,它會(huì)在AP模式下打開(kāi)自己的Wi-Fi,因?yàn)閃i-Fi客戶端參數(shù)可能無(wú)效并且僅為配置網(wǎng)頁(yè)提供服務(wù)。

您現(xiàn)在可以將移動(dòng)智能手機(jī)連接到此單獨(dú)的Wi-Fi,訪問(wèn)配置網(wǎng)頁(yè)并執(zhí)行應(yīng)用程序的初始配置。稍后,一旦Wi-Fi客戶端參數(shù)正確并且應(yīng)用程序可以連接到您的家庭Wi-Fi,您仍然可以通過(guò)家庭Wi-Fi訪問(wèn)配置網(wǎng)頁(yè)以及應(yīng)用程序從本地DHCP服務(wù)器接收的地址。

以下是處理上述輸入文件( ConfigDataStructure )并創(chuàng)建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包含帶有配置數(shù)據(jù)的struct的typedef,configuration.c包含配置結(jié)構(gòu)的實(shí)例化,生成的帶有表單的網(wǎng)頁(yè),以及處理從表格傳送的輸入信息用于將其存儲(chǔ)在EEPROM中。

應(yīng)用程序代碼

在應(yīng)用程序代碼中,配置struct variable configBlock可用于訪問(wèn)配置。

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上提供了該系統(tǒng)的所有代碼,包括配置示例,模板和代碼生成器。我在Gitlab頁(yè)面上的幾個(gè)項(xiàng)目中使用了這段代碼。

此應(yīng)用程序的后續(xù)步驟

這方法一直讓我高興。但是,我正在努力重構(gòu)整個(gè)應(yīng)用程序結(jié)構(gòu),以提取所有ESP8266和MQTT樣板代碼,以便能夠?qū)⑵渥鳛樽禹?xiàng)目包含。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ESP8266
    +關(guān)注

    關(guān)注

    51

    文章

    965

    瀏覽量

    47057
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ESP8266 太空人動(dòng)畫(huà)的 OLED 顯示

    ESP8266 太空人動(dòng)畫(huà)的 OLED 顯示
    的頭像 發(fā)表于 10-08 15:06 ?657次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動(dòng)畫(huà)的 OLED 顯示

    arduino(1)--ESP8266配置

    硬件準(zhǔn)備 首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是淘寶購(gòu)買的兼容arduino的ESP8266模塊。 arduino配置 我使用的是arduino來(lái)編程實(shí)現(xiàn),故需要下載對(duì)應(yīng)的庫(kù)文件,打開(kāi)
    發(fā)表于 09-06 11:00

    STM32 ESP8266阿里云鏈接源碼

    stm32F103C8T6 ESP8266 物聯(lián)網(wǎng)電表 登錄阿里云
    發(fā)表于 08-29 14:21 ?9次下載

    esp32和esp8266代碼共用嗎

    本文將介紹ESP32和ESP8266兩款流行的微控制器在代碼共用性方面的可能性與差異性。 一、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來(lái)越多的智能設(shè)備開(kāi)始進(jìn)入我們的生活。其中,ESP32和ESP82
    的頭像 發(fā)表于 08-19 18:23 ?2234次閱讀

    esp8266esp32區(qū)別是什么

    以下是關(guān)于ESP8266ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用一個(gè)Tensilica L106 80MHz的處理器,屬于Xtensa架構(gòu)。 ESP32 :使
    的頭像 發(fā)表于 08-19 18:16 ?7037次閱讀

    esp8266不燒錄可以使用嗎

    ESP8266是一款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項(xiàng)目中。然而,如果不進(jìn)行燒錄,ESP8266將無(wú)法正常工作。 1. ESP8266簡(jiǎn)介 ESP8266是一款由Espres
    的頭像 發(fā)表于 08-19 17:28 ?1595次閱讀

    esp8266wifi模塊怎么連接手機(jī)

    ESP8266 : 使用USB轉(zhuǎn)TTL模塊將ESP8266模塊與電腦連接。 通過(guò)串口調(diào)試助手發(fā)送AT指令配置ESP8266,包括設(shè)置WiFi模式
    的頭像 發(fā)表于 08-19 17:27 ?7342次閱讀

    ESP8266配置用作單個(gè)UDP連接的透明WiFi到串行橋接器遇到的疑問(wèn)求解

    我正在嘗試將我的 ESP8266ESP-WROOM-02) 配置用作單個(gè) UDP 連接的透明 WiFi 到串行橋接器。ESP8266
    發(fā)表于 07-16 06:47

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

    v0.22卻可以成功的配置 而最新的espTouch for IOS V0.3 卻配置不了ESP8266 請(qǐng)問(wèn)要如何處理才能成功配置? 而且,
    發(fā)表于 07-15 08:16

    如何讓ESP8266變成AP模式?

    請(qǐng)問(wèn)除了smartconfig之外,我想讓ESP8266變成AP模式,再用手機(jī)APP與ESP8266對(duì)連后由手機(jī)輸入家中的路由器的SSID與Password給ESP8266 然后讓ESP826
    發(fā)表于 07-15 08:16

    ESP8266_RTOS_SDK LWIP構(gòu)建失敗怎么解決?

    然后我克隆了 ESP8266_RTOS_SDK 的 release/v3.3 分支。這導(dǎo)致我的項(xiàng)目生成失敗,并出現(xiàn)以下情況: 抄送構(gòu)建/lwip/lwip/src/api/if_api.o 在
    發(fā)表于 07-09 08:01

    ESP8266_RTOS_SDK-v3.4的構(gòu)建錯(cuò)誤如何解決?

    我嘗試將 SDK3.4 導(dǎo)入 Aithinker windows IDE 程序,然后構(gòu)建它。不幸的是,我收到以下錯(cuò)誤: LD /d/8266/ESP8266
    發(fā)表于 07-08 07:59

    如何為ESP8266構(gòu)建自定義盾牌?

    我正在尋找某種如何為ESP8266構(gòu)建自定義盾牌的指南。 到目前為止,我已經(jīng)使用 NODEMCU 構(gòu)建了功能原型,但我現(xiàn)在想簡(jiǎn)化事情并使其更小。 1. 是否有一些書(shū)面的、開(kāi)放的硬件指南 (很好
    發(fā)表于 07-08 07:17

    ESP8266網(wǎng)絡(luò)天氣時(shí)鐘OLED顯示

    基于ESP8266實(shí)現(xiàn)網(wǎng)絡(luò)獲取天氣和時(shí)鐘并OLED顯示
    的頭像 發(fā)表于 06-28 04:46 ?2119次閱讀
    <b class='flag-5'>ESP8266</b>網(wǎng)絡(luò)天氣時(shí)鐘OLED顯示

    求助,eclipse配置esp32后怎么配置esp8266

    eclipse配置esp32后怎么配置esp8266?可以同時(shí)開(kāi)發(fā)
    發(fā)表于 06-20 06:55
    主站蜘蛛池模板: 在线你懂的视频 | 一级片在线视频 | 日韩在线三级视频 | 在线麻豆国产传媒60在线观看 | 日本午夜大片免费观看视频 | 久久99精品久久久久久久不卡 | 国产网站免费看 | 天天干夜夜操美女 | 三级四级特黄在线观看 | 午夜影院毛片 | 久久国产精品99精品国产987 | 欧美一区二区三区免费高 | 影院午夜 | 国产成人综合自拍 | 怡红院国产 | 教官的好爽好深h片段 | 一区视频在线播放 | 狠狠综合 | 人与性www | 国产乱码1卡一卡二卡 | 2018国产大陆天天弄 | 午夜影视在线免费观看 | 毛片天天看 | 成人欧美精品久久久久影院 | 三级在线观看网站 | 免费在线观看一区二区 | 狠狠操狠狠干 | www在线播放| 黄色网在线 | 加勒比黑人喝羽月希奶水 | avhd101天天看新片 | 久久婷婷国产一区二区三区 | 美女毛片免费看 | 特黄特色大片免费视频大全 | 五月婷婷综合基地 | 狠狠干综合 | 一区二区三区高清视频在线观看 | 日韩一区二区在线观看 | 日本黄色免费电影 | 国产午夜三区视频在线 | 免费 在线观看 视频 |