본문 바로가기

PROGRAMMING/PYTHON

[MQTT] Python subscribe, publish

<이전 글>



  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

  1. MQTT client 생성
  2. client callback 사용자 함수 생성 및 client 객체에 연결 
    1. on_connect() : 콜백 함수 동작 시 subscribe 하도록 설정
    2. on_message() : 메시지가 수신되었다면 message.payload를 읽고 메시지 종류에 따라 사용자 함수를 호출 하여 필요한 작업을 수행
      (<프로그램 흐름>상 이 단계에서 publish 수행이 필요했음)
  3. broker에 client 연결(이때 연결 방식 : 동기 or 비동기 선택한다. 이번 문서의 코딩 순서는 비동기 방식을 따른다.)
  4. loop start : 그리고 loop가 끊어지지 않도록 밑에 다른 작업 코드를 추가해준다.