Node.js Alexa Skill在本地工作,但在Skill developer门户中测试时不工作
我正在raspberry pi上运行Node.js mqtt订阅服务器,该服务器通过lambda aws代码侦听已发布事件。发布事件通过Alexa Skill事件触发 榜样 “Alexa,告诉电视切换到频道10”-然后我的Lambda代码会将此意图识别为ChannelNumberInt意图,然后将带有频道号的正确消息发布到我的Raspi上的mqtt服务器。然后,Raspi执行不断变化的通道逻辑 我已经使用alexa应用服务器在本地运行了这一切,它工作得非常好。来自Alexa的响应有效,mqtt服务器收到正确的数字/消息包 当我在“测试”选项卡上的开发人员技能门户中使用Alexa技能进行测试时,问题就出现了。它运行正常,从lambda返回一个响应,表示消息已收到,但mqtt订户从未收到通道数字/消息包?我相信在几个小时的困惑之后,我的lambda代码被搞砸了。这是我的密码 LAMBDA AWS代码Node.js Alexa Skill在本地工作,但在Skill developer门户中测试时不工作,node.js,amazon-web-services,aws-lambda,alexa,alexa-skills-kit,Node.js,Amazon Web Services,Aws Lambda,Alexa,Alexa Skills Kit,我正在raspberry pi上运行Node.js mqtt订阅服务器,该服务器通过lambda aws代码侦听已发布事件。发布事件通过Alexa Skill事件触发 榜样 “Alexa,告诉电视切换到频道10”-然后我的Lambda代码会将此意图识别为ChannelNumberInt意图,然后将带有频道号的正确消息发布到我的Raspi上的mqtt服务器。然后,Raspi执行不断变化的通道逻辑 我已经使用alexa应用服务器在本地运行了这一切,它工作得非常好。来自Alexa的响应有效,mqtt服
'use strict';
module.change_code = 1;
var Alexa = require('alexa-app');
var skill = new Alexa.app('tvRemote');
var awsIot = require('aws-iot-device-sdk');
var deviceName = "tvRemote";
var _ = require('lodash');
var path = require('path');
var host = "randomletters.iot.us-east-1.amazonaws.com";
//App id is the skill being used.
var app_id = "amzn1.ask.skill.more random letters";
var thingShadows = awsIot.thingShadow({
keyPath: path.join(__dirname, '/Raspi.private.key'),
certPath: path.join(__dirname, '/Raspi.cert.pem'),
caPath: path.join(__dirname, '/root-CA.crt'),
clientId: deviceName,
region: "us-east-1",
});
var reprompt = 'I didn\'t hear a channel, tell me a channel number or name to change to that channel';
skill.launch(function (request, response) {
var prompt = 'To change channel, tell me a channel number.';
response.say(prompt).reprompt(reprompt).shouldEndSession(true);
});
skill.intent('ChannelNumberIntent', {
'slots': {
'CHANNELNUMBER': 'CHANNELID'
},
'utterances': ['{|Change|put} {|the|on} {|channel} {|to} {-|CHANNELNUMBER}']
},
function (request, response) {
var channelNumber = request.slot('CHANNELNUMBER');
if (_.isEmpty(channelNumber)) {
var prompt = 'I didn\'t hear a channel code. Tell me a channel code.';
response.say(prompt).shouldEndSession(true);
return true;
} else {
thingShadows.publish('lambda/channelNumber', channelNumber, function () {
var prompt1 = 'Okay.';
response.say(prompt1).shouldEndSession(false);
return true;
});
return true;
}
}
);
module.exports = skill;
MQTT服务器
'use strict'
var mqtt = require('mqtt')
var fs = require('fs')
var path = require('path')
var KEY = fs.readFileSync(path.join(__dirname, '/Raspi.private.key'))
var CERT = fs.readFileSync(path.join(__dirname, '/Raspi.cert.pem'))
var TRUSTED_CA_LIST = fs.readFileSync(path.join(__dirname, '/root-CA.crt'))
var PORT = Corretportnumber
var HOST = 'RASPIHOSTWORDSASDFSDF.iot.us-east-1.amazonaws.com'
var options = {
port: PORT,
host: HOST,
key: KEY,
cert: CERT,
rejectUnauthorized: true,
// The CA list will be used to determine if server is authorized
ca: TRUSTED_CA_LIST
}
var client = mqtt.connect('mqtts://' + HOST, options)
client.subscribe('lambda/channelNumber')
client.on('connect', function () {
console.log('Connected')
})
client.on('message', function (topic, message) {
if (topic === 'lambda/channelNumber') {
// logic.changeChannelCode(message);
console.log(message.toString());
}
})
显然,隐藏主机和端口号的原因是您是否向服务器提供任何特定于技能的数据,例如
userId
,或user
?如果是这样的话,这些数据只有在本地触发您的技能时才可用,而不是从开发人员门户。@MikiP Hi,我不确定您的意思,我向Lambda发送了一些JSON-带有会话id和用户id等。然后Lambda会提取这些数据,并在以下情况下正确运行:<代码>thingShadows.publish('lambda/channelNumber',channelNumber,function(){var prompt1='ok';response.say(prompt1.shouldEndSession(false);返回true;})代码>哪个似乎不运行发布,但运行响应?尽管响应在发布函数中,但有什么想法吗?(在我看来,我对node.js和javascript是新手)您是否尝试过通过lambda控制台进行测试?