Alexa Skill разработан в Lambda, MQTT асинхронной связи - PullRequest
0 голосов
/ 24 октября 2019

Я занимаюсь разработкой Alexa Skill, используя AWS lambda и ask-sdk. В этом навыке мне нужно общаться с помощью mqtt, я добавил библиотеку mqtt в проект. Для этого типа связи нам нужна асинхронная связь. Я следую следующему руководству Amazon: https://developer.amazon.com/blogs/alexa/post/4a46da08-d1b8-4d8e-9277-055307a9bf4a/alexa-skill-recipe-update-call-and-get-data-from-external-apisblog

Руководство объясняет HTTP-связь, я не могу работать с MQTT.

Структура моего проекта:

  const Alexa = require('ask-sdk');
    const BienvenidaHandler = {
    canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'LaunchRequest';
    },
    handle(handlerInput) {  
    return handlerInput.responseBuilder
      .speak('Hello MQTT ')
      .reprompt('wait') //Para que no se cierre la sesión tras la bienvenida.
      .withSimpleCard(SKILL_NAME, 'Bienvenido')
      .getResponse();
   },
  };
  const ConversorHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'IntentRequest'
      && request.intent.name === 'Conversor';
  },
  handle(handlerInput) {
    **//HERE WE MUST SUBSCRIBE/PUBLISH to the BROKER.**
    var mqtt = require('mqtt')
    var client  = mqtt.connect('mqtt://test.mosquitto.org')
    var texto = 'No data'

    client.on('connect', function () {
      client.subscribe('presence', function (err) {
        if (!err) {
          client.publish('presence', 'Hello mqtt')
        }
      })
    })

    client.on('message', function (topic, message) {
      // message is Buffer
      console.log(message.toString())
      texto = message.toString()
      client.end()
    })

    **//ALEXA SPEAK WITH MQTT DATA. (DOES NOT WORK)**
    return handlerInput.responseBuilder
      .speak('test mqtt, '+texto)      
      .reprompt(HELP_REPROMPT)
      .getResponse();
   },
 };
 ...

const skillBuilder = Alexa.SkillBuilders.standard();

exports.handler = skillBuilder
  .addRequestHandlers(
    BienvenidaHandler,
    ConversorHandler,
    HelpHandler,
    ExitHandler,
    SessionEndedRequestHandler
  )
  .addErrorHandlers(ErrorHandler)
  .lambda();

Этот способ чтения MQTT не работает. Alexa должна говорить с данными MQTT, но для чтения нам нужна асинхронная функция, когда Alexa говорит, у нас нет данных MQTT.

Знаете ли вы, как я могу читать данные MQTT с помощью Alexa Skill?

Спасибо.

...