使用 SSL 连接到 Amazon MQTT 代理

Connecting to Amazon MQTT Broker with SSL

我正在尝试从不支持 SigV4 或客户端证书的客户端 publish/subscribe 到 AWS IoT MQTT 代理,它只有带用户名和密码的 SSL。据我所知这是不可能的,那么集成此客户端的最佳方式是什么?

目前客户端正在发布到运行良好的 CloudMQTT 代理,但我想将 Amazon Echo/Alexa 集成到解决方案中以允许语音控制,因此我需要某种方式将其连接到 AWS IoT我有 Alexa 发布数据的 MQTT 代理(使用 Lambda 和 IoT Device Shadows)。

最好的方法是什么,因为据我所知我无法使用 SSL 将客户端连接到 AWS MQTT,它坚持使用证书。我应该尝试将 cloudMQTT 桥接到 AWS MQTT 吗?或者有什么方法可以让 Echo 发布到与 Amazons 不同的 MQTT 代理?

桥接代理是一种可能的解决方案,如

所述

https://aws.amazon.com/blogs/iot/how-to-bridge-mosquitto-mqtt-broker-to-aws-iot/

虽然这确实是一个相当复杂的过程。我使用本地安装的 mosquitto 进行桥接,但无法连接 'unknown error'。在网上做了一些搜索后,这个问题似乎刚刚出现在最新版本的 mosquitto 中。相反,我尝试在 AWS Linux EC2 实例上与 mosquitto 代理 运行 进行桥接,我成功地使用它进行了桥接。

我想到的更好的解决方案是修改我的 Lambda 函数以直接发布到我已经在使用的 MQTT 代理。为此,您需要包含 node.js 模块 'mqtt.js'(或类似的库),它不在 aws-sdk 中,因此需要一些阅读才能弄清楚如何去做。到目前为止,我一直在使用 AWS Lambda 网络界面内联编辑器编写代码,不幸的是,它不允许您包含外部库。相反,您需要创建自己的部署包。

下面是两个有用的链接,可帮助您开始制作自己的部署包,但它们缺少一些我在下面提到的关键信息:

https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html

您需要将代码写入硬盘驱动器上的文件中,然后从命令行使用 npm-install 将所需的依赖项放入代码所在的文件夹中。然后您需要压缩整个文件这样就没有包含所有内容的顶级文件夹。也就是说,您的代码需要位于 zip 的根目录中,而不是位于 zip 根目录中的文件夹中(如果您右键单击包含代码的文件夹并发送到 zip,就会得到)。

同样没有提及的是,如果您要离开在线编辑器,则需要在 JavaScript 的顶部添加几行,以便正确解析路径。您需要添加以下内容:

var child_process = require('child_process');
var path = require('path');

然后您可以在 lambda 函数 Web 编辑器中上传此代码并正常构建您的函数。很遗憾,您不能再使用内联网络编辑器,因此您需要重新压缩并再次上传才能进行更改。