代码之家  ›  专栏  ›  技术社区  ›  Senura Dissanayake

使用触发的Lambda函数向另一个IoT主题发送MQTT消息?

  •  0
  • Senura Dissanayake  · 技术社区  · 6 年前

    我已经创建了AWS物联网规则。当客户端向 terminal1/ 主题(客户端正在向 终端1/ 使用AWS IoT生成的证书文件。)。我需要一个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函数会触发,我是否必须重新验证服务器才能将消息发送到其他主题?)

    3 回复  |  直到 6 年前
        1
  •  0
  •   Yohan    6 年前

    尝试使用

    AWS.config.update({
        accessKeyId: <accessKeyId>,
        secretAccessKey: <secretAccessKey>,
        region: <region>
      });
    
        2
  •  0
  •   Caroline Willis    6 年前

    根据您想要生成的内容,您可能能够使用主题规则本身转换输入消息,并跳过lambda调用的费用。看见 https://docs.aws.amazon.com/iot/latest/developerguide/iot-substitution-templates.html 例如。

        3
  •  0
  •   winter    6 年前

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