I ran my own MQTT Broker on a remote server by HiveMQ. I setup Nginx and the dashboards works Ok. But I can’t connect to it via a publisher or subscriber. Before I connected to HiveMQ sandbox somehow like this mqtt://broker.hivemq.com:1883 but I can’t do this on my own server. What should I do?
HiveMQ Log
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*;
}
Subscriber
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
}))