1

我一直在尝试使用端口 1883 在我的 AWS EC2 服务器上设置 MQTT 代理。到目前为止,它可以与ruby​​-mqtt gem一起使用,但我无法使用 Paho Javascript Client 为网站设置它。

到目前为止我做了什么:

蚊子

在我的 AWS EC2 实例上安装了 mosquitto,它正在运行并在端口 1883 上侦听。我使用命令在本地订阅了一个主题

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

AWS EC2 安全组

允许通过端口 1883 的流量(在 tcp 协议下)

Ruby on Rails

安装了 ruby​​-mqtt gem,并通过在 rails 控制台(开发环境)中运行以下代码来测试 mqtt 是否正常工作

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

该消息出现在mosquitto_sub正在运行的终端中。

Nginx

所有这一切都是在没有对 Nginx 配置文件进行任何配置的情况下完成的。

帕霍客户

因此,我在本地计算机上启动了本地 Rails 服务器,并在我的一个 html 视图上运行示例 javascript 片段。

// 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

我不确定这里有什么问题。非常感谢任何帮助!提前致谢!

4

1 回答 1

1

所以问题是 Paho Javascript Client 声明client对象的参数必须是

消息服务器的地址,作为完全限定的 WebSocket URI,作为 DNS 名称或点分十进制 IP 地址。

所以让它监听 1883 端口,这是 mqtt 的标准端口,是行不通的。

ruby-mqtt按原样工作,因为它的参数被视为 mqtt uri

换句话说,Paho连接 viaws://host同时ruby-mqtt连接 via mqtt://host。后者使用正确的协议连接到端口 1883(不确定这是否是正确的词)用于正确的端口。

所以Paho必须连接到另一个可以使用 websocket 协议的端口。

这是我的解决方案。

蚊子

支持 websocket 的版本至少需要 1.4。我将最后 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

这为 mosquitto 打开了 2 个端口,以分别订阅超过 2 个不同的协议。

AWS 安全组

允许通过端口 1884 的流量(在 tcp 协议下)

帕霍客户

mqtt.hostname.com 仅更改客户端对象初始化的行

client = new Paho.MQTT.Client("mqtt.hostname.com", Number(1884), "", "clientId")
于 2016-08-13T02:50:57.957 回答