Raspberry Pi MQTT
- IoT
- 2022. 4. 14.
다운 받고 설치를 해준다.
그리고 설치된 경로 C:\Program Files\mosquitto 복사를 해주고 환경변수를 추가 해주자.
Path에 경로를 추가 해준다.
그리고 cmd창을 4개 만들어준다
이렇게 4개 준비해준다.
왼쪽 위 : 서버(브로커) - mosquitto -v 명령어 입력
왼쪽 밑, 오른쪽 위 : 서브스크라이버 - mosquitto_sub -t iot 명렁어 입력
오른쪽 밑 : 퍼블리셔 - mosquitto_pub -t iot -m "led_on" 명렁이 입력
퍼블리셔에서 명령어를 입력하는 순간 서브스크라이버에 메세지가 전달 될거다
이제 제대로 연결을 해보자
왼쪽 밑 : mosquitto_sub -h 서버(브로커)아이피주소 -p 1883 -t iot 입력
포트는 1883으로 정해진것이다.
이제 퍼블리셔에서 메세지를 보내보자
오른쪽 밑 : mosquitto_pub -h 서버(브로커)아이피주소 -p 1883 -t iot -m "led_on" 입력
그럼 각 서브스크라이버에게 메세지가 전달된다.
그럼 이제 딕셔너리를 보내보자.
mosquitto_pub -h 서버(브로커)아이피주소 -p 1883 -t iot -m "{\"h\":65 , \"t\":24}"
이렇게 입력해야 한다
C언어에서 줄바꿈(\n)을 출력할때 처럼 "는 인식을 못해서 \" 붙여주는거다
이제 이것을 파이참을 통해서 해보자.
paho를 설치해주자.
import paho.mqtt.publish as publisher
publisher.single("iot","led_on",hostname="서버(브로커)아이피주소")
#single은 보내고 난 다음 연결을 바로 끊어버림
그리고 이렇게 작성 후 실행을 해주면 서브스크라이버에 전송이 된다.
이제 찐으로 테스트를 해보자.
cmd 창은 전부 컨트롤 + C를 눌러서 종료 시킨 후 다 닫아준다.
라즈베리파이로 가서 테스트를 한다
cmd에서 sudo apt-get install mosquitto-clients 입력해주고 설치를 해준다.
그리고 pip3 install paho.mqtt 입력해 설치해준다.
문제)
1. PC에서 broker 실행
2. PC->라즈베리파이 메세지 전송
3. 라즈베리파이 -> PC 메세지 전송
4. 파이참->라즈베리파이 메세지 전송
1. PC에서 mosquitto -v
2. 라즈베리파이 - mosquitto_sub -h broker아이피주소 -p 1883 -t hello
PC - mosquitto_pub -h broker아이피주소 -p 1883 -t hello -m "hi"
3. PC - mosquitto_sub -h broker아이피주소 -p 1883 -t hello
라즈베리파이 - mosquitto_pub -h broker아이피주소 -p 1883 -t hello -m "hi"
4. 라즈베리파이 mosquitto_sub -h broker아이피주소 -p 1883 -t hello
파이참
import paho.mqtt.publish as publisher
publisher.single("hello","hi",hostname="서버(브로커)아이피주소")
single메소드는 메시지를 전송하고 바로 연결을 끊어버린다.
그래서 메시지를 전송하고 다시 돌아오는 메소드를 볼거다
import paho.mqtt.client as client
#client 갖고 있는 publish메소드를 사용 - 객체를 생성
'''
paho.mqtt.client모듈의 Client객체의 publish를 사용하기 위한 방법
publish는 메시지를 전송하고 다시 결과를 가지고 되돌아온다
1. 클라이언트 객체를 만들기
2. 클라이언트가 브로커에 연결하기
3. 메시지 보내기
4. 메시지 보낸 후 되돌아는 결과를 확인
5. on_publish 콜백을 적용해서 publish가 제대로 됐는지 확인
'''
#result값은 메시지의 고유 ID값
def on_publish(client,userdata,result):
print(client,userdata,result)
print("데이터 전송")
try:
mqttClient = client.Client("python_pc_pub")
mqttClient.connect("192.168.50.201",1883)
#메시지를 전송하고 되돌아왔을때 발생되는 이벤트가 on_publish이고
#이벤트가 발생되면 callback함수를 실행할 수 있도록 연결
#메시지를 보내고 되돌아왔을때 on_publish라는 함수를 호출해라
mqttClient.on_publish = on_publish
mqttClient.publish("iot","led")
print("호출완료")
mqttClient.loop(2)
except Exception as err:
print("에러:",err)
mqttClient = client.Client("python_pc_pub")
mqttClient.connect("192.168.50.201",1883)
이 코드는 mosquitto_pub -h 192.168.50.201 -p 1883 명령어와 같은거고
mqttClient.on_publish = on_publish
메시지를 보내고 돌아왔을때 on_publish 함수를 실행하는 이벤트를 등록해놓고
mqttClient.publish("iot","led")
iot topic에다가 led 메시지를 전송해라 라는 의미
PC
import paho.mqtt.client as mqtt
#broker에 구독신청 - broker와 연결, topic을 등록하는 작업
#연결이 성공하면 메시지를 전송받도록 설정
#연결이 성공하면 되돌아와서 callback함수를 호출
def connect_result(client, userdata, flags, rc):
print("connect..."+str(rc)) #rc가 0이면 성공 접속, 1이면 실패
if rc==0: #연결이 성공하면 구독신청
client.subscribe("iot/led")
else:
print("연결실패...")
def on_message(client, userdata, message):
myval = message.payload.decode("utf-8")
print(myval)
try:
mqttClient = mqtt.Client()
mqttClient.on_connect = connect_result
mqttClient.on_message = on_message #메시지가 broker에 전달됐을때 콜백함수가 호출되도록 등록
mqttClient.connect("broker아이피주소",1883,60)
mqttClient.loop_forever() #등록한 토픽의 메시지를 broker에서 전송받아야 하므로 대기
except KeyboardInterrupt:
pass
finally:
pass
라즈베리파이
import paho.mqtt.client as mqtt
#broker에 구독신청 - broker와 연결, topic을 등록하는 작업
#연결이 성공하면 메시지를 전송받도록 설정
#연결이 성공하면 되돌아와서 callback함수를 호출
def connect_result(client, userdata, flags, rc):
print("connect..."+str(rc)) #rc가 0이면 성공 접속, 1이면 실패
if rc==0: #연결이 성공하면 구독신청
client.subscribe("iot/#") #모든 데이터를 수신하려면 #을 입력함
else:
print("연결실패...")
def on_message(client, userdata, message):
myval = message.payload.decode("utf-8")
print(myval)
try:
mqttClient = mqtt.Client()
mqttClient.on_connect = connect_result
mqttClient.on_message = on_message #메시지가 broker에 전달됐을때 콜백함수가 호출되도록 등록
mqttClient.connect("broker아이피주소",1883,60)
mqttClient.loop_forever() #등록한 토픽의 메시지를 broker에서 전송받아야 하므로 대기
except KeyboardInterrupt:
pass
finally:
pass
이렇게 해놓고 cmd - mosquitto_pub -t "iot/led" -m "test"
라고 입력하면 두개 모두 전송된다.
mosquitto_pub -t "iot/servo" -m "test" 라고 입력하면 라즈베리파이에게만 전송이 된다.
문제)
- MQTT 이용해서 LED 불끄고 키기
- 라즈베리파이 서브스크라이버
led_on 메세지가 오면 LED켜기
led_off 메세지가 오면 LED끄기
- PC - 퍼블리셔
키보드로 입력받은 메시지를 전송
1. PC broker 만들기
- mosquitto -v
2. 라즈베리파이 서브스크라이버 만들기
import paho.mqtt.client as mqtt
import RPi.GPIO as g
g.setmode(g.BCM)
g.setup(21,g.OUT)
def connect_result(client, userdata, flags, rc):
print("connect..."+str(rc))
if rc==0:
client.subscribe("iot/led")
else:
print("연결실패...")
def on_message(client, userdata, message):
myval = message.payload.decode("utf-8")
if myval == "led_on":
g.output(21, g.HIGH)
print("ledOn!")
elif myval == "led_off":
g.output(21, g.LOW)
print("ledOff!")
try:
mqttClient = mqtt.Client()
mqttClient.on_connect = connect_result
mqttClient.on_message = on_message #메시지가 broker에 전달됐을때 콜백함수가 호출되도록 등록
mqttClient.connect("broker 아이피주소",1883,60)
mqttClient.loop_forever() #등록한 토픽의 메시지를 broker에서 전송받아야 하므로 대기
except KeyboardInterrupt:
pass
finally:
g.cleanup()
PC
import paho.mqtt.publish as publisher
publisher.single("iot/led","led_on",hostname="broker아이피주소")