跳到主要内容

CoAP 驱动 — 技术参考

PlantPulse Edge 的 CoAP 驱动是对 Eclipse Californium 3.13.0 库进行封装的 Java 实现。 通过 GET / PUT 访问低功耗 IoT 设备(RFC 7252)的资源 URI。

源码:plantpulse.driver.protocol.coap.*

职责
CoAPDriverProtocolDriver 实现 — connect/read(GET)/write(PUT)/close,按 resource 缓存 CoapClient

依赖库:

  • lib/californium-core-3.13.0.jar
  • lib/element-connector-3.13.0.jar

工作流程

[connect] CoapClient(baseUri) 생성 → setConnected(true)

[read] resource path → resourceUri = baseUri + "/" + path
→ resourceClients.computeIfAbsent(uri, CoapClient::new)
→ CoapClient.get() (synchronous)
→ resp.isSuccess() ? resp.getResponseText() : ""

[write] resourceClients.computeIfAbsent(uri, CoapClient::new)
→ CoapClient.put(value, MediaTypeRegistry.TEXT_PLAIN /* 0 */)
→ resp.isSuccess()

[close] 모든 CoapClient.shutdown() + resourceClients.clear()

CoAP 基于 UDP,因此是 connectionless —— 仅创建客户端对象即视为 “connected”。 设备的实际可用性要到首次 read 时才能确认。


选项 (BasicDriverSource.options)

本驱动没有任何选项。 连接只使用 host 与 port 两个值。

即使填入 dtls · psk-identity · psk-key 也不会有任何效果

驱动始终以 coap:// 形式构建连接 URI。即使在选项中填入 dtls=true, 或将 port 指定为 DTLS 标准端口 5684,通信仍以明文 CoAP 发出 —— 而且不会报错, 容易被误认为已加密。

对于需要 DTLS 的设备,请在设备前部署 DTLS 终结网关,并用本驱动读取网关的明文侧。

请求超时同样无法指定,直接沿用 Californium 的默认值。 对于响应较慢的设备,请通过延长采集周期(timecycle)来应对,而非调整超时。


地址 (resource path) 格式

格式转换结果
/sensors/temperaturecoap://host:5683/sensors/temperature
sensors/temperaturecoap://host:5683/sensors/temperature(自动补全前导 /)
/.well-known/core设备的资源发现 —— 已注册资源列表 (CoRE Link Format)

按 resource 缓存 CoapClient 以复用 socket。close() 时全部 shutdown。


响应处理

Californium 响应驱动处理
resp == nullread = "",write = false
resp.isSuccess() (2.xx)read = resp.getResponseText(),write = true
resp.getCode() 错误 (4.xx / 5.xx)warn 日志 + read = "",write = false

CoAP 响应文本与 mediaType 无关,均按原样以 String 返回 —— 若设备以 JSON 响应, 需由调用方(PlantPulse 的 JsonExtract)解码。CBOR 响应会以文本形式显示,需要额外的解码器(当前不支持)。


单元测试

test/java/plantpulse/driver/protocol/coap/CoAPDriverTest.java — 13 个方法:

  • 类加载 + 初始状态
  • 元信息 (isWriteSupported / isExternal / getDriverSource)
  • 未连接状态下 read / write 安全(无 NPE)
  • close() 安全
  • baseUri() — 显式指定 / 默认端口
  • resourceUri() — 前导 / 补全
  • getDebugBaseUrl()coap://host:port

无网络调用的构建隔离测试(./gradlew test 全绿)。


参考