Apr 112017
 

Node-RED Hello world

이번에는 Node-RED를 가지고 기본적인 설정 후에 간단히 노드 생성 및 테스트/디버깅해봄으로써 Node-RED를 맛보기로 하겠다. Node-RED를 라즈베리 파이에서 운영하는 것은 너무도 쉽다. 2015년 11월 이후, 그러니까 Raspbian Jessie 이후의 full image를 설치했다면 이미 Node-RED가 설치되어 있다. 만약 수동으로 설치하려면 링크의 글을 보고 하면 된다. 본격적으로 Node-RED를 사용하려면 부팅시마다 자동으로 실행되도록 해주면 되는데 다음의 명령어를 실행해주면 된다. sudo systemctl enable nodered.service Node-RED가 실행중이라면 http://ip:1880을 입력해서 다음과 같은 editor에 접근이 가능하다.

node-red editor

그런데 뭔가 이상하다. 아무런 인증 과정없이 editor에 접근이 가능했다. 그렇다. 기본적으로 node-red의 editor는 아무런 인증 과정없이도 사용이 가능하다. 링크의 글을 참조해서 기본적인 사용자 인증을 적용하면 되는데, 다음에 기재한 것만 해도 별 무리는 없을 듯 하다.

sudo apt-get update 
sudo apt-get install npm 
sudo npm install -g node-red-admin 
sudo service nodered restart 

node-red-admin hash-pw 실행 후 원하는 암호 입력하면 출력되는 hash된 키를 복사해둔다. vi ~/.node-red/setting.js해서 adminAuth/httpNodeAuth/httpStaticAuth 부분의 주석표시를 제거해서 활성화 후 node-red-admin을 통해 생성한 hash된 키를 복사해 넣고 node-red를 재부팅하면 된다.

adminAuth: { 
  type: "credentials", 
  users: [{ 
    username: "admin", 
    password: "생성한 hash암호", 
    permissions: "*" }] 
}, 
httpNodeAuth: {
  user:"admin",
  pass:"생성한 hash암호"
}, 
httpStaticAuth: {
  user:"admin",
  pass:"생성한 hash암호"
}, 

이제 다시 http://ip:1880으로 접속해보면 다음처럼 로그인 화면이 나오고 위에서 지정한 암호를 입력해야 editor 접근이 가능해진다.

node-red editor login

이제 Hello world를 해보자.

Hello world 용으로 MQTT를 사용해보자. 일단 MQTT 서버와 클라이언트를 라즈베리 파이에 다음처럼 설치하자.

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key 
sudo apt-key add mosquitto-repo.gpg.key 
cd /etc/apt/sources.list.d/ 
sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list 
sudo apt-get update 
sudo apt-get install mosquitto mosquitto-clients 

아무 설정없는 상태에서 mosquitto에는 아무 인증없이 누구나 subscribe/publish가 가능하다. 그러므로 다음의 사용자 인증/토픽접근 제어 설정을 적용하도록 하자.

  • sudo vi /etc/mosquitto/mosquitto.users 해서 아이디:암호 형식으로 admin:password_1처럼 1줄에 1개씩 기재
  • sudo mosquitto_passwd -U /etc/mosquitto/mosquitto.users
  • sudo vi /etc/mosquitto/mosquitto.conf 해서 다음을 추가
allow_anonymous false 
password_file /etc/mosquitto/mosquitto.users
  • sudo service mosquitto restart 해서 재시작

테스트 해보자. * 터미널 1: mosquitto_sub -h localhost -t /sensor/livingroom/state -u admin -P password * 터미널 2: mosquitto_pub -h localhost -t /sensor/livingroom/state -m “23 -u user -P password

아이디/암호를 가지고 사용자 접근을 제어했으니까 이제는 사용자별로 사용할 수 있는 topic을 지정해보자. sudo vi /etc/mosquitto/mosquitto.acl 해서 다음을 추가한다.

user admin 
topic/sensor/livingroom/state

sudo service mosquitto restart해서 재시작한 후 테스트 해보자. * 터미널 1: mosquitto_sub -h localhost -t /sensor/livingroom/state -u admin -P password * 터미널 2: mosquitto_pub -h localhost -t/sensor/livingroom/state -m “23” -u admin -P password

