Настройка 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")