개발 기록일지

[node-red] MQTT 통신 하기 (1)노드레드 시작 본문

프로그래밍/node-red

[node-red] MQTT 통신 하기 (1)노드레드 시작

JuoDev 2021. 4. 2. 17:13

1)Node-red 를 왜 쓰지

 

회사에서 node-red 를 활용하여  서버와 클라이언트의 MQTT통신을 구현해

dashboard page를 만들어야 할 일이 있었다.

 

Node-red 는 IBM 에서 개발한 흐름 기반 프로그래밍 도구이다. 일반적인 IDE와는 달리

 

화면 왼쪽에 '팔레트' 라는 노드모음에서 'Node'를 선택해서 프로그램의 흐름대로 프로그래밍을 하는 것이다.

 

기본언어는 JavaScript가 제공되고 NodeJS를 설치해야한다.

NodeJS로 웹서비스 만드신분들은 훨씬 능숙하게 다루실듯...?

 

보통 하드웨어, IOT 의 통신을 통한 내부 이벤트 처리, 모니터링 등으로 많이 쓰인다.

 

소스의 흐름을 시각화 시켜서 보기 때문에 직관적으로 볼 수 있다는 점이 좋은 것 같다.

 

그리고 배포하는게 상당히 용이하다. 수정하고 우측 상단에 배포를 누르면 바로 배포가 된다.

 

또한 Dashboard 팔레트를 설치해서 노드의 흐름을 시각화 시켜서 바로 보여줄 수 있다는 점이 용이하다.

 

 

단점이라면 흐름대로 진행되기 때문에 

 

어떤 이벤트가 발생하고 끝난다고 해서 그 값들이 사라지는게 아니라 다 남아있다. 그래서 동작 하나하나에 대한 처리를 다해줘야 한다는 점.

 

각 노드간 와이어링 ( 연결)을 통해서 이어지는데 점차 많아지면 화면이 너무 복잡해진다...그리고 변수 이런것들을 찾는게 좀 힘들다 .

 

비주얼이나 리눅스의 vi 편집기, 이클립스 등으로 코딩해오다가 갑자기 이런식으로 해보니 뭔가 적응이 더 안됐던거같다.

 

 

Node-red를 사용한 가장 큰 이유는 MQTT 통신 방식을 통해 원격 하드웨어,IOT 등을 다룬다고 가정했을때,

가장 효율적인 방식이며 쉽고 간단하게 구현할 수 있어서 사용했다.

 

 

2)MQTT 통신

MQTT 통신 예시

 

 

MQTT 통신은 위 사진처럼 'MQTT Broker' 라는 중간 관리자를 통해 통신하는 방식이다

 

그리고 MQTT Broker에는 'Python' , 'C' , 'C++' , 'JAVA' 등 Topic 이라는 여러개의 채널이 있고

 

이 Topic 을 통해 메세지를 전송하고 받는 형식이다. 여기서 메세지란 토픽이라는 링크를 통해 전달되는 데이터를 의미한다.

 

쉽게말하면 

 

  • 바나나와 수박이 서로 메세지를 주고 받고 싶다고 가정하자,  이때 Topic을 통해서 서로 메세지를 주고 받을 수가 있다.
  • Topic은 유투브 채널 같은 개념이며 , 바나나가 위 사진과 같이 'C'라는 Topic 채널을 구독(subscribe) 하면  'C' Topic 유투브 채널에 올라오는 영상을 볼 수가 있는 것이다.
  • 사진과 같은 경우 수박이 'C' Topic으로 메세지를 전송(publish) , 바나나는 'C' Topic을 구독(subscribe) 하고 있으므로 수박의 메세지를 바나나에서 받을 수 있고,  바나나에서 전송한 메세지를 수박에서 받을 수가 있다.
  • 포도는 'C++' Topic에 메세지를 Pub 하면 , 참외는 구독한 'C++' Topic 을 통해 포도의 메세지를 받는다
  • 참외가 'JAVA' Topic에 메세지를 Pub 하면 , 포도는 구독한 'JAVA' Topic을 통해 참외의 메세지를 받는다.

 

 

이렇게 특정 토픽을 통해 클라이언트와 서버가 메세지를 주고 받는 형식으로 진행 된다.

 

메세지(msg)라는 객체는 

 

기본적으로 _msgid  , topic , payload 로 구성되어있다.

 

각각 전달되는 msg마다 가지고있는 번호 (msg._msgid) 

 

메세지를 주고받는 토픽 ( msg.topic)

 

메세지의 내용 (msg.payload)

 

 

 

또한 msg객체에는 사용자가 속성(변수)을 지정해서 사용할 수도 있다.

다음과 같은 function node를 클릭해서

msg.topic="Control"
msg.value="ㅎㅎ";
msg.addr="서울 특별시";
msg.payload="아아아아아";
return msg;

이와 같이 return msg; 를 하면 msg객체안의 다음과 같은 속성을 가지고 가게 된다.

 

 

 

 

3)노드레드  팔레트 설정

 

노드레드를 설치하고

http://ip:port/ui 로 접속하게 되면 처음에는 우측에 기본적인 노드들만 존재한다

 

그래서 우측 상단 배포버튼 오른쪽 메뉴 속 팔렛트 관리를 통해 내게 필요한 팔렛트를 설치할 수 있따.

 

설치 가능한 노드에서 검색을 통해 필요한 팔렛트를 설치가능

기본적으로 깔려있는 것들이 있고

 

dashboard에서 led 를 표현하기 위해 node-red-contrib-ui-led 팔렛트나

 

DB 와 연결하기위해 postgres 등을 추가로 설치할 수가 있다.

 

 

작업 일부분

위 사진은 mqtt 브로커 통신으로 DB를 조회,업데이트 다시 특정 토픽으로 메세지를 전달하는 일부분이다.

 

 

 

 

mqtt node를 클릭하면 다음과 같이 토픽명과 mqtt 서버의 주소,포트, id,pw, tls 설정등을 할 수 가 있다.

 

 

 

작업 일부분 사진처럼 mqtt노드는

mqtt in / mqtt out 으로 나뉘어져 있고

 

토픽을 구독할때는 mqtt in // 토픽에게 메세지를 전송(publish)할때는 mqtt out 노드를 사용한다

 

참고로 위 사진처럼 mqtt in의 토픽이 HBEAT_BN/# 인 경우 

 

HBEAT_BN/123,  HBEAT_BN/234, HBEAT_BN/ㅎㅎㅎ,....

 

이런식으로 HBEAT_BN 으로 시작하는 모든 토픽을 구독하겠다는 뜻이다. 

위와 같은 토픽들이 들어오면 사진과 같은 동작들을 수행하게 되는 것이다.