mqttdevicemanager/dashboard/src/services/mqtt.js
2026-03-15 23:05:23 +10:30

35 lines
1.1 KiB
JavaScript

import mqtt from 'mqtt'
export default class MQTTService {
constructor(brokerUrl = 'ws://127.0.0.1:8083/mqtt', clientId = null) {
this.clientId = clientId || 'vue-client-' + Math.random().toString(16).substr(2, 8)
this.client = mqtt.connect(brokerUrl, { clientId: this.clientId })
this.subscriptions = [] // array of {topic, callback}
this.client.on('connect', () => console.log('Connected to MQTT broker'))
this.client.on('message', (topic, payload) => {
// iterate over subscriptions and check for matches
this.subscriptions.forEach(({topic: subTopic, callback}) => {
if (mqttMatch(subTopic, topic)) {
callback(payload.toString(), topic)
}
})
})
}
subscribe(topic, callback) {
this.subscriptions.push({topic, callback})
this.client.subscribe(topic)
}
publish(topic, message, options = {}) {
this.client.publish(topic, message, options)
}
}
// helper function for MQTT wildcards
function mqttMatch(subTopic, topic) {
// replace MQTT wildcards with RegExp
const regex = '^' + subTopic.replace('+', '[^/]+').replace('#', '.+') + '$'
return new RegExp(regex).test(topic)
}