AWS IoT의 Thing Shadows를 실행하는 샘플 코드를 작성하여 작동 방식 이해
개요
AWS IoT의 핵심 기능 중 하나는 Thing Shadows라는 IoT 디바이스의 상태 관리를 제공하는 메커니즘입니다.
AWS IoT의 Thing Shadows를 그림과 실행 예제로 이해 을 참고하여 AWS SDK에서 디바이스 상태를 전송하는 코드와 관리 애플리케이션에서 상태를 전송하고 상태에 차이가 나면 알림을 받는 코드를 작성해 보았습니다.
코드
클래스 메소드 씨의 기사 그대로 하거나 합니다만, power라고 하는 디바이스의 상태를 판정하는 항목을 만듭니다. 이 항목에 대해 on과 off라는 상태를 구분하여 장치의 상태를 교환합니다.
우선은 다음의 소스가 관리 어플리케이션측의 소스입니다. panpan-device
라는 Thing Shadows를 정의하여 AWS IoT에 등록합니다. 그리고, {"state":{"desired":{"power":"on"}}
라고 하는 관리 어플리케이션으로 정의되는 바람직한 상태 desired
를 "power":"on"
로서 등록하고 있습니다. 요점은 power는 on에 있는 상태가 정상이라고요. 당연합니다.
그리고, delta
라는 이벤트를 등록하고 있습니다만, 해야 할 상태와 디바이스로부터 송신되는 디바이스의 현재 상태인 reported
가 desired
와 차이가 있으면 이 이벤트가 발화해 차이를 알려줍니다.
mobile-app.jsconst thingShadow = require('../thing');
const isUndefined = require('../common/lib/is-undefined');
const cmdLineProcess = require('./lib/cmdline');
function processTest( args, argsRemaining ) {
const thingShadows = thingShadow({
keyPath: args.privateKey,
certPath: args.clientCert,
caPath: args.caCert,
clientId: args.clientId,
region: args.region,
reconnectPeriod: args.reconnectPeriod,
});
var clientToken;
thingShadows
.on('connect', function() {
console.log('connected to things instance, registering thing name');
thingShadows.register( 'panpan-device' );
setTimeout( function() {
var panpanpanState = {"state":{"desired":{"power":"on"}}};
clientToken = thingShadows.update('panpan-device', panpanpanState );
}, 2000 );
});
thingShadows.on('status',
function(thingName, stat, clientToken, stateObject) {
console.log('received '+stat+' on '+thingName+': '+
JSON.stringify(stateObject));
});
thingShadows
.on('delta', function(thingName, stateObject) {
console.log('panpan-device:delta on '+thingName+': '+
JSON.stringify(stateObject));
});
}
module.exports = cmdLineProcess;
if (require.main === module) {
cmdLineProcess('connect to the AWS IoT service',
process.argv.slice(2), processTest )
}
다음은 IoT 장치 측의 상태를 알리는 코드입니다. '$aws/things/<デバイス名>/shadow/update'
라는 주제에 상태를 게시하여 상태를 알립니다.
이번에는 굳이 있어야 하는 상태와의 차이를 검지시키기 위해 {"reported" : {"power" : "off"}}
라는 상태를 영원히 통지하게 합니다.
device-sample.jsconst deviceModule = require('../device');
const cmdLineProcess = require('./lib/cmdline');
function processTest( args, argsRemaining ) {
const device = deviceModule({
keyPath: args.privateKey,
certPath: args.clientCert,
caPath: args.caCert,
clientId: args.clientId,
region: args.region,
reconnectPeriod: args.reconnectPeriod,
});
var timeout;
var count=0;
device
.on('connect', function() {
const minimumDelay=250;
console.log('connect');
timeout = setInterval( function() {
device.publish('$aws/things/panpan-device/shadow/update', '{"state": {"reported" : {"power" : "off"}}}');
}, Math.max(args.delay,minimumDelay) );
});
}
module.exports = cmdLineProcess;
if (require.main === module) {
cmdLineProcess('connect to the AWS IoT service',
process.argv.slice(2), processTest )
}
실행
관리 도구 측 코드 실행
$node examples/mobile-app.js -f ~/certs/
이제 관리 도구 프로세스를 실행했습니다. Thing Shadows가 등록되어야 하는 상태 power:on
가 정의됩니다.
기기 측 코드 실행
$ node examples/device-sample.js -f ~/certs/
그리고 굳이 현재 상태로서 power:off
를 디바이스로부터 계속 송신합니다
결과
제대로 관리 툴측의 delta 이벤트가 발화해, power:on이어야 한다고 상태의 차이를 통지해 주었습니다.
요약
코드를 작성하여 Thing Shadows의 메커니즘을 이해할 수있었습니다. 상시 가동하고 있는 IoT 디바이스를 운용 관리하는데 있어서는 매우 편리한 구조라고 생각했습니다.
다만, 놀이로 사용하고 있는 동안은 Publish/Subscribe만으로 부족할까라고 느끼네요.
Reference
이 문제에 관하여(AWS IoT의 Thing Shadows를 실행하는 샘플 코드를 작성하여 작동 방식 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/horike37/items/1933dd0c85fb32680685
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
클래스 메소드 씨의 기사 그대로 하거나 합니다만, power라고 하는 디바이스의 상태를 판정하는 항목을 만듭니다. 이 항목에 대해 on과 off라는 상태를 구분하여 장치의 상태를 교환합니다.
우선은 다음의 소스가 관리 어플리케이션측의 소스입니다.
panpan-device
라는 Thing Shadows를 정의하여 AWS IoT에 등록합니다. 그리고, {"state":{"desired":{"power":"on"}}
라고 하는 관리 어플리케이션으로 정의되는 바람직한 상태 desired
를 "power":"on"
로서 등록하고 있습니다. 요점은 power는 on에 있는 상태가 정상이라고요. 당연합니다.그리고,
delta
라는 이벤트를 등록하고 있습니다만, 해야 할 상태와 디바이스로부터 송신되는 디바이스의 현재 상태인 reported
가 desired
와 차이가 있으면 이 이벤트가 발화해 차이를 알려줍니다.mobile-app.js
const thingShadow = require('../thing');
const isUndefined = require('../common/lib/is-undefined');
const cmdLineProcess = require('./lib/cmdline');
function processTest( args, argsRemaining ) {
const thingShadows = thingShadow({
keyPath: args.privateKey,
certPath: args.clientCert,
caPath: args.caCert,
clientId: args.clientId,
region: args.region,
reconnectPeriod: args.reconnectPeriod,
});
var clientToken;
thingShadows
.on('connect', function() {
console.log('connected to things instance, registering thing name');
thingShadows.register( 'panpan-device' );
setTimeout( function() {
var panpanpanState = {"state":{"desired":{"power":"on"}}};
clientToken = thingShadows.update('panpan-device', panpanpanState );
}, 2000 );
});
thingShadows.on('status',
function(thingName, stat, clientToken, stateObject) {
console.log('received '+stat+' on '+thingName+': '+
JSON.stringify(stateObject));
});
thingShadows
.on('delta', function(thingName, stateObject) {
console.log('panpan-device:delta on '+thingName+': '+
JSON.stringify(stateObject));
});
}
module.exports = cmdLineProcess;
if (require.main === module) {
cmdLineProcess('connect to the AWS IoT service',
process.argv.slice(2), processTest )
}
다음은 IoT 장치 측의 상태를 알리는 코드입니다.
'$aws/things/<デバイス名>/shadow/update'
라는 주제에 상태를 게시하여 상태를 알립니다.이번에는 굳이 있어야 하는 상태와의 차이를 검지시키기 위해
{"reported" : {"power" : "off"}}
라는 상태를 영원히 통지하게 합니다.device-sample.js
const deviceModule = require('../device');
const cmdLineProcess = require('./lib/cmdline');
function processTest( args, argsRemaining ) {
const device = deviceModule({
keyPath: args.privateKey,
certPath: args.clientCert,
caPath: args.caCert,
clientId: args.clientId,
region: args.region,
reconnectPeriod: args.reconnectPeriod,
});
var timeout;
var count=0;
device
.on('connect', function() {
const minimumDelay=250;
console.log('connect');
timeout = setInterval( function() {
device.publish('$aws/things/panpan-device/shadow/update', '{"state": {"reported" : {"power" : "off"}}}');
}, Math.max(args.delay,minimumDelay) );
});
}
module.exports = cmdLineProcess;
if (require.main === module) {
cmdLineProcess('connect to the AWS IoT service',
process.argv.slice(2), processTest )
}
실행
관리 도구 측 코드 실행
$node examples/mobile-app.js -f ~/certs/
이제 관리 도구 프로세스를 실행했습니다. Thing Shadows가 등록되어야 하는 상태 power:on
가 정의됩니다.
기기 측 코드 실행
$ node examples/device-sample.js -f ~/certs/
그리고 굳이 현재 상태로서 power:off
를 디바이스로부터 계속 송신합니다
결과
제대로 관리 툴측의 delta 이벤트가 발화해, power:on이어야 한다고 상태의 차이를 통지해 주었습니다.
요약
코드를 작성하여 Thing Shadows의 메커니즘을 이해할 수있었습니다. 상시 가동하고 있는 IoT 디바이스를 운용 관리하는데 있어서는 매우 편리한 구조라고 생각했습니다.
다만, 놀이로 사용하고 있는 동안은 Publish/Subscribe만으로 부족할까라고 느끼네요.
Reference
이 문제에 관하여(AWS IoT의 Thing Shadows를 실행하는 샘플 코드를 작성하여 작동 방식 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/horike37/items/1933dd0c85fb32680685
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$node examples/mobile-app.js -f ~/certs/
$ node examples/device-sample.js -f ~/certs/
코드를 작성하여 Thing Shadows의 메커니즘을 이해할 수있었습니다. 상시 가동하고 있는 IoT 디바이스를 운용 관리하는데 있어서는 매우 편리한 구조라고 생각했습니다.
다만, 놀이로 사용하고 있는 동안은 Publish/Subscribe만으로 부족할까라고 느끼네요.
Reference
이 문제에 관하여(AWS IoT의 Thing Shadows를 실행하는 샘플 코드를 작성하여 작동 방식 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/horike37/items/1933dd0c85fb32680685텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)