IoT

Facebook Messenger와 Node js 를 이용하여 아두이노 조작하기

페이스북 메신저에서 제공하는 챗봇(chat-bot) 기능을 통해 아두이노와 같은 장비에 메시지를 주고 받는 기능을 개발해보기로 했다.

가장 먼저 페이스북 메신저 SDK 사이트를 참고하여 챗봇이 가능한 환경을 셋팅해주고 Node js 로 서비스가 가능한 소스를 개인서버에서 동작시켜줘야한다.

챗봇 서비스를 정상적으로 실행하기 위해서는 필히 https 를 통해 서비스를 제공하도록 제한하고 있는것 같다.

그런데 github에 올라온 소스는 https가 완전히 적용된 소스가 아니라 추가적인 수정이 필요하다.

그리고 app.js 파일에 모든 소스가 있기때문에 이를 분리해줘야 한다. 분리작업은 express router 기능을 이용하면 손쉽게 분리가 된다.

분리할때 url 경로를 기준으로 분리했는데

  1. /authorize
  2. /webhook

이렇게 두개의 router 를 만들어 분리를 했다.

url을 분리한뒤에는 TOKEN 관련 상수들도 추가해주어야 페이스북 메신저에서 보낸 메시지가 제대로 날라오게 된다.

github에 올라온 소스는 app.js 에서 Listener 까지 띄워주지만 나는 Express 를 이용했기 때문에 www 라는 파일에서 Listener를 띄워줘야한다.

여기서 한가지 큰 문제가 있었다.

1
[FB messenger] <--https--> [개인서버] <--websocket--> [아두이노]

이렇게 서로 통신프로토콜을 정하였는데 websocket 과 https Listener 둘다 같은 port로 동작하도록 구현을 해야만 했다.

websocket 도 https 와 마찬가지로 router를 이용하여 서비스 별로 분리를 하려고 express-ws-routes 모듈을 이용하여 websocket을 구현했다.

그런데 이 모듈은 WebSocket Security 를 지원하도록 만들어진건 아니라 일부분 수정이 필요했다.

일단 www 파일에서 Listener 를 띄우는 부분을 살펴보자

1
2
3
4
5
6
7
8
9
10
var options = {
key: fs.readFileSync('./keys/privkey.pem'),
ca : fs.readFileSync('./keys/chain.pem'),
cert: fs.readFileSync('./keys/cert.pem')
};


var server = app.listen(options,app,3000, function() {
console.log('Websocket listening on port 3000...');
});

위소스에서 app.listen으로 넘겨지는 파라미터가 options,app,3000 총 3개인데 original source 에서는 포트 번호만 넘겨주고 끝이었다.

1
2
3
options : 인증서 파일
app : https requestListener(router)
3000 : port 번호

넘겨지는 파라미터는 위와 같은데 인증서 파일과 https requestListener를 동작할 수 있도록 추가적인 파라미터를 넘겨줘야 했고 이에 맞게 express-ws-routes 소스도 약간의 수정이 필요했다.

1
2
3
4
5
6
7
8
9
10
11
12
exports = module.exports = function(options) {
var app = exports.extendExpress(options)();

app.listen = function(sslOption,requestListener,port) {
var server = https.createServer(sslOption,requestListener);
server.listen(port)
server.wsServer = exports.createWebSocketServer(server, app, options);
return server.listen.apply(server);
};

return app;
};

위 소스가 수정된 소스인데 sslOption,requestListener,port 3개의 파라미터를 받아 https listener를 띄웠고 https 를 이용하여 websocket도 띄웠기 때문에 WebSocket Security 로 서비스가 올라갔다.

websocket 의 router 기능은 express-ws-routes 모듈내에서 지원해주는 기능이기 때문에 별도록 신경 쓸것은 없다.

여기 까지 했으면 일단 전체적인 틀은 잡은것이라고 생각한다.

마지막으로 확인해봐야 할것이 facebook messenger 와 통신과 아두이노와 통신이 되는지 확인해보는것인데 facebook messenger 에서 메시지를 날리면 몇몇 단어를 제외하곤 전부 echo를 하게 되어있다. 제대로 echo가 되는지 확인을 해보면 되고 websocket 통신은 간단한 websocket client를 만들어 접속해보고 접속이 잘되면 문제가 없는것이다.

마지막으로 여러대의 아두이노 들을 관리하기 위해 socket을 별도로 관리 해주어야 하는데 Node.JS Singleton structure 이곳에 있는 소스를 참고하여 singleton 객체를 하나 만들어 socket을 저장하고 fb 메신저에서 특정 단어가 들어가면 singleton 객체에 저장된 소켓리스트에서 해당하는 아두이노를 찾아 메시지를 보내는 형식으로 구현을 하였다.

공유하기