[사물 인터넷 네트워크와 서비스 구축 강좌] #7-3 홈 오토메이션 – Node.js 서버 만들기

강좌 전체보기

.

홈 오토메이션 서비스 기획 중 라즈베리파이 서버를 구현할 차례입니다.

이미 이전 실습들을 진행했다면 라즈베리파이에 MQTT 브로커는 설치되어 있을겁니다. 설치되지 않았다면 아래 내용을 참고하세요.

MQTT 설치가 되었으면 Node.js 서버를 설정해주면 됩니다.

라즈베리파이 홈 서버 설치과정

우선, 서버에서 사용할 데이터베이스를 생성해야 합니다.

라즈베리파이에서는 MySQL 호환 DBMS 인 MariaDB를 사용합니다. apt-get 을 통해 MariaDB를 설치합니다.

  • sudo apt-get install mariadb-server mariadb-client

설치 도중 root 비밀번호를 설정하는 팝업이 뜨는 경우, 비밀번호를 설정해 줍니다.

팝업이 뜨지 않는 경우, 설치 완료 후 다음과 같이 입력하여 root 비밀번호를 설정해 줍니다.

  • sudo mysql_secure_installation

root 패스워드 반드시 지정해주고, 나머지 다 Y 로 대답하면 됩니다.

데이터베이스 생성을 위해 MariaDB를 실행합니다.

  • sudo mariadb -u root -p

비밀번호를 입력하면 MariaDB가 실행됩니다.

홈 오토메이션 서버에서 사용하는 데이터베이스를 생성합니다.

  • CREATE DATABASE sensor_db;

다음, 방금 생성한 데이터베이스에 연결해 채널 테이블과 데이터 테이블을 생성합니다.

connect sensor_db

CREATE TABLE `channel_table` (
  `channel` int(11) NOT NULL AUTO_INCREMENT,
  `channel_info` varchar(20) DEFAULT NULL,
  `auth_code` char(6) DEFAULT NULL,
  `status` char(1) DEFAULT '1',
  PRIMARY KEY (`channel`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

CREATE TABLE `data_table` (
  `_id` int(11) NOT NULL AUTO_INCREMENT,
  `channel` int(11) DEFAULT '0',
  `data` int(11) DEFAULT '0',
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`_id`)
) ENGINE=InnoDB AUTO_INCREMENT=746 DEFAULT CHARSET=utf8;

데이터베이스 생성이 완료되면 Node.js용 패키지 폴더를 생성해 패키지 초기화를 실행합니다. 홈 오토메이션용 Node.js 프로젝트를 시작하는 것입니다.

  • mkdir sensor_nodejs
  • cd sensor_nodejs
  • npm init

Node.js로 구현된 홈 오토메이션 예제를 다운 받으세요.

다운받은 파일들을 새로 생성한 패키지 폴더에 복사하고 다음의 모듈들을 설치해 줍니다.

  • npm install body-parser mysql mqtt express chart.js pug

다음의 모듈들은 홈 오토메이션 예제에서 사용되는 UI framework 인 부트스트랩-  CoreUI 를 사용하기 위해 설치하는 모듈들입니다. 이 모듈들은 CoreUI 모듈을 설치하기 전에 설치해야 정상설치가 됩니다.

  • npm install jquery perfect-scrollbar popper.js bootstrap chalk pace-progress

마지막으로 CoreUI 모듈을 설치합니다.

  • npm install @coreui/coreui @coreui/coreui-plugin-chartjs-custom-tooltips

package.json 파일을 열어 main 필드를 예제 파일의 app_sensor.js로 변경해 줍니다.

{
  "name": "sensor_nodejs",
  "version": "1.0.0",
  "description": "",
  "main": "app_sensor.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@coreui/coreui": "^2.0.4",
    "@coreui/coreui-plugin-chartjs-custom-tooltips": "^1.2.0",
    "@coreui/coreui-plugin-npm-postinstall": "^1.0.2",
    "body-parser": "^1.18.3",
    "bootstrap": "^4.1.3",
    "chalk": "^2.4.1",
    "chart.js": "^2.7.2",
    "express": "^4.16.3",
    "jquery": "^3.3.1",
    "mqtt": "^2.18.3",
    "mysql": "^2.16.0",
    "pace-progress": "^1.0.2",
    "perfect-scrollbar": "^1.4.0",
    "popper.js": "^1.14.4",
    "pug": "^2.0.3"
  }
}

