十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

arduino-esp32 OpenThread 实战:greenhouse_client 双传输 CoAP 温室控制器(Thread Joiner + CoAPS)

arduino-esp32 OpenThread 实战:greenhouse_client 双传输 CoAP 温室控制器(Thread Joiner + CoAPS) arduino-esp32 OpenThread 实战greenhouse_client 双传输 CoAP 温室控制器Thread Joiner CoAPS【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32greenhouse_client是 CoAP Greenhouse 演示中的客户端工程它先在setup()中运行 Thread Joiner 状态机完成组网入网随后以“明文 CoAP 拉取遥测 CoAPS 可靠写入执行器”的双传输模式驱动一套简单的温室自动化逻辑温度过高开风扇、光照不足开水阀。读完本文你将掌握该客户端的入网时序、8 秒/24 秒双循环节拍设计、全部可调常量、预期串口输出与常见故障定位方法并能对照 OpenThread 库源码 理解每个 API 的底层语义。在 Greenhouse 双传输架构中的角色Greenhouse 演示模拟典型的 IoT 分工开放遥测走明文 CoAP受认证的执行器走 CoAPSDTLS 加密的 CoAP。一个服务器节点 一个客户端节点即可展示多资源、CON/NON 报文选择、以及同一对 Mesh 节点上的双传输并存工程角色greenhouse_serverLeader Commissioner 明文/CoAPS 双服务器5683/5684greenhouse_clientJoiner 入网 NON GET 轮询遥测 CON PUT 下发控制客户端负责四个资源中的“读”和“写”两端资源路径传输方法可靠性用途greenhouse/temp明文 5683GETNON温度°Cgreenhouse/light明文 5683GETNON光照luxvalve/waterCoAPS 5684PUTCON灌溉 0–100%fan/speedCoAPS 5684PUTCON通风 0–100%资源表与双传输总览见 CoAP Greenhouse 组级说明完整示例索引见 Native CoAP 示例总览。支持的目标板SoC支持 Thread状态ESP32-H2是支持ESP32-C6是支持ESP32-C5是支持必需的 IDF 特性sdkconfig特性作用CONFIG_OPENTHREAD_ENABLEDy编译 OpenThread 协议栈CONFIG_SOC_IEEE802154_SUPPORTEDy确保 SoC 带有 802.15.4 射频CONFIG_OPENTHREAD_JOINERy启用 sketch 用到的otJoiner*APIOPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE1启用 5684 端口的 CoAPS 执行器客户端MBEDTLS_KEY_EXCHANGE_PSK_ENABLED演示使用的 PSK 密码套件其中前三项也是 CI 构建校验清单 中列出的必需配置CoAPS 两项则决定了“安全控制循环”能否运行详见下文 启用 CoAPS。运行前提与启动顺序先起服务器一台 greenhouse_server 必须先运行等待其 Commissioner 就绪且明文5683与 CoAPS5684两个服务均在监听。客户端只在setup()中入网失败时通过OThread.stop()后重试若客户端在服务器 Commissioner 激活之前就已上电需复位客户端重新入网。凭据必须一致COAP_PSK与COAP_PSK_ID必须与服务器端一致PSKD必须与服务器 Commissioner 配置的 Joiner 密钥一致演示共用J01NME网络名ESP_OT_CoAP_Greenhouse信道 15PAN ID0xBEE5。控制命令有条件跳过在第一次成功遥测轮询使lastTempC 0之前控制命令一律不发避免向未知环境下发执行器状态。代码走读入网、轮询与控制三条主线以下分析基于 greenhouse_client.ino全部可调常量集中在文件头部L33–L44。1) Joiner 入网startJoiner()start()getLeaderRloc()// 1) Join the greenhouse network via Commissioner. OThread.startJoiner(J01NME, JOIN_TIMEOUT_MS); OThread.start(); serverIp OThread.getLeaderRloc();joinNetwork()L74–L95的实际流程是OThread.setChannel(CHANNEL_HINT)设定 802.15.4 信道提示默认 15再networkInterfaceUp()拉起 IPv6 接口OThread.startJoiner(PSKD, JOIN_TIMEOUT_MS)同步运行 Joiner 状态机——从 OThread.h 的接口注释可见该调用要求 IPv6 栈已建立且 Thread 协议尚未启动成功后由 Commissioner 下发 Active Dataset返回OT_ERROR_NONE才继续PSKd 的合法格式为 6–32 位 Base32 字符OThread.start()正式启动 Thread 协议waitForAttach()L55–L72轮询OThread.otGetDeviceRole() OT_ROLE_CHILD期间每 2 秒打印一个句点最长等待ATTACH_TIMEOUT_MS30 s入网成功后取serverIp OThread.getLeaderRloc()——即 OThread.h 声明的 Thread Leader RLOC 地址fdde:ad00:beef::前缀的链路本地地址后续所有 CoAP 请求都直接发往该地址无需 DNS/地址解析。2) 遥测轮询8 秒一次明文 NON GET// 2) Every TELEMETRY_MS: NON GET telemetry. PlainClient.setConfirmable(false); PlainClient.GET(serverIp, greenhouse/temp); PlainClient.GET(serverIp, greenhouse/light);pollTelemetry()L97–L116用 OThreadCoAPClient 发起阻塞式 GETsetConfirmable(false)使请求使用NON不可靠但开销小报文适合周期性遥测GET()返回 CoAP 响应码≥0或负的OT_COAP_ERROR_*错误码负值时用OThreadCoAP::errorToString(code)翻译后打印响应体经getString().toFloat()解析为lastTempC/lastLightLux缓存供控制循环读取该实例的超时由PlainClient.setTimeout(3000)设定。注意 OThreadCoAPClient::setTimeout 的文档说明对 CON 报文栈层重传时机默认会与 sketch 超时对齐对 NON 报文则仅作 sketch 层等待上限。loop()中用now - lastTelemetryMs TELEMETRY_MS默认 8000 ms做节拍控制每轮delay(100)让出 CPU并在设备掉线角色低于 CHILD时直接空转等待。3) 控制循环24 秒一次 CoAPS CON PUTDTLS 会话按周期开关// 3) Every CONTROL_MS: automation CoAPS CON PUT. SecureClient.connect(serverIp); SecureClient.PUT(fan/speed, fanPercent); // temp 26 C - 75% SecureClient.PUT(valve/water, valvePercent); // light 8000 lux - 60% SecureClient.disconnect();runControlLoop()L130–L151体现三条设计决策运行时能力探测入口先检查OThreadCoAP::secureApiEnabled()——该函数在 OThreadCoAP.cpp 中直接编译期判定OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE。若固件未启用 CoAPS安全控制循环被整体跳过明文遥测不受影响DTLS 会话按控制周期开关connect(serverIp)→ 两次PUT→disconnect()避免长连接在 Mesh 低功耗场景下的维护成本OThreadCoAPSecureClient 默认连接端口 5684connect()阻塞直至 DTLS 握手完成或setConnectTimeout(10000)超时简单双阈值自动化lastTempC 26.0 °C→ 风扇 75%否则 15%lastLightLux 8000 lux→ 水阀 60%否则 10%。sendSecurePut()L118–L128把百分比转成十进制字符串 payload发送 CON PUT 并打印响应码如2.04 Changed。setup()L153–L179中的初始化顺序值得注意OThread.begin(false)启动 OpenThread 但不自动start()随后按secureApiEnabled()分支初始化SecureClient的 PSK、握手超时10 s、请求超时5 s与 CON 模式最后进入while (!joinNetwork())死循环——失败则打印Join failed, retry in 3s...、OThread.stop()、delay(3000)后重试。共享凭据一览参数值网络名ESP_OT_CoAP_Greenhouse信道15PAN ID0xBEE5Thread Joiner PSKdJ01NMECoAPS PSK IDesp-coap-demoCoAPS PSK 本体为 16 字节常量数组0x10…0xF0, 0x00定义在 sketch 头部 L43服务器端必须使用相同的 key 与 identity。预期串口输出成功入网并跑通双传输时的输出 CoAP Greenhouse — client Joining Thread network (Joiner)... Commissioning with PSKd J01NME... Waiting for attach.. Attached as Child. Greenhouse server: fdde:ad00:beef:0:0:ff:fe00:0 Ready. Polling telemetry and running control loop. [plain NON] temp24.3 C [plain NON] light11500 lux Control: temp24.3 fan15% light11500 valve10% [CoAPS CON] PUT fan/speed15 - 2.04 Changed [CoAPS CON] PUT valve/water10 - 2.04 Changed若固件未启用 CoAPS明文遥测仍正常工作 CoAP Greenhouse — client ... CoAPS is not enabled in this build. Secure control will not run. Ready. Polling telemetry and running control loop. [plain NON] temp24.3 C [plain NON] light11500 lux若入网失败 CoAP Greenhouse — client Joining Thread network (Joiner)... Commissioning with PSKd J01NME... Joiner failed: 7 Join failed, retry in 3s...自定义参数.ino 文件顶部的全部可调项常量作用PSKDThread Joiner 的 Pre-Shared Key for Device必须与服务器 Commissioner 一致CHANNEL_HINT802.15.4 信道提示默认 15JOIN_TIMEOUT_MSstartJoiner()内部等待 Commissioner 的最长时间60 sATTACH_TIMEOUT_MS/ATTACH_DOT_MS等待角色达到 Child 的超时30 s与等待动画句点间隔2 sTELEMETRY_MS明文 NON 遥测轮询间隔默认 8000 msCONTROL_MSCoAPS 控制循环间隔默认 24000 msTEMP_FAN_ON_C温度超过该值时风扇 75%默认 26.0LIGHT_VALVE_LUX光照低于该值时水阀 60%默认 8000COAP_PSK16 字节 CoAPS 预共享密钥——必须与服务器一致COAP_PSK_IDPSK identity 字符串默认esp-coap-demo超时相关明文客户端PlainClient.setTimeout(3000)安全客户端SecureClient.setConnectTimeout(10000)DTLS 握手SecureClient.setTimeout(5000)请求等待。启用 CoAPSArduino as ESP-IDF componentCoAPS 依赖OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE1。标准 Arduino IDE 平台构建可能不含 CoAPS 安全 API若OThreadCoAP::secureApiEnabled()返回 false应将 sketch 作为ESP-IDF 组件项目重新构建.ino改为.cpp放入main/idf.py set-target soc后idf.py menuconfig并在 menuconfig 中启用OpenThread、Thread Core Features 中的Enable Joiner客户端所需、mbedTLS 的 PSK 密码套件以及 OpenThread 自定义头文件选项。OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE不是直接的 menuconfig 开关需在自定义 OpenThread 头文件中定义#define OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE 1完整的 menuconfig 表格与步骤见 CoAP Greenhouse 组级说明 的Enabling CoAPS一节方法同样适用于本客户端工程。故障排查启动顺序总原则先烧录并运行 greenhouse_server等待Commissioner ready与明文/CoAPS 两个监听提示出现再烧录本客户端。若客户端先于服务器就绪而上电直接复位客户端。现象可能原因Join failed, retry in 3s...服务器 Commissioner 未就绪——先启动服务器再复位客户端CoAPS is not enabled in this build固件缺少 CoAPS。按上文方法以 ESP-IDF 组件方式重编客户端会跳过安全控制明文 GET 仍运行明文 GET 正常但DTLS connect failed服务器 CoAPS 未运行、PSK 不匹配、或固件未启用 CoAPS约 24 s 内没有控制输出控制循环在等待首次成功遥测lastTempC 0CON PUT ... failed: Timeout服务器 CoAPS 未运行或服务器节点已脱离 Mesh曾成功一次服务器复位后失败复位客户端重新入网服务器内存中的状态在重启后丢失延伸阅读CoAP Greenhouse 组级说明——资源表、双传输架构图与 CoAPS 启用步骤。CoAP Greenhouse — greenhouse_server——配套的双传输网关节点Leader Commissioner。CoAP_Secure — secure_client——仅 CoAPS 传输的最小对照示例。OThreadCoAP.h / OThread.h——本例所用OThreadCoAPClient、OThreadCoAPSecureClient、startJoiner、getLeaderRloc等 API 的完整签名与文档。Native CoAP 示例总览——全部 Native CoAP 演示与端口约定。本示例采用 Apache License 2.0 协议。【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表