Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Alexa Skill在本地工作,但在Skill developer门户中测试时不工作_Node.js_Amazon Web Services_Aws Lambda_Alexa_Alexa Skills Kit - Fatal编程技术网

Node.js Alexa Skill在本地工作,但在Skill developer门户中测试时不工作

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服

我正在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代码

    '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控制台进行测试?