【问题标题】:Send an MQTT Message to another IoT Topic using a triggered Lambda function?使用触发的 Lambda 函数将 MQTT 消息发送到另一个 IoT 主题?
【发布时间】:2018-05-01 06:48:05
【问题描述】:

我创建了一个 AWS IoT 规则。当客户端向terminal1/ 主题发送消息(客户端使用从AWS IoT 生成的证书文件向terminal1/ 发送消息)时,它会触发一个Lambda 函数。我需要一个 Lambda 函数来使用客户端消息生成新消息并发送到另一个主题 (terminal2/test)。

我已尝试触发“将消息重新发布到 AWS IoT 主题”。但是,它将数据发送到特定主题。它只是转发相同的消息(我需要发送不同的消息)。

我创建了一个 Lambda 函数来向另一个主题发送消息。但我无法验证端点。

这是我创建的 Lambda 函数(根据this),

'use strict';

 // Load the AWS SDK
 var AWS = require("aws-sdk");

exports.handler = (event, context, callback) => {

     var iotdata = new AWS.IotData({
     endpoint: 'akugdx70brb.iot.us-west-2.amazonaws.com:8883',
     apiVersion: '2015-05-28'
   });

         var params = {
      topic: 'terminal2/test/',
      payload: new Buffer('...') || 'STRING_VALUE',
      qos:1
    };
    iotdata.publish(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });

};

它会产生这个错误,

2018-05-01T06:22:02.394Z f5a570ef-4d07-11e8-b8a2-6bad8f2982f7 { Error: write EPROTO 139935652661056:error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:../deps/openssl/openssl/ssl/s3_pkt.c:1493:SSL alert number 42
139935652661056:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:../deps/openssl/openssl/ssl/s3_pkt.c:659:

at exports._errnoException (util.js:1018:11)
at WriteWrap.afterWrite (net.js:800:14)
message: 'write EPROTO 139935652661056:error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:../deps/openssl/openssl/ssl/s3_pkt.c:1493:SSL alert number 42\n139935652661056:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:../deps/openssl/openssl/ssl/s3_pkt.c:659:\n',
code: 'NetworkingError',
errno: 'EPROTO',
syscall: 'write',
region: 'us-west-2',
hostname: 'akugdx70brb.iot.us-west-2.amazonaws.com',
retryable: true,
time: 2018-05-01T06:22:02.394Z } 'Error: write EPROTO 139935652661056:error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:../deps/openssl/openssl/ssl/s3_pkt.c:1493:SSL alert number 42\n139935652661056:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:../deps/openssl/openssl/ssl/s3_pkt.c:659:\n\n at exports._errnoException (util.js:1018:11)\n at WriteWrap.afterWrite (net.js:800:14)'

我猜这意味着我无法对主机进行身份验证,我在创建 Lambda 函数时没有使用任何证书。如何使用 AWS Lambda 将 MQTT 消息发送到同一主机,但发送到不同的主题? (上面的 Lambda 函数在客户端发送消息时触发,是否必须重新认证服务器才能将消息发送到不同的主题?)

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-iot


    【解决方案1】:

    尝试使用

    AWS.config.update({
        accessKeyId: <accessKeyId>,
        secretAccessKey: <secretAccessKey>,
        region: <region>
      });
    

    【讨论】:

    • 好的。谢谢,我会试试这个并回复你。 :)
    • 有没有办法用现有的证书文件进行身份验证?我对获取物联网事物的访问密钥的方式有点困惑。
    • 如果您要继续使用必须从某个地方导入它们并将它们保存在易失性内存中的证书,Lambda 只有一个易失性存储,访问它们可能会非常棘手。与我的理解相比,这种方式相当困难
    • 是的,完全正确.. 使用证书文件有点乱。我会试试上面的。谢谢??
    • 从端点删除端口号并设置 accessKey 值后,它已经工作了。谢谢。
    【解决方案2】:

    根据您要生成的内容,您可能能够使用主题规则本身来转换输入消息,而无需为 lambda 调用付费。示例见https://docs.aws.amazon.com/iot/latest/developerguide/iot-substitution-templates.html

    【讨论】:

      【解决方案3】:

      您的 lambda 应使用有权访问 IoT 策略的角色。您的 lambda 执行角色没有足够的权限来写入或连接并发布到 IoT。

      【讨论】:

        猜你喜欢
        • 2017-02-22
        • 1970-01-01
        • 2018-10-01
        • 2017-03-04
        • 2018-11-26
        • 1970-01-01
        • 2020-05-09
        • 2016-04-05
        • 2021-08-17
        相关资源
        最近更新 更多