Не удается подключиться к HiveMQ на удаленном сервере - PullRequest
0 голосов
/ 26 февраля 2020

Я запустил свой собственный брокер MQTT на удаленном сервере с помощью HiveMQ. Я установил Nginx, и приборная панель работает нормально на http://104.251.210.224. Но я не могу подключиться к нему через издателя или подписчика. До того, как я подключился к песочнице HiveMQ, как-то так, mqtt: //broker.hivemq.com: 1883, но я не могу сделать это на своем собственном сервере. Что мне делать?

Журнал HiveMQ

2020-02-26 07:29:07,819 INFO  - Extension "Allow All Extension" version 1.0.0 started successfully.
2020-02-26 07:29:09,952 INFO  - 5EQfP: no members discovered after 2001 ms: creating cluster as first member
2020-02-26 07:29:09,989 INFO  - No user for HiveMQ Control Center configured. Starting with default user
2020-02-26 07:29:09,990 INFO  - Starting HiveMQ Control Center on address 127.0.0.1 and port 8080
2020-02-26 07:29:10,217 INFO  - Control Center Audit Logging started.
2020-02-26 07:29:10,217 INFO  - Started HiveMQ Control Center in 227ms
2020-02-26 07:29:10,230 INFO  - Starting TCP listener on address 0.0.0.0 and port 1883
2020-02-26 07:29:10,269 INFO  - Started TCP Listener on address 0.0.0.0 and on port 1883
2020-02-26 07:29:10,269 INFO  - Started HiveMQ in 6383ms

Ngnix

server {
    listen      80;
    client_max_body_size 20M;
    server_name xxxxx.io www.xxxxx.io;
    error_log  /var/log/apache2/domains/xxxxx.io.error.log error;

    location / {
        proxy_pass      http://0.0.0.0:8080;
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|odt|ods|odp|odf|tar|wav|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {
            root           /home/admin/web/mqtt/hivemq-4.3.1/;
            access_log     /var/log/apache2/domains/xxxxx.log combined;
            access_log     /var/log/apache2/domains/xxxxx.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }


    location @fallback {
        proxy_pass      http://0.0.0.0:8080;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    include /home/admin/conf/web/nginx.xxxxxx.io.conf*;
}

Подписчик

const mqtt = require('mqtt')
options = {
  port: 1883,
  host: 'mqtt://104.251.210.224',
  // clientId: "alireza"
}
const client = mqtt.connect('mqtt://104.251.210.224', options)

/**
* The state of the doorphone, defaults to closed
* Possible states : closed, opening, open, closing
*/
// console.log(client)

var state = 'closed'

client.on('connect', () => {
  console.log(client.connected)
  client.subscribe('doorphone/open')
  client.subscribe('doorphone/close')

  // Inform controllers that doorphone is connected
  client.publish('doorphone/connected', 'true')
  sendStateUpdate()
})

client.on('message', (topic, message) => {
    console.log('received message %s %s', topic, message)
    switch (topic) {
        case 'doorphone/open':
          return handleOpenRequest(message)
        case 'doorphone/close':
          return handleCloseRequest(message)
      }
})

function sendStateUpdate () {
    console.log('sending state %s', state)
    client.publish('doorphone/state', state)
}


function handleOpenRequest (message) {
    if (state !== 'open' && state !== 'opening') {
      console.log('opening doorphone door')
      state = 'opening'
      sendStateUpdate()

      // simulate door open after 5 seconds (would be listening to hardware)
      setTimeout(() => {
        state = 'open'
        sendStateUpdate()
      }, 5000)
    }
}


function handleCloseRequest (message) {
    if (state !== 'closed' && state !== 'closing') {
      state = 'closing'
      sendStateUpdate()

      // simulate door closed after 5 seconds (would be listening to hardware)
      setTimeout(() => {
        state = 'closed'
        sendStateUpdate()
      }, 5000)
    }
}



/**
 * Want to notify controller that doorphone is disconnected before shutting down
 */
function handleAppExit (options, err) {
    if (err) {
      console.log(err.stack)
    }

    if (options.cleanup) {
      client.publish('doorphone/connected', 'false')
    }

    if (options.exit) {
      process.exit()
    }
  }

  /**
   * Handle the different ways an application can shutdown
   */
  process.on('exit', handleAppExit.bind(null, {
    cleanup: true
  }))
  process.on('SIGINT', handleAppExit.bind(null, {
    exit: true
  }))
  process.on('uncaughtException', handleAppExit.bind(null, {
    exit: true
  }))

Ответы [ 2 ]

4 голосов
/ 26 февраля 2020

Ответ можно найти на форуме сообщества HiveMQ

Тем не менее, краткий ответ на вашу проблему: ваша конфигурация прокси пропустила конфигурацию для порта MQTT (1883), вы настроен только порт панели инструментов (8080).

Вам нужен параметр, который выглядит примерно так:

upstream hivemq {
    server 127.0.0.1:1883;
}

server {
    listen 1883;
    proxy_pass hivemq;
}
0 голосов
/ 26 февраля 2020

Это решение решило мою проблему. Это важно для того, чтобы ваш порт был известен и доступен извне, и это возможно сделать это через конфигурацию брандмауэра вашей ОС, для моего ubuntu есть инструмент настройки брандмауэра с именем ufw.

$ sudo apt install ufw

$ sudo ufw enable

$ sudo ufw allow 1883/tcp

$ sudo ufw status verbose
...