Raspberry Pi MQTT

http://mosquitto.org/

 

Eclipse Mosquitto

Eclipse Mosquitto is an open source (EPL/EDL licensed) message broker that implements the MQTT protocol versions 5.0, 3.1.1 and 3.1. Mosquitto is lightweight and is suitable for use on all devices

mosquitto.org

다운 받고 설치를 해준다.

 

그리고 설치된 경로 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아이피주소")

 

댓글

Designed by JB FACTORY