是否可以通过 Javascript 连接到 Google IOTCore MQTT 桥?

Is it possible to connect to the Google IOTCore MQTT Bridge via Javascript?

我一直在尝试使用 Eclipse Paho MQTT 客户端的 javacscript 版本来访问 Google IOTCore MQTT Bridge,如下所示:

https://cloud.google.com/iot/docs/how-tos/mqtt-bridge

但是,无论我做什么,任何使用已知良好凭据(与其他客户端一起工作)进行连接的尝试都会导致此连接错误:

errorCode: 7, errorMessage: "AMQJS0007E Socket error:undefined."

那里没什么好说的,所以我想知道是否有人通过 Javascript 使用 Eclipse Paho 成功连接到 MQTT Bridge,这是 Google 在他们的建议中建议的客户端实现文档。

我已经完成了他们的故障排除步骤,事情似乎进展顺利,所以也没有帮助。

https://cloud.google.com/iot/docs/troubleshooting

我注意到在他们的文档中有 Java/Python 等的示例代码,但没有 Javascript,所以我想知道它是否不受支持并且他们的文档只是没有提及像这样。

我已经简化了我的代码,只使用 Paho 文档中的 'Hello World' 示例,据我所知,我做的事情是正确的(包括使用我的设备路径作为 ClientID, JWT 令牌作为密码,指定 'unused' 用户名字段并明确要求 MQTT v3.1.1)。

与此同时,我正在回退到通过他们的 HTTP 桥进行轮询,但这有明显的延迟和网络流量缺点。

// Create a client instance
client = new Paho.MQTT.Client("mqtt.googleapis.com", Number(8883), "projects/[my-project-id]/locations/us-central1/registries/[my registry name]/devices/[my device id]");

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

// connect the client
client.connect({
    mqttVersion: 4,   // maps to MQTT V3.1.1, required by IOTCore
    onSuccess:onConnect,
    onFailure: onFailure,
    userName: 'unused',  // suggested by Google for this field
    password: '[My Confirmed Working JWT Token]' // working JWT token

function onFailure(resp) {
    console.log(resp);
}


// 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("World");
  message = new Paho.MQTT.Message("Hello");
  message.destinationName = "World";
  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);
}

我是 Googler(但我不从事 Cloud IoT 工作)。

我觉得你的代码不错,应该可以工作。今天晚上或明天我会亲自试一试,然后报告给你。

过去一天我一直在研究 Google 文档中发布的示例的 Golang 版本。和你一样,我很失望没有看到样本涵盖所有 Google 的常规语言。

您是 运行 来自浏览器的代码还是 运行 Node.JS 上的代码?

你有 package.json(如果是 Node)也可以分享吗?

更新

这是一个连接到 Cloud IoT、订阅 /devices/${DEVICE}/config 并发布到 /devices/${DEVICE}/events 的 Node.JS(JavaScript 但非浏览器)。

https://gist.github.com/DazWilkin/65ad8890d5f58eae9612632d594af2de

  • 将所有文件放在同一个目录下
  • 替换 Google 的 CA 位置的 index.js 中的值和您的密钥
  • 替换 config.json
  • 中的 [[YOUR-X]] 值
  • 使用"npm install"拉取包
  • 使用node index.js

您应该能够从 Pub/Sub 订阅中提取消息,并且您应该能够将配置消息发送到设备。

简短的回答是否定的。 Google Cloud IoT Core 不支持 WebSocket。 所有 JavaScript MQTT 库都使用 WebSocket,因为 JavaScript 仅限于执行 HTTP 请求和 WebSocket 连接。