51
사물 간의 연결을 위한 Open API

Do IoT Yourself! - 사물 간의 연결을 위한 Open API

Embed Size (px)

DESCRIPTION

Do IoT Yourself 세미나의 세 번째 발표 자료 프리뷰입니다. 이번 세미나에서는 지난 세미나에서 개발한 아두이노 기반 온도 센서 정보를 RESTful Web API 형태의 Open API로 개발하는 과정을 다룹니다. 프리뷰 자료이기 때문에 이후 수정, 변경될 가능성이 있으니 양해 바랍니다.

Citation preview

Page 1: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

사물 간의 연결을 위한 Open API

Page 2: Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Page 3: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

Sensing

• 주변 상황 정보

획득과 실시간

전달

Network

• 사물과 인터넷

간의 연결

Service

• 수집된 정보의

가공, 처리,

융합

Security

Page 4: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■아두이노 소개 – Open source H/W

– sparkfun™ starker kit for Redboard

■가변 저항으로 LED 색깔 바꾸기 구현 – Soft potentiometer 이용

■온도 센서 구현 – 실시간 온도 정보를 serial port로 출력하기

Page 5: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Get the source code: http://goo.gl/V5HJzo

Page 6: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

Page 7: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

Security

Sensing

• 주변 상황 정보

획득과 실시간

전달

Network

• 사물과 인터넷

간의 연결

Service

• 수집된 정보의

가공, 처리 융합

Page 8: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Web Service Development of IoT using

Node.JS and MySQL

Serial comm.

Open API

※ Covers at day 2

Page 9: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Server-side application development

platform with JavaScript

– Google’s chrome JavaScript engine (V8) 기반

– Event handling I/O Framework

• Non-blocking I/O

• 단일 스레드 이벤트 루프를

통한 높은 처리성능

