시작은 미약하였으나 , 그 끝은 창대하리라

[Python] MQTT 통신하기(docker,rabbitmq사용) 본문

프로그래밍/MQTT

[Python] MQTT 통신하기(docker,rabbitmq사용)

애플파ol 2022. 8. 12. 00:29

 

(들어가기전 ->

1. 만약 본인의 컴퓨터에서 한다면  ip:localhost  ,port=1883 으로 설정하면 됩니다.

2. docker를 사용하지 않면 포트포워딩 없이 서버의 ip, port를 입력하시면 됩니다.

3. 파이썬 기반으로 작성하였습니다. ) 

 

 

1. 기본적인 Subscriber Code 

## Subscriber Code using Paho

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("connected OK")
    else:
        print("Bad connection Returned code=", rc)

def on_disconnect(client, userdata, flags, rc=0):
    print(str(rc))

def on_subscribe(client, userdata, mid, granted_qos):
    print("subscribed: " + str(mid) + " " + str(granted_qos))

def on_message(client, userdata, msg):
    print(str(msg.payload.decode("utf-8")))

# 새로운 클라이언트 생성
client = mqtt.Client()
# 콜백 함수 설정 on_connect(브로커에 접속), on_disconnect(브로커에 접속중료), on_subscribe(topic 구독),
# on_message(발행된 메세지가 들어왔을 때)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_subscribe = on_subscribe
client.on_message = on_message
# address : localhost, port: 20518 에 연결
client.connect('localhost', 20518)


topic_name='common'                  # topic이름 
client.subscribe('topic_name', 1)   # (토픽명, QOS 레벨)  
client.loop_forever()

주의:  1. 포트번호가 20518인 이유는 나는 rabbitmq를 사용하여 서버컴퓨터와 포트포워딩(docker사용)을 하였기 때문.

           2. address 가 localhost 인 이유는 이 파일은 서버 컴퓨터에 있기 때문.( 서버 ip를 입력해도 무관함.)

          3. QOS level 은 0,1,2가 존재하는데 (rabbitmq를 사용하면 qos레벨 2는 지원하지 않음)

              (QOS level 참고: https://put-idea.tistory.com/35?category=1010122)

 

2. 기본적인 Publisher Code

# Publisher Code using Paho

import paho.mqtt.client as mqtt
import json


def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("connected OK")
    else:
        print("Bad connection Returned code=", rc)


def on_disconnect(client, userdata, flags, rc=0):
    print(str(rc))


def on_publish(client, userdata, mid):
    print("In on_pub callback mid= ", mid)


# 새로운 클라이언트 생성
client = mqtt.Client()
# 콜백 함수 설정 on_connect(브로커에 접속), on_disconnect(브로커에 접속중료), on_publish(메세지 발행)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish
# address : 111.111.111.119, port: 20158 에 연결
client.connect('111.111.111.119', 20518)   # 서버 주소 111.111.111.119(물론 진짜 ip 아닙니다...)
client.loop_start()
# common topic 으로 메세지 발행
client.publish('common', json.dumps({"success": "ok"}), 1)  # (토픽명, 보낼 데이터,QOS레벨)
client.loop_stop()
# 연결 종료
client.disconnect()

참고로 1. subscribe 코드부터 실행 시켜야 한다.

             2. QOS 레벨은 동일하게(sub,pub에) 설정해야한다.

결과 창.

결과창을 잘 보면 알겠지만 위에꺼는 서버(subscriber)이고 아래꺼는 rasberrrypi 이다.(센서값 전송이 목적...)

 

다음글에서는 json 형식의 전송 말고  GPS, Gyro, Image 전송하는 글을 쓸 예정이다.

( 아물론 이미지 base64사용해야한다)

 

***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** 

***************** ***************** ***************** ***************** ***************** ***************** ***************** 

 

 

기본적인 이해를 하셨다면 어떤 누가 local환경 에서만 연구를 하겠습니까. 

나는 상당히 도커 포트포워딩 때문에 고생했던 기억이....난다..(이걸보고 잘 해결했으면..좋겠어요)

저는  랩실서버에서 docker라는 걸 사용하여 한대의 컴퓨터에서 여러 서버를 돌립니다.

 

(docker란 간단하게 말하면 한개의 서버(컴퓨터)에서 여러개의 서버를 만들어 놀수 있게 구현하는 기술.)

(rabbitmq란 broker의 종류중 하나 입니다.. (mosquitto쓸걸.. 왜 이걸로 했지..))

(rabbimq container란 docker위에 있는 rabbitmq를 부루는 지시어)

현재 subscriber 코드의 위치.(랩실서버의 ip: 111.111.111.119), 랩실 서버 열려 있는 포트는 저렇더라구요

(참고로 학교에서 포트 안열어 놓아서 1주일동안 삽질했던 기억도.;;)

rabbitmq의 포트 번호들.

 

자 위에 써져있는 port 번호들을 잘 보셨다면 이제 모든게 끝났습니다.(포트포워딩 설명할겁니다.) 

 

docker 사용법을 설명하자니..너무 길어지니... 포트포워딩을 하는데 필요한 docker 기능만 설명하겠습니다.

 

 (한국인이 좋아하는 정서 = 결론부터 말해주기)

 (일단 이거 사용하면 됩니다 , 위에 포트포워딩 그림이랑 비교하시면 편해요) 

의미
docker run -d -p 접속시도하는 서버포트:docker포트 --name <컨테이너이름=사용자지정><이미지이름:tag>

위 사진 활용 예시
docker run -d -p 20518:1883 -p 20519:5672 --name rabbitmq rabbitmq:management

 

(-d                                                         ☜ 백그라운드 실행 ,

  -p  외부포트번호:컨테이너포트번호   ☜ 포트포워딩

)

 

 

<이해를 도울만큼만의 Docker설명>

(docker 사용법을 설명하자니..너무 길어지니... 포트포워딩을 하는데 필요한 docker 기능만 설명하겠습니다.)

 

1. docker images (당연 리눅스 환경입니다) = 설치하고싶은 파일들이 나타납니다.

(설치하고싶은 파일은 물론 https://hub.docker.com/   여기서 다운하시면되요)

(REPOSITORY = 이미지 보관소 라고 생각하시면 돼요)

 

 

2.docker ps =실행중인 컨테이너(빨강 박스에 집중해보면)

Image : rabbitmq(이미지이름):management(TAG)             ☜ 1번 사진이랑 비교해서 봐주세요

names :rabbitmq                                                                 ☜    --name rabbitmq 해서 이렇게 설정됨

20518->1883  ,20519->5672                                              ☜  포트포워딩된 상태

그림이 작지만 클릭해서 보시면 잘보여요.

 

3. 마지막 mqtt 플러그인 활성화 해야함... 

 

docker exec -it rabbitmq /bin/bash

우리가 지정했던 이름 (rabbitmq)의 컨테이너 내부로 접속 하는 명령어

    접속을 해주었으니 플러그인 활성화 하면 됨.

rabbitmq-plugins enable rabbitmq_mqtt

하면  아래와 같이 됨.

rabbitmq_pluins enable rabbitmq_management

이것 까지 해주면

이렇게 뜸.

알맞게 설치 됬는지 플러그인 확인을 위해 

rabbitmq-plugins list

입력해주면

확인하고 exit 치고 나오면 됨.

 

그렇다면 위에서 본 rabbitmq의 포트가 열린것을 확인할 수 있다.

 

 

Comments