我用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重新发送它:
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}`);
}
}
}
}在我的(完美工作的)常规技能λ中,我要这样称呼它:
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。复制是有意的,因为我发现其他问题分布均匀,而且不确定如何才能接触到更广泛的开发人员。
发布于 2017-02-12 10:40:49
好吧,够奇怪的了,但也许有人能把这件事弄清楚。
首先,问题解决了。
在关闭来自Alexa的连接之前,我必须发送TCP指令。在我看来,当入站调用以其中之一结束时,任何TCP流量都会结束:
所以我的新处理程序是这样的:
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而不是普通技能的话,它的行为会有所不同。
https://stackoverflow.com/questions/42177497
复制相似问题