작성
·
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
아니요. 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을 클라우드 서버로 발송을 하고 있는데도 서버에서 받지를 못하고 있네요..ㅠㅠ
위에 포트 테스트를 해봤을 때 포트가 닫혀있다고 나오는데 서버에서 포트를 여는 과정은 문제는 없었을까요?(제가 검색해서 해 본 방법으로는 위에서 설정한 방법으로 포트를 여는것은 되는데 로컬에서 해당 서버의 포트를 확인하면 닫혀있다고 나오네요.ㅠㅠ)
추가 답변에 감사합니다.^^