【问题标题】:Publishing message from AWS Lambda to AWS IoT将消息从 AWS Lambda 发布到 AWS IoT
【发布时间】:2018-03-25 05:21:13
【问题描述】:

我正在尝试使用 Nodejs 从 AWS Lamba 向 AWS IoT 发布消息。 我已压缩项目并上传到 AWS IoT 下面是代码sn-p

 var awsIot = require('aws-iot-device-sdk');

 var device = awsIot.device({
  keyPath: 'keyfilepath',
  certPath: 'pem file path',
  caPath: 'root-CA.crt',
  clientId: 'iotTest7526532135',
  host: 'host id'
 });


device
  .on('connect', function() {
     console.log('connect');
     device.subscribe('topic_3');

     device.publish('topic_1', JSON.stringify({ message_id:23,Message:'HelloWorld'}));
    });

     device
     .on('message', function(topic, payload) {
console.log('message', topic, payload.toString());
 });

我遇到错误
"errorMessage": "找不到模块 'aws-iot-device-sdk'",

我知道缺少 iot sdk,我不知道如何在 AWS Lambda 上安装它。

任何建议都会很有帮助

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda mqtt aws-iot


    【解决方案1】:

    当你压缩你的项目时,你也压缩了./node_modules 文件夹。所以只要有aws-iot-device-sdk(连同所有依赖项),你的 Lambda 就可以了。

    所以你只需要:

    npm install aws-iot-device-sdk
    zip ...
    

    【讨论】:

    • 非常感谢您的回复,我运行了安装命令并运行了 zip -r test_package.zip 但 zip 中没有 ./node_modules 文件夹或文件
    • 我进行了更改并将 package.json 添加到 zip 文件中,但是当我在 lambda 上上传 zip 时仍然遇到同样的错误
    • 它按照您的指示工作。我的坏:)
    【解决方案2】:

    您还需要确保上传您的package.json 文件,该文件应具有aws-iot-device-sdk 的依赖项要求

    你可以通过运行将包添加到你的 package.json 中

    npm -i --save aws-iot-device-sdk

    来自您的项目目录。

    【讨论】:

      【解决方案3】:

      在您的 package.json 文件中添加如下内容。然后运行npm install。这将创建一个 node_modules 文件夹。现在将其压缩并再次上传。

      "aws-iot-device-sdk": "^2.1.0"
      

      【讨论】:

        【解决方案4】:

        我强烈建议不要使用 aws-iot-device-sdk 通过 Lambda 函数与 AWS IoT 进行交互。

        您需要了解可用于访问 AWS IoT 的 2 个 javascript API

        • AWS IOT Device SDKs for javascript,使用 MQTT 作为协议和 x509 证书进行身份验证。这些通常用于在您的 AWS 云之外运行的设备。
        • AWS SDK for javascript,使用 HTTP 作为协议,使用 IAM 角色(除其他外)进行身份验证。这些 SDK 通常在您的 AWS 云(例如 Lambda)中运行

        您应该选择基于 HTTP 的 SDK 的原因有多种:

        • aws-iot-device-sdk 专门针对需要远程连接的“生活”在 Aws 之外的设备(物联网网关/现场设备)。
        • 设备 SDK 使用 MQTT 和 x509 证书与 AWS IoT 进行交互。无需在 lambda 中配置 x509 证券。在您的 AWS 账户上运行的 Lambda 可以通过 IAM 角色轻松访问 AWS IoT,因此如果您的 lambda 函数配置了正确的角色,您就可以使用标准的 aws sdks。
        • 像 MQTT(或任何 pub/sub 协议)这样的协议与无服务器 lambda 架构不能很好地匹配。在您的 lambda 函数中,您订阅了一个主题,这是您在短期 lambda 函数中通常不会做的事情。
        • AWS SDK for NodeJS 提供给您的 lambda 开箱即用。无需要求或打包其他节点模块)

        您的代码可以变得如此简单(请注意,不需要凭据或额外的节点模块):

        var AWS = require('aws-sdk');
        
        var iotdata = new AWS.IotData({endpoint:"yourendpoint.iot.eu-central-1.amazonaws.com"});
        
        exports.handler = function(event, context, callback) {
        
        console.log("found iotdata",iotdata);
        
            var params = {
                topic: 'topic/test',
                payload: 'blah',
                qos: 0
                };
        
        
            iotdata.publish(params, function(err, data){
                if(err){
                    console.log("Error occured : ",err);
                }
                else{
                    console.log("success.....");
                }
            });
        
            callback();
        };
        

        【讨论】:

        • 感谢您提供的好信息,我现在已经有了明确的方向。
        【解决方案5】:

        如果您只是将数据发布到 IoT 主题,您最好使用 http 协议而不是 MQTT 连接。

        并且使用 HTTP 连接不需要 aws-iot-device-sdk 包。 AWS 默认开发工具包具有 iotdata。 iotdata 将提供与设备的 http 连接。

        iotHTTPConnection= AWS.IotData({endpoint: Your_END_POINT});

        iotHTTPConnection.publish(params) 将使用 http 发布数据,而无需特定于 iot 的 sdk。

        https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html

        虽然没有 http 订阅。

        【讨论】:

          猜你喜欢
          • 2017-02-22
          • 1970-01-01
          • 2019-08-31
          • 2021-08-17
          • 1970-01-01
          • 2021-10-18
          • 1970-01-01
          • 2016-12-25
          • 2019-11-04
          相关资源
          最近更新 更多