(들어가기전 ->
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를 부루는 지시어)
(참고로 학교에서 포트 안열어 놓아서 1주일동안 삽질했던 기억도.;;)
자 위에 써져있는 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의 포트가 열린것을 확인할 수 있다.
'프로그래밍 > MQTT' 카테고리의 다른 글
[Python] MQTT를 이용한 이미지 전송 (raspberry pi 이용) (0) | 2022.08.29 |
---|---|
[Python] MQTT를 이용한 자이로센서 값 전송 (raspberry pi 이용) (0) | 2022.08.15 |
(4) MQTT.fx 사용하기 (0) | 2022.03.01 |
(3) 파이썬에서 MQTT 사용하기. (0) | 2022.03.01 |
(2) MQTT Broker 구동하기 (0) | 2022.03.01 |