Dialogflow подключиться к брокеру MQTT с помощью Firebase? - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь использовать облачные функции для Firebase, чтобы намерение Dialogflow приводило к публикации сообщения MQTT. Мне удалось получить необходимые данные, и все, что я до сих пор не могу сделать sh, это:

  1. Установление соединения с брокером MQTT;
  2. Публикация в указанном брокере.

Поскольку второй требует первого, это не моя забота пока .

Я вижу это так: либо мой код неверен, либо MQTT включен в то, что Firebase называет «внешней сетью». И я здесь, главным образом, чтобы убедиться, что я не обновляюсь до платного плана ни за что.

index.js:

'use strict';

const functions = require('firebase-functions');
const { WebhookClient, Card, Suggestion } = require('dialogflow-fulfillment');

var mqtt = require('mqtt');

process.env.DEBUG = 'dialogflow:debug';
const HOST = 'broker.mqttdashboard.com';
const PORT = 1883;
const TOPIC = 'topic/voice_recog';

exports.dialogflowFirebaseFulfillment = functions.region('europe-west1').https.onRequest((request, response) => {

  const agent = new WebhookClient({ request, response });

  try {

    function publishParameter(agent) {

      let message = agent.parameters.param_test;

      return publishToMqtt(message).then((output) => {
        agent.add(output);
      }).catch(error => {
        agent.add('error from publishToMqtt');
      });
    }

    let intentMap = new Map();
    intentMap.set('Repeat parameter', publishParameter);
    agent.handleRequest(intentMap);

  }

  catch (err) {
    console.error(err);
    agent.add(err.message);
    agent.send_();
  }
});

function publishToMqtt(message) {

   console.log("------------------------------");
   console.log("Topic: \""+TOPIC+"\"");
   console.log("Message: \""+message+"\"");
   console.log("------------------------------");

   return new Promise((resolve, reject) => {

      var options = {
         port: PORT,
         host: HOST,
         clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8),
         keepalive: 60,
         reconnectPeriod: 1000,
         protocolId: 'MQIsdp',
         protocolVersion: 3,
         clean: true,
         encoding: 'utf8'
      };

      var client = mqtt.connect("mqtt://"+HOST, {port: PORT});

      // is not executed
      client.on('connect', function () { 
         console.log('client connected');
      });

      // is not executed
      client.publish(TOPIC, message, {}, function (err) { 
         console.log("Tried publishing \""+message+"\" to \""+TOPIC+"\".");
         if (err) {
            console.log("But the future refused to change:" + err);
            reject();
         }
         else {
            resolve(message);
            client.end();
            clearTimeout(noResp);
         }
      });

      let noResp = setTimeout(() => {
         console.log("No connection"); // always gives this result
         reject();
         client.end();
      }, 5000);

   });
}

package.json:

{
  "name": "assistant-to-mqtt",
  "description": "publishes intent parameter to MQTT broker",
  "engines": {
    "node": "8"
  },
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "firebase serve --only functions:publish_mqtt",
    "deploy": "firebase deploy --only functions:publish_mqtt"
  },
  "dependencies": {
    "actions-on-google": "^2.1.3",
    "dialogflow-fulfillment": "^0.4.1",
    "firebase-admin": "^5.12.1",
    "firebase-functions": "^2.2.1",
    "mqtt": "^2.13.0"
  }
}

Вся помощь приветствуется. Спасибо.

РЕДАКТИРОВАТЬ: журнал.

log

1 Ответ

1 голос
/ 20 февраля 2020

Вы на самом деле используете MQTT Broker, который Firebase рассматривает как URL внешнего доступа. Попробуйте включить выставление счетов, как описано здесь .

...