MqttDispatcher/dist/mqttclient.js
2017-07-23 22:55:05 +02:00

63 lines
2.4 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Mqtt = require("mqtt");
const log = require("./log");
const MQTT_BROKER_DEFAULT_URL = "mqtt://localhost";
class MqttClient {
constructor(mqttBrokerUrl) {
this._mqttBrokerUrl = (mqttBrokerUrl) ? mqttBrokerUrl : MQTT_BROKER_DEFAULT_URL;
this._topicHandlers = [];
}
register(topic, callback) {
this._topicHandlers.push({ topic, callback });
log.info(`handler registered for topic ${topic}`);
}
exec() {
this._mqttClient = Mqtt.connect(this._mqttBrokerUrl);
this._mqttClient.on('error', log.error);
this._mqttClient.on('connect', () => {
log.info("connected to mqtt broker");
for (let topicHandler of this._topicHandlers) {
this._mqttClient.subscribe(topicHandler.topic);
}
});
this._mqttClient.on('message', (topic, payload) => {
log.info(`message received, topic ${topic}, payload ${payload}`);
for (let topicHandler of this._topicHandlers) {
if (this.topicMatch(topicHandler.topic, topic)) {
log.info(`received topic ${topic} matches registered topic ${topicHandler.topic}`);
if (topicHandler.callback != null) {
topicHandler.callback(payload);
}
}
}
});
}
topicMatch(registeredTopic, receivedTopic) {
let registeredTopicFields = registeredTopic.split('/');
let receivedTopicFields = receivedTopic.split('/');
for (let field in registeredTopicFields) {
let regField = registeredTopicFields[field];
let recvField = receivedTopicFields[field];
log.info(`recv: ${recvField}, reg: ${regField}`);
if (regField === "#") {
log.info('true');
return true;
}
if (regField != recvField && regField != "+") {
log.info('false');
return false;
}
}
if (registeredTopicFields.length == receivedTopicFields.length) {
log.info('true');
return true;
}
else {
log.info('false');
return false;
}
}
}
exports.MqttClient = MqttClient;
//# sourceMappingURL=mqttclient.js.map