Page 10: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■사이트에서 설치 (http://nodejs.org/)

Page 11: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■설치가 완료된 이후, console에서 node 실행

■ REPL (Read Eval Print Loop)에서 코드 입력

– console.log(‘Hello, Node.JS ‘ + process.version)

■화면에 메시지와 함께 버전을 출력

■ Crtl+c를 두번 입력해서 REPL 종료

Page 12: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■가장 많이 사용하는 Node.js 웹 개발 프레임워크

■ Express 생성기 설치

– npm install –g express-generator

■ Express 템플릿 생성

– express DIoTY

■템플릿 폴더로 이동하여

관련 모듈 설치

– cd DIoTY; npm install

Page 13: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Open Source Relational

Database Management System (RDBMS)

– 세계에서 가장 많이 쓰이는 DB

• 다양한 웹 사이트 및 웹 애플리케이션에서 사용 중

– Apache web server, PHP, Tomcat 등과 연계해서 사용.

– 현재 Oracle에 인수

Page 14: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■사이트에서 community version 설치

– Windows 계열

• http://dev.mysql.com/downloads/windows/installer/5.6.html

Page 15: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ ‘mysql –u{id} –p{password}’ 로 로그인하면 설치

완료

– 오류 발생 시 ‘mysql 설치’로 googling해서 원인 해결

Page 16: Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Page 17: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Reading or Writing or Both

Page 18: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ GETing or POSTing

Page 19: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Client protocol: – {GET | PUT | POST | DELETE …} {URI} HTTP/1.1

{HTTP headers, e.g. Accept:, User-Agent:, Host:, …} {body – any representation}

■ Server protocol: – HTTP/1.1 {200 OK | 404 Not Found | …}

{HTTP headers, e.g. Content-Length:, Content-Type:, …} {body – any representation}

HTTP header

empty line

body

Page 20: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Representation

– Content-Type header describes media type of the body.

<?xml version="1.0" encoding="UTF-8"?>

<xml>

<Person firstName=“John” lastName=“Smith” alive>

<age>25</age>

<height scale=“cm”>167.6</height>

<address>

<streetAddress> 21 2nd Street</streetAddress>

<city>New York</city>

<state>NY</state>

<postalCode>10021-3100</postalCode>

</address>

<phoneNumbers> … <phoneNumbers>

<children></children>

<spouse></spouse>

</Person>

</xml>

<!doctype html>

<html>

<head>

</head>

<body>

<header>

John Smith

</header>

<div role=‘main’>

<p>age: 25</p>

<p>height: 167.cm</p>

<p>address:<br/>

21 2nd Street, New York,

NY 10021-3100

</p>

</div>

</body>

</html> [HTML] [XML] [JSON]

Page 21: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Clients request, Server responses

client

요청

server

응답

client

요청

응답

응답

요청

C

S

C

C

C

C

C

C

C

Page 22: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Sensing or actuating within things over internet

Page 23: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ IoT requests, IoT responses

IoT

요청

IoT

응답

IoT

요청

응답

응답

요청 IoT

IoT

IoT

IoT

IoT

IoT

IoT

IoT

IoT

Page 24: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

Page 25: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Sets of technologies that enable websites to

interact with each other by using REST, SOAP,

JavaScript and other web technologies.

– wikipedia (http://en.wikipedia.org/wiki/Open_API)

■ Open API 예

Page 26: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ REST: REpresentational State Transfer

– from R. T. Fielding’s dissertation

• resources and their state transfer by HTTP standard protocol.

Resource

[client] [server]

Resource

GET

update

state

Resource

Resource PUT, POST, DELETE

Resource

Page 27: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Retrieving resources

– Request:

• GET /api/resources HTTP/1.1

Accept: application/json

– Response:

• HTTP/1.1 200 OK

Content-Type: application/json

{ “resources” : [ {“id” : “…”,

“name” : “…” }, … ]

}

Operation HTTP command

Retrieve GET

Create POST

Update PUT

Delete DELETE

Page 28: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Create new resource

– Request:

• POST /api/resources HTTP/1.1

Content-Type: application/json

{ “resource” : {“name” : “newbie”

} }

– Response:

• HTTP/1.1 201 Created

{ “resource” : {“id”: “1”, “name” : “newbie” } }

Operation HTTP command

Retrieve GET

Create POST

Update PUT

Delete DELETE

Page 29: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Update a resource

– Request:

• PUT /api/resources/1 HTTP/1.1

Content-Type: application/json

{ “resource” : {“name” : “intermediate”

} }

– Response:

• HTTP/1.1 202 Accepted

Operation HTTP command

Retrieve GET

Create POST

Update PUT

Delete DELETE

Page 30: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Delete a resource

– Request:

• DELETE /api/resources/1 HTTP/1.1

Accept: application/json

– Response:

• HTTP/1.1 200 OK

Operation HTTP command

Retrieve GET

Create POST

Update PUT

Delete DELETE

Page 31: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

List

information

API state

diagram

Magic

string

elimination

Design

media type

& profile

API

implement

& billboard

URL

■ Design procedure

– Excerpt from the book “RESTful Web API”

• By Leonard Richardson, Mike Amundsen and Sam Ruby

Page 32: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ List all the pieces of information for a

temperature sensor

– a list of sensors

• a thermometer, …

a collection of temperatures

» a temperature

date published

unit of measure (e.g. 섭씨 (C), 화씨 (K))

» the latest temperature

• a switch

turn on or off

Page 33: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ derives state diagram and eliminates all

magic strings

a list of

sensors

a thermo-

meter (switch)

sensor

(safe)

Turn on or off

(unsafe, idempotent*)

a list of

temperatures

temperature (datePublished)

(unitOfMeasure)

latest

(safe)

temperatures

(safe) *Idempotent: the result of a

successful performed

request is independent of

the number of times it is

executed.

Page 34: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Design media type for representation

– application/json (without semantic descriptor)

Page 35: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ API implementation & billboard URL

– Describes a request and responses briefly.

• Considers success condition and various error conditions

e.g. 200 OK on success, 500 Internal Server Error on error, …

– Billboard URL: /api

Action Request Response codes*

Retrieve sensors GET /api/sensors 200, 500

Retrieve a sensor GET /api/sensors/:id 200, 404, 500

Switch a sensor on/off PUT /api/sensors/:id 202, 404, 406, 500

Retrieve temperatures GET /api/sensors/:id/temperatures 200, 404, 500

Retrieve latest temp. GET /api/sensors/:id/temperatures/latest 200, 404, 500

* http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

Page 36: Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Page 37: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ DB schema 만들기

– MySQL console로 로그인 후 temps DB 및 schema 생성

mysql -u root -p Enter password: mysql> CREATE DATABASE temps; mysql> USE temps;

Mysql> CREATE TABLE tempData ( tempId int(11) AUTO_INCREMENT NOT NULL, tempDate datetime NOT NULL, tempCelsius decimal(4,2) NOT NULL, constraint tempData_PK primary key (tempId) );

tempData

int tempId (public key)

datetime tempDate

decimal tempCelsius

Page 38: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ DB schema 확인

– SQL 기본 질의 구문인 “SELECT {property name} FROM

{table name} WHERE {query condition}” 사용

mysql> select * from tempData; +--------+---------------------+-------------+ | tempId | tempDate | tempCelsius | +--------+---------------------+-------------+ +--------+---------------------+-------------+ 0 rows in set (0.11 sec) mysql>

Page 39: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ mysql 모듈 설치 (npm install mysql)

■ Node.JS에서 DB에 데이터 쓰기 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: ‘{password here}', database: 'temps' }); connection.connect(); connection.query('insert into tempData(tempDate, tempCelsius) values(?, ?)', [new Date(), 10.01], function(err, rows, cols) { if (err) throw err; console.log(rows); }); connection.end();

Page 40: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Node.JS에서 DB에 읽어오기

var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '{password here}', database: 'temps' }); connection.connect(); connection.query('select * from tempData', function(err, rows, cols){ if (err) throw err; console.log(rows); }); connection.end();

