티스토리 뷰

구현개요

 

1) windows broker 설치

2) windows subscriber 구현

3) 라즈베리파이에 publisher 구현. 센서정보 전달

 

실제 구현

 

참고링크: http://www.steves-internet-guide.com/into-mqtt-python-client/

이번에는 windows 에서 vds1/data 라는 토픽을 받는 subscriber 구현해보자

* 현재 구현에서는 broker subscriber 동일한 windows PC에서 동작하지만, 다른 PC인게 더욱 일반적일 것이다.

 

paho-mqtt package 설치

 

- 파이썬으로 mqtt Client 로서 publish, subscribe 있게 해주는 패키지이다.

 

시행착오. 부분은 컴퓨터와 환경에 따라 다를 있을 같음

 

1) pip3 install paho-mqtt 설치 (version 1.3.1)

- 파이썬 3 사용하기에 pip3 설치하였는데 경로를 못찾는듯함

2) python-etcd 설치해봄

- 구글링했는데 설치해보라는 글이 있었으나 해결안됨

3) pip install paho-mqtt 설치하니 그냥 해결됨

- (참고) 라즈베리 파이에서는 pip3 설치해야 동작하였음

- sudo pip3 install paho-mqtt

 

 

코드 보기

 

import paho.mqtt.client as mqtt

 

# subscriber callback

def on_message(client, userdata, message):

    print("message received " ,str(message.payload.decode("utf-8")))

    print("message topic=",message.topic)

    print("message qos=",message.qos)

    print("message retain flag=",message.retain)

 

# subscriber

broker_address="192.168.2.9"

client1 = mqtt.Client("ClientSubscriber")

client1.connect(broker_address)

client1.subscribe("vds1/data")

client1.on_message = on_message

client1.loop_forever()

 

1) paho.mqtt.client import

 

2) broker_address Broker 설치된 PC IP 주소임

 

3) client1 이라는 mqtt.Client() 인스턴스를 생성하고

 

4) Broker 연결한다음

 

5) Broker 에게 구독 (=subscribe) 하고 싶은 topic 이름을 전달한다

- 여기서는 vds1/data 라는 이름의 topic 이다.

 

6) Broker 로부터 message 오면 동작할 callback 함수를 등록한다

- on_message

 

7) loop_forever() 함수로 지속적으로 buffer 체크하고 이벤트를 발생한다.

- 참고링크: https://goo.gl/dhVVBu

 

Loop 대한 정리

 

- 참고링크 / 이미지 출처: https://goo.gl/dhVVBu

 

Broker Client message 오면 receibe buffer 위치하게 된다.

버퍼의 메시지를 어떻게 읽을까? 일일이 가서 있나보고 읽어올까?

아니다. 메시지가 있다면, 메시지를 처리할 함수를 미리 정해두면 편하다.

그게 callback 함수이다.

 

 


 

 

loop() 함수는 무엇을 할까?

 

1) send buffer, receive buffer 지켜보다가

2) 메시지가 있으면 그것을 처리한다.

 

Paho Python client 종류의 loop() 제공한다

 

- loop_start()

- loop_forever()

- loop()

 

 

loop_start()

 

- 새로운 thread() 생성해서 loop() 정기적으로 호출하며

- 자동으로 reconnect 해준다

- 멈출때는 loop_stop()

 

loop_forever()

 

- 새로운 thread() 아니라 프로그램을 block() 한다.

- 자동으로 reconnect 하는 것과, 멈출때 loop_stop() 부르는 것은 똑같다

- 무한루프를 돌며 실행될때 유용하다

 

loop()

 

- 호출되면 한번 실행한다.

- loop_start() loop_forever() 결국 함수를 계속 부르는 것이다.

- loop() default timeout 1초이며 파라미터로  timeout 값을 정할 있다.


반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함