如何从Lambda函数发回消息到设备?

时间:2018-05-28 19:45:06

标签: aws-lambda alexa-skill aws-iot

我们是否可以通过Alexa Skill调用的Lambda函数向设备发送消息。该消息包含Lambda函数收集的一些值。 所以基本上我想这样做:

  • 设备--->语音命令---> Alexa Skill - (触发器) - > Lambda函数
  • Lambda函数(收集值)----消息--->设备

Java中是否有任何示例?

感谢任何指针/帮助。

-James

2 个答案:

答案 0 :(得分:0)

Invoke Alexa device from lambda function是一个非常相似的问题,答案是:"它不可能YET"

我会详细说明。您可以向技能的所有用户发送通知,例如新功能,但是,您无法向调用功能的特定用户发送通知。

要向已启用通知的Alexa技能的所有用户发送通知,请参阅此design

有关向特定用户发送通知的限制的详细信息,请参阅此thread

答案 1 :(得分:0)

您的要求可以完成。

首先,语音命令不是来自图中的人。 设备与Alexa通话。 Alexa调用或触发Lambda。 Lambda功能消息设备。

Lambda内部的函数为httphttps。如果您的设备可以处理https或TLS加密,那就很好。但是大多数设备很小,并且计算能力有限,因此您最终将使用http。截至2020年,AWS允许使用http,但由于联邦法规的限制,一年后要求您使用https或TLS 1.3。但是直到发生时我们才知道。

以下是NodeJS中Lambda http帖子的示例。触发数据来自request。因此,您应该知道将使用哪种JSON,并使用if语句从JSON中提取数据。 NodeJS网站上有很好的http范例。

现在您的设备是服务器。它必须预见Lambda请求并进行处理,并在需要时回复Lambda。

现在您的设备开始通话并接收信息。

    const http = require('http');
exports.handler = async (request, context) => {

 if (request.directive.header.namespace === 'FromAlexaSkill') {
httpost("This is your data to device", "192.168.1.2");
}

//**********************************************
let httpPost =async (postData, servername) => {
  
    let dataString = '';
    
    const response = await new Promise((resolve, reject) => {

        const options = {
          hostname: servername,
          port: 1777,
          path: '/dim',
          method: 'POST',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': Buffer.byteLength(postData)
          }
        };
        
        const req = http.request(options, (res) => 
          {
              res.setEncoding('utf8');
              res.on('data', chunk => {
                  dataString += chunk;
              });
              
              res.on('end', () => {
                  resolve({
                       "body":dataString
                  });
              });
            
          });//http.request
        
       
        req.on('error', (e) => {
          console.error("problem with request: "+e.message);
          reject({
              statusCode: 500,
              body: 'Something went wrong!'
          });
        });
        
        
        // Write data to request body
        req.write(postData);
        req.end();
    
    }); //Promise
    
    return response;

};//httpPost
}