<이전 글>
MQTT의 구독과 발행 |
- MQTT 브로커와 클라이언트를 연결하면 데이터를 sub/pub 할 때 필요한 토픽(topic)을 설정해야 한다.
- 해당 브로커에 접속하여 데이터를 주고 받고자 하는 클라이언트들이 각자가 원하는 데이터를 지정 하기 위한 수단으로 토픽을 이용한다.
구독 subscribe |
- 'XX라는 topic으로 브로커에 도달하는 메시지를 수신하겠다.' 정하면? client.subscribe('XX') 코드를 입력하면 된다.
- 그렇게 되면 subscribe 위치를 어디로 잡을 것인가가 문제.
- client(python 코드로 작성중인 프로그램 파일)에서 on_connect() 콜백 함수가 별 탈 없이 수행된다면?
- 무사히 broker와 connect 되었다는 의미 이므로, 개인적으로는 on_connect() 콜백 함수에 rc(result code)의 확인과 subscribe를 수행 하도록 코드를 구현했다.
1 2 3 | def on_connect(self, client, userdata, flags, rc): print "connect with result code "+str(rc) client.subscribe("XX") | cs |
on_subscribe(), on_message() callback |
- client.subscribe() 했으니 콜백도 on_subscribe()로 구독한 메시지를 확인할 수 있지 않을까? 라고 생각하기 쉽다.
- 그러나 on_subscribe() 콜백은 메시지의 수신이 제대로 이루어졌을 때 실행 되는 함수
- topic으로 구독한 메시지를 확인 할 수 있고, 그 메시지를 가지고 수행 할 기능을 넣는 위치는 on_message() 콜백 함수
- on_message() 콜백의 인자들 중 message가 우리가 구독한 메시지와 관련한 내용이고
- 그 중 message.payload가 사용자가 가장 필요로 하는(!) 내용
1 2 | def on_message(self, client, userdata, message): print('subscribe data : ', message.payload) | cs |
발행 publish |
- 'XX'라는 topic으로 subscribe가 가능하다면 어느 한쪽에서는 같은 topic으로 메시지를 publish 중이라는 의미
- 프로그램 기능 흐름에 따라 publish 위치 선정
1 | client.publish("XX",pub할 내용) | cs |
코딩 순서 |
기본적으로 python MQTT description을 참고하여 소스를 짰으나 시행착오를 겪으면서 프로그램 흐름에 맞춰 코딩 한 것이기 때문에 개인적인 코딩 순서이지 절대적인 코딩 순서가 아니다.
<프로그램 흐름>
MQTT 통신 연결 -> subscribe -> 메시지 확인 -> 메시지 종류에 따른 사용자 함수 처리 -> publish
- MQTT client 생성
- client callback 사용자 함수 생성 및 client 객체에 연결
- on_connect() : 콜백 함수 동작 시 subscribe 하도록 설정
- on_message() : 메시지가 수신되었다면 message.payload를 읽고 메시지 종류에 따라 사용자 함수를 호출 하여 필요한 작업을 수행
(<프로그램 흐름>상 이 단계에서 publish 수행이 필요했음) - broker에 client 연결(이때 연결 방식 : 동기 or 비동기 선택한다. 이번 문서의 코딩 순서는 비동기 방식을 따른다.)
- loop start : 그리고 loop가 끊어지지 않도록 밑에 다른 작업 코드를 추가해준다.
'PROGRAMMING > PYTHON' 카테고리의 다른 글
[Python3] requests로 웹서버에 데이터 전달하기 (0) | 2018.08.23 |
---|---|
[Python3] ARTIK 시리얼 포트로 LoRa(stm32) 데이터 수신 (0) | 2018.08.23 |
C에서 보내는 HTTP-POST 데이터 python flask로 받기 (0) | 2018.08.16 |
pip3 install on Ubuntu 16.04.4 LTS (0) | 2018.07.19 |
[MQTT] Python MQTT , client와 broker 연결 (0) | 2018.06.22 |