Zum Hauptinhalt springen

CoAP-Treiber

Der CoAP-Treiber von PlantPulse Edge ist eine Java-Implementierung, die die Eclipse Californium 3.13.0-Bibliothek umschließt. Er greift über GET / PUT auf Ressourcen-URIs von energiesparenden IoT-Geräten (RFC 7252) zu.

Quelle: plantpulse.driver.protocol.coap.*

KlasseVerantwortung
CoAPDriverProtocolDriver-Implementierung — connect/read(GET)/write(PUT)/close, CoapClient-Cache pro Ressource

Bibliothek:

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

Ablauf​

[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 basiert auf UDP und ist daher connectionless — allein durch die Erzeugung des Client-Objekts gilt die Verbindung als "connected". Die tatsächliche Verfügbarkeit des Geräts wird erst beim ersten read überprüft.


Optionen (BasicDriverSource.options)​

Dieser Treiber hat keine Optionen. Für die Verbindung werden ausschließlich host und port verwendet.

dtls · psk-identity · psk-key haben keinerlei Wirkung

Der Treiber bildet die Verbindungs-URI immer als coap://. Selbst wenn Sie dtls=true in den Optionen setzen oder den Port auf 5684, den DTLS-Standardport, festlegen, erfolgt die Kommunikation im Klartext per CoAP — es wird auch kein Fehler ausgegeben, sodass leicht der Eindruck entsteht, die Verbindung sei verschlüsselt.

Für Geräte, die DTLS benötigen, platzieren Sie ein DTLS-Terminierungsgateway vor dem Gerät und lesen Sie dessen Klartext-Seite mit diesem Treiber.

Auch ein Anforderungs-Timeout ist nicht konfigurierbar. Der Californium-Standardwert wird unverändert angewendet. Bei Geräten, die langsam antworten, erhöhen Sie stattdessen die Erfassungsperiode (timecycle) anstelle des Timeouts.


Adressformat (resource path)​

FormatUmwandlungsergebnis
/sensors/temperaturecoap://host:5683/sensors/temperature
sensors/temperaturecoap://host:5683/sensors/temperature (führendes / wird automatisch korrigiert)
/.well-known/coreRessourcen-Discovery des Geräts — Liste der registrierten Ressourcen (CoRE Link Format)

Pro Ressource wird CoapClient gecacht, sodass Sockets wiederverwendet werden. Bei close() werden alle geschlossen.


Antwortverarbeitung​

Californium-AntwortTreiberbehandlung
resp == nullread = "", write = false
resp.isSuccess() (2.xx)read = resp.getResponseText(), write = true
resp.getCode()-Fehler (4.xx / 5.xx)warn log + read = "", write = false

Der Antworttext von CoAP wird unabhängig vom mediaType unverändert als String zurückgegeben — wenn das Gerät mit JSON antwortet, erfolgt die Dekodierung auf der Aufruferseite (der JsonExtract von PlantPulse). CBOR-Antworten werden als Text angezeigt, daher ist ein separater Dekoder erforderlich (derzeit nicht unterstützt).


Unit-Tests​

test/java/plantpulse/driver/protocol/coap/CoAPDriverTest.java — 13 Methoden:

  • Klassenladen + Anfangszustand
  • Metadaten (isWriteSupported / isExternal / getDriverSource)
  • Sicherheit bei read / write ohne Verbindung (kein NPE)
  • Sicherheit bei close()
  • baseUri() — expliziter / Standard-Port
  • resourceUri() — Korrektur des führenden /
  • getDebugBaseUrl() — coap://host:port

Build-isolierte Tests ohne Netzwerkaufrufe (./gradlew test grün).


Referenzen​