강의

멘토링

로드맵

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của holykhd
holykhd

câu hỏi đã được viết

Giao tiếp IoT nằm trong tay bạn (Arduino, MQTT, Nodejs, MongoDB, Android, VS Code)

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

Viết

·

1.3K

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

 

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

node.jsmongodbarduinoiotMQTT

Câu trả lời 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로 봐보시면 명확하게 이유를 알 수 있으실거예요

bitcocom님의 프로필 이미지
bitcocom
Người chia sẻ kiến thức

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

0

bitcocom님의 프로필 이미지
bitcocom
Người chia sẻ kiến thức

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

holykhd님의 프로필 이미지
holykhd
Người đặt câu hỏi

아니요. 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을 클라우드 서버로 발송을 하고 있는데도 서버에서 받지를 못하고 있네요..ㅠㅠ

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

Hình ảnh hồ sơ của holykhd
holykhd

câu hỏi đã được viết

Đặt câu hỏi