1. Aws와 Node-red 연결하기

2. 라즈베리파이 publish -> Node-red subcribe 예제 (Switch)

3. Node-red publish -> 라즈베리파이 subcribe 예제 (LED)

 

 

 


1. Aws 와 Node-red 연결하기

 

Node.js 를 설치합니다

 

설치 후 Nodejs command prompt 를 실행합니다

 

node-red 명령어를 입력하여 node-red 를 실행합니다

node-red

 

실행 후 크롬 창에서 http://127.0.0.1:1880/ 에 접속합니다

 

 

 

다음과 같은 node-red 창이 나옵니다

 

 

아래 블록들을 다음과 같이 배치합니다

파란색 동그라미는 수정사항이 있다는 표시이고 빨간색 세모는 연결이 안 됐거나 문제가 있는 표시입니다

 

더블클릭하여 해당 노드 설정에 들어갈 수 있습니다

 

 

Inject : 

입력입니다

테스트라는 string을 보내도록 설정합니다

 

 

 

 

mqtt out:

토픽은 test, Qos는 0, 보존은 하지 않는다 로 설정한 후 빨간 네모 펜 표시로 들어갑니다

 

원하는 이름을 지정하고  서버는 본인의 엔드포인트를 붙여 넣기, 포트는 8883으로 기입하고 또다시 빨간 네모 펜 표시로 들어갑니다

 

 

라즈베리파이에서 인증서와 프라이빗 키, CA인증서를 pc로 가져온 후 파일 버튼을 눌러 해당 파일을 지정합니다

 

전부 변경을 누르면 완료

 

 

 

mqtt in:

 

서버는 mqtt out에서 만든 서버가 그대로 저장되어 있기 때문에 화살표 버튼으로 가져올 수 있습니다

 

 

토픽은 test, QoS는 0으로 지정합니다

 

 

 

 

 

이제 모든 설정을 완료하였으므로 우측 상단의 배포하기를 누릅니다

 

초록 불과 함께 접속됨이 보인다면 성공입니다

 

 

우측의 벌레 모양을 누르면 디버그를 확인할 수 있으며 inject 옆의 파란 버튼을 누르면 활성화됩니다

 

디버그 창에서 "테스트"가 제대로 발행되고 구독하였음을 알 수 있습니다

 

 

 

 

같은 test라는 이름으로 구독한다면 Aws 의 mqtt 클라이언트 테스트 화면과 라즈베리파이의 subscribe.py 를 실행했을 때도 구독이 되었음을 볼 수 있을 것입니다

 

 

 

 

 

2. 라즈베리파이 publish -> Node-red subcribe 예제 (Switch)

 

mqtt in 와 text 를 가져와 다음과 같이 배치합니다

 

mqtt in:

다음과 같이 설정합니다

서버는 위에서 만든 서버를 그대로 가져옵니다

 

 

text:

아래와 같이 설정하고 Group을 추가합니다

 

dashboard group의 설정입니다

 

 

같은 Tab을 가진 노드끼리는 같은 dashboard 상에서 표시되고

같은 Name을 가진 노드끼리는 dashboard 상에서 같은 묶음으로 표시됩니다

 

 

완료하였으면 변경을 누르고

 

배포하기를 누릅니다

 

 

이제 라즈베리파이의 스위치와 케이블이 잘 연결이 되었는지 확인한 후

 

라즈베리파이에서 발행하는 코드를 생성합니다

import time, json, ssl
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO


# aws set
ENDPOINT = "본인의 엔드포인트"
THING_NAME = 'raspi'
CERTPATH =  "/home/pi/aws/raspi.cert.pem" # cert파일 경로
KEYPATH = "/home/pi/aws/raspi.private.key" # key 파일 경로
CAROOTPATH = "/home/pi/aws/root-CA.crt" # RootCaPem 파일 경로
TOPIC = 'input' #Topic명

# GPIO set
GPIO.setmode(GPIO.BCM)
SW1 = 22
SW2 = 23
SW3 = 24
SW4 = 25

"""
GPIO.setmode(GPIO.BOARD)
SW1 = 15
SW2 = 16
SW3 = 18
SW4 = 22
"""
GPIO.setup(SW1, GPIO.IN)
GPIO.setup(SW2, GPIO.IN)
GPIO.setup(SW3, GPIO.IN)
GPIO.setup(SW4, GPIO.IN)


