CoAP
13
特性
└ The ConstrainedApplication Protocol
└ 封包 overhead 較輕,標頭僅有 4 bytes
└ 專為 M2M 應用打造
└ 使用 coap:// 協定,易於和 HTTP 結合
└ 基於 UDP
└ 支援 GET, POST, PUT, DELETE 請求方法
└ 支援 URI、加解密與認證、discovery 功能
Proxy
HTTP
HTTP
CoAP
CoAP
Internet Constrained Environment
REST
Constrained Link
IP
UDP
CoAP
Web Resources
CoAP Stack
為資源受限的裝置所量身訂製的 RESTful 協定
15.
Web 世界的資源命名
14
Universal ResourceLocator (URL)
http:// www.example.com :8080 /sensors ?id=light
PortScheme Authority Path Query
Resource
HTTP
TCP
IP
Ethernet Link
DNS
2001:dead:beef::1
16.
Web 世界的資源命名
15
Universal ResourceLocator (URL)
coap:// www.example.com :5683 /sensors ?id=light
PortScheme Authority Path Query
Web Resources
CoAP
UDP
IP
Constrained Link
DNS
2001:dead:beef::1
36
var cserver =require('coap-shepherd');
cserver.on('ready', function () {
console.log('>> coap-shepherd server start!');
console.log('>> Permit devices joining for 180 seconds');
cserver.permitJoin(180);
});
cserver.start(function (err) {
if (err)
console.log(err);
});
app.js
38.
37
cserver.on('ind', function (msg){
switch (msg.type) {
case 'devIncoming':
devIncomingHandler(msg);
break;
case 'devStatus':
devStatusHandler(msg);
break;
case 'devNotify':
devNotifyHandler(msg);
break;
default:
// Not deal with other msg.type in this example
break;
}
});
app.js
39.
38
function devIncomingHandler(msg) {
varcnode = msg.cnode;
if (cnode.clientName === 'my_client_id_cnode001') {
cnode.readReq('temperature/0/sensorValue', function (err, rsp) {
if (!err)
console.log('>> Current temperature value at machine: ' + rsp.data);
});
}
}
app.js
40.
39
function devStatusHandler(msg) {
varcnode = msg.cnode;
if (cnode.clientName === 'my_client_id_cnode001' && msg.data === 'online') {
// setting for notification of led state reporting
cnode.observeReq('temperature/0/sensorValue', function (err, rsp) {
console.log('>> Temperature observation starts: ' + rsp.status);
});
}
}
app.js
41.
40
function devNotifyHandler(msg) {
vardata = msg.data,
node = cserver.find('my_first_node');
if (data && data.path === ‘/temperature/0/sensorValue') {
console.log(‘>> Temperature value at machine changed: ' + data.value);
}
}
app.js
42.
修改註冊 IP 位址
41
修改cnode1.js 中的 IP 位址為 coap-shepherd 所在電腦的 IP 位置
// ...略
cnode1.register('192.168.1.196', 5683, function (err, msg) {
if (err) {
console.log(err);
} else {
if (msg.status !== '2.01') {
setTimeout(startRegister, 5000);
}
}
});
module.exports = cnode1;
cnode1.js
$ ifconfig
於電腦終端機執行指令 $ ifconfig 取得 IP 位置
#7 IPSO 定義了一個階層式的資料模型來描述真實世界的裝置資源。
一個物件 (Object) 就像是一個類別 (Cless),並且每個物件實例 (Object Instance) 是物件的實體。
每一個物件、物件實例和資源都有自己唯一的 Id,物件的 Id 可用於判斷屬於什麼類別;物件實例的 Id 可用於識別自身;資源的 Id 則是資源的名稱。