서론
이번에는 A리모컨에서 신호를 받으면 똑같은 기능을 하는 B리모컨의 버튼을 송신하는 node.js 앱을 만들어보고, 재부팅했을 때에도 항상 돌아가게 서비스로 만드는 방법을 알아보도록 하겠습니다.
개발 환경
pi@raspberrypi:~ $ node –version
v4.2.1
pi@raspberrypi:~ $ forever –version
v0.15.3
pi@raspberrypi:~ $ forever-service –version
forever-service version 0.5.100.5.10
lirc_node
lirc_node는 node에서 lirc를 다루기 위한 모듈입니다. node.js가 설치되어있지 않다면 외부 블로그의 글 http://blog.xcoda.net/86 을 참고하여 설치를 하고 npm을 통해 lirc_node를 설치합니다.
pi@raspberrypi:~ $ npm install lirc_node
lirc_node@0.0.4 node_modules/lirc_node
그리고 새로운 node.js 프로젝트 파일을 생성하고 합니다.(저는 lirc_server.js로 짓겠습니다) 그리고 아래의 내용 중에서 ‘TIENA-custom’이 A 리모컨이고 ‘BRITZ-T3400’이 B 리모컨입니다. A 리모컨의 버튼 입력을 B 리모컨의 신호로 송신하는 코드입니다.
pi@raspberrypi:~ $ nano lirc_server.js
lirc_node = require(‘lirc_node’)lirc_node.init();
lirc_node.addListener(function(data){
console.log(“Received ” + data.key + ” from remote ” + data.remote);
if(data.remote == ‘TIENA-custom‘){
lirc_node.irsend.send_once(‘BRITZ-T3400‘,data.key);
console.log(“Sending ” + data.key + ” to remote BRITZ-T3400″);
}
});
저장하고 텍스트 에디터를 종료한다음 실제로 실행해봅시다. 실행을 하면 아무것도 나타나지 않지만 리모컨으로 입력을 주면 반응합니다.
pi@raspberrypi:~ $ node lirc_server.js
Received KEY_VOLUMEUP from remote TIENA-custom
Sending KEY_VOLUMEUP to remote BRITZ-T3400
Received KEY_VOLUMEDOWN from remote TIENA-custom
Sending KEY_VOLUMEDOWN to remote BRITZ-T3400
Received KEY_MUTE from remote TIENA-custom
Sending KEY_MUTE to remote BRITZ-T3400
실제로 송신하고 있는지는 휴대폰 카메라를 켜서 적외선 LED을 매우 근접해서 비추고 있으면 적외선이 나오는 것이 보라색 빛으로 나타나는 것으로 확인할 수 있습니다.
forever-service
이러한 리모컨 전달 앱은 라즈베리파이가 껐다 켜져도 시작할 수 있어야 쓸모가 있습니다. node.js 프로젝트를 서비스처럼 활용하기 위하여 forever-service 모듈이 있습니다. npm로 -g 옵션으로 /usr/lib/node_modules에 설치되도록 그리고 관리자 권한으로 forever-service와 종속 모듈인 forever을 forever, forever-service 순서대로 설치합니다.
pi@raspberrypi:~ $ sudo npm install forever -g
npm WARN optional dep failed, continuing fsevents@1.1.2
/usr/local/bin/forever -> /usr/local/lib/node_modules/forever/bin/forever
forever@0.15.3 /usr/local/lib/node_modules/forever
├── object-assign@3.0.0
├── path-is-absolute@1.0.1
├── colors@0.6.2
├── clone@1.0.2
├── timespan@2.3.0
├── optimist@0.6.1 (wordwrap@0.0.3, minimist@0.0.10)
├── cliff@0.1.10 (eyes@0.1.8, colors@1.0.3)
├── nssocket@0.5.3 (eventemitter2@0.4.14, lazy@1.0.11)
├── prettyjson@1.2.1 (colors@1.1.2, minimist@1.2.0)
├── winston@0.8.3 (cycle@1.0.3, async@0.2.10, stack-trace@0.0.10, eyes@0.1.8, isstream@0.1.2, pkginfo@0.3.1)
├── utile@0.2.1 (async@0.2.10, deep-equal@1.0.1, ncp@0.4.2, i@0.3.5, mkdirp@0.5.1, rimraf@2.6.2)
├── shush@1.0.0 (strip-json-comments@0.1.3, caller@0.0.1)
├── nconf@0.6.9 (ini@1.3.4, async@0.2.9, optimist@0.6.0)
├── flatiron@0.4.3 (director@1.2.7, optimist@0.6.0, prompt@0.2.14, broadway@0.3.6)
└── forever-monitor@1.7.1 (minimatch@3.0.4, ps-tree@0.0.3, broadway@0.3.6, chokidar@1.7.0)
pi@raspberrypi:~ $ sudo npm install forever-service -g
npm WARN deprecated swig@1.4.2: This package is no longer maintained
/usr/local/bin/forever-service -> /usr/local/lib/node_modules/forever-service/bin/forever-service
/usr/local/bin/get-forever-config -> /usr/local/lib/node_modules/forever-service/bin/get-forever-config
forever-service@0.5.10 /usr/local/lib/node_modules/forever-service
├── commander@2.3.0
├── async@0.9.2
├── shelljs@0.3.0
├── walker@1.0.7 (makeerror@1.0.11)
└── swig@1.4.2 (optimist@0.6.1, uglify-js@2.4.24)
node.js 앱을 서비스로 등록하기 위해서는 ‘sudo forever-service install -s node소스파일.js 서비스이름’ 과 같이 입력합니다. node소스파일.js는 소스의 경로(상대경로든 절대경로든 상관없습니다.) 서비스이름은 ‘/etc/init.d/서비스이름’ 할 때 그 이름입니다. 저는 소스파일이름과 서비스이름을 같게 쓰겠습니다.
pi@raspberrypi:~ $ sudo forever-service install -s lirc_server.js lirc_server
forever-service version 0.5.10Platform – Raspbian GNU/Linux 9 (stretch)
foreverpath not found
lirc_server provisioned successfullyCommands to interact with service lirc_server
Start – “sudo service lirc_server start”
Stop – “sudo service lirc_server stop”
Status – “sudo service lirc_server status”
Restart – “sudo service lirc_server restart”
forever-service 모듈이 알아서 운영체제를 찾고 그에 맞추어 설정파일을 만들어줍니다. 어떻게 서비스를 시작/종료/상태확인/재시작을 하는지 명령어를 알려줍니다.
그리고, 이 서비스가 라즈베리파이가 부팅될 때 자동으로 실행되게 하기 위해 systemctl 명령어로 등록을 해줍니다.
pi@raspberrypi:~ $ sudo systemctl enable lirc_server
lirc_server.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable lirc_server
그리고 마지막으로 한가지 더 해야할 것이 있습니다. 기본적으로 forever-service로 만든 서비스는 터미널, GUI같이 그래픽이 불러져야 자동으로 시작합니다. 이를 라즈베리파이가 켜지기만 하면 자동으로 실행되기 위해서 아래의 파일을 삭제해줍니다. 강조 표시되어있는 부분을 본인이 만든 서비스이름으로 바꾸면 됩니다.
pi@raspberrypi:~ $ sudo rm /run/systemd/generator.late/graphical.target.wants/lirc_server.service
이제 재부팅해서 라즈베리파이에 터미널로 접속하지 않고도 A 리모컨의 버튼을 누르면 적외선 LED에서 불 빛이 나는지 확인해봅시다. 완전히 켜질때까지 시간이 조금 걸리니 1~2분 정도의 여유를 가지고 테스트 해보세요.
서비스를 삭제할 때
‘sudo systemctl disable 서비스이름‘ -> ‘sudo forever-service delete 서비스이름‘ 순서로 실행하면 삭제됩니다.