Подписка на брокера MQTT и получение передаваемых данных - PullRequest
1 голос
/ 28 мая 2020

Я генерирую данные с помощью симулятора node.js и передаю эти данные в http-маршрут /simulator/data

В приложении я прослушиваю файл брокера с MQTT mqtthandler. js, которым я делюсь ниже.

//This is mqtthandler.js file

const mqtt = require("mqtt");

class MqttHandler {
  constructor() {
    this.mqttClient = null;
    this.host = "mqtt://localhost:1883";
    this.username = "YOUR_USER"; // mqtt credentials if these are needed to connect
    this.password = "YOUR_PASSWORD";
  }

  connect() {
    // Connect mqtt with credentials (in case of needed, otherwise we can omit 2nd param)
    this.mqttClient = mqtt.connect(this.host, {
      username: this.username,
      password: this.password,
    });

    // Mqtt error calback
    this.mqttClient.on("error", (err) => {
      console.log(err);
      this.mqttClient.end();
    });

    // Connection callback
    this.mqttClient.on("connect", () => {
      console.log(`mqtt client connected`);
    });

    // mqtt subscriptions
    this.mqttClient.subscribe("value", { qos: 0 });

    // When a message arrives, console.log it
    this.mqttClient.on("message", function (topic, message) {
      console.log(message.toString());
    });

    this.mqttClient.on("close", () => {
      console.log(`mqtt client disconnected`);
    });
  }

  // Sends a mqtt message to topic: mytopic
  sendMessage(message) {
    this.mqttClient.publish("value", message);
  }
}

module.exports = MqttHandler;

Когда симулятор отправляет данные по маршруту /simulator/data, я получаю значение и отправляю брокеру значение topi c. Я делюсь кодом почтового запроса и выводом симулятора ниже.

var mqttHandler = require("../mqtthandler");

module.exports = function (app) {
  app.get("/simulator", function (req, res) {
    res.render("iot/simulator");
  });

  // route to display all the data that is generated
  app.get("/simulator/data", require("./controllers/data").all);

  var mqttClient = new mqttHandler();
  mqttClient.connect();

  // route to write data to the database
  app.post(
    "/simulator/data",
    require("./controllers/data").write,
    (req, res) => {
      mqttClient.sendMessage(req.body.value);
      res.status(200).send("Message sent to mqtt");
    }
  );

  // delete the data when the stream is stopped or when the app is closed
  app.get("/simulator/data/delete", require("./controllers/data").delete);
};

Когда я отправляю запрос на получение /simulator/data, я могу видеть сгенерированные данные, однако эти данные не отправляются брокеру.

//This is output of simulator

    [
        {
            "_id": "5ecfadc13cb66f10e4d9d39b",
            "value": "1.886768240197795",
            "__v": 0,
            "categories": []
        },
        {
            "_id": "5ecfadc23cb66f10e4d9d39c",
            "value": "7.351404601932272",
            "__v": 0,
            "categories": []
        }
    ]

PS: Брокер создается через node-red

Я хотел бы передать эти данные брокеру и посмотреть результат с подпиской MQTT. Однако я не могу найти, где я ошибаюсь.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Ваше решение - исправить ваш процесс разработки. Вместо того, чтобы работать на основе отказов отладки 2 подсистем (вашего издателя / симулятора и вашего подписчика), работайте на основе успеха:

1) используйте издателей, которых вы ЗНАЕТЕ, например. mosquitto_pub, любой работающий симулятор и т. д. c.

2) используйте подписчиков, которых вы ЗНАЕТЕ о работе, например. mosquitto_sub

Это решит вашу проблему за считанные минуты, а не часы или дни, и позволит вам сосредоточиться на коде, который вы ДЕЙСТВИТЕЛЬНО хотите разработать.

0 голосов
/ 28 мая 2020

Итак, пара вещей, на которые стоит обратить внимание.

  1. Ваш вызов this.mqttClient.subscribe() встроен в ваш connect(), on.("error",...), on.("message",...) et c. Таким образом, subscribe () может сработать до завершения connect () ... и, таким образом, вы никогда не подпишетесь. Поместите subscribe() внутрь блока connect().

  2. Вы подписываетесь на «значение», которое не является правильным MQTT topi c. Если необходимо, используйте value/# для подписки () и «value / ..» для publi sh (). Ваш класс допускает только один жестко запрограммированный topi c, поэтому он не будет очень полезен, если вы хотите повторно использовать этот класс для других проектов. Найдите время, чтобы передать классу строку topi c.

...