def on_connect(mqttc, obj, flags, rc):
  if rc == 0: # 연결 성공
    print('connected!!')

# SW 컨트롤에 따라 다른 값 발행하는 함수
def GPIO_Input_SW():
  if GPIO.input(SW1) == False:
      comment = "1 Button push !!"
  elif GPIO.input(SW2) == False:
      comment = "2 Button push !!"
  elif GPIO.input(SW3) == False:
      comment = "3 Button push !!"
  elif GPIO.input(SW4) == False:
      comment = "4 Button push !!"
  else:
      comment = None
      
  if comment is not None:
      payload = json.dumps(comment) #메시지 포맷
      mqtt_client.publish(TOPIC, payload, qos=1) #메시지 발행
      print("SW {}".format(comment))
      time.sleep(0.5)
  
    
try:    
  mqtt_client = mqtt.Client(client_id=THING_NAME)
  mqtt_client.on_connect = on_connect
  mqtt_client.tls_set(CAROOTPATH, certfile= CERTPATH, keyfile=KEYPATH, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
  mqtt_client.connect(ENDPOINT, port=8883)
  mqtt_client.loop_start()
  
  while True: 
      GPIO_Input_SW()
      time.sleep(0.01)

except KeyboardInterrupt:
  pass
  
mqtt_client.disconnect()
GPIO.cleanup()
print(end='\n')

그리고 코드를 실행합니다

connected! 가 출력되었다면 발행에 성공한 것입니다

 

 

 

대시보드로 들어갑니다

 

대시보드 창으로 들어가 보면 다음과 같고

SW1~SW4에 따라 다음과 같은 메시지를 반환합니다

 

리눅스 실행화면은 다음과 같습니다

 

 

 

 

 

3. Node-red publish -> 라즈베리파이 subcribe 예제 (LED)

 

이번에는 왼쪽의 노드 중에 mqtt out 1개와 switch 3개 를 가져와 배치합니다

 

mqtt out:

토픽을 led로 지정하고 서버는 위에서 사용한 서버를 가져옵니다

 

switch:

Label 은 node-red 상에서 표시되는 이름입니다

 

 

On/Off Payload는 스위치가 on/off 되었을 때 출력하는 값입니다

형식은 JSON으로 지정하고 JSON 형식의 코드를 작성합니다

 

 

{
	"color":"red",
	"onoff":"1"
}

 

 

Gourp 설정입니다

 

Red switch 설정을 완료하였습니다

Green과 Blue 도 똑같이 진행하되 JSON 부분만 Green, Blue로 변경하시면 됩니다

 

 

 

전부 완료하신 후 배포하기를 누릅니다

 

 

 

배포 후 대시보드 창에 들어가면

3개의 스위치가 활성화되어 있음을 볼 수 있습니다

 

 

라즈베리파이에서 led의 스위치 케이블을 모두 연결한 후 코드를 생성합니다

 

import time, json, ssl
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO

# aws set
ENDPOINT = "본인의 엔드포인트"
THING_NAME = 'raspi'
CERTPATH =  "/home/pi/aws/raspi.cert.pem" # cert파일 경로
KEYPATH = "/home/pi/aws/raspi.private.key" # key 파일 경로
CAROOTPATH = "/home/pi/aws/root-CA.crt" # RootCaPem 파일 경로
TOPIC = 'led' #Topic명
recvData = ""

# GPIO set
GPIO.setmode(GPIO.BCM)
Led_Red = 4
Led_Green = 5
Led_Blue = 6

"""
GPIO.setmode(GPIO.BOARD)
Led_Red = 7
Led_Green = 29
Led_Blue = 31
"""

GPIO.setup(Led_Red, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Led_Blue, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Led_Green, GPIO.OUT, initial=GPIO.LOW)


# GPIO 값에 따른 출력 함수
def GPIO_Led_onoff(Led, light):
  if Led == 'Red':
    Led_color = Led_Red
  elif Led == 'Green':
    Led_color = Led_Green
  elif Led == 'Blue':
    Led_color = Led_Blue
  
  if light == 1:
    print_light = "On"
  else:
    print_light = "Off"

  GPIO.output(Led_color, light)
  print("{} Led {} !!".format(Led, print_light))


# 메세지를 받았을때
def on_message(mqttc, obj, msg):
  time.sleep(0.1)
  recvData = str(msg.payload.decode("utf-8"))
  
  try:
    # json data로 전환 및 데이터 반환
    jsonData = json.loads(recvData)
    Led = str(jsonData["color"])
    light = int(jsonData["onoff"])
    # 데이터에 따른 GPIO 동작 함수
    GPIO_Led_onoff(Led, light)
  except :
    pass


def on_connect(mqttc, obj, flags, rc):
  if rc == 0: # 연결 성공
    print('connected')
    

def on_subscribe(mqttc, obj, mid, granted_qos):
  print("Subscribed: "+TOPIC)

  
try: 
  mqtt_client = mqtt.Client(client_id=THING_NAME)
  mqtt_client.on_message = on_message
  mqtt_client.on_connect = on_connect
  mqtt_client.on_subscribe = on_subscribe

  mqtt_client.tls_set(CAROOTPATH, certfile= CERTPATH, keyfile=KEYPATH, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
  mqtt_client.connect(ENDPOINT, port=8883)
  mqtt_client.subscribe(TOPIC)
  mqtt_client.loop_start()

  while True:
      time.sleep(1)

except KeyboardInterrupt:
    pass
  
mqtt_client.disconnect()
GPIO.cleanup()
print(end='\n')

on_message() 함수에서 받은 JSON data에서 color 값과 onoff 값을 가져옵니다

 

가져온 값에 따라서 GPIO_Led_onoff() 함수에서 GPIO를 출력하고 print 합니다

 

 

 

 

라즈베리파이에서 코드를 실행합니다

위와 같은 출력이 나온다면 잘 구독이 되었습니다

 

 

 

이제 대시보드의 스위치를 작동해봅니다

 

 

 

 

라즈베리파이

 

Node-red

리눅스 실행화면

 

 

 

 

 

 

 

 

 

 

이렇게 라즈베리파이에서 AWS IoT Core, mqtt, Node-red를 이용하여 연결시켜 보았습니다

이제 라즈베리파이에 어떤 센서를 연결하여도 값을 받을 수 있을 것이고 조금 더 응용한다면 스마트폰에서도 값을 받는 것도 가능할 것 같습니다

 

 

1. 라즈베리파이에 aws 연결하기

2. 라즈베리파이 publish -> Aws subcribe 예제

3. Aws publish -> 라즈베리파이 subcribe 예제

 

 


1. 라즈베리파이에 aws 연결하기

 

 

먼저 AWS에서 AWS IoT Core에 들어갑니다 (AWS 회원가입 필수)

 

Connect - Get started 에 들어가 시작하기를 누릅니다

 

 

라즈베리파이에 연결하기 위해 Linux, Python 으로 선택합니다

 

 

사물 등록을 위해 원하는 이름을 지정합니다

 

 

사물이 생성되었다는 메시지와 함께 위 창이 나왔습니다

 

연결 키트를 다운로드하고 라즈베리파이 안에 넣습니다

MobaXterm을 사용하신다면 드래그 앤 드롭만으로 쉽게 넣을 수 있습니다

 

이 연결 키트 안에 인증서와 프라이빗 키 등이 전부 들어있습니다

 

라즈베리파이 상에서 연결 키트를 넣은 폴더로 들어가 명령어를 차례대로 실행합니다

 

unzip connect_device_package.zip
chmod +x start.sh
./start.sh

 

위와 같은  {"message": "Hello World!", "sequence": 0} 형태가 나오면 성공입니다

 

 

메시지를 라즈베리파이에 전송해 볼 수 있습니다

잘 전송이 되었네요

 

 

보안 - 인증서 로 들어가면 생성한 인증서를 볼 수 있습니다

 

인증서 안으로 들어가 보면

정책과 사물이 전부 연결되어 있음을 볼 수 있습니다

 

여기서 알 수 있듯이 사물 - 인증서 그리고 인증서 - 정책 으로 연결되어 있습니다

 

만약 연결 키트로 하지 않으신다면 각각 생성 후 연결해 주어야 합니다

 

 

 

 

다음은 정책 설정을 해야 합니다

정책은 aws에 들어오는 디바이스 중 접근을 거부하거나 허용하는 권한을 정합니다

보안 - 정책 을 통해 정책으로 들어가 줍니다

그리고 본인의 정책으로 들어갑니다

 

활성 버전 편집, JSON 으로 들어가 코드를 수정해줍니다

이 코드는 모든 접근을 허용한다는 코드입니다

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ]
}

