3

我按照下面的教程将我的树莓派 3 连接到 Google IOT Core。我在 Google 控制台上设置了 Google Core IOT 部分 OK,并且对 raspberry pi 部分执行了所有步骤,但是,根据下面的错误消息,连接总是被拒绝。

error { Error: Connection refused: Bad username or password
at MqttClient._handleConnack (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/lib/client.js:920:15)
at MqttClient._handlePacket (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/lib/client.js:350:12)
at work (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/lib/client.js:292:12)
at Writable.writable._write (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/lib/client.js:302:5)
at doWrite (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/node_modules/readable- 
stream/lib/_stream_writable.js:428:64)
at writeOrBuffer (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/node_modules/readable- 
stream/lib/_stream_writable.js:417:5)
at Writable.write (/home/pi/Desktop/Google-IoT- 
Device/node_modules/mqtt/node_modules/readable- 
stream/lib/_stream_writable.js:334:11)
at TLSSocket.ondata (_stream_readable.js:639:20)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7) code: 4 }
close

教程链接: https ://hub.packtpub.com/build-google-cloud-iot-application/#comment-53421

这是我的 index.js 文件的顶部:

var fs = require('fs'); 
var jwt = require('jsonwebtoken'); 
var mqtt = require('mqtt'); 
var rpiDhtSensor = require('rpi-dht-sensor'); 

var dht = new rpiDhtSensor.DHT11(2); // `2` => GPIO2 

var projectId = 'nifty-*******-******'; 
var cloudRegion = 'us-central1'; 
var registryId = 'device-registry'; 
var deviceId = 'raspberrypi'; 

var mqttHost = 'mqtt.googleapis.com'; 
var mqttPort = 8883; 
var privateKeyFile = '../certs/rsa_private.pem'; 
var algorithm = 'RS256'; 
var messageType = 'state'; // or event 

var mqttClientId = 'projects/' + projectId + '/locations/' + cloudRegion + 
'/registries/' + registryId + '/devices/' + deviceId; 
var mqttTopic = '/devices/' + deviceId + '/' + messageType; 

var connectionArgs = { 
  host: mqttHost, 
  port: mqttPort, 
  clientId: mqttClientId, 
  username: 'unused', 
  password: createJwt(projectId, privateKeyFile, algorithm), 
  protocol: 'mqtts', 
  secureProtocol: 'TLSv1_2_method' 
}; 

本教程没有说明下载 Google 根 CA 证书,所以我按照本教程进行操作: https ://raspberrypi.stackexchange.com/questions/76419/entrusted-certificates-installation

我还通过在 Google 上遵循此操作检查了连接路线是否正常,并且一切正常: https ://cloud.google.com/iot/docs/troubleshooting

projectID、registryID、deviceID 和 region 都检查正确。

我确信它必须非常简单,但这已经让我沮丧了一个星期。我已经在互联网上搜索过,但是我尝试过的方法都会导致同样的错误。有没有人可以帮忙?

4

3 回答 3

3

三重检查的事情:

  1. 您的项目 ID、注册表和设备名称均正确,大小写正确,破折号与下划线
  2. 您的 SSL 密钥类型与注册表中的算法和指定类型相匹配。即,如果您有一个 RSA 密钥,请确保它是 RSA 而不是具有注册表中指定 x509 的 RSA。
  3. 根证书是正确的......您链接的那个教程比它需要的要复杂得多。只需运行:wget https://pki.google.com/roots.pem从 Google 获取当前的roots.pem。

不要再向您扔另一个教程,但我实际上也刚刚发布了一篇博客文章,其中包含有关此内容的详细信息,主要是因为其他教程要么有漏洞,要么是陈旧的信息。

另一个注意事项:我看到您正在使用stateMQTT 主题发送,没错,但在您列出的评论中event。是events。因此,如果您尝试发送到event,那也会失败。

于 2018-12-21T19:37:30.330 回答
2

我遇到并解决了同样的问题,减少了为密码创建 json 令牌的到期时间

于 2019-08-04T11:43:09.900 回答
0

对我来说,这是一个简单的疏忽,即等号 (=) 和区域名称之间的空格。代码是:

之前(失败)....

node cloudiot_mqtt_example_nodejs.js mqttDeviceDemo \
--projectId=myproject \
--cloudRegion= us-central1 \
--registryId=1234 \
--deviceId=test-device \
--privateKeyFile=./cert/rsa_private.pem \
--numMessages=25 \
--algorithm=RS256

之后(修复了错误消息“错误错误:连接被拒绝:用户名或密码错误) ....

--cloudRegion=us-central1 \

另外,请参见此处的示例: https ://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/iot/mqtt_example

于 2019-08-25T03:10:59.113 回答