CoAP 驱动 — 技术参考
PlantPulse Edge 的 CoAP 驱动是对 Eclipse Californium 3.13.0 库进行封装的 Java 实现。 通过 GET / PUT 访问低功耗 IoT 设备(RFC 7252)的资源 URI。
源码:plantpulse.driver.protocol.coap.*
| 类 | 职责 |
|---|---|
CoAPDriver | ProtocolDriver 实现 — connect/read(GET)/write(PUT)/close,按 resource 缓存 CoapClient |
依赖库:
lib/californium-core-3.13.0.jarlib/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/temperature | coap://host:5683/sensors/temperature |
sensors/temperature | coap://host:5683/sensors/temperature(自动补全前导 /) |
/.well-known/core | 设备的资源发现 —— 已注册资源列表 (CoRE Link Format) |
按 resource 缓存 CoapClient 以复用 socket。close() 时全部 shutdown。
响应处理
| Californium 响应 | 驱动处理 |
|---|---|
resp == null | read = "",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 全绿)。