Я новичок в nodejs и учусь, но не могу понять, почему моя вспомогательная функция не работает. По сути, это часть примера лямбда-функции alexa, которая обычно работает. Операция MQTT работает, если я оставляю код MQTT в обработчике намерений, но мне нужно переместить его в основную часть кода, чтобы я мог вызывать операцию MQTT из других функций кода.
В этом фрагменте есть несколько «тестовых» функций, которые не работают, вероятно, потому, что мне не нравится правильный способ переместить код из функции Intent.
Я также не совсем понимаю обработчики … (на самом деле несколько обработчиков) Во фрагменте кода есть два обработчика … это не вызывает проблем, но я надеялся получить два лямбда-триггера (ask-sdk и умный дом) с каждым вызовом своего обработчика — не уверен, возможно ли это.
var APP_ID = "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // input the axela skill ID
var AWS = require('aws-sdk');
var Alexa = require("alexa-sdk");
AWS.config.region = "us-east-1";
var iotData = new AWS.IotData({endpoint: "xxxxxxxxxxx.iot.us-east-1.amazonaws.com"}); // input the AWS thing end point
var topic = "esp32/sub"; //input the topic that the device is subscribed to
// Handler for Generic Event handling accepts both SmartHomeand ask-sdk events
// But only works when the handler below is removed.
exports.handler = async function (event, context) {
// Dump the request for logging - check the CloudWatch logs
console.log("index.handler request -----");
console.log(JSON.stringify(event));
if (context !== undefined) {
console.log("index.handler context -----");
console.log(JSON.stringify(context));
}
switchon(); // test call of standalone MQTTfunction ( doesn't work)
};
// Remove this function and the Smarthome Test works.
// But is needed for the ask-sdk events ( Smarthome events fail )
exports.handler = function(event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
console.log("index.handler comment -----");
};
//*********************************
// Helper code examples to functionalise the MQTT switch on
// NONE OF THESE WORK WHEN CALLED
function switchon3(){
var dataObj = {
topic: topic,
payload: "on",
qos:0
};
iotData.publish(dataObj, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
}
function switchon (error, data){
var params = {
topic: topic,
payload: "on",
qos:0
};
iotData.publish(params, (error, data)=>{
if (!error){this.emit(':tell', 'Robert, well done its Switched On');
}else{this.emit(':tell', 'Oh dear MQTT returned a switch on error')}
});
}
// End of helper examples
//*********************************
//********* THE PROPER CODE ************************
var handlers = {
'LaunchRequest': function () {
this.emit(':tell', 'Hello. Skill four here. How may I help you?');
},
'SwitchOnIntent': function () {
// None of the example function calls work here
// switchon3();
// this.emit(':tell', 'Test Switch On'); // needs this line to work
// The following original example code DOES work
var params = {
topic: topic,
payload: "on",
qos:0
};
iotData.publish(params, (error, data)=>{
if (!error){this.emit(':tell', 'Robert, well done its Switched On');
}else{this.emit(':tell', 'Oh dear MQTT returned a switch on error')}
});
},
Отредактировано …
Нет, Томми, это не так уж и просто, спасибо за помощь. На самом деле я пытаюсь заставить лямбда принимать входные данные от двух триггеров AWS. 1. ASK-API от пользовательских навыков 2. Триггер Smarthome. Я не уверен, нужны ли этим двум триггерам отдельные функции-обработчики, или, если, как я подозреваю, использование триггера smarthome отменяет использование методов ask-api, которые каким-то образом вызывают зарегистрированные функции Intent, полученный json явно отформатирован иначе, чем оба типа триггеров, и я понимаю, что можно выполнять синтаксический анализ пользовательских навыков alexa вручную в лямбда-выражении. Тогда у меня вопрос … если вы начинаете с пользовательского навыка, регистрация всех вызовов функций с помощью ask-api становится недействительной, если я затем добавляю триггер smarthome, потому что один обработчик, который имел дело с событием ask-api, не может также иметь дело с директива smarthome.
После того, как разобрались с этим, он пытается «активировать» вызов MQTT, который работает в функциях Intent, как это было изначально закодировано, но терпит неудачу, если я попытаюсь поместить их в отдельные вызовы функций. Потерпи меня … Я знаю, что хочу делать … просто еще совсем не знаю этот язык.