다음으로는 dashboard node를 설치해야 한다(참고로 cd ~/.node-red 하지 않고 설치시 설치된 모듈이 지정된 위치에 다운로드되지 않아 인식되지 않는 오류가 발생함으로 현 시점에서는 디렉토리 변경이 필요함).

cd ~/.node-red 
npm install node-red-dashboard 
sudo service nodered restart

이제 http://ip:1880을 가면 다음과 같은 dashboard node들을 볼 수 있다.

dashboard-nodes

이제 모든 준비가 끝났다. editor에서 ctrl + i 누른 후 다음을 붙여넣은 후 다음처럼 설정을 해주면 되고 deploy버튼을 눌러서 작성한 내용이 서버에 반영되도록 한 이후 http://ip:1880/ui에 접근하면 랜덤하게 생성된 값들이 MQTT 토픽에 Publish되고 그 값들이 대쉬보드에 실시간 표시됨을 볼 수 있다.

helloworld"

[
  {
    "id": "e8a6a48f.8953d8",
    "type": "inject",
    "z": "aa0a983c.7cbef8",
    "name": "",
    "topic": "",
    "payload": "",
    "payloadType": "date",
    "repeat": "5",
    "crontab": "",
    "once": false,
    "x": 115,
    "y": 54,
    "wires": [
      [
        "fb45a81f.16e8d8"
      ]
    ]
  },
  {
    "id": "fb45a81f.16e8d8",
    "type": "random",
    "z": "aa0a983c.7cbef8",
    "name": "",
    "low": "10",
    "high": "100",
    "inte": "true",
    "x": 266,
    "y": 53,
    "wires": [
      [
        "147a741a.fcf04c"
      ]
    ]
  },
  {
    "id": "147a741a.fcf04c",
    "type": "mqtt out",
    "z": "aa0a983c.7cbef8",
    "name": "",
    "topic": "/sensor/livingroom/state",
    "qos": "1",
    "retain": "true",
    "broker": "d96006fc.6471d8",
    "x": 463,
    "y": 51,
    "wires": []
  },
  {
    "id": "89ac48b1.9612a8",
    "type": "mqtt in",
    "z": "aa0a983c.7cbef8",
    "name": "",
    "topic": "/sensor/livingroom/state",
    "qos": "2",
    "broker": "d96006fc.6471d8",
    "x": 135,
    "y": 150,
    "wires": [
      [
        "1adfa2af.934e3d"
      ]
    ]
  },
  {
    "id": "1adfa2af.934e3d",
    "type": "ui_gauge",
    "z": "aa0a983c.7cbef8",
    "name": "",
    "group": "54359e7.e23766",
    "order": 0,
    "width": 0,
    "height": 0,
    "gtype": "donut",
    "title": "Gauge",
    "label": "units",
    "format": "{{value}}",
    "min": "10",
    "max": "100",
    "colors": [
      "#00b500",
      "#e6e600",
      "#ca3838"
    ],
    "seg1": "",
    "seg2": "",
    "x": 354,
    "y": 148,
    "wires": []
  },
  {
    "id": "d96006fc.6471d8",
    "type": "mqtt-broker",
    "z": "",
    "broker": "localhost",
    "port": "1883",
    "clientid": "",
    "usetls": false,
    "compatmode": true,
    "keepalive": "60",
    "cleansession": true,
    "willTopic": "",
    "willQos": "0",
    "willPayload": "",
    "birthTopic": "",
    "birthQos": "0",
    "birthPayload": ""
  },
  {
    "id": "54359e7.e23766",
    "type": "ui_group",
    "z": "",
    "name": "Default",
    "tab": "841c7e06.6255c",
    "disp": true,
    "width": "6"
  },
  {
    "id": "841c7e06.6255c",
    "type": "ui_tab",
    "z": "",
    "name": "Home",
    "icon": "dashboard"
  }
]

helloworld-configuration

만약 어떤 값이 Random 노드에서 생성되는지 알고 싶다면 다음처럼 간단히 debug 노드를 붙여주면 된다. 생성한 디버그 노드의 출력은 끝에 달린 버튼을 클릭해서 on/off 시킬 수 있으므로 삭제하지 말고 필요없을 때에는 그냥 off시켜주면 편리하다.

helloworld-debug

이 예제를 통해 Injetc, debug, random, MQTT read(subscribe)/write(push) 그리고 dashboard 노드 중 Gauge 까지 한번에 다뤄보았다.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)