다음 app_sensor.js 파일을 열어 데이터베이스 연결과 관련된 설정을 변경해 줍니다.

const sqlConn = sql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '사용자 비밀번호',
  database: 'sensor_db',
})

앞서 database 이름을 sensor_db 로 했으니 여기서도 똑같이 맞춰줘야 합니다.

그리고 서버의 도메인 이름(또는 IP addr)을 설정해줘야 합니다. config.json 파일을 열어서 수정해줍니다.

  • server_addr : 도메인 이름 대신 내부 IP (192.168.x.x)를 사용해도 되지만, 그럼 공유기 외부에서 접속할 수가 없습니다.
  • mqtt_addr : Node.js 가 MQTT 접속하기 위해 쓰는 주소기 때문에 굳이 도메인 이름을 쓸 필요가 없습니다. 내부 IP 를 사용하면 됩니다. 포트도 1883 포트 그대로 쓰면 됩니다.
{
  "server_addr":"http://user.server.com",
  "server_port":1000,
  "mqtt_addr":"mqtt://user.server.com",
  "mqtt_port":1883
}

공유기에 설정된 도메인 주소가 있다면 server_addr 항목에 도메인 주소를 넣어주세요. 그리고 server_port 포트는 원하는대로 수정해주세요. 대신 공유기에 포트 포워딩 설정을 해주셔야 공유기 외부에서 접속이 가능합니다. 이 예제에서는 server_port = 3010 포트로 수정했습니다. 그리고 공유기 포트포워딩 설정을 해줬습니다.

  • 공유기 접속시 : 3010 포트로 접속할 경우
  • 포워딩 : 192.168.x.x 아이피, 3010 포트로 전달되도록 설정

Node.js에서 데이터베이스에 접근할 수 있게 하기 위해 MariaDB root 계정에 권한을 부여해야 합니다.

쉘에 다음과 같이 입력하여 MariaDB 접근에 대한 root 권한을 얻어옵니다.

  • sudo mysqld_safe –skip-grant-tables

그 후 MariaDB를 실행합니다.

  • sudo mariadb -u root -p

MariaDB에서 다음과 같이 입력하여 root 계정에 모든 권한을 부여합니다.

use mysql;
GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY '사용자비밀번호';
FLUSH PRIVILEGES;

이것으로 홈 오토메이션 서버 구동 준비가 끝났습니다.

아래 명령어로 서버를 실행하세요.

  • sudo node app_sensor.js

아래 주소로 접속해서 채널 선택 화면이 뜨는지 확인해보세요.

  • http://RPi_IP_Address:3010/login

화면이 뜨면 Node.js 서버 구동이 성공한 것입니다!

팁!!

Node.js 서버는 백그라운드로 계속 돌고있어야 합니다. 아래 방법을 사용하면 Terminal 접속과 상관없이 서버가 계속 돌아가도록 만들 수 있습니다.

  • npm install -g forever
  • sudo forever app_sensor.js &

멈출 때는…

  • sudo forever stop 0

단, 라즈베리파이가 재구동 되면 다시 실행해줘야 합니다.

주의!!! [사물 인터넷 네트워크와 서비스 구축 강좌] 시리즈 관련 문서들은 무단으로 내용의 일부 또는 전체를 게시하여서는 안됩니다. 계속 내용이 업데이트 되는 문서이며, 문서에 인용된 자료의 경우 원작자의 라이센스 문제가 있을 수 있습니다.

강좌 전체보기

.

You may also like...