라즈베리파이 node.js 기반 REST API를 이용하여 LED on/off 제어하기

Web 상에서 라즈베리파이를 제어하고 라즈베리파이와 연결 된 센서 정보를 수집하기 위해 REST API를 사용하기로 했다. 해당 작업을 진행하기 위해 먼저 간단히 REST API의 GET, PUT method로 LED를 제어해보기로 한다.

node.js와 express는 설치된 것으로 간주하고 진행하겠다.(참고 : 라즈베리파이 node.js 설치와 express로 웹페이지 띄우기)

 

onoff 라이브러리 설치

GPIO control을 위해 onoff 라이브러리를 설치한다.

$ npm install onoff

 

LED control 모듈 만들기

LED를 제어하기 위한 JavaScript 모듈을 express 프로젝트 디렉토리의 routes에 만든다.

power.js

var express = require('express');
var router = express.Router();
var onoff = require('onoff');

var Gpio = onoff.Gpio;
var power = new Gpio(24, 'out');

/* GET users listing. */
router.get('/', function(req, res, next) {
        var status = power.readSync();
        res.send( { status : status });
});
router.put('/', function(req, res) {
        var status = req.body.status;

        console.log("status : " + status);

        if(status == 0) {
                power.writeSync(0);
        }
        else if(status == 1) {
                power.writeSync(1);
        }
        res.send();
});
module.exports = router;

코드를 보면 GET method의 경우 readSync() 함수를 이용해 GPIO의 현재 값을 읽어와 return 하도록 했다. 그리고 PUT의 경우 status key 값이 0인 경우 GPIO를 0으로 1인 경우 GPIO를 1로 세팅 되도록 하였다.

 

URL 설정

power/api URL을 통해 GET/PUT method 사용이 가능하도록 추가한다. 프로젝트 디렉토리의 app.js를 수정하자.

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');
var users = require('./routes/users');
var power = require('./routes/power');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);
app.use('/power/api', power);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

위와 같이 power 모듈을 require() 함수로 불러주고 app.use()를 이용하여 /power/api URL에 의해 호출 되도록 한다.

보드는 아래와 같이 연결하였다. GPIO pin은 24번 pin을 사용하였고 GND 역시 연결했다.

 

POSTMAN을 이용하여 GET/PUT Method로 JSON 객체 주고 받기

먼저 GET method로 power/api URL을 요청하면 아래와 같은 JSON 객체를 받는다.

 

그리고 PUT method로 아래와 같이 status 값을 1로 보내보자.

Headers 설정을 아래와 같이 Content-Type과 application/json으로 설정해주었다.

PUT method를 날리면 아래와 같이 LED에 불이 들어온다.

Leave a Reply