W3C WoT Binding Template specification for CoAP can be found here.
Current Maintainer(s): @JKRhb
The protocol prefix handled by this binding is coap:// or coaps://.
In the following examples, how to use the CoAP binding of node-wot is shown.
npm install @node-wot/corenpm install @node-wot/binding-coap
The client example tries to connect to a TestThing via CoAP and read the string property.
The Thing Description is located under the following CoAP URI coap://plugfest.thingweb.io:5683/testthing.
node example-client.js
// example-client.js
const { Servient } = require("@node-wot/core");
const { CoapClientFactory } = require("@node-wot/binding-coap");
// create Servient and add CoAP binding
const servient = new Servient();
servient.addClientFactory(new CoapClientFactory());
servient
.start()
.then(async (WoT) => {
try {
const td = await WoT.requestThingDescription("coap://plugfest.thingweb.io:5683/testthing");
const thing = await WoT.consume(td);
// read property
const read1 = await thing.readProperty("string");
console.log("string value is: ", await read1.value());
} catch (err) {
console.error("Script error:", err);
}
})
.catch((err) => {
console.error("Start error:", err);
});The CoAP binding also supports secure communication over coaps:// using DTLS with Pre-Shared Keys (PSK).
To use PSK security, define a psk security scheme in the Thing Description and provide the credentials when consuming the Thing.
{
"title": "SecureThing",
"securityDefinitions": {
"psk_sc": {
"scheme": "psk"
}
},
"security": ["psk_sc"],
"properties": {
"count": {
"type": "integer",
"forms": [
{
"href": "coaps://localhost:5684/count"
}
]
}
}
}const { Servient } = require("@node-wot/core");
const { CoapClientFactory } = require("@node-wot/binding-coap");
const servient = new Servient();
servient.addClientFactory(new CoapClientFactory());
servient
.start()
.then(async (WoT) => {
try {
const td = await WoT.requestThingDescription("coaps://localhost:5684/secureThing");
const thing = await WoT.consume(td);
// configure PSK security
thing.setSecurity(td.securityDefinitions, {
identity: "Client_identity",
psk: "secretPSK",
});
const value = await thing.readProperty("count");
console.log("count value is:", await value.value());
} catch (err) {
console.error("Script error:", err);
}
})
.catch((err) => {
console.error("Start error:", err);
});- The
identitymust match the server configuration. - The
pskmust match the server's configured secret. - Currently, only the
psksecurity scheme is supported forcoaps://in this binding.
The server example produces a thing that allows for setting a property count. The thing is reachable through CoAP.
node example-server.js
// example-server.js
const { Servient } = require("@node-wot/core");
const { CoapServer } = require("@node-wot/binding-coap");
// create Servient add HTTP binding
const servient = new Servient();
servient.addServer(new CoapServer());
servient.start().then((WoT) => {
WoT.produce({
title: "MyCounter",
properties: {
count: {
type: "integer",
},
},
}).then((thing) => {
console.log("Produced " + thing.getThingDescription().title);
let count = 0;
// set property handlers (using async-await)
thing.setPropertyReadHandler("count", async () => count);
thing.setPropertyWriteHandler("count", async (intOutput) => {
count = await intOutput.value();
});
thing.expose().then(() => {
console.info(thing.getThingDescription().title + " ready");
console.info("TD : " + JSON.stringify(thing.getThingDescription()));
});
});
});