수정 후 하단의 새 버전으로 저장을 누릅니다

 

 

방금 설정한 버전 2를 활성으로 설정합니다

 

 

 

 

 

2. 라즈베리파이 publish -> Aws subcribe 예제

 

mqtt 사용을 위해 라즈베리파이에 paho-mqtt 설치

pip install paho-mqtt

 

 

설정에서 엔드포인트를 가져와 복사합니다

 

 

테스트 - 주제 구독 에서

test라는 주제를 구독합니다

 

 

라즈베리파이에서 다음과 같은 코드를 생성하고 publish.py 로 저장합니다

이때 엔드포인트는 위에서 저장한 엔드포인트를 넣으며 파일 경로는 절대 경로를 넣어줍니다

import time, json, ssl
import paho.mqtt.client as mqtt

ENDPOINT = "본인의 엔드포인트"
THING_NAME = 'raspi'
CERTPATH =  "/home/pi/aws/raspi.cert.pem" # cert파일 경로
KEYPATH = "/home/pi/aws/raspi.private.key" # key 파일 경로
CAROOTPATH = "/home/pi/aws/root-CA.crt" # RootCaPem 파일 경로
TOPIC = 'test' #주제


def on_connect(mqttc, obj, flags, rc):
  if rc == 0: # 연결 성공
    print('connected!!')

try: 
  mqtt_client = mqtt.Client(client_id=THING_NAME)
  mqtt_client.on_connect = on_connect
  mqtt_client.tls_set(CAROOTPATH, certfile= CERTPATH, keyfile=KEYPATH, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
  mqtt_client.connect(ENDPOINT, port=8883)
  mqtt_client.loop_start()
  
  i=0
  while True: 
    payload = json.dumps({'action': i*0.1}) #메시지 포맷
    mqtt_client.publish('test', payload, qos=1) #메시지 발행
    i=i+1 
    time.sleep(2)

except KeyboardInterrupt:
    pass
  
mqtt_client.disconnect()
print(end='\n')

그리고 다음 명령어로 파이썬 코드를 실행해 줍니다

python publish.py

라즈베리파이에서 connected!! 가 출력되며

 

MQTT 테스트 클라이언트에서 다음과 같이 2초에 0.1 씩 늘어나는 숫자를 받고 있다면 성공입니다

 

 

 

 

3. Aws publish -> 라즈베리파이 subcribe 예제

 

이번에는 라즈베리파이에서 subscribe.py 라는 이름의 코드를 생성합니다

import time, json, ssl
import paho.mqtt.client as mqtt

ENDPOINT = "본인의 엔드포인트"
THING_NAME = 'raspi'
CERTPATH =  "/home/pi/aws/raspi.cert.pem" # cert파일 경로
KEYPATH = "/home/pi/aws/raspi.private.key" # key 파일 경로
CAROOTPATH = "/home/pi/aws/root-CA.crt" # RootCaPem 파일 경로
TOPIC = 'test' #주제

def on_connect(mqttc, obj, flags, rc):
  if rc == 0: # 연결 성공
    print('connected')
    
def on_message(mqttc, obj, msg):
  print(msg.topic+":"+str(msg.payload))

def on_subscribe(mqttc, obj, mid, granted_qos):
  print("Subscribed: "+TOPIC)

try:
  mqtt_client = mqtt.Client(client_id=THING_NAME)
  mqtt_client.on_message = on_message
  mqtt_client.on_connect = on_connect
  mqtt_client.on_subscribe = on_subscribe
  
  mqtt_client.tls_set(CAROOTPATH, certfile= CERTPATH, keyfile=KEYPATH, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
  mqtt_client.connect(ENDPOINT, port=8883)
  mqtt_client.subscribe(TOPIC)
  mqtt_client.loop_start()
  while(1):
      time.sleep(2)

except KeyboardInterrupt:
    pass
  
mqtt_client.disconnect()
print(end='\n')

똑같이 다음 명령어로 실행합니다

python subscribe.py

위와 같은 출력이 나오고

 

 

MQTT 테스트 클라이언트로 들어갑니다

 

주제 게시로 들어가 주제 이름을 test 라 하고 게시합니다

 

 

라즈베리파이 상에서 위와 같이 나오면 성공입니다

 

 

준비물 :

raspberry pi

sd 카드 (저는 16GB로 진행했습니다)

sd 카드 리더기

 

준비 프로그램 : 

Raspberry Pi Imager

Angry IP Scanner 또는 개인 공유기 관리자 페이지

MobaXterm

VNC Viewer

 

 

 

 

 

목차

 

1. SD 카드에 Image write

2. 라즈베리파이 IP 확인

3. 라즈베리파이 연결

4. 라즈베리파이 원격연결

 

pc에 와이파이가 연결된 상태로 진행하시는 게 편합니다

 

 


1. SD 카드에 Image write

 

Operating System : Raspberry Pi OS (other) - Raspberry Pi OS FULL(32-BIT)

 

Storage : 삽입 한 SD 카드 선택

 

전부 선택하셨으면 다음과 같습니다

 

 

 

 

여기서 우측 하단의 설정 버튼을 누르시거나 윈도우 + shift + x를 누르시면 설정 창이 나타납니다

 

 

 

 

여기서  세 가지 를 체크해 줍니다

 

Enable SSH - ssh를 활성화합니다

다른 글에서 ssh 파일을 넣는 방법과 같습니다

 

Set username and password - 유저 이름과 비밀번호를 설정합니다.

유저 이름은 기본으로 pi로 설정되어있습니다

 

Configure wifi - pc가 와이파이가 연결되어있다면 자동으로 와이파이와 비밀번호가 입력되어 있으니 체크만 하시면 됩니다 이때 와이파이는 2.4G로 잡습니다

다른 글에서 wpa_supplicant.conf 파일을 넣는 방법과 같습니다

 

 

 

완료했다면 WRITE 버튼을 누르고 기다린 후

끝났다면 SD 카드를 라즈베리파이에 삽입한 후 전원을 켭니다

 

 

 

 

 

2. 라즈베리파이 IP 확인

 

Angry IP Scanner를 켭니다

위와 같은 현재 pc가 연결되어 있는 ip의 0~255의 range 가 자동 설정되며

 

혹시라도 설정이 안 되시면

cmd 창에서 ipconfig 명령어를 입력하셔서

현재 pc 가 연결되어 있는 ip를 볼 수 있습니다

 

 

 

이제 Angry IP Scanner의 start 버튼을 누르면 ip scan 이 진행되고 연결된 ip를을 보여줍니다

115번에 pc가 연결되어 있는 것이 보이고

139번이 라즈베리파이가 연결되어 있는 것이 보입니다

 

그러므로 저의 라즈베리파이의 ip는 192.xxx.xxx.139 네요

 

 

 

 

 

3. 라즈베리파이 연결

 

다음은 MobaXterm을 실행합니다

Session - SSH로 들어가서 Remote host에 본인의 라즈베리파이의 ip를 입력합니다

 

로그인 창이 나오면 성공입니다

처음에 설정한 아이디와 비밀번호를 입력합니다

(비밀번호는 입력 시 화면에 표시되지 않습니다!)

 

 

올바르게 입력했다면 비밀번호를 저장할 건지 묻는 창이 나온 후 접속이 완료됩니다

 

 

Putty를 사용할 수도 있지만 좌측의 GUI 가 편해서 MobaXterm을 선택하였습니다

드래그 앤 드롭으로 windows에서의 파일을 옮기기도 쉬워서 리눅스 환경이 아직 어렵다면 MobaXterm 이 좋지 않을까 싶네요

 

 

 

4. 라즈베리파이 원격 연결

 

순서대로 다음 명령어를 실행합니다

 

sudo apt-get update
sudo apt-get upgrade

 

 

sudo raspi-config

라즈베리의 환경설정에 진입했습니다

 

방향키로 위아래로 움직일 수 있고

Tab 키로 <Select>로 움직일 수 있습니다

 

3 Interface Options로 진입하여 SSH와 VNC Server를 enable 합니다

 

 

Tab - Finish로 설정을 빠져나옵니다

 

 

다음 명령어를 순서대로 입력합니다

sudo apt-get install tightvncserver
vncserver -geometry 1280x1024

 

문제가 없으면 password를 입력하라는 문구가 뜹니다

입력하면 한번 더 입력하라고 합니다

 

 

 

 

 

 

이제 VNC Viewer를 엽니다

VNC Server 주소를 넣으라는 창에 라즈베리파이의 ip를 입력합니다

 

 

 

위와 같은 창이 뜨는데 라즈베리파이의 아이디와 비밀번호를 입력하시면 됩니다

 

 

 

 

여기까지 모니터/키보드 없이 라즈베리파이 설치하는 방법이었습니다

+ Recent posts