ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

arduino-esp32 OpenThread Native CoAP 入门实战:CoAP_SimpleGet 双板示例与源码级解析

arduino-esp32 OpenThread Native CoAP 入门实战:CoAP_SimpleGet 双板示例与源码级解析 arduino-esp32 OpenThread Native CoAP 入门实战CoAP_SimpleGet 双板示例与源码级解析【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32在 ESP32 系 SoCH2/C6/C5上用 Thread 组网后如何在应用层跑通最基础的一问一答本文以 arduino-esp32 仓库中的 CoAP SimpleGet 示例 为核心完整拆解这块最小双板演示一块板作为 Thread Leader 兼 CoAP 服务器监听路径hello另一块板仅凭共享网络密钥NETKEY加入网络发送一次 confirmable GET 并把响应 payload 打印到串口。读完本文你将掌握 Native CoAP APIOThreadCoAPServer/OThreadCoAPClient的完整调用链、固定操作数据集DataSet的组网方式、串口预期输出以及各类故障现象的排查路径并能对照 OThreadCoAP.h 理解端口、超时与确认模式的底层约定。1. 演示拓扑与核心参数示例位于 libraries/OpenThread/examples/Native/CoAP/CoAP_SimpleGet/由两个 sketch 组成Sketch角色serverThread Leader CoAP 服务器监听 UDP 端口 5683clientThread Child 一次性one-shotGET 客户端两端共享的组网参数硬编码在 server.ino 顶部参数值网络名称ESP_OT_CoAP_Demo802.15.4 信道24PAN ID0xC0A0扩展 PAN ID{0xC0, 0xA0, 0x00, 0x00, 0x47, 0x45, 0x54, 0x01}网络密钥 NETKEY00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff128 位CoAP 路径hello这套数据集刻意选择固定值 无需 Commissioner的方式Leader 用ds.initNew()创建全新网络Client 端只提交 NETKEY信道、PAN ID、扩展 PAN ID 全部在 attach 阶段从 Leader 学习。这是该示例区别于 ThreadCommissioningJoiner/Commissioner示例的关键简化点也决定了它要求server 必须先启动。支持的目标 SoC 为ESP32-H2、ESP32-C6、ESP32-C5均带 802.15.4 射频并支持 Thread每个 sketch 目录下有 ci.yml 声明的构建前提。2. 运行步骤How to Run在一块 ESP32-H2 / ESP32-C6 / ESP32-C5 板上烧录 server sketch打开 115200 波特率的串口监视器等待串口打印Attached as Leader与CoAP server listening on path hello在第二块板上烧录 client sketchNETKEY必须与 server 一致Client 会对hello发起一次 GET并把 CoAP 响应码与 payload 打印出来。所需 IDF 编译特性sdkconfig只有两项两个 sketch 都依赖特性用途CONFIG_OPENTHREAD_ENABLEDy构建 OpenThread 协议栈CONFIG_SOC_IEEE802154_SUPPORTEDy确保 SoC 具备 802.15.4 射频普通 CoAPUDP 5683在上述默认配置下即可工作无需 CoAPS 所需的OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE等额外开关见 Native CoAP 示例总览。3. Server 端源码走读建网 回调式 CoAP 服务器server.ino 的流程分为三步第一步用固定 DataSet 建网并等待 Leader 角色DataSet ds; ds.initNew(); ds.setNetworkName(ESP_OT_CoAP_Demo); ds.setChannel(CHANNEL); // 24 ds.setPanId(PAN_ID); // 0xC0A0 ds.setExtendedPanId(EXTPANID); ds.setNetworkKey(NETKEY); OThread.commitDataSet(ds); OThread.networkInterfaceUp(); OThread.start();提交数据集后waitForAttach()轮询OThread.otGetDeviceRole() OT_ROLE_CHILD判断 attach 成功超时 20000 ms。成功时打印 Mesh-local EID 与 Leader RLOC这两者是后续客户端定位服务器的地址依据。第二步注册资源回调OThreadCoAPServer.on(hello, OT_COAP_METHOD_GET, onHello); OThreadCoAPServer.begin();注意OThreadCoAPServer是库内单例begin()默认监听标准端口5683宏OT_COAP_DEFAULT_PORT见 OThreadCoAP.h如要改端口需在begin()之前调用OThreadCoAPServer.setPort()。第三步处理器onHello()static void onHello(OThreadCoAPRequest req, OThreadCoAPResponse resp, void *ctx) { if (req.method() ! OT_COAP_REQ_GET) { resp.setCode(OT_COAP_RESP_METHOD_NA); // 405 resp.send(); return; } resp.setCode(OT_COAP_RESP_OK); // 205 Content resp.setPayload(Hello from CoAP!); resp.send(); }这是典型的回调模式loop()中没有任何 CoAP 轮询请求到来时由协议栈自动回调onHello()。从 OThreadCoAP.h 的注释还可以看到一个关键底层约定——自动应答机制如果处理器返回时没有调用response.send()且请求是单播 CON 或 GET服务器会自动回一个无 payload 的 2.05 Content以免 confirmable 客户端一直等待 ACK。反过来这意味处理器若想报 4.xx/5.xx 错误必须自己调用send()否则错误会被静默上报为成功——本示例中 405 分支正是手动send()的示范。4. Client 端源码走读只凭 NETKEY 入网 一次 confirmable GETclient.ino 的入网逻辑与 server 形成对照DataSet ds; ds.clear(); // 注意不是 initNew() ds.setNetworkKey(NETKEY); // 只提交网络密钥 OThread.commitDataSet(ds); OThread.networkInterfaceUp(); OThread.start(); serverIp OThread.getLeaderRloc(); // 以 Leader RLOC 作为 CoAP 目标地址waitForAttach()在等待期间会额外检查角色若设备变成了OT_ROLE_LEADER说明网内没有可用的 Leader——即 server 没先启动客户端自建了网络脚本会直接提示Started as Leader — is server.ino running first?并失败返回。这正是 README 故障表中最常见的症状来源。attach 成功后setup()中执行一次性请求CoapClient.setTimeout(3000); CoapClient.setConfirmable(true); // 可靠 GET等待响应 ACK/消息 delay(500); // 让 server CoAP 服务稳定 int code CoapClient.GET(serverIp, hello); Serial.printf(GET hello - code %d (%s)\n, code, OThreadCoAP::responseCodeToString(code)); if (code 0) { Serial.printf(Payload: %s\n, CoapClient.getString().c_str()); } else { Serial.printf(Error: %s\n, OThreadCoAP::errorToString(code)); }结合 OThreadCoAP.h 的常量定义可以补全几个默认值setTimeout()的库默认值是 5000 msOT_COAP_DEFAULT_TIMEOUT_MS示例缩短为 3000 mssetConfirmable(true)使请求以 CONConfirmable形式发出失败会触发重传并在超时报错NON 模式则是 fire-and-forgetGET()返回值为正数时表示 CoAP 响应码如 205负数时表示库内错误码其中OT_COAP_ERROR_TIMEOUT为 -11见 OThreadCoAP.h#L67-L74可通过OThreadCoAP::errorToString()转为可读字符串。5. 预期串口输出Server成功 CoAP Simple GET — server Forming Thread network... Waiting for attach.. Attached as Leader. Mesh-local EID: fdde:ad00:beef:0:.... Leader RLOC: fdde:ad00:beef:0:0:ff:fe00:0 Starting CoAP server... Ready. CoAP server listening on path helloClient成功 CoAP Simple GET — client Joining Thread network... Waiting for attach.. Attached as Child. Server (Leader RLOC): fdde:ad00:beef:0:0:ff:fe00:0 Ready. Sending GET hello... GET hello - code 205 (2.05 Content) Payload: Hello from CoAP!Clientserver 未先启动时Waiting for attach.. Started as Leader — is server.ino running first? Attach timeout. Thread attach failed.Clientattach 成功但 GET 超时Ready. Sending GET hello... GET hello - code -11 (unknown) Error: timeout其中 -11 即OT_COAP_ERROR_TIMEOUTError:行来自OThreadCoAP::errorToString(code)。6. 故障排查启动顺序是最主要变量先烧录并启动 serverLeader等到Attached as Leader和 CoAP 监听提示后再烧录/复位 client。Client 只需要与 server 相同的NETKEY若 client 在 server 成为 Leader 之前就已启动需复位 client若改动了数据集常量信道/PAN/ExtPAN/NETKEY建议两块板都擦除 flashNVS 中残留的旧数据集会让节点附着到错误的网络表现为 payload 不对或 attach 到错误网络。症状可能原因Client 报Thread attach failed没有先烧录server或NETKEY不一致Client 打印Started as Leaderserver 未运行client 自建了网络——先启动 server再擦除 client flash 重试Client 先于 server 启动网内无 Leader——启动 server 后复位 clientGET hello - error timeoutcode -11两端处于不同 Thread 分区启动顺序错或 server CoAP 服务未启动payload 不对 / 附着到错误网络任一块板 NVS 中残留旧数据集——两块板都擦除 flashServer 报CoAP server start failedOpenThread 未 attach 或端口冲突7. 可定制点与延伸Server 端可调常量server.ino 顶部CHANNEL802.15.4 信道默认 24、PAN_ID默认0xC0A0、EXTPANID64 位固定值多次运行之间不应改动、NETKEY必须与 client 一致。Client 端NETKEY必须与 server 匹配请求超时在setup()中经CoapClient.setTimeout(3000)调整。更高级的可选调用Native CoAP 总览 中有说明OThreadCoAPServer.setPort()自定义监听端口须在begin()前调用、client.useDefaultCoapRetransmit()使用 RFC 7252 默认重传参数、joinMulticastGroup()/leaveMulticastGroup()管理组播成员。横向对比与进阶示例CoAP Light Switch — 基于 CoAP 的组播灯泡控制CoAP Sensor、CoAP CRUD —serve() NON GET 遥测、OThreadCoAPResourceStoreREST 笔记存储CoAP Secure、CoAP Greenhouse — 5684 端口的 CoAPSDTLS/PSK版本需要额外的构建开关CLI CoAP 示例 — 用 OpenThread CLI 字符串驱动的同一类场景可与本文的 Native 类型化 API 对照阅读。8. 小结CoAP_SimpleGet 是理解 arduino-esp32 OpenThread Native API 的最小完整闭环它同时演示了固定 DataSet 建网initNew vs. 仅 NETKEY 入网、回调式 CoAP 服务器含 405 错误处理与自动应答语义、confirmable GET 客户端超时、错误码 -11、响应码 205三块核心 API 面且全程无需 Commissioner。把 server/client 两个 sketch 的源码与 OThreadCoAP.h 中的常量、注释对照阅读再按本文第 2、5、6 节的步骤与故障表操作即可在 H2/C6/C5 硬件上稳定复现这一演示并作为后续 CoAPS、组播控制等进阶示例的起点。【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表