Page 41: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ serialport 모듈 설치 (npm install serialport)

■ Redboard와 PC 연결 후 해당 {COM port} 입력

var serialPort = require('serialport'); var sp = new serialPort.SerialPort('{your COM port here}', { baudrate: 19200, parser: serialPort.parsers.readline('\n') }); sp.on('open', function () { console.log('serial opened.'); sp.on('data', function (data) { try { data = new String(data).trim(); console.log(data + ' degree'); } catch (e) { console.error('ERROR: ' + e.name); } }); });

Page 42: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Express로 생성한 폴더의 app.js 열기

■파일 마지막 줄 위에 아래 코드 삽입

■ node app 실행

■ Browser로 http://localhost:3000/ 접속

// create http server at port 3000 var http = require('http'); http.createServer(app).listen(3000, function () { console.log("Express server listening on port 3000"); }); module.exports = app; // end of code line.

Page 43: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Retrieve sensors

var express = require('express'); var router = express.Router(); var sensorsObj = { "sensors": [{ "type": "thermometer", "id": "thermometer1", "switch": "off" }] }; /* GET api/sensors listing. */ router.get('/sensors', function (req, res) { res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(sensorsObj)); }); module.exports = router;

Page 44: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Retrieve a sensor

/* GET api/sensors/:id */ router.get('/sensors/:id', function (req, res) { try { var id = req.params.id; // search the sensor in the sensors var sensorObj = findSensor(id); if (sensorObj == null) { throw new Error('404'); } res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(sensorObj)); } catch (err) { // return error code here res.sendStatus(err.message); } });

Page 45: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Switch a sensor on/off /* PUT api/sensors/:id */ router.put('/sensors/:id', function (req, res) { try { // search the sensor in the sensors var sensorObj = findSensor(req.params.id); if (sensorObj == null) { throw new Error('404'); } if (!req.is('application/json')) { throw new Error('406'); } var sensorModified = req.body; if (!sensorModified.switch == null) { throw new Error('406'); } sensorObj.switch = sensorModified.switch; if (sensorObj.switch == 'on') { serialToDb(true); } else { serialToDb(false); } res.sendStatus(202); } catch (err) { res.sendStatus(err.message); } });

Page 46: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Retrieve temperature list

/* GET api/sensors/:id/temperatures */ router.get('/sensors/:id/temperatures', function (req, res) { try { // omitted:search the sensor in the sensors var tempList = getTemperatureList(function (tempList) { var temps = { temperatures: tempList }; res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(temps)); },queries); } catch (err) { res.sendStatus(err.message); } });

Page 47: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Retrieve the latest temperature

/* GET api/sensors/:id/temperatures/latest */ router.get('/sensors/:id/temperatures/latest', function (req, res) { try { var id = req.params.id; // search the sensor in the sensors var tempList = getLatestTemperature(function (temp) { var tempObj = { temperatures: temp }; res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(tempObj)); }); res.sendStatus(err.message); } });

Page 48: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Chrome browser에 Advanced REST Client 설치

– Open API의 동작을 간단하게 테스트 가능

Page 49: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ JavaScript API Development

– How to invoke open API with AJAX

■ Web Application Development

– HTML5 basics

– Don’t reinvent the wheel! reuses the open source.

– Data visualization with google open API

■ Postmortem

Page 50: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ HTTP 프로토콜 관련

– 개요: http://ko.wikipedia.org/wiki/HTTP

– 헤더 유형:

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

– 응답 코드:

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

■ REST API 관련

– 개요: http://ko.wikipedia.org/wiki/REST

– 설계 절차: http://webofthink.tistory.com/19

Page 51: Do IoT Yourself! - 사물 간의 연결을 위한 Open API

IoT Web Service Dev. – 사물 간의 연결을 위한 Open API

■ Node.JS 관련

– Node.JS API: http://nodejs.org/documentation/api/

– Express API: http://expressjs.com/api.html

– mysql API: https://github.com/felixge/node-mysql/

– serialport API: https://github.com/voodootikigod/node-

serialport

■ MySQL 관련

– MySQL 설치: http://blog.daum.net/bang2001/91

– SQL 문법: http://ko.wikipedia.org/wiki/SQL