メインコンテンツまでスキップ

CoAP Driver — 技術リファレンス

PlantPulse Edge の CoAP ドライバは Eclipse Californium 3.13.0 ライブラリをラップした Java 実装です。 低消費電力 IoT デバイス (RFC 7252) のリソース URI に GET / PUT でアクセスします。

ソース: 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 を指定しても効果はありません

ドライバは接続 URI を常に coap:// として生成します。オプションに 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 応答driver 処理
resp == nullread = ""、write = false
resp.isSuccess() (2.xx)read = resp.getResponseText()、write = true
resp.getCode() エラー (4.xx / 5.xx)warn log + 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 グリーン)。


参考