将消息从AWS Lambda发布到AWS IoT

时间:2017-10-13 06:23:47

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

我正在尝试使用Nodejs将AWS Lamba的消息发布到AWS IoT。 我已将项目压缩并上传到AWS IoT 下面是代码段

 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上安装它。

任何建议都会非常有用

5 个答案:

答案 0 :(得分:6)

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

您需要了解可以使用2个javascript API来访问AWS IoT

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

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

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

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

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();
};

答案 1 :(得分:2)

当您压缩项目时,还会压缩./node_modules文件夹。因此,只要aws-iot-device-sdk(以及所有依赖项),您的Lambda就可以了。

所以你需要的只是:

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

答案 2 :(得分:2)

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

您可以通过运行

将软件包添加到package.json中

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

来自项目目录。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

iotHTTPConnection.publish(params)将使用http发布数据而不使用特定的sdk。

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

虽然没有http订阅。