【发布时间】:2019-12-27 10:13:51
【问题描述】:
我必须在 Intent 匹配时向我的 mqtt 代理发布一条 MQTT 消息,以下是无法按预期工作的代码。
var mqtt = require('mqtt-async');
function sendMQTTMessage(json)
{
if(!client || !client.connected)
{
console.log('found mqtt client to be not connected');
if(client)client.end();
var options = {
username: 'uname',
password: 'pass',
rejectUnauthorized: false,
clean: true
};
client = mqtt.connect('mqtts://ip:8883',options);
client.on('connect', () => {
client.publish('alexaIntentMatch', JSON.stringify(json));
console.log('sent');
});
}
else//publish now
{
client.publish('alexaIntentMatch', JSON.stringify(json));
console.log('sent');
}
}
const ItineraryIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'itinerary';
},
handle(handlerInput) {
var res = {'intentName':'ITENARY'};
sendMQTTMessage(res);
return handlerInput.responseBuilder.speak('You asked for ITENARY').getResponse();}
};
发生的情况是,当消息成功发送到 mqtt 代理时,Alexa 不说话(可以在 cloudwatch 中看到请求在 8 多秒后超时)。
Task timed out after 8.01 seconds
虽然这段代码工作得很好,
const ItineraryIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'itinerary';
},
handle(handlerInput) {let userID = handlerInput.requestEnvelope.context.System.user.userId;
let client = mqtt.connect('mqtts://ip:8883',{
username: 'uname',
password: 'pass',
rejectUnauthorized: false,
clean: true
});
client.on('connect', () => {
var res = {'intentName':'ITENARY'};
client.publish('alexaIntentMatch', JSON.stringify(res));
console.log('worked');
client.end();
});
return handlerInput.responseBuilder.speak("Today's itinerary is displayed on your TV.").getResponse();}};
这里有什么愚蠢的地方漏掉了。
【问题讨论】:
标签: node.js aws-lambda alexa alexa-skills-kit alexa-skill