完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有这个基于 esp8266 的项目:
在模块上,我有一个用于跟踪时间的 RTC 模块、一个 LED 和一个用于控制 LED 的按钮。 还有一个运行 php 和 mySQL 的网站,带有控制 LED 的按钮。 每 3 秒,模块将每个配置的时间戳发送到服务器。服务器将收到的时间戳与数据库中的时间戳进行比较。如果收到的时间戳比数据库旧,则向模块发送新的时间戳和配置,否则更新数据库。 每次,模块连接到服务器,最后断开连接。此同步过程适用于未加密的连接。但是当我使用 SSL 时,特别是在建立连接上需要更长的时间。 我听说过 Websockets。是否可以使用 Websockets 使我的连接保持活动状态并仅发送/接收数据?有例子吗? 还是有更好的方式与加密连接同步? 实际上我的项目远比这复杂,我通过将同步过程拆分为由 TaskScheduler 库管理的多个函数来优化它。 我把它缩减为: 代码:全选#include #include #include WiFiClientSecure CLIENT; Task TASK_ESP_WIFI(3000, TASK_FOREVER, &ESP_WIFI_ANALYSE); Task TASK_ESP_SYNC(1500, TASK_FOREVER, &ESP_SYNC_CONNECT); bool LED_UPLOAD = false; DynamicJsonDocument ESP_SYNC_REQUEST_JSONDOC(3000); DynamicJsonDocument ESP_SYNC_RESPONSE_JSONDOC(3000); //////////////////////////////////////////////////////////////// // This executes on setup() void ESP_INIT(void) { WiFi.persistent(true); WiFi.mode(WIFI_STA); WiFi.setAutoReconnect(true); WiFi.begin(CONFIG.SSID, CONFIG.PASSWORD); CLIENT.settimeout(200); CLIENT.setInsecure(); } //////////////////////////////////////////////////////////////// // This executes every 3 seconds void ESP_WIFI_ANALYSE(void) { if (WiFi.status() == WL_CONNECTED) { TASK_ESP_SYNC.enableIfNot(); } else { TASK_ESP_SYNC.disable(); } } //////////////////////////////////////////////////////////////// void ESP_SYNC_CONNECT(void) { if (CLIENT.connect(ESP_SYNC_HOST, 443)) { TASK_ESP_SYNC.setCallback(&ESP_SYNC_BUILD); TASK_ESP_SYNC.setInterval(500); } else { CLIENT.flush(); CLIENT.stop(); TASK_ESP_SYNC.setCallback(&ESP_SYNC_CONNECT); TASK_ESP_SYNC.setInterval(1000); } } //////////////////////////////////////////////////////////////// void ESP_SYNC_BUILD(void) { JsonArray tmp_LED_ARRAY = ESP_SYNC_REQUEST_JSONDOC.createNestedArray(\"LED\"); tmp_LED_ARRAY.add((String)SETTING.LED_TIMESTAMP); if (LED_UPLOAD) { tmp_LED_ARRAY.add((String)SETTING.LED_MODE); } #endif TASK_ESP_SYNC.setCallback(&ESP_SYNC_SEND); TASK_ESP_SYNC.setInterval(500); } //////////////////////////////////////////////////////////////// void ESP_SYNC_SEND(void) { String tmp_ESP_SYNC_REQUEST_BODY; serializeJson(ESP_SYNC_REQUEST_JSONDOC, tmp_ESP_SYNC_REQUEST_BODY); CLIENT.println(\"POST \" + (String)ESP_SYNC_URL + \" HTTP/1.1\"); CLIENT.println(\"Host: \" + (String)ESP_SYNC_HOST); CLIENT.println(\"Content-Type: application/json\"); CLIENT.println(\"Content-Length: \" + (String)tmp_ESP_SYNC_REQUEST_BODY.length()); CLIENT.println(); CLIENT.print(tmp_ESP_SYNC_REQUEST_BODY); if (CLIENT.println() != 0) { TASK_ESP_SYNC.setCallback(&ESP_SYNC_RECEIVE); TASK_ESP_SYNC.setInterval(500); } else { CLIENT.flush(); CLIENT.stop(); TASK_ESP_SYNC.setCallback(&ESP_SYNC_CONNECT); TASK_ESP_SYNC.setInterval(1000); } } //////////////////////////////////////////////////////////////// void ESP_SYNC_RECEIVE(void) { while (CLIENT.available()) tmp_PHP_RESULT = CLIENT.readStringUntil(\'\\n\'); if (tmp_PHP_RESULT.length() > 0) { DeserializationError tmp_JSON_ERROR; tmp_JSON_ERROR = deserializeJson(ESP_SYNC_RESPONSE_JSONDOC, tmp_PHP_RESULT); if (!tmp_JSON_ERROR) { TASK_ESP_SYNC.setCallback(&ESP_SYNC_DECODE); TASK_ESP_SYNC.setInterval(500); } else { TASK_ESP_SYNC.setCallback(&ESP_SYNC_CONNECT); TASK_ESP_SYNC.setInterval(1000); } } else { TASK_ESP_SYNC.setCallback(&ESP_SYNC_CONNECT); TASK_ESP_SYNC.setInterval(1000); } CLIENT.flush(); CLIENT.stop(); } //////////////////////////////////////////////////////////////// void ESP_SYNC_DECODE(void) { if (ESP_SYNC_RESPONSE_JSONDOC.containsKey(\"LED\")) { if (SETTING.LED_TIMESTAMP < (int)ESP_SYNC_RESPONSE_JSONDOC[\"LED\"][0]) { SETTING.LED_TIMESTAMP = (int)ESP_SYNC_RESPONSE_JSONDOC[\"LED\"][0]; SETTING.LED_STATUS_MODE = (int)ESP_SYNC_RESPONSE_JSONDOC[\"LED\"][1]; LED_UPLOAD = false; } else if (SETTING.LED_TIMESTAMP > (int)ESP_SYNC_RESPONSE_JSONDOC[\"LED\"][0]) { LED_UPLOAD = true; } else { LED_UPLOAD = false; } } TASK_ESP_SYNC.setCallback(&ESP_SYNC_CONNECT); TASK_ESP_SYNC.setInterval(1000); } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
313 浏览 0 评论
1170 浏览 1 评论
586浏览 6评论
483浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
442浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 20:46 , Processed in 0.754709 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号