SlideShare a Scribd company logo
1 of 45
CoAP 與 LwM2M 應用實作
易弼仁
目標
1
ATMega32u4
UART
MT7688
節點開發環境準備1
LwM2M Client (coap-node)
LwM2M Server (coap-shepherd)
register() ind
readReq()
writeReq()
組織機器網路與操作遠端節點3
LwM2M Client (coap-node)
SmartObject
設計機器節點2
LwM2M
Server Client
確認 Linkit 7688 Duo 中已有程式碼與 fermata、smartobject 和 coap-node模組
Reset 按鈕與狀態燈號參照表
2
智慧物件
3
應用層統一資料模型
4
訊息/數據
的意義是什麼?
屬性 命令 行為
Physical
Data Link
Network
Transport
> 230 models
2016 (OIC@2014)
51 models
2008
5 Schemas
2015
智慧物件 Smart Object
5
Object
oid = 3303
rid = 5700
Resources
rid = 5701
rid = 5605
Temperature Sensor
Boilerplate
Create instance with an iid
Temperature Sensor
Entity #1
oid = 3303
rid = 5700
rid = 5701
rid = 5605
iid = 1
Object Instance
value
value
value
oid = 3303
rid = 5700
rid = 5701
rid = 5605
iid = 0
Object Instance
value
value
value
Temperature Sensor
Entity #0
IPSO Alliance & IPSO Model
└ 對真實世界的物件資料模型進行標準化
└ 已定義 51 種 Smart Objects,增加中
└ 採用階層化資料模型
└ Object, Object Instance, Resource
請花幾分鐘閱讀
6
溫度感測器的模型
└ https://github.com/AllSmartObjects/smartobject/blob/master/docs/templates.md#tmpl_temperature
電燈的模型
└ https://github.com/AllSmartObjects/smartobject/blob/master/docs/templates.md#tmpl_lightCtrl
SmartObject 模組使用入門
└ Overview: https://github.com/AllSmartObjects/smartobject#1-overview
└ Usage: https://github.com/AllSmartObjects/smartobject#3-usage
SmartObject 的存取介面
└ Read: https://github.com/AllSmartObjects/smartobject#API_read
└ Write: https://github.com/AllSmartObjects/smartobject#API_write
1 mins
1 mins
6 mins
5 mins
smartobject 模組
7
APIs 說 明
new SmartObject() 建立 SmartObject 實例
.init() 建立並初始化一個物件實例 (Object Instance)
.read() 讀取 SmartObject 實例中資源的值
.write() 寫入 SmartObject 實例中資源的值
.dump() 讀取 SmartObject 實例中所有資源的值
smartobject 模組重要 APIs 說明
初始化你的智慧物件專案
8
開一個專案資料夾
進入資料夾
npm init 初始化專案
安裝所需的第三方模組
$ mkdir smart-iot-app
$ cd smart-iot-app
$ npm init
$ npm install smartobject --save
啟動新專案的制式步驟
Smart Object 專案
/smart-iot-app
/node_modules
/lib
- rboard.js
- vboard.js
- smart-obj.js
- package.json
- index.js
(前面已經做好)
製作 Smart Object
9
var rboard = require('./rboard'),
vboard = require('./vboard'),
SmartObject = require('smartobject');
var so = new SmartObject({
arduino: rboard.arduino
});
so.init('temperature', 0, {
// < rid = 5700, R, Float >
sensorValue: {
read: function (cb) {
return vboard.fooBus.read(cb);
}
},
// < rid = 5701, R, String >
units: 'C'
});
so.init('lightCtrl', 0, {
// < rid = 5850, RW, Boolean { 0: off, 1: on } >
onOff: {
read: function (cb) {
return rboard.gpio.read(13, cb);
},
write: function (value, cb) {
return rboard.gpio.write(13, value, cb);
}
}
});
module.exports = so;
6 mins/lib/smart-obj.js
請在專案資料夾底下開新檔 /lib/smart-obj.js
index.js
10
var mySo = require('./lib/smart-obj');
mySo.hal.arduino.on('ready', function () {
console.log('rboard ready!');
// toggle the LED
setInterval(function () {
mySo.read('lightCtrl', 0, 'onOff', function (err, onOff) {
mySo.write('lightCtrl', 0, 'onOff', onOff ? 0 : 1, function (err, status) {
console.log('LED Status: ' + (status ? 'ON' : 'OFF'));
});
});
}, 2000);
// poll the sensor
setInterval(function () {
mySo.read('temperature', 0, 'sensorValue', function (err, value) {
console.log('Sensor value: ' + value + ' C');
});
}, 3000);
});
6 minsindex.js
# node index.js // 觀察結果是否與上個應用相同
應用程式的進入點 (其他常見的進入點名稱還有 main.js 或 app.js)
當溫度超過 25 度就亮燈
11
var mySo = require('./lib/smart-obj');
// poll the sensor
mySo.hal.arduino.on('ready', function () {
console.log('rboard ready!');
setInterval(function () {
mySo.read('temperature', 0, 'sensorValue', function (err, value) {
console.log('Sensor value: ' + value + ' C');
if (value > 25) {
mySo.write('lightCtrl', 0, 'onOff', 1, function (err, status) {
console.log('Temp > 25 C, LED ON');
});
} else {
mySo.write('lightCtrl', 0, 'onOff', 0, function (err, status) {
console.log('Temp <= 25 C, LED OFF');
});
}
});
}, 3000);
});
3 minsindex.js
# node index.js
CoAP
12
CoAP
13
特性
└ The Constrained Application 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 協定
Web 世界的資源命名
14
Universal Resource Locator (URL)
http:// www.example.com :8080 /sensors ?id=light
PortScheme Authority Path Query
Resource
HTTP
TCP
IP
Ethernet Link
DNS
2001:dead:beef::1
Web 世界的資源命名
15
Universal Resource Locator (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
LwM2M
16
LwM2M
17
輕量型機器對機器協定:統一管理介面
Machine ServerBootstrap Server
Machine Network Management Layer (REST Interface)
register deregister update read write
write attrs execute create delete observe
bootstrap
notify
end-nodes
LWM2M URLs
18
是不是覺得很眼熟呢?
/{object}/{instance}/{resource}
/3303/0/5700 (= /temperature/0/sensorValue)
http://www.example.com/myhouse/{object}/{instance}/{resource}
http://www.example.com/myhouse/3303/0/5700
http://www.example.com/myhouse/temperature/0/sensorValue
coap-shepherd 與 coap-node
19
提供簡單的方式建立和管理 LwM2M 網路
實作:CoAP 機器節點
20
應用架構
21
ATMega32u4
UART
MT7688
節點開發環境準備1
LwM2M Client (coap-node)
LwM2M Server (coap-shepherd)
register() ind
readReq()
writeReq()
組織機器網路與操作遠端節點3
LwM2M Client (coap-node)
SmartObject
設計機器節點2
LwM2M
Server Client
機器網路架構
•
22
CoAP Machine Nodes
CoAP Machine Server
Temperature Sensor Light Control
REST, CoAP, WS, TCP/IP, …

Device Tier
(Edge Nodes)
Gateway Tier
User Tier
Cloud Tier
HTTP Server (Proxy)
REST, MQTT,
WS, TCP/IP, …
CoAP Machine Server:Leshan
23
借用 CaAP Machine Server JAVA 的實作來測試:Leshan Server Demo
待會 CoAP 要註冊的位址:
leshan.eclipse.org
節點專案看起來的樣子
24
CoAP 機器節點
/coap-devices
/node_modules
/lib
- rboard.js
- vboard.js
- package.json
- cnode1.js
- cnode2.js
(前面已經做好)
coap-node 模組
25
APIs 說 明
new cnode(deviceName, smartobject) 建立一個 Cnode 實例
.register(address, port, callback) 發送註冊請求給 server
.deregister(callback) 發送取消註冊請求給 server
Events 說 明
'registered’ registered 事件監聽器,接收 Cnode 註冊完成通知
coap-node 模組重要 APIs 說明
準備 CoAP Machine Nodes
26
我們有一個溫度感測器跟一顆 LED 燈,這裡先做溫度感測器的節點 cnode1.js
var vboard = require('./lib/vboard')
CoapNode = require('coap-node'),
SmartObject = require('smartobject');
var cnode1,
soTemp = new SmartObject({
arduino: vboard.arduino
});
soTemp.init('temperature', 0, {
sensorValue: {
read: function (cb) {
return vboard.fooBus.read(cb);
}
},
units: 'C'
});
cnode1 = new CoapNode('my_client_id_cnode001', soTemp);
cnode1.on('registered', function () {
console.log('registered');
});
cnode1.register('leshan.eclipse.org', 5683, function (err, msg)
{
if (err) {
console.log(err);
} else {
if (msg.status !== '2.01') {
setTimeout(startRegister, 5000);
}
}
});
module.exports = cnode1;
cnode1.js
Ref: https://github.com/PeterEB/coap-node/wiki#4-usage
讓節點加入網路
27
設定 7688 為 Station Mode,連上網際網路
執行 $ node cnode1.js,並測試看看是否讀到溫度值
製作另一個節點:cnode2.js(I)
28
var rboard = require('./lib/rboard'),
CoapNode = require('coap-node'),
SmartObject = require('smartobject');
var cnode2,
soLight = new SmartObject({
arduino: rboard.arduino,
ledPinNum: 13
});
soLight.init('lightCtrl', 0, {
onOff: {
read: function (cb) {
var hal = this.parent.hal;
return rboard.gpio.read(hal.ledPinNum, cb);
},
write: function (value, cb) {
var hal = this.parent.hal;
return rboard.gpio.write(hal.ledPinNum, value, cb);
}
}
});
cnode2.js
製作另一個節點:cnode2.js(II)
29
cnode2 = new CoapNode('my_client_id_cnode002', soLight);
cnode2.on('registered', function () {
console.log('registered');
});
soLight.hal.arduino.on('ready', function () {
console.log('rboard ready!');
cnode2.register('leshan.eclipse.org', 5683, function (err, msg) {
if (err) {
console.log(err);
} else {
if (msg.status !== '2.01') {
setTimeout(startRegister, 5000);
}
}
});
});
module.exports = cnode2;
cnode2.js
Ref: https://github.com/PeterEB/coap-node/wiki#4-usage
讓節點加入網路
30
執行 $ node cnode2.js,測試看看除了讀取到 LED 狀態外,還可以做什麼…
實作:CoAP 伺服器
31
機器網路架構
•
32
CoAP Machine Nodes
CoAP Machine Server
Temperature Sensor Light Control
REST, CoAP, WS, TCP/IP, …

Device Tier
(Edge Nodes)
Gateway Tier
User Tier
Cloud Tier
HTTP Server (Proxy)
REST, MQTT,
WS, TCP/IP, …
33
ATMega32u4
UART
MT7688
節點開發環境準備1
LwM2M Client (coap-node)
LwM2M Server (coap-shepherd)
register() ind
readReq()
writeReq()
組織機器網路與操作遠端節點3
LwM2M Client (coap-node)
SmartObject
設計機器節點2
LwM2M
Server Client
節點專案看起來的樣子
34
CoAP 機器節點
/coap-server
/node_modules
- package.json
- app.js
$ npm install coap-shepherd
於電腦終端機執行指令 $ npm install coap-shepherd 安裝模組
35
Server APIs 說 明
new CShepherd() 建立 CShep 實例
.start() 啟動 coap-shepherd,啟動完成後發射 ready 事件
.permitJoin() 允許或禁止周邊 client 裝置加入網路
.find() 搜尋已入網之 client device 實例,可對其進行讀寫操作
Server Events 說 明
'ready' ready 事件監聽器,接收 CShep 啟動完成通知
'ind' ind 事件監聽器,接收 client 相關事件通知 (如裝置入網、離網等)
Client APIs 說 明
.readReq() 讀取遠端 client 裝置的資源
.writeReq() 將值寫入到遠端 client 裝置的資源中
.observeReq() 訂閱遠端 client 裝置的資源
coap-shepherd 模組重要 APIs 說明
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
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
38
function devIncomingHandler(msg) {
var cnode = 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
39
function devStatusHandler(msg) {
var cnode = 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
40
function devNotifyHandler(msg) {
var data = 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
修改註冊 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 位置
執行測試
於電腦終端機執行指令 $ node app.js,
於 Linkit 7688 Duo 執行指令$ node cnode1.js
觀察電腦終端機是否有印出溫度值。
42
$ node app.js
$ node cnode1.js
修改溫度值回傳時間
43
function devStatusHandler(msg) {
var cnode = msg.cnode;
if (cnode.clientName === 'my_client_id_cnode001' && msg.data === 'online') {
// setting for notification of led state reporting
cnode.writeAttrsReq('temperature/0/sensorValue', { pmax: 10 }, function (err, rsp) {
console.log('>> Temperature writeAttrs starts: ' + rsp.status);
cnode.observeReq('temperature/0/sensorValue', function (err, rsp) {
console.log('>> Temperature observation starts: ' + rsp.status);
});
});
}
}
app.js
Thank you
44

More Related Content

What's hot

ch13-pv1-system-calls
ch13-pv1-system-callsch13-pv1-system-calls
ch13-pv1-system-callsyushiang fu
 
艾鍗學院-單晶片韌體-CC2500通訊實驗
艾鍗學院-單晶片韌體-CC2500通訊實驗艾鍗學院-單晶片韌體-CC2500通訊實驗
艾鍗學院-單晶片韌體-CC2500通訊實驗艾鍗科技
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)Kris Mok
 
[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階Simen Li
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)FLASH开发者交流会
 
Mongo db架构之优先方案
Mongo db架构之优先方案Mongo db架构之优先方案
Mongo db架构之优先方案Lucien Li
 
Gdb principle
Gdb principleGdb principle
Gdb principlelibfetion
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOpenSourceCamp
 
Lua gc代码
Lua gc代码Lua gc代码
Lua gc代码Wei Sun
 
Android 源码分析 -- (一) Android启动过程
Android 源码分析 -- (一) Android启动过程Android 源码分析 -- (一) Android启动过程
Android 源码分析 -- (一) Android启动过程manateew
 
揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharing揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharingYi-Jun Zheng
 
Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式ZongYing Lyu
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closureswang hongjiang
 

What's hot (20)

ch7-pv1-modules
ch7-pv1-modulesch7-pv1-modules
ch7-pv1-modules
 
Nio trick and trap
Nio trick and trapNio trick and trap
Nio trick and trap
 
ch13-pv1-system-calls
ch13-pv1-system-callsch13-pv1-system-calls
ch13-pv1-system-calls
 
艾鍗學院-單晶片韌體-CC2500通訊實驗
艾鍗學院-單晶片韌體-CC2500通訊實驗艾鍗學院-單晶片韌體-CC2500通訊實驗
艾鍗學院-單晶片韌體-CC2500通訊實驗
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
 
[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)
 
Mongo db架构之优先方案
Mongo db架构之优先方案Mongo db架构之优先方案
Mongo db架构之优先方案
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
 
Gdb principle
Gdb principleGdb principle
Gdb principle
 
Arduino程式快速入門
Arduino程式快速入門Arduino程式快速入門
Arduino程式快速入門
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresql
 
Lua gc代码
Lua gc代码Lua gc代码
Lua gc代码
 
Android 源码分析 -- (一) Android启动过程
Android 源码分析 -- (一) Android启动过程Android 源码分析 -- (一) Android启动过程
Android 源码分析 -- (一) Android启动过程
 
揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharing揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharing
 
Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 

Similar to 181201_CoAP_coding365

LinkIt Smart 7688程式開發
LinkIt Smart 7688程式開發LinkIt Smart 7688程式開發
LinkIt Smart 7688程式開發Wei-Tsung Su
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)Shanda innovation institute
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 Renaun Erickson
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
嵌入式inux應用專題文件-智慧家庭系統
嵌入式inux應用專題文件-智慧家庭系統嵌入式inux應用專題文件-智慧家庭系統
嵌入式inux應用專題文件-智慧家庭系統艾鍗科技
 
高性能远程调用解决方案
高性能远程调用解决方案高性能远程调用解决方案
高性能远程调用解决方案Ady Liu
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisXiaoming Chen
 
HTML+COIMOTION 開發跨平台 app
HTML+COIMOTION 開發跨平台 appHTML+COIMOTION 開發跨平台 app
HTML+COIMOTION 開發跨平台 appBen Lue
 
用Raspberry PI學Linux驅動程式
用Raspberry PI學Linux驅動程式用Raspberry PI學Linux驅動程式
用Raspberry PI學Linux驅動程式Stanley Ho
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应zhaolinjnu
 
Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Bob Huang
 
20170415- 智慧空調通訊系統實務_柯大
20170415- 智慧空調通訊系統實務_柯大20170415- 智慧空調通訊系統實務_柯大
20170415- 智慧空調通訊系統實務_柯大MAKERPRO.cc
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Harvey Zhang
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocketpwesh
 
高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕ideawu
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的hnoutman
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计fuchaoqun
 

Similar to 181201_CoAP_coding365 (20)

LinkIt Smart 7688程式開發
LinkIt Smart 7688程式開發LinkIt Smart 7688程式開發
LinkIt Smart 7688程式開發
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
Glider
GliderGlider
Glider
 
嵌入式inux應用專題文件-智慧家庭系統
嵌入式inux應用專題文件-智慧家庭系統嵌入式inux應用專題文件-智慧家庭系統
嵌入式inux應用專題文件-智慧家庭系統
 
高性能远程调用解决方案
高性能远程调用解决方案高性能远程调用解决方案
高性能远程调用解决方案
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
 
HTML+COIMOTION 開發跨平台 app
HTML+COIMOTION 開發跨平台 appHTML+COIMOTION 開發跨平台 app
HTML+COIMOTION 開發跨平台 app
 
用Raspberry PI學Linux驅動程式
用Raspberry PI學Linux驅動程式用Raspberry PI學Linux驅動程式
用Raspberry PI學Linux驅動程式
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应
 
Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01
 
20170415- 智慧空調通訊系統實務_柯大
20170415- 智慧空調通訊系統實務_柯大20170415- 智慧空調通訊系統實務_柯大
20170415- 智慧空調通訊系統實務_柯大
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计
 

181201_CoAP_coding365

  • 1. CoAP 與 LwM2M 應用實作 易弼仁
  • 2. 目標 1 ATMega32u4 UART MT7688 節點開發環境準備1 LwM2M Client (coap-node) LwM2M Server (coap-shepherd) register() ind readReq() writeReq() 組織機器網路與操作遠端節點3 LwM2M Client (coap-node) SmartObject 設計機器節點2 LwM2M Server Client 確認 Linkit 7688 Duo 中已有程式碼與 fermata、smartobject 和 coap-node模組
  • 5. 應用層統一資料模型 4 訊息/數據 的意義是什麼? 屬性 命令 行為 Physical Data Link Network Transport > 230 models 2016 (OIC@2014) 51 models 2008 5 Schemas 2015
  • 6. 智慧物件 Smart Object 5 Object oid = 3303 rid = 5700 Resources rid = 5701 rid = 5605 Temperature Sensor Boilerplate Create instance with an iid Temperature Sensor Entity #1 oid = 3303 rid = 5700 rid = 5701 rid = 5605 iid = 1 Object Instance value value value oid = 3303 rid = 5700 rid = 5701 rid = 5605 iid = 0 Object Instance value value value Temperature Sensor Entity #0 IPSO Alliance & IPSO Model └ 對真實世界的物件資料模型進行標準化 └ 已定義 51 種 Smart Objects,增加中 └ 採用階層化資料模型 └ Object, Object Instance, Resource
  • 7. 請花幾分鐘閱讀 6 溫度感測器的模型 └ https://github.com/AllSmartObjects/smartobject/blob/master/docs/templates.md#tmpl_temperature 電燈的模型 └ https://github.com/AllSmartObjects/smartobject/blob/master/docs/templates.md#tmpl_lightCtrl SmartObject 模組使用入門 └ Overview: https://github.com/AllSmartObjects/smartobject#1-overview └ Usage: https://github.com/AllSmartObjects/smartobject#3-usage SmartObject 的存取介面 └ Read: https://github.com/AllSmartObjects/smartobject#API_read └ Write: https://github.com/AllSmartObjects/smartobject#API_write 1 mins 1 mins 6 mins 5 mins
  • 8. smartobject 模組 7 APIs 說 明 new SmartObject() 建立 SmartObject 實例 .init() 建立並初始化一個物件實例 (Object Instance) .read() 讀取 SmartObject 實例中資源的值 .write() 寫入 SmartObject 實例中資源的值 .dump() 讀取 SmartObject 實例中所有資源的值 smartobject 模組重要 APIs 說明
  • 9. 初始化你的智慧物件專案 8 開一個專案資料夾 進入資料夾 npm init 初始化專案 安裝所需的第三方模組 $ mkdir smart-iot-app $ cd smart-iot-app $ npm init $ npm install smartobject --save 啟動新專案的制式步驟 Smart Object 專案 /smart-iot-app /node_modules /lib - rboard.js - vboard.js - smart-obj.js - package.json - index.js (前面已經做好)
  • 10. 製作 Smart Object 9 var rboard = require('./rboard'), vboard = require('./vboard'), SmartObject = require('smartobject'); var so = new SmartObject({ arduino: rboard.arduino }); so.init('temperature', 0, { // < rid = 5700, R, Float > sensorValue: { read: function (cb) { return vboard.fooBus.read(cb); } }, // < rid = 5701, R, String > units: 'C' }); so.init('lightCtrl', 0, { // < rid = 5850, RW, Boolean { 0: off, 1: on } > onOff: { read: function (cb) { return rboard.gpio.read(13, cb); }, write: function (value, cb) { return rboard.gpio.write(13, value, cb); } } }); module.exports = so; 6 mins/lib/smart-obj.js 請在專案資料夾底下開新檔 /lib/smart-obj.js
  • 11. index.js 10 var mySo = require('./lib/smart-obj'); mySo.hal.arduino.on('ready', function () { console.log('rboard ready!'); // toggle the LED setInterval(function () { mySo.read('lightCtrl', 0, 'onOff', function (err, onOff) { mySo.write('lightCtrl', 0, 'onOff', onOff ? 0 : 1, function (err, status) { console.log('LED Status: ' + (status ? 'ON' : 'OFF')); }); }); }, 2000); // poll the sensor setInterval(function () { mySo.read('temperature', 0, 'sensorValue', function (err, value) { console.log('Sensor value: ' + value + ' C'); }); }, 3000); }); 6 minsindex.js # node index.js // 觀察結果是否與上個應用相同 應用程式的進入點 (其他常見的進入點名稱還有 main.js 或 app.js)
  • 12. 當溫度超過 25 度就亮燈 11 var mySo = require('./lib/smart-obj'); // poll the sensor mySo.hal.arduino.on('ready', function () { console.log('rboard ready!'); setInterval(function () { mySo.read('temperature', 0, 'sensorValue', function (err, value) { console.log('Sensor value: ' + value + ' C'); if (value > 25) { mySo.write('lightCtrl', 0, 'onOff', 1, function (err, status) { console.log('Temp > 25 C, LED ON'); }); } else { mySo.write('lightCtrl', 0, 'onOff', 0, function (err, status) { console.log('Temp <= 25 C, LED OFF'); }); } }); }, 3000); }); 3 minsindex.js # node index.js
  • 14. CoAP 13 特性 └ The Constrained Application 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 Resource Locator (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 Resource Locator (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
  • 18. LwM2M 17 輕量型機器對機器協定:統一管理介面 Machine ServerBootstrap Server Machine Network Management Layer (REST Interface) register deregister update read write write attrs execute create delete observe bootstrap notify end-nodes
  • 19. LWM2M URLs 18 是不是覺得很眼熟呢? /{object}/{instance}/{resource} /3303/0/5700 (= /temperature/0/sensorValue) http://www.example.com/myhouse/{object}/{instance}/{resource} http://www.example.com/myhouse/3303/0/5700 http://www.example.com/myhouse/temperature/0/sensorValue
  • 22. 應用架構 21 ATMega32u4 UART MT7688 節點開發環境準備1 LwM2M Client (coap-node) LwM2M Server (coap-shepherd) register() ind readReq() writeReq() 組織機器網路與操作遠端節點3 LwM2M Client (coap-node) SmartObject 設計機器節點2 LwM2M Server Client
  • 23. 機器網路架構 • 22 CoAP Machine Nodes CoAP Machine Server Temperature Sensor Light Control REST, CoAP, WS, TCP/IP, …  Device Tier (Edge Nodes) Gateway Tier User Tier Cloud Tier HTTP Server (Proxy) REST, MQTT, WS, TCP/IP, …
  • 24. CoAP Machine Server:Leshan 23 借用 CaAP Machine Server JAVA 的實作來測試:Leshan Server Demo 待會 CoAP 要註冊的位址: leshan.eclipse.org
  • 25. 節點專案看起來的樣子 24 CoAP 機器節點 /coap-devices /node_modules /lib - rboard.js - vboard.js - package.json - cnode1.js - cnode2.js (前面已經做好)
  • 26. coap-node 模組 25 APIs 說 明 new cnode(deviceName, smartobject) 建立一個 Cnode 實例 .register(address, port, callback) 發送註冊請求給 server .deregister(callback) 發送取消註冊請求給 server Events 說 明 'registered’ registered 事件監聽器,接收 Cnode 註冊完成通知 coap-node 模組重要 APIs 說明
  • 27. 準備 CoAP Machine Nodes 26 我們有一個溫度感測器跟一顆 LED 燈,這裡先做溫度感測器的節點 cnode1.js var vboard = require('./lib/vboard') CoapNode = require('coap-node'), SmartObject = require('smartobject'); var cnode1, soTemp = new SmartObject({ arduino: vboard.arduino }); soTemp.init('temperature', 0, { sensorValue: { read: function (cb) { return vboard.fooBus.read(cb); } }, units: 'C' }); cnode1 = new CoapNode('my_client_id_cnode001', soTemp); cnode1.on('registered', function () { console.log('registered'); }); cnode1.register('leshan.eclipse.org', 5683, function (err, msg) { if (err) { console.log(err); } else { if (msg.status !== '2.01') { setTimeout(startRegister, 5000); } } }); module.exports = cnode1; cnode1.js Ref: https://github.com/PeterEB/coap-node/wiki#4-usage
  • 28. 讓節點加入網路 27 設定 7688 為 Station Mode,連上網際網路 執行 $ node cnode1.js,並測試看看是否讀到溫度值
  • 29. 製作另一個節點:cnode2.js(I) 28 var rboard = require('./lib/rboard'), CoapNode = require('coap-node'), SmartObject = require('smartobject'); var cnode2, soLight = new SmartObject({ arduino: rboard.arduino, ledPinNum: 13 }); soLight.init('lightCtrl', 0, { onOff: { read: function (cb) { var hal = this.parent.hal; return rboard.gpio.read(hal.ledPinNum, cb); }, write: function (value, cb) { var hal = this.parent.hal; return rboard.gpio.write(hal.ledPinNum, value, cb); } } }); cnode2.js
  • 30. 製作另一個節點:cnode2.js(II) 29 cnode2 = new CoapNode('my_client_id_cnode002', soLight); cnode2.on('registered', function () { console.log('registered'); }); soLight.hal.arduino.on('ready', function () { console.log('rboard ready!'); cnode2.register('leshan.eclipse.org', 5683, function (err, msg) { if (err) { console.log(err); } else { if (msg.status !== '2.01') { setTimeout(startRegister, 5000); } } }); }); module.exports = cnode2; cnode2.js Ref: https://github.com/PeterEB/coap-node/wiki#4-usage
  • 31. 讓節點加入網路 30 執行 $ node cnode2.js,測試看看除了讀取到 LED 狀態外,還可以做什麼…
  • 33. 機器網路架構 • 32 CoAP Machine Nodes CoAP Machine Server Temperature Sensor Light Control REST, CoAP, WS, TCP/IP, …  Device Tier (Edge Nodes) Gateway Tier User Tier Cloud Tier HTTP Server (Proxy) REST, MQTT, WS, TCP/IP, …
  • 34. 33 ATMega32u4 UART MT7688 節點開發環境準備1 LwM2M Client (coap-node) LwM2M Server (coap-shepherd) register() ind readReq() writeReq() 組織機器網路與操作遠端節點3 LwM2M Client (coap-node) SmartObject 設計機器節點2 LwM2M Server Client
  • 35. 節點專案看起來的樣子 34 CoAP 機器節點 /coap-server /node_modules - package.json - app.js $ npm install coap-shepherd 於電腦終端機執行指令 $ npm install coap-shepherd 安裝模組
  • 36. 35 Server APIs 說 明 new CShepherd() 建立 CShep 實例 .start() 啟動 coap-shepherd,啟動完成後發射 ready 事件 .permitJoin() 允許或禁止周邊 client 裝置加入網路 .find() 搜尋已入網之 client device 實例,可對其進行讀寫操作 Server Events 說 明 'ready' ready 事件監聽器,接收 CShep 啟動完成通知 'ind' ind 事件監聽器,接收 client 相關事件通知 (如裝置入網、離網等) Client APIs 說 明 .readReq() 讀取遠端 client 裝置的資源 .writeReq() 將值寫入到遠端 client 裝置的資源中 .observeReq() 訂閱遠端 client 裝置的資源 coap-shepherd 模組重要 APIs 說明
  • 37. 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) { var cnode = 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) { var cnode = 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) { var data = 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 位置
  • 43. 執行測試 於電腦終端機執行指令 $ node app.js, 於 Linkit 7688 Duo 執行指令$ node cnode1.js 觀察電腦終端機是否有印出溫度值。 42 $ node app.js $ node cnode1.js
  • 44. 修改溫度值回傳時間 43 function devStatusHandler(msg) { var cnode = msg.cnode; if (cnode.clientName === 'my_client_id_cnode001' && msg.data === 'online') { // setting for notification of led state reporting cnode.writeAttrsReq('temperature/0/sensorValue', { pmax: 10 }, function (err, rsp) { console.log('>> Temperature writeAttrs starts: ' + rsp.status); cnode.observeReq('temperature/0/sensorValue', function (err, rsp) { console.log('>> Temperature observation starts: ' + rsp.status); }); }); } } app.js

Editor's Notes

  1. IPSO 定義了一個階層式的資料模型來描述真實世界的裝置資源。 一個物件 (Object) 就像是一個類別 (Cless),並且每個物件實例 (Object Instance) 是物件的實體。 每一個物件、物件實例和資源都有自己唯一的 Id,物件的 Id 可用於判斷屬於什麼類別;物件實例的 Id 可用於識別自身;資源的 Id 則是資源的名稱。
  2. 我們等一下就要把溫度感測器與 LED 燈變成智慧物件
  3. 可以把它想像成是一個減肥成功的 HTTP
  4. 我們在課堂上的目標是完成  和 
  5. 我們在課堂上的目標是完成  和 