96 lines
1.9 KiB
Vue
96 lines
1.9 KiB
Vue
|
|
<template>
|
|||
|
|
<view>
|
|||
|
|
<!-- MQTT 客户端组件 -->
|
|||
|
|
<slot :connect="connect" :disconnect="disconnect" :publish="publish" :subscribe="subscribe" :unsubscribe="unsubscribe" :status="status" :topics="topics">
|
|||
|
|
<!-- 默认插槽内容,用户可自定义 -->
|
|||
|
|
</slot>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import MQTTClient from '../js_sdk/index.js'
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
name: 'mqtt-client',
|
|||
|
|
props: {
|
|||
|
|
options: {
|
|||
|
|
type: Object,
|
|||
|
|
default: () => ({})
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
mqtt: null,
|
|||
|
|
status: 'disconnected',
|
|||
|
|
topics: []
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
created() {
|
|||
|
|
this.mqtt = new MQTTClient(this.options)
|
|||
|
|
|
|||
|
|
this.mqtt.on('statusChange', (status) => {
|
|||
|
|
this.status = status
|
|||
|
|
this.$emit('status-change', status)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
this.mqtt.on('message', (msg) => {
|
|||
|
|
this.$emit('message', msg)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
this.mqtt.on('connect', () => {
|
|||
|
|
this.$emit('connect')
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
this.mqtt.on('disconnect', (res) => {
|
|||
|
|
this.$emit('disconnect', res)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
this.mqtt.on('error', (error) => {
|
|||
|
|
this.$emit('error', error)
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
beforeDestroy() {
|
|||
|
|
if (this.mqtt) {
|
|||
|
|
this.mqtt.disconnect()
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
connect() {
|
|||
|
|
if (this.mqtt) {
|
|||
|
|
this.mqtt.connect()
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
disconnect() {
|
|||
|
|
if (this.mqtt) {
|
|||
|
|
this.mqtt.disconnect()
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
publish(topic, message, qos = 0) {
|
|||
|
|
if (this.mqtt) {
|
|||
|
|
this.mqtt.publish(topic, message, qos)
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
subscribe(topic, qos = 0) {
|
|||
|
|
if (this.mqtt) {
|
|||
|
|
this.mqtt.subscribe(topic, qos)
|
|||
|
|
if (!this.topics.includes(topic)) {
|
|||
|
|
this.topics.push(topic)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
unsubscribe(topic) {
|
|||
|
|
if (this.mqtt) {
|
|||
|
|
this.mqtt.unsubscribe(topic)
|
|||
|
|
const index = this.topics.indexOf(topic)
|
|||
|
|
if (index > -1) {
|
|||
|
|
this.topics.splice(index, 1)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style>
|
|||
|
|
</style>
|