do iot yourself! - 사물 간의 연결을 위한 open api
DESCRIPTION
Do IoT Yourself 세미나의 세 번째 발표 자료 프리뷰입니다. 이번 세미나에서는 지난 세미나에서 개발한 아두이노 기반 온도 센서 정보를 RESTful Web API 형태의 Open API로 개발하는 과정을 다룹니다. 프리뷰 자료이기 때문에 이후 수정, 변경될 가능성이 있으니 양해 바랍니다.TRANSCRIPT
사물 간의 연결을 위한 Open API
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
Sensing
• 주변 상황 정보
획득과 실시간
전달
Network
• 사물과 인터넷
간의 연결
Service
• 수집된 정보의
가공, 처리,
융합
Security
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■아두이노 소개 – Open source H/W
– sparkfun™ starker kit for Redboard
■가변 저항으로 LED 색깔 바꾸기 구현 – Soft potentiometer 이용
■온도 센서 구현 – 실시간 온도 정보를 serial port로 출력하기
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Get the source code: http://goo.gl/V5HJzo
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
Security
Sensing
• 주변 상황 정보
획득과 실시간
전달
Network
• 사물과 인터넷
간의 연결
Service
• 수집된 정보의
가공, 처리 융합
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Web Service Development of IoT using
Node.JS and MySQL
Serial comm.
Open API
※ Covers at day 2
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
• 단일 스레드 이벤트 루프를
통한 높은 처리성능
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■사이트에서 설치 (http://nodejs.org/)
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■설치가 완료된 이후, console에서 node 실행
■ REPL (Read Eval Print Loop)에서 코드 입력
– console.log(‘Hello, Node.JS ‘ + process.version)
■화면에 메시지와 함께 버전을 출력
■ Crtl+c를 두번 입력해서 REPL 종료
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■가장 많이 사용하는 Node.js 웹 개발 프레임워크
■ Express 생성기 설치
– npm install –g express-generator
■ Express 템플릿 생성
– express DIoTY
■템플릿 폴더로 이동하여
관련 모듈 설치
– cd DIoTY; npm install
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Open Source Relational
Database Management System (RDBMS)
– 세계에서 가장 많이 쓰이는 DB
• 다양한 웹 사이트 및 웹 애플리케이션에서 사용 중
– Apache web server, PHP, Tomcat 등과 연계해서 사용.
– 현재 Oracle에 인수
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■사이트에서 community version 설치
– Windows 계열
• http://dev.mysql.com/downloads/windows/installer/5.6.html
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ ‘mysql –u{id} –p{password}’ 로 로그인하면 설치
완료
– 오류 발생 시 ‘mysql 설치’로 googling해서 원인 해결
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Reading or Writing or Both
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ GETing or POSTing
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
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]
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Clients request, Server responses
client
요청
server
응답
client
요청
응답
응답
요청
C
S
C
C
C
C
C
C
C
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Sensing or actuating within things over internet
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ IoT requests, IoT responses
IoT
요청
IoT
응답
IoT
요청
응답
응답
요청 IoT
IoT
IoT
IoT
IoT
IoT
IoT
IoT
IoT
IoT Web Service Dev. – 사물 간의 연결을 위한 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 예
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
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
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
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
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
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
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
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.
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Design media type for representation
– application/json (without semantic descriptor)
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
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
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>
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();
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();
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); } }); });
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.
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;
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); } });
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); } });
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); } });
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); } });
IoT Web Service Dev. – 사물 간의 연결을 위한 Open API
■ Chrome browser에 Advanced REST Client 설치
– 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
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
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