이번에는 이전글에서 설정했던 오라클 클라우드의 linux를 이용해 MQTT 브로커를 설치해 보고, 송수신 테스트를 해보려고 합니다.
이전글에서 만들었던 오라클 서버에 MQTT 브로커 서버를 올리고 외부에서 접속해 보려고 합니다.
내부망을 이용해서 테스트 해도 되지만 외부망을 이용해 시도해보고 싶은 마음이 있어 개인적으로 이용할 기능을 추가해 보려고 합니다.
MQTT를 사용해본적이 없기 때문에 설치와 테스트는 아래글을 참조로 진행했습니다.
MQTT mosquitto 브로커 설치 참고 사이트 링크
1. 지난번에 WEB서버를 테스트한 VM linux(ubuntu)에 MQTT 브로커를 설치합니다.
2022.12.07 - [취미/linux 기초] - 오라클 클라우드 웹서버만들기 따라 하기.
2. 설치
- VM linux에 SSH 접속합니다.
- 다음 명령어를 통해 mosquitto 브로커와 mosquitto-clients 를 설치합니다.
sudo apt-get install mosquitto mosquitto-clients -y
3. 발행(Publish)/구독(Subscribe) 서버 내 자체 테스트
- 구독(Subscribe) 클라이언트 topic 설정을 해줍니다. (토픽은 "test_topic" 이네요.)
mosquitto_sub -t "test_topic"
- 발행(Publish) 클라이언트 창 실행을 위해 VM linux에 SSH 접속을 하나 더 열어줍니다.
발행 클라이언트의 토픽과 메시지를 설정 후 실행합니다.
mosquitto_pub -t "test_topic" -m "HELLO WORLD!"
- 먼저 실행한 구독 클라이언트에 메시지가 들어와 있는지 확인합니다.
- IP를 변경하려고 하면 해당옵션을 붇여서 이용할 수 있다.
mosquitto_sub -h [브로커 IP] -t [토픽]
mosquitto_pub -h [브로커 IP] -t [토픽] [발행 메시지]
4. 오라클 서버에 외부접속을 위한 포트/보안 설정
여기까지는 잘 실행되는군요. 여까지는 VM linux 내에서 실행한 상태이게 때문에 외부 클라이언트 접속을 위해 방화벽을 해제합니다.
MQTT 기본 PORT는 1883 이므로 WEB 페이지의 80 포트를 열어준 것과 같이 subnet-수신규칙 과 네트워크 보안그룹에 보안규칙을 추가해 줍니다.
- 수신규칙 추가
- 보안규칙 추가
- linux에서 iptable 규칙을 설정해 줍니다.
위에 것과 아래 것의 차이는 명확하게 모르겠지만, 두 개 다 정리해 봅니다.
sudo iptables -I INPUT 1 -p tcp --dport 1883 -j ACCEPT or
sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 1883 -m state --state NEW,ESTABLISHED -j ACCEPT
5. 외부 접속 메시지 전송 테스트
- 서버에서 포트 설정이 완료되었으면 이제 Python을 이용한 테스트 소스를 이용해 Subscribe , Publish를 실행해 봅니다.
- 파이썬 예제를 참조한 글 -- > 참조글 링크
- 해당 소스를 수정해서 브로커의 주소를 오라클 VM linux 인스턴스의 공용 IP로 설정을 수정합니다.
- 정리해보면 외부 서버(오라클)에서는 MQTT 브로커 서버가 1883 포트로 대기하고 있고,
동시에 토픽에 대한 메시지가 도착하면 확인할 수 있도록 mosquitto_sub -t "test_topic" 를실행시켜 수신 대기 상태로 만듭니다.
- 파이썬을 이용해 외부브로커 IP로 설정하고 메시지를 발행합니다.
파이썬에서는 pip install paho-mqtt 를 많이 이용하는듯 합니다. 일단 설치를 해주고, 소스를 수정 합니다.
파이썬으로 는 발행 기능을 이용할것이기 때문에 publish.py 를 참조 해서 만들고, 실행 해 봅니다.
i) 우선 토픽이 같아야 하므로, 토픽을 "test_topic"으로 통일합니다.
ii) 메시지는 원하는 메시지로 바꿔서 정상적으로 송/수신되는지 확인해봅니다.
import paho.mqtt.client as mqtt
import json
### 브로커 IP 설정.
BROKER_IP = 'XXX.XXX.XXX.XXX' ### 여기에 오라클 클라우드IP를 입력한다.
### 토픽 이름을 알아야 구독이 가능하다.
RIO_TOPIC_NAME = 'test_topic'
## 내부 ubuntu mosquitto 를 이용한 테스트
#BROKER_IP = '192.168.10.10'
#RIO_TOPIC_NAME = 'common/mydata'
## Broker port & qos config
BROKER_PORT = 1883
CONFIG_QOS_SET = int (1) # qos level 0 ~ 2
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 : localhost, port: 1883 에 연결 [브로커 Address]
#client.connect('localhost', 1883)
client.connect(BROKER_IP, BROKER_PORT) ## my ubuntu
client.loop_start()
# common topic 으로 메세지 발행
#client.publish('common', json.dumps({"success": "ok"}), 1)
client.publish(RIO_TOPIC_NAME, json.dumps({"success": "ok"}), CONFIG_QOS_SET) ## Send
client.loop_stop()
# 연결 종료
client.disconnect()
저는 " {"success": "ok"}" 메시지를 보내보도록 테스트해 보았습니다.
메시지가 정상적으로 수신되었습니다.
- 처음 시도 했을때, TCP 연결이 안되는 에러가 발생 했습니다. 파이썬 소스의 문제인가 햇지만, 내부망을 이용한 테스트시에는 문제없이 잘 동작 하더군요. 그래서 확인 해보니, 외부 서버연결시 오라클 서버에 보안규칙 설정이 잘 안되있었습니다. 연결이 타임아웃/거부 되지 않도록 포트 설정만 되어있으면 잘 될것 같습니다.
- 발행/구독을 모두 외부에서 해본 것은 아니지만, 큰 문제는 없을 것으로 봅니다.
- 외부 네트워크와 송수신 실행이 잘 되는 것을 확인했으니, 보드나 이후 테스트 시 별도의 윈도 프로그램을 안 깔아도 돼서 좋고, vmware linux 를 안이용해도 되서 좋네요. 외부 네트워크와 테스트까지 한 번에 할 수 있으니 좋습니다.
'취미 > linux 기초' 카테고리의 다른 글
[Python] VC Code 가상환경 설정. (0) | 2022.12.21 |
---|---|
오라클 클라우드 웹서버만들기 따라하기. (0) | 2022.12.07 |
YU12, NV12 format 구조(YUV420) (1) | 2022.11.18 |
Tina Linux SSH server 설정 (2) (0) | 2022.11.15 |
Tina Linux SSH server 설정 (1) (0) | 2022.11.11 |
댓글