Настройка Paho Javascript Client (MQTT) с mosquitto в AWS EC2 Ubuntu + Ruby on Rails

Я пытался настроить брокер MQTT на своем сервере AWS EC2, используя порт 1883. До сих пор он работал с гемом ruby-mqtt, но у меня возникли проблемы с его настройкой с помощью клиента Paho Javascript для веб-сайта.

Что я сделал до сих пор:

Mosquitto

Установил mosquitto на моем экземпляре AWS EC2, и он работает и прослушивает порт 1883. Я подписался на тему локально, используя команду

mosquitto_sub -h localhost -p 1883 -v -t 'topic1'

AWS EC2 Security Group

Разрешить трафик через порт 1883 (по протоколу tcp)

Рубин на рельсах

Установил гем ruby-mqtt и протестировал работоспособность mqtt, запустив приведенный ниже код в консоли rails (среда разработки)

MQTT::Client.connect(ip_address_or_domain_name) do |c|
  c.publish('topic1', 'message to topic 1')
end

Сообщение появляется в терминале, где mosquitto_sub бегал.

Nginx

Все это было сделано без какой-либо настройки в конфигурационных файлах Nginx.

Paho Client

Поэтому я запустил локальный сервер rails на своем локальном компьютере и запустил фрагмент кода javascript в одном из моих html-представлений.

// Create a client instance
client = new Paho.MQTT.Client("mqtt.hostname.com", Number(1883), "", "clientId")

// set callback handlers
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;

// connect the client
client.connect({onSuccess:onConnect});


// called when the client connects
function onConnect() {
  // Once a connection has been made, make a subscription and send a message.
  console.log("onConnect");
  client.subscribe("topic1");
  message = new Paho.MQTT.Message("Hello");
  message.destinationName = "topic1";
  client.send(message);
}

// called when the client loses its connection
function onConnectionLost(responseObject) {
  if (responseObject.errorCode !== 0) {
    console.log("onConnectionLost:"+responseObject.errorMessage);
  }
}

// called when a message arrives
function onMessageArrived(message) {
  console.log("onMessageArrived:"+message.payloadString);
}

Но я не могу подключиться. Ошибка, которую я получаю в консоли разработчика Chrome:

WebSocket connection to 'ws://mqtt.example.com:1883/' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET

Я не уверен, что здесь не так. Очень ценю любую помощь! Заранее спасибо!

1 ответ

Так что проблема в том, что Paho Javascript Client утверждает, что параметр для client объект должен быть

адрес сервера обмена сообщениями, как полный URI WebSocket, как DNS-имя или десятичный IP-адрес с точками.

Так что заставить его слушать порт 1883, который является стандартным портом для mqtt, не будет работать.

ruby-mqtt работает как есть, потому что его параметр рассматривается как URI mqtt

Другими словами, Paho подключается через ws://host в то время как ruby-mqtt подключается через mqtt://host, Последний подключается к порту 1883 с правильным протоколом (не уверен, что это правильное слово здесь) для правильного порта.

Так Paho должен подключиться к другому порту, где может использоваться протокол websocket.

Это моё решение.

Mosquitto

Версия должна быть как минимум 1.4, где поддерживается websocket. Я добавляю последние 3 строки по умолчанию mosquitto.conf файл.

# /etc/mosquitto/mosquitto.conf
pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

port 1883

listener 1884
protocol websockets

Это открывает 2 порта для комаров, чтобы подписаться на более чем 2 различных протокола соответственно.

AWS Security Group

Разрешить трафик через порт 1884 (по протоколу tcp)

Paho Client

mqtt.hostname.com изменить только строку, в которой инициализируется объект клиента

client = new Paho.MQTT.Client("mqtt.hostname.com", Number(1884), "", "clientId")
Другие вопросы по тегам