首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Amazon :从SmartHomeSkill lambda控制TCP设备

Amazon :从SmartHomeSkill lambda控制TCP设备
EN

Stack Overflow用户
提问于 2017-02-11 15:18:40
回答 1查看 1.1K关注 0票数 1

我用lambda模板创建了一个SmartHomeSkill。

我还有一个简单的技能函数。

我两种方法都使用NodeJS。我使用Node中的套接字通过TCP直接连接到本地路由器。

使用套接字连接的普通Lambda : works!使用套接字连接的技能Lambda :工作!使用aws: works调用另一个Lambda (来自步骤1)的技能!使用SmartHomeSkill调用套接字:不工作!使用SmartHomeSkill调用另一个Lambda:不工作!我对所有人都使用同样的IAM角色。因此,因为场景1到3工作,我认为我的角色是好的。我正在使用一个自定义策略来进行内部访问。

我的SmartHomeSkill使用AWS角色进行身份验证,并获得带有令牌和所有内容的有效请求。

我的inter和TCP设备都没有任何身份验证功能。

TCP-设备是自制的电子产品.它能很好地使用普通的lambda和本地软件。

唯一的问题是:一旦我切换到SmartHomeSkill模板,什么都不会发生。然而,这种技能本身是有效的。我可以发现设备,Alexas可以不抱怨地发送调用请求。我做了很多日志,看上去一切都很好。在这两种情况下,使用柏拉图TCP套接字或对另一个lambda的HTTP调用,它什么也不做,没有错误,没有响应。

问题: SmartHomeSkill是否在某种程度上限制了使用出站连接。但是,如果,它如何连接到其他设备,如菲利普斯霍?

--

这是我的(完全工作的)inter,它接受HTTP有效负载并使用TCP重新发送它:

代码语言:javascript
复制
var net = require('net');

exports.handler = (event, context, callback) => {
    console.log(`event=${event}`);
    var payload = event.payload;
    sendKnx(payload.ga, +payload.v);
    // TODO implement
    callback(null, 'Hello from Lambda');
};
// ---- outbound -----
function sendKnx(ga, v) {
  var noreply = true;
  var dir = "W";
  if (ga) {
    console.log('**** Incoming TCP request from Client');
    // make numerical ga from convient one
    var parts = ga.split('/');
    if (parts.length === 3) {
      var hi = +parts[0];
      var mi = +parts[1];
      var lo = +parts[2];
      var gnumerical = hi * 2048 + mi * 256 + lo;
      // each time we send a package we connect, send, and close in one step
      // This is EibPC
      console.log('**** Connect using ' + gnumerical);
      try {
        var client = new net.Socket();
        console.log('**** Socket created');
        client.connect(8888, 'this.is.my.cloud.server', function () {
          console.log(`**** Send Data ${gnumerical}=${v}`);
          client.write(`${dir}|${gnumerical}=${v}`);
          if (noreply){
            client.destroy();
            console.log('**** Socket destroyed');
          }
        });
        client.on('data', function (data) {
          console.log('Received TCP Response from EibPC: ' + data);
          client.destroy(); // kill client after server's response
        });
        client.on('close', function () {
          console.log('TCP Connection to EibPC closed');
        });
      } catch (Error) {
        console.error(`**** TCP sending failed: ${Error}`);
      }
    }
  }
}

在我的(完美工作的)常规技能λ中,我要这样称呼它:

代码语言:javascript
复制
  function forwardLambdaCall(ga, v, context) {
   console.log('forwardLambdaCall');
   var payload = {
        "payload": {
            "ga": ga,
            "v": v
        }
   };
   lambda.invoke({
    FunctionName: 'KNXForwarder',
    InvocationType: 'RequestResponse',
    LogType:'Tail',
    Payload: JSON.stringify(payload) // pass params
   }, function(error, data) {
     console.log('Return forwardLambdaCall');
     if (error) {
      console.log('Error forwardLambdaCall' + error);
      context.done('error', error);
     } else {
      console.log('Success forwardLambdaCall' + data);
      context.succeed({});
   }
 });    
}

"KNXForwarder“是inter的名称。有效载荷通过,并按预期工作。这主要是为了测试的目的,我想保证货代是工作的。

如果我在我的SmartHomeSkill中使用完全相同的调用,什么都不会发生。

我已经在Alexa论坛上发布了这个名字:https://forums.developer.amazon.com/questions/58233/control-tcp-device-from-smarthomeskill-lambda.html。复制是有意的,因为我发现其他问题分布均匀,而且不确定如何才能接触到更广泛的开发人员。

EN

回答 1

Stack Overflow用户

发布于 2017-02-12 10:40:49

好吧,够奇怪的了,但也许有人能把这件事弄清楚。

首先,问题解决了。

在关闭来自Alexa的连接之前,我必须发送TCP指令。在我看来,当入站调用以其中之一结束时,任何TCP流量都会结束:

  • Context.succeed(.)
  • Context.fail(.)

所以我的新处理程序是这样的:

代码语言:javascript
复制
exports.handler = (event, context, callback) => {
    console.log(`event=${event}`);
    var result;
    if (event.header && event.header.namespace){
        switch (event.header.namespace) {

            case 'Alexa.ConnectedHome.Discovery':
                handleDiscovery(event, context);
                break;
            case 'Alexa.ConnectedHome.Control':
                result = handleControl(event, context);
                break;
            default:
                context.fail('Something went wrong');
                break;
        }
    }
    if (result){
        sendKnx(result.payload.ga, result.payload.v, () => context.succeed(result));
    }    
};

因此,handleControl函数不会结束通信,而是返回我想要提取的值。我的TCP连接'sendKnx‘建立出站通信,该通道一旦关闭,Alexa连接就会得到其结果。为此我使用了一个回调(第三个参数),它运行得很好。

如果能得到一些关于调用行为的文档,那就太好了。特别是,这就是为什么我有点抱怨,为什么如果触发器是SmartHomeSkill而不是普通技能的话,它的行为会有所不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42177497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档