인프런 커뮤니티 질문&답변

인프러너님의 프로필 이미지
인프러너

작성한 질문수

사물인터넷 통신은 내 손에 (Arduino, MQTT, Nodejs, MongoDB, Android,VS Code)

다른서버에서 mqtt 접속 테스트가 안되네요.

작성

·

988

0

A 장비에서 mqtt 메시지를 보낼 때

B 서버에서 메시지를 받기 위해서 서버에 mosquitto를 설치하고, mosquitto-client를 설치했습니다.

그리고 mosquitto.conf 파일에서 아래 두 부분을 추가를 했습니다.

listener 1883

allow_anonymous true

그리고 서버에서 tcp 포트를 열었습니다.

# iptables -I INPUT 1 -p tcp --dport 1883 -j ACCEPT

아래 명령어로 설정을 저장하고

iptables-save > /etc/iptables.rules

아래 명령어로 방화벽에서 1883포트도 열었습니다.

firewall-cmd --permanent --zone=public --add-port=1883/tcp

그리고 재가동을 했습니다.

firewall-cmd --reload

sudo systemctl status mosquitto.service로 조회를 해 보면

Active 상태가 active(running)으로 되어있습니다.

 

이렇게 한 후 서버에서 mosquitto -v를 실행하면 브로커가 실행이 되고

1688558540: mosquitto version 2.0.11 starting
1688558540: Using default config.
1688558540: Starting in local only mode. Connections will only be possible from clients running on this machine.
1688558540: Create a configuration file which defines a listener to allow remote access.
1688558540: For more details see https://mosquitto.org/documentation/authentication-methods/
1688558540: Opening ipv4 listen socket on port 1883.
1688558540: Opening ipv6 listen socket on port 1883.
1688558540: mosquitto version 2.0.11 running
1688558540: New connection from ::1:58012 on port 1883.
1688558540: New client connected from ::1:58012 as auto-E1654EA0-1FC2-B13F-C9A5-5162C4E11F43 (p2, c1, k60).
1688558540: No will message specified.
1688558540: Sending CONNACK to auto-E1654EA0-1FC2-B13F-C9A5-5162C4E11F43 (0, 0)
1688558540: Received SUBSCRIBE from auto-E1654EA0-1FC2-B13F-C9A5-5162C4E11F43
1688558540: 	topic (QoS 0)
1688558540: auto-E1654EA0-1FC2-B13F-C9A5-5162C4E11F43 0 topic
1688558540: Sending SUBACK to auto-E1654EA0-1FC2-B13F-C9A5-5162C4E11F43

같은 서버에서 아래와 같이 토픽을 보내면

mosquitto_pub -h localhost -t test -m "hello world"
[root@localhost ~]# mosquitto_sub -t test
hello world

sub에서 메시지가 정상적으로 출력이 됩니다.

동일 서버에서는 mosquitto 실행도 잘 되고, publish, subscribe 모두 적용이 잘 됩니다.

 

그런데 문제는 다른 서버에서 발송을 할 때 메시지가 출력이 안됩니다.

위의 설정대로 포트를 열고 메시지를 보냈는데 서버쪽에서는 sub를 실행해 놓고 있어도 메시지를 받지를 못하고 있습니다.

그래서 port가 열려있는지 로컬에서 확인을 해 보니 아래와 같이 포트가 열려있지 않았습니다.

 ✘ username@usernameui-MacBookPro  ~  nc -vz xxx.xxx.xxx.xxx 1883
nc: connectx to xxx.xxx.xxx.xxx port 1883 (tcp) failed: Operation timed out

 

문제가 포트가 정상적으로 안열려서 문제가 생긴 것 같은데 위에서 포트를 열었던 방법이 잘못된 걸까요?

netstat -lntp로 열려있는 포트를 확인해보면 아래와 같이 열려있다고 나오는데..

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:1883          0.0.0.0:*               LISTEN      126689/mosquitto

 

제가 놓치고 있는 부분이 어떤 부분인지.. 아니면 잘못 설정한 부분이 어떤 부분인지 알 수 있을까요??
몇일동안 이 부분때문에 씨름하다가 문의 드립니다.

답변 2

0

mosquitto.conf 파일에 아래 내용을 추가하고 재 기동 해주시겠어요?

listener 1883 0.0.0.0

netstat 조회할때 포트가 0.0.0.0 1883 으로 lcoalhost가 아닌 any로 오픈되어있어야 합니다.

보안상의 이유로 기본설정은 보통 localhost binding으로 되어있을 수 있어요

tcpdump -i any port 1883 -vv -w tcpdump-20230713-a.pcap 으로 덤프떠서

wireshark로 봐보시면 명확하게 이유를 알 수 있으실거예요

박매일님의 프로필 이미지
박매일
지식공유자

추가 답변에 감사합니다.^^

0

박매일님의 프로필 이미지
박매일
지식공유자

혹시 다른 pc는 와이파이나 또는 네트워크 존이 mqtt server와 같은지요?

인프러너님의 프로필 이미지
인프러너
질문자

아니요. mqtt server는 클라우드 서버에 세팅을 했고, publisher는 또 다른 위치의 장비에 설정이 되어있습니다.

로컬에서도 해당 아이피로 메시지를 보내도 서버에서는 받지를 못하더라구요..

java 소스상에서는 서버 정보를 tcp://localhost:1883으로 했고, clientId는 랜덤으로 만들고, subscriber("topic")으로 해서 구독을 하도록 설정을 했습니다.

 

mqtt를 받을 서버에서는 mosquitto와 mosquitto-client를 설치하고, 1883포트를 열어놓으면 되고,

 

메시지를 발송할 곳에서는 mosquitto_pub -h xxx.xxx.xxx.xxx -p 1883 -t test -m "aaa"
이런식으로 메시지를 발송하면 일반적인 설정에는 문제가 없는걸까요??

 

현재 테스트로 로컬에도 mosquitto도 설치를 해 놓은 상태라 로컬에서 mosquitto_pub을 클라우드 서버로 발송을 하고 있는데도 서버에서 받지를 못하고 있네요..ㅠㅠ

위에 포트 테스트를 해봤을 때 포트가 닫혀있다고 나오는데 서버에서 포트를 여는 과정은 문제는 없었을까요?(제가 검색해서 해 본 방법으로는 위에서 설정한 방법으로 포트를 여는것은 되는데 로컬에서 해당 서버의 포트를 확인하면 닫혀있다고 나오네요.ㅠㅠ)

인프러너님의 프로필 이미지
인프러너

작성한 질문수

질문하기