Starter Kit ์ SKT์ ThingPlug์์ ์ ๊ณตํ๋ IoT ๊ตญ์ ํ์ค oneM2M API๋ฅผ ์ด์ฉํ์ฌ LoRa์๋น์ค ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ ๋ ์ข ๋ ์ฝ๊ฒ ์ ๊ทผํ๊ณ , ์๋น์ค์ ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ๋น ๋ฅด๊ฒ ํ ์คํธ ํ ์ ์๋๋ก ์ ๊ณตํ๋ Device์ Application ์๋ฎฌ๋ ์ดํฐ์ ๋๋ค. ๋ณธ Starter Kit์ ํตํ์ฌ SK Telecom์ ThingPlug ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฝ๊ฒ ์ดํดํ๊ณ , ๋ค์ํ ์๋น์ค ๊ฐ๋ฐ์ Starter Kit์์๋ถํฐ ์์ํด๋ณด์ธ์
-
์ค์ Device๊ฐ ์์ด๋ ์๋น์ค ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ ๊ณตํ๋ ๋ชจ๋์ ๋๋ค.
-
ThingPlug๊ฐ ์ ๊ณตํ๋ IoT ๊ตญ์ ํ์ค์ธ oneM2M๊ท๊ฒฉ REST API๋ฅผ ํ์ฉํ์ฌ ๋ฒ์ฉ์ฑ์ ํ๋ณดํ์์ต๋๋ค.
-
node.js์ express ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์ฝ๊ฒ ๊ฐ๋ฐํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
-
IFTTT ๋ฐ ์ง๋, ๊ทธ๋ํ ๋ฑ ๋ค์ํ ์ปดํฌ๋ํธ ํ์ฌ๋ก ๋ฐ์ดํฐ์ ์๋น์ค๊ฐ ์ธํฐํ์ด์ค ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
Github์ ์์ ๊ฐ ์ ๋ก๋ ๋์ด์์ด ๋ฐ๋ก ๋ค์ด๋ก๋ ๊ฐ๋ฅํฉ๋๋ค.
Starter Kit์์๋ ์ญํ ์ ๋ฐ๋ผ ๊ตฌ์ฑ์์ ๋ค์ ๋ค ๊ฐ์ง๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ํด๋ผ์ด์ธํธ (Application)
- ๋๋ฐ์ด์ค ํด๋ผ์ด์ธํธ (Device)
- oneM2M API๋ฅผ ์ ๊ณตํ๋ ThingPlug ์๋ฒ (ThingPlug)
- LoRa Network ์๋ฒ
์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋๋ฐ์ด์ค๋ ์ง์ ์ ์ผ๋ก ํต์ ํ์ง ์๊ณ ๊ฐ ๊ตฌ์ฑ์๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ThingPlug๊ฐ ์ ๊ณตํ๋ oneM2M ํ์ค ๊ธฐ๋ฐ์ REST API๋ฅผ ํตํด oneM2M ์๋ฒ์ ํต์ ์ ํ๊ฒ ๋ฉ๋๋ค. ํด๋น API๋ฅผ ํตํด ์ ๊ณต๋๋ IoT์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ(์, ๋ฐ์ดํฐ ์ ์ฅ, ์ฅ์น ๊ด๋ฆฌ, ์ฅ์น ๋ฑ๋ก ๋ฑ)์ ๋๋ฐ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ์๋ค์ด ์ข ๋ ์ฝ๊ฒ LoRa ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ฐํธํ๊ฒ Starter Kit์ ์คํํ ์ ์์ต๋๋ค.
-
์ฌ์ ์ค๋น : ํ์ํ ํ์ ๋๊ตฌ ์ค์น ๋ฐ ์ฝ๋ ๋ณต์ฌ
-
Code ๋ณต์ฌ
-
ํ๋ก์ ํธ dependency๋ฅผ ์ค์น
-
๋์ ThingPlug ๊ณ์ ์ ๋ณด์ ๋ง๊ฒ ์ผ๋ถ ํ์ผ(config.js)์ ์์
-
Device.js๋ฅผ ์คํ
-
ThingPlug์ ๋ด ๊ณ์ ์ Device๋ฅผ ๋ฑ๋ก
-
Application_web.js ์คํ
Starter Kit์ ์คํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋๊ตฌ๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
- Node.js : ๊ณต์ ์ฌ์ดํธ์์ ์ค์น ํจํค์ง๋ฅผ ๋ค์ด๋ฐ์ ์ ์์ต๋๋ค.
![]()
๊ทธ๋ฆผ 3 โ node.js ์ค์น
Git์ Release๋ ํ๋ก์ ํธ ์์ถํ์ผ์ ๋ค์ด ๋ฐ์์ ์์์ ํด๋์ ์์ถ์ ํด์ ํ์ธ์. ๋๋ ์๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ github์ master ๋ฒ์ ์ cloneํด๋ ๋ฉ๋๋ค.
git clone https://github.com/SKT-ThingPlug/thingplug-lora-starter-kit.git
๋ณต์ฌ๋ ํด๋ ์์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ํ์ผ์ด ์์ต๋๋ค.
-
config_x.js: ๊ฐ๋ฐ์ ์ธ์ฆํค์ ๋๋ฐ์ด์ค ID๋ฑ ์คํํฐํท ์คํ์ ์์ ํ์ํ ํ๊ฒฝ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ์์ ์ํฉ์ ๋ง๊ฒ ์์ ์ด ํ์ํฉ๋๋ค. -
device_mqtt_x.js: ์ค์ IoT Device์์ ๊ตฌ๋์ด ๊ฐ๋ฅํ ์ฝ๋ ์ ๋๋ค. Node.js๋ก ๊ตฌํ๋์ด ์์ด Node.js๊ฐ ์คํ ๊ฐ๋ฅํ ์ปดํจํฐ์์ ์คํ๊ฐ๋ฅํ๋ฉฐ BeegleBone Black ๊ฐ์ด Node.js๋ฅผ ๊ตฌ๋ํ ์ ์๋ IoT Device์์ ์ง์ ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. ํด๋น jsํ์ผ์ mqtt๋ฐฉ์์ ํ๋กํ ์ฝ์ ์ ์ฉํ ๋ฒ์ ์ ๋๋ค. -
device_http_x.js: ํด๋น ํ์ผ์ device.jsํ์ผ์ http ๋ฒ์ ์ ๋๋ค. -
application_web.js: Express.js๋ฅผ ์ฌ์ฉํ Web API ์๋ฒ๋ก Sample Web Application์์ ํธ์ถํ๋ backend ์๋ฒ์ ์ญํ ์ ํฉ๋๋ค.device.js์์ ThingPlug๋ก ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์นํ์ด์ง๋ก๋ถํฐ ๋ช ๋ น์ ๋ฐ์ ThingPlug ์๋ฒ๋ฅผ ํตํด ์ค์ device๋ฅผ ์ ์ดํ๊ธฐ๋ ํฉ๋๋ค. -
public/: Sample Web Application์ html, css, javascript ๋ฑ ์ ์ ํ์ผ ๋ชฉ๋ก์ ๋๋ค. -
notification/: trigger ๋ฐ์์ ๋ฌธ์ ๋ฅผ notifyํ๊ธฐ ์ํ E-MAIL๊ด๋ จ ํ์ผ์ด ์์ต๋๋ค. ํ์ฌ E-MAIL์ nodemailer api๋ฅผ ํ์ฉํด ์ ์ก์ ํ๋ ๋ฐฉ์์ ํ์ฉํ์์ผ๋ฉฐ, GMAIL๊ณ์ ์ ๋ณด๋ฅผ mail.js์ ์ ๋ ฅํ์๋ฉด ๋ฉ๋๋ค. ์ด์ธ์๋ ๊ฐ๋ฐ์๊ฐ nodejs์ library๋ฅผ ํตํด ๋ค์ํ ๋ฐฉ๋ฒ์ ์์ฉํ ์ ์์ต๋๋ค.
ํ์ฌ sample์ ๊ฒฝ์ฐ multi Device๋ฅผ ์ง์ํ๊ธฐ์ํด {jsํ์ผ ์ด๋ฆ_์ซ์} ํํ๋ก mapping ํ์์ต๋๋ค.
Device์ ์ซ์๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ๋ช๊ฐ์ง ๋ณ๊ฒฝ์ฌํญ์ด ์์ต๋๋ค.
config_x.js์device_x.jsํ์ผ์ ์ถ๊ฐ ๋๋ ์ญ์ (๋ฒํธ๋ 1๋ฒ๋ถํฐ ๋น ์ง์์ด ์์ฐจ๋ก)config_x.js์nodeID์์ application_web.js์numOfDevice์์ /public/js/app.js์numOfDevice์์
Starter Kit์ ํตํด์ ์คํํ๋ device์ application์ Node.js๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ ์คํ์ ํ์ํ dependency ์ ๋ณด๋ package.json์ ๊ธฐ์
๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์์์ ๋ณต์ฌํ starter kit ํด๋(package.json์ด ์กด์ฌํ๋ ํด๋)๋ก ์ด๋ ํ npm install ๋ช
๋ น์ด๋ฅผ ํตํด dependency ์ค์นํ์ธ์.
Starter Kit์ด ์ค์ง์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด์๋ ๊ฐ๋ฐ์ ๊ณ์ ์ ๋ณด ๋ฐ ๋๋ฐ์ด์ค ์ ๋ณด๋ฅผ ๊ฐ๋ฐ์ ์ํฉ์ ๋ง๊ฒ ์์ ํด์ผํฉ๋๋ค. config.js_sampleํ์ผ์ config.jsํ์ผ๋ก ๋ณต์ฌํ ํ config.js๋ฅผ ์๋ํฐ์์ ์ด๊ณ ๊ฐ ํญ๋ชฉ ์ค๋ฅธ์ชฝ์ ๋ฌ๋ฆฐ ์ฃผ์ ์ค๋ช
๊ณผ ์๋ ์ค๋ช
์ ์ฐธ๊ณ ํ์ฌ ์์ ํ์ธ์.
module.exports = {
AppEUI : 'starterkittest', // Application EUI
DevEUI : 'DevEUI', // Device EUI
version : 'v1_0', // Application์ version
TPhost : 'thingplugtest.sktiot.com', // ThingPlug์ HOST Addresss
TPport : '9000', // ThingPlug์ HTTP PORT ๋ฒํธ
responseAddress : 'http://0.0.0.0', // HTTP๋ฒ์ ์์ ๋๋ฐ์ด์ค ์ ์ด๋ฅผ ์ํ ๋๋ฐ์ด์ค์ ๋ฌผ๋ฆฌ์ ์ฃผ์ mga
responsePORT : '0000', // HTTP๋ฒ์ ์์ ๋๋ฐ์ด์ค์ ์ด๋ฅผ ์ํ ๋๋ฐ์ด์ค์ ๋ฌผ๋ฆฌ์ ์ฃผ์์ ๋ก์ปฌ ํฌํธ
userID : 'userID', // MQTT๋ฒ์ ์์ Broker ์ ์์ ์ํ ID, ํฌํธ ID ์ฌ์ฉ
mqttClientId : 'Please Make Ramdom Value_1', // MQTT๋ฒ์ ์์ Broker ์ ์์ ์ํ client ID
nodeID : 'Please Type Your Own LTID', // Device ๊ตฌ๋ถ์ ์ํ LTID, ๋๋ฐ์ด์ค ๊ณ ์ ID ์ฌ์ฉ
passCode : '000101', // ThingPlug์ Device๋ฑ๋ก ์ ์ฌ์ฉํ Device์ ๋น๋ฐ๋ฒํธ
uKey : 'USER KEY FROM PORTAL', // Thingplug๋ก๊ทธ์ธ ํ, `๋ง์ดํ์ด์ง`์ ์๋ ์ฌ์ฉ์ ์ธ์ฆํค
containerName:'LoRa', // starter kit์์ ์์ฑํ๊ณ ์ฌ์ฉํ container ์ด๋ฆ (์์์ง์ )
DevReset : 'DevReset', // starter kit์์ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์ด ๋ช
๋ น DevReset
extDevMgmt : 'extDevMgmt', // starter kit์์ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์ด ๋ช
๋ น extDevMgmt
UPDATE_CONTENT_INTERVAL : 1000, //contentInstance ์์ฑ์ฃผ๊ธฐ
delimiter : ',', // contents ๊ตฌ๋ถ์
contents : function(){ // Device์์ ThingPlug๋ก ์ ๋ฌํ๋ ์ค์ ๋ฐ์ดํฐ (contentInstance์ Attribute <con>)
var value_TEMP = (Math.floor(Math.random() * 5) + this.BASE_TEMP).toString(); // ๊ฐ์์ ์จ๋๊ฐ
var value_HUMID = (Math.floor(Math.random() * 5) + this.BASE_HUMID).toString(); // ๊ฐ์์ ์ต๋๊ฐ
var value_LUX = (Math.floor(Math.random() * 5) + this.BASE_LUX).toString(); // ๊ฐ์์ ์กฐ๋๊ฐ
return value_TEMP + this.delimiter + value_HUMID + this.delimiter + value_LUX;
}
};HTTP๋ฒ์ ์์ ์ฌ์ฉ์๊ฐ ๋ฐ๋์ ์์ ๋์ผํ๋๊ฒ
responseAddress, responsePORT, uKey, nodeID, passCode
MQTT๋ฒ์ ์์ ์ฌ์ฉ์๊ฐ ๋ฐ๋์ ์์ ๋์ผํ๋๊ฒ
userID, uKey, mqttClientId, nodeID, passCode
| ๊ตฌ๋ถ | ์ค๋ช | HTTP Method (MQTT Publish) |
|---|---|---|
| 1. node ์์ฑ | ๋ฌผ๋ฆฌ์ Device๋ฅผ ๋ฑ๋กํฉ๋๋ค. | POST |
| 2. remoteCSE ์์ฑ | ์๋น์ค ๋ฐ remoteCSE ID์ passCode๋ฅผ oneM2M ์๋ฒ์ ๋ฑ๋กํ๊ณ , ์๋น์ค์์ ๋ฐ์๋๋ ๋ฐ์ดํฐ(dKey)๋ฅผ ์ ์ฅํฉ๋๋ค . | POST |
| 3. container ์์ฑ | ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋ container๋ฅผ ์์ฑํฉ๋๋ค. ํ์ผ์์คํ ์ ํด๋์ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค. | POST |
| 4. mgmtCmd ์์ฑ | ๋๋ฐ์ด์ค์์ ๋ฐ์๋ค์ผ ์ ์๋ ์ ์ด ๋ช ๋ น์ด๋ฅผ ํฌํจํ๋ ์์์ ์์ฑ ํฉ๋๋ค. LoRa์ ๊ฒฝ์ฐ predefined๋ command๊ฐ ์์ต๋๋ค. | POST |
| 4-1. DevReset | LoRa ๋๋ฐ์ด์ค ๋ฆฌ์ ์ ์ํ mgmtCmd | POST |
| 4-2. extDevMgmt | ์ฌ์ฉ์ ์ง์ mgmtCmd (์ค์ ๋ฐฉ๋ฒ์ API ๋ฌธ์ ์ฐธ์กฐ) | POST |
| 5. Content Instance ์์ฑ | ์ผ์์ ์ธก์ ๊ฐ์ ์ง์ ํ ์ปจํ ์ด๋์ ๊ธฐ๋กํฉ๋๋ค. | POST |
| 6. execInstance ๊ฐฑ์ | ThingPlug๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ execInstance์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. | PUT |
- MQTT ๋ฒ์ ์ ๊ฒฝ์ฐ
isRunning์ ์ํ์ ๋ฐ๋ผ ๋์์ ๊ตฌ๋ถ ์ง์ผ๋ฉฐ,Subscribe๋ฅผ ํตํด ThingPlug๋ก๋ถํฐ Response๋ฅผ ๋ฐ๊ณ ,Publish๋ฅผ ํตํด ThingPlug๋ก HTTP์ Request ๋์์ ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆผ 4 - ๋๋ฐ์ด์ค ์๋ฎฌ๋ ์ดํฐ์ ์ญํ
- ์ค์ ์ผ์ ๊ฐ์ ThingPlug์ ๋ณด๋ด๊ณ , Application์์ ํด๋น ๊ฐ์ ๋ฐ๊ธฐ ์ํด์๋ contentInstance์ parameter์ธ ๊ฐ์ ์์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์๋ contents ํจ์์ return ๊ฐ์ด ๋ฐ๋ก ์ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
//////////////config.js////////////////////
module.exports = {
delimiter : ',', // contents ๊ตฌ๋ถ์
contents : function(){ // Device์์ ThingPlug๋ก ์ ๋ฌํ๋ ์ค์ ๋ฐ์ดํฐ (contentInstance์ Attribute <con>)
var value_TEMP = (Math.floor(Math.random() * 5) + this.BASE_TEMP).toString(); // ๊ฐ์์ ์จ๋๊ฐ
var value_HUMID = (Math.floor(Math.random() * 5) + this.BASE_HUMID).toString(); // ๊ฐ์์ ์ต๋๊ฐ
var value_LUX = (Math.floor(Math.random() * 5) + this.BASE_LUX).toString(); // ๊ฐ์์ ์กฐ๋๊ฐ
return value_TEMP + this.delimiter + value_HUMID + this.delimiter + value_LUX;
}
};- ์๋ ์์ ๋ application์์ ThingPlug์ ์ฌ๋ผ์จ ๊ฐ์ ์ผ์๊ฐ์ ์ง์ ํ delimiter๋ฅผ ์ด์ฉํด ํ์ฑํ์ฌ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ์์ ์ ๋๋ค.
//////////////public/js/app.js////////////////////
//-------------------------------------์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํ๋ ์ต์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ---------------------------------------//
getConfig( function(err,config) {
...
setInterval(function(){
getData(container_name, function(err,time,data_prim){
var valueTemp = data_prim.split(delimiter[nodeIndex])[0]; // delimiter๋ฅผ ์ด์ฉํ์ฌ ์จ๋๊ฐ ํ์ฑ
var valueHumid = data_prim.split(delimiter[nodeIndex])[1]; // delimiter๋ฅผ ์ด์ฉํ์ฌ ์ต๋๊ฐ ํ์ฑ
var valueLux = data_prim.split(delimiter[nodeIndex])[2]; // delimiter๋ฅผ ์ด์ฉํ์ฌ ์กฐ๋๊ฐ ํ์ฑ
...
๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ ํ๋ฉด์ด ๋์ค๋ฉด ์ ์์ ๋๋ค.
๊ทธ๋ฆผ 5 โ device_mqtt์คํ ๊ฒฐ๊ณผ
์๋์ ๊ฐ์ด ํ๋์ A ์๋น์ค ์๋ B,C ๋จ๋ง์ด ๋ฑ๋ก๋ ๊ฒฝ์ฐ, D์๋น์ค๊ฐ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ๋๋ Key๊ฐ uKey์ด๋ฉฐ, ํ์๊ฐ์ ์ ํตํด ๋ฐ๊ธ ๋ฐ์ ์ ์์ต๋๋ค.
-
uKey ๋ฐ๊ธ
- ์ธ๋ถ์์ ThingPlug Rest API ์ ๊ทผ ์ ์ ์์ ์ธ ์ ๊ทผ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ Access Token Key
(Mqtt Client์ User Credential์ผ๋ก ์ฌ์ฉ
- ํ์๊ฐ์ : https://thingplugdev.sktiot.com
- ๋๋ฐ์ด์ค ์ฐ๋ ํ๋กํ ์ฝ: HTTP ์ ํ
- ์ฌ์ฉ์ ์ธ์ฆํค: uKey (์์คํ ์์ฑ)
์ ํ๋ฆฌ์ผ์ด์ ์์ ThingPlug oneM2M REST API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ํ์์ ๋ฐ๋ผ ์ ์ด๋ช ๋ น์ ๋ณด๋ด๊ธฐ ์ํด์๋ ๋จผ์ ThingPlug ์ฌ์ดํธ์ ์ device(์์ฑ๋ remoteCSE)๋ฅผ ๋ฑ๋กํด์ผํฉ๋๋ค.
-
๋จ๋ง๋ฑ๋ก ์ด์ ์ ๋จ๋ง์ด ThingPlug ํฌํ์ node, remoteCSE ์์์ด ์ ์์ ์ผ๋ก ๋๋ก ์๋ฃ
-
๋จ๋ง ์๋ณ ๋ฐฉ๋ฒ์ ๋จ๋งID(nodeID)์ passCode๋ก ๊ตฌ๋ถ
-
passCode
-
ํฌํ์์ ๋จ๋ง์ ์๋ณํ๊ธฐ์ํ ์ฌ์ฉ์์ง์ ๋จ๋ง ๋น๋ฐ๋ฒํธ(4 โ 16์๋ฆฌ)
-
๋จ๋ง ๋ฑ๋ก ๊ณผ์ ์์ ์ฌ์ฉ
-
-
-
[ThingPlug] ๋ก๊ทธ์ธ ํ "๋ง์ดํ์ด์ง > ๋์ ๋๋ฐ์ด์ค > ๋๋ฐ์ด์ค ๋ฑ๋ก" ํ์ด์ง๋ก ์ด๋
-
์์์ device ์คํ ์ ์ฌ์ฉํ
config.js์ ๋๋ฐ์ด์ค ์์ด๋(LTID)์ passCode๋ฅผ ๊ฐ๋ณ๋ฑ๋ก์ ์ ๋ ฅํ๊ณ๋๋ฐ์ด์ค ์ ๋ณดํ์ธ๋ฒํผ
-
ํ์์ ๋ณด ์ ๋ ฅํ๋ฉด์ ๋ด์ฉ์ ํด๋น ๋ด์ฉ์ ๋ฃ์ด์ค ํ ํ๋จ '์ ์ฅ'๋ฒํผ
-
ThingPlug์ Device ๋ฑ๋ก ์๋ฃ
-
๋ง์ดํ์ด์ง โ ๋์ ๋๋ฐ์ด์ค์์ ๋๋ฐ์ด์ค ๋ฑ๋ก์ด ๋์์์ ํ์ธ
node application_web.js ๋ช
๋ น์ด๋ก application์ ์คํํฉ๋๋ค. (Application ์คํํ๊ธฐ ์ ์ device.js๊ฐ ๋์ํ๋ ์ํ๋ก ์ ์งํฉ๋๋ค. ๋ฐ๋ผ์ device.js ์คํ์ ์ข
๋ฃํ์ง ์๊ณ ์๋ก์ด terminal(์ปค๋งจ๋์ฐฝ)์ ์ด์ด ์คํํ์ธ์.
์นํ์ด์ง๋ฅผ ํ์ธํ์๊ธฐ ์ํด์๋ http://[SERVER_IP]:3000/dashboard๋ฅผ ํ์ธํด์ฃผ์ธ์
ํด๋น web page์์๋ device์ ์์น๊ฐ์ ํ์ํ ์ ์๊ณ , ๋๋ฐ์ด์ค์์ ๋ณด๋ด์จ ๊ฐ์ ์ผ์ 3์ข ์ ๊ฐ์ ๋ณด์ฌ์ฃผ๋ฉฐ, device์ predefined๋ mgmtCmd๋ฅผ ์คํํ ์ ์๊ณ , trigger๋ฅผ ์ค์ ํด event ๋ฐ์์ E-MAIL ๋ฑ์ผ๋ก ์๋ฆผ์ ์ ์ก ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ 7 โ Application ์ญํ
| ๊ตฌ๋ถ | ์ค๋ช | Method |
|---|---|---|
| 1. Content Instance ์กฐํ | ๊ฐ์ฅ ์ต๊ทผ์ content Instance๋ฅผ ์กฐํํฉ๋๋ค. | HTTP GET |
| 2. mgmtCmd ์์ฒญ | Device๋ก ๋ณด๋ผ ์ ์ด ๋ช ๋ น์ ThingPlug์๊ฒ ๋ณด๋ ๋๋ค. | HTTP POST |
| 2-1. DevReset | LoRa ๋๋ฐ์ด์ค ๋ฆฌ์ ์ ์ํ mgmtCmd | HTTP PUT |
| 2-2. extDevMgmt | ์ฌ์ฉ์ ์ง์ mgmtCmd (์ค์ ๋ฐฉ๋ฒ์ API ๋ฌธ์ ์ฐธ์กฐ) | HTTP PUT |
| 3. mgmtCmd execInstance ์กฐํ | Device๋ก ๋ณด๋ธ ์ ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์กฐํ ํฉ๋๋ค. | HTTP GET |
| 4. Sensor Display | Sensor๊ฐ(ํ์ฌ ์จ๋, ์ต๋, ์กฐ๋) ๊ทธ๋ํํํ๋ก ํ์ | d3 API |
| 5. Google ์ง๋ API | LoRa Device ์์น ํ์ | Google API |
| 6. Trigger ์ค์ | Trigger ๋ฐ์์ notification | nodemailer API |
์คํ ํ Application์์ ์ ์ด๋ฅผ ์์ฒญํ๊ณ , device.js๊ฐ ์คํ์ค์ธ ํฐ๋ฏธ๋์ ์ดํด๋ณด๋ฉด ใ
pplication์ด ๋ณด๋ธ mgmtCmd์ ๋ํ ์๋์ ๊ฐ์ ๋ก๊ทธ๊ฐ ๋ณด์ผ ๊ฒ์
๋๋ค.
๊ทธ๋ฆผ 7-1 โ Web App์์ ๋ฒํผ ์ด์ฉํmgmtCmd ์์ฒญ
Application_web ์ฝ๋ ์์
////////////CODE EXAMPLE in /public/js/app.js////////////////
///๋ฒํผ ํด๋ฆญ ์ application์์ mgmtCmd(DevReset) ์ก์ ///////
$('#DevReset').on('click', function(event) {
$.post('/control',{cmt:'DevReset', cmd:'request'}, function(data,status){
});
});๊ทธ๋ฆผ 7-2 โCLI์์ Argument๋ฅผ ์ด์ฉํ mgmtCmd ์์ฒญ
๊ทธ๋ฆผ 8 โ device.js์์ mgmtCmd Push message๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ console๋ก๊ทธ
///////CODE EXAMPLE in device.js///////////
- device_http.js ์์
////////////response for HTTP//////////////
httpRes.createServer(function (req, res) {
...//๋ฐ์ ์์ฒญ ์ฒ๋ฆฌ ๋ฐ ์๋ต
}).listen(ResponsePORT);- device_mqtt.js ์์
////////////response for MQTT//////////////
client.on('message', function(topic, message){
var msgs = message.toString().split(',');
xml2js.parseString( msgs[0], function(err, xmlObj){
...//๋ฐ์ ์์ฒญ ์ฒ๋ฆฌ ๋ฐ ์๋ต
/////////condition branch device.js//////////////////
if(cmt=='RepImmediate'){//์ฆ์๋ณด๊ณ
...
}
else if(cmt=='extDevMgmt'){//์ฌ์ฉ์ ์ง์ ๋ช
๋ น์ด
...
}
else{
}
});
์ผ์๊ฐ ๊ด๋ จ ํน์ ์ด๋ฒคํธ ๋ฐ์์ ๋ฉ์ผ๋ก ์๋ฆผ์ ๋ฐ์ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
nodemailer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์์ผ๋ฉฐ, ์๋ฆผ ๋ฐ๊ณ ์ ํ๋ ๋ฉ์ผ ์ฃผ์ ๋ฐ smtp์ฃผ์๋ฅผ ์ด์ฉํด ์ด๋ฒคํธ ๋ฐ์์ ๋ฉ์ผ๋ก ๋๋ฐ์ด์ค์ ์ ๋ณด๋ฅผ ๋ฐ์๋ณด์ธ์.
node application_web.js ๋ช
๋ น์ด๋ก Express.js ์๋ฒ๋ฅผ ์คํํฉ๋๋ค. ์ด์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด์ ์คํ ์ค์ธ ์๋ฒ์ IP๋ก ์ ์ํ์ฌ Dashboard๋ฅผ ์คํํฉ๋๋ค. ๊ฐ์ ์ผ์๋ฅผ ์ํ Dashboard๋ http://[SERVER_IP]:3000/dashboard ์ด๋ฉฐ, ๊ฐ์ ์ผ์๊ฐ์ Dashboard์ ํ์ํ๊ธฐ ์ํด์๋ node device.js ๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค. ํด๋น application์ ์ค์ ๋์๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ ์์ ํ๊ธฐ ์ํด์๋ /public/index.html ํ์ผ์์ ์นํ์ด์ง๋ฅผ ์์ ํ๊ณ , /public/js/app.jsํ์ผ์์ ์ค์ ๋์๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ ์์ ํฉ๋๋ค.
๊ทธ๋ฆผ 9 โ StarterKit Web App ์คํ ๊ฒฐ๊ณผ
๋ฒ์จ Starter Kit์ ์ด์ฉํ์ฌ SKT ThingPlug LoRa ์ฌ์ฉ์ ํ์ํ ๊ตฌ์ฑ์์๋ฅผ ์ค๋น ์๋ฃํ์ต๋๋ค. ์ด์ Application๊ณผ Device์ ์ฝ๋๋ฅผ ์์์ ์ผ๋ก ์ํ๋ ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ณด์ธ์. ์๋น์ค๋ฅผ ๊ฐ๋ฐํด ๋๊ฐ๋ ๊ณผ์ ์์ ์๊ฒจ๋๋ ๊ถ๊ธ์ฆ์ ThingPlug ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ด์ฉํด์ฃผ์ธ์.
ThingPlug๋ก ์์ํ๋ IoT ์๋น์ค ๊ฐ๋ฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์๋๋๋ค. ๋๋ฐ์ด์ค๋ง๋ค ์ต์ด 1ํ๋ง Resource๋ฅผ ๋ฑ๋กํ๋ฉด ๋ฉ๋๋ค. ๋ณธ ์คํํฐํท์์๋ ๋๋ฐ์ด์ค ์คํ ์ ๋งค๋ฒ Resource๋ฅผ ๋ฑ๋กํ๋๋ก ๋์ด ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ์๋๋๋ค. ๋ค๋ง ๊ฐ์ ID๋ก ๋ง๋๋ ค๊ณ ํ๋ ๊ฒฝ์ฐconflict ( HTTP : 409, MQTT : 4015) ๋ฉ์์ง๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
ThingPlug ํ์๊ฐ์ ์ ๋ ฅ์์์ ์๋ ๋๋ฐ์ด์ค ์ฐ๋ ํ๋กํ ์ฝ ์ ํ์ ๋ฐ๋์ HTTP๋ก ์ ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ oneM2M API๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ ์์๋ง ์ ํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์์ด๋๋ก ์ ๊ณ์ ์ ๋ง๋ค๊ณ ๊ฐ์ ์ ๋ ฅ์์์์ ๊ผญ HTTP๋ก ์ ํํด์ฃผ์ธ์.
ThingPlug ID์ uKey๊ฐ configํ์ผ์ ์ ๋๋ก ์ ๋ ฅ์ด ๋์๋์ง ํ์ธํด์ฃผ์ธ์. ๊ทธ๋ฆฌ๊ณ clientId๊ฐ ๋ค๋ฅธ์ฌ๋๊ณผ ๊ฒน์น๋ ๊ฒฝ์ฐ ๊ฐํน ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ ์ฃผ์ํ์ฌ ์ฃผ์ญ์์ค
ThingPlug ํฌํธ์ ๋๋ฐ์ด์ค๋ฅผ ๋ฑ๋กํ์๋์ง ํ์ธํด์ฃผ์ธ์. ๋ฑ๋กํ์ง ์์๊ฒฝ์ฐ uKey mapping์ด ๋์ง ์์ Application์์ ๋๋ฐ์ด์ค๋ก ์ ๊ทผ์ด ๋์ง ์์ต๋๋ค.
Sample์ฝ๋๋ฅผ ์์ ํ๋์ง, ํ์ผ๋ช ์์ sample์ ์ง์ ๋์ง ๋ค์ํ๋ฒ ํ์ธํด์ฃผ์ธ์.














