在 alexa 技能的 lambda 函数中连接到 MQTT 代理时遇到问题 with/How
having issues with/How to connect to MQTT broker in lambda function for alexa skill
我试图克服的直接问题是我的 aws-lambda 函数没有使用 js MQTT 库连接到我的 broke。我可以在本地节点环境中使用此库进行连接,只是不能在 aws-lambda 函数中使用。
我已经从这个 repo 创建了一个 zip 文件:
https://github.com/JordanKlaers/AlexaMQTT
我上传到我的 lambda 函数。我正在使用 index.js.
的导出函数
除未连接到 broker/client 的部分外,一切正常(index.js 中的第 83 行)
当我 运行 oldIndex.js 来自我链接的 repo(这只是连接的 promise 函数,来自 aws-lambda 函数)在我的本地节点环境中它连接并且事情 运行 正确。
我不知道如何创建最小可复制草图,因为它的成功基于与硬件的交互。我确实创建了 "oldIndex.js" 作为最小草图,以表明至少连接功能有效。我已经包含了 lambda 函数的日志,以表明它在尝试连接之前按预期工作。
我唯一可以推测的是我对与 lambda 函数一起使用的角色的权限存在一些问题,但我已经研究并向我的角色添加了不同的策略,但这没有帮助。
这是函数调用时的日志(显示它达到了承诺并尝试连接但没有成功)
我自己几乎完成了所有工作,但是从这个 tutorial 中得到了关于我的方法的最终说明,所以我不确定我还有什么不是 considering/missing。
这里的主要问题是您的代理 运行 在连接到本地家庭网络的 Pi 上。
这意味着它在执行网络地址转换 (NAT) 的家用宽带路由器后面。这从您的家庭网络 (10.0.0.0/24) 获取数据包并将它们重新映射为来自您的 public 面向 IP 地址。
这意味着 Lambda 代码(AWS 上的 运行)无法直接向代理发送数据包,因此无法连接。
对此有几种可能的解决方案,但这里有几个。
- 运行 云托管提供商的经纪人。然后您就可以从任何地方访问它。
- 在您的路由器上启用端口转发以将端口 1883 暴露给互联网并将所有数据包转发到您 raspberry pi 上的代理 运行。 (此选项取决于您拥有固定 IP 地址或动态 DNS)
对于这两种情况,您可能希望在代理上启用 authentication/authorisation 并可能添加 TLS。
您还需要仔细查看 MQTT.js 库以及如何启用错误跟踪,以便了解失败的原因,例如
client.on('error', function(err) {...});
我试图克服的直接问题是我的 aws-lambda 函数没有使用 js MQTT 库连接到我的 broke。我可以在本地节点环境中使用此库进行连接,只是不能在 aws-lambda 函数中使用。
我已经从这个 repo 创建了一个 zip 文件: https://github.com/JordanKlaers/AlexaMQTT
我上传到我的 lambda 函数。我正在使用 index.js.
的导出函数除未连接到 broker/client 的部分外,一切正常(index.js 中的第 83 行) 当我 运行 oldIndex.js 来自我链接的 repo(这只是连接的 promise 函数,来自 aws-lambda 函数)在我的本地节点环境中它连接并且事情 运行 正确。
我不知道如何创建最小可复制草图,因为它的成功基于与硬件的交互。我确实创建了 "oldIndex.js" 作为最小草图,以表明至少连接功能有效。我已经包含了 lambda 函数的日志,以表明它在尝试连接之前按预期工作。
我唯一可以推测的是我对与 lambda 函数一起使用的角色的权限存在一些问题,但我已经研究并向我的角色添加了不同的策略,但这没有帮助。
这是函数调用时的日志(显示它达到了承诺并尝试连接但没有成功)
我自己几乎完成了所有工作,但是从这个 tutorial 中得到了关于我的方法的最终说明,所以我不确定我还有什么不是 considering/missing。
这里的主要问题是您的代理 运行 在连接到本地家庭网络的 Pi 上。
这意味着它在执行网络地址转换 (NAT) 的家用宽带路由器后面。这从您的家庭网络 (10.0.0.0/24) 获取数据包并将它们重新映射为来自您的 public 面向 IP 地址。
这意味着 Lambda 代码(AWS 上的 运行)无法直接向代理发送数据包,因此无法连接。
对此有几种可能的解决方案,但这里有几个。
- 运行 云托管提供商的经纪人。然后您就可以从任何地方访问它。
- 在您的路由器上启用端口转发以将端口 1883 暴露给互联网并将所有数据包转发到您 raspberry pi 上的代理 运行。 (此选项取决于您拥有固定 IP 地址或动态 DNS)
对于这两种情况,您可能希望在代理上启用 authentication/authorisation 并可能添加 TLS。
您还需要仔细查看 MQTT.js 库以及如何启用错误跟踪,以便了解失败的原因,例如
client.on('error', function(err) {...});