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를 이용하여 연결시켜 보았습니다
이제 라즈베리파이에 어떤 센서를 연결하여도 값을 받을 수 있을 것이고 조금 더 응용한다면 스마트폰에서도 값을 받는 것도 가능할 것 같습니다
'사물인터넷' 카테고리의 다른 글
라즈베리파이에서 AWS IoT Core 연결하기 (0) | 2022.03.06 |
---|---|
키보드/모니터 없이 라즈베리파이 원격 연결하기 (0) | 2022.03.03 |