You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.2 KiB
93 lines
2.2 KiB
import mqtt from 'mqtt' |
|
import { message } from 'ant-design-vue' |
|
|
|
export interface Options { |
|
host: string |
|
port: number // ws -> 8083; wss -> 8084 |
|
protocol: mqtt.MqttProtocol // ws or wss |
|
clean: boolean |
|
clientId: string |
|
connectTimeout: number |
|
reconnectPeriod: number |
|
username: string |
|
password: string |
|
} |
|
export class MqttService { |
|
client: mqtt.MqttClient | null |
|
options: Options |
|
constructor(options: Options) { |
|
this.client = null |
|
this.options = options |
|
} |
|
|
|
connect() { |
|
return new Promise((resolve, reject) => { |
|
const { protocol, host, port } = this.options |
|
const connectUrl = `${protocol}://${host}:${port}/mqtt` |
|
this.client = mqtt.connect(connectUrl, this.options) |
|
this.client.on('connect', () => { |
|
console.log('连接成功,connectUrl:', connectUrl) |
|
|
|
resolve(true) |
|
}) |
|
this.client.on('error', (error: any) => { |
|
message.error('连接失败!') |
|
reject(error) |
|
}) |
|
}) |
|
} |
|
|
|
subscribe(topic: string) { |
|
if (!this.client || !this.client.connected) { |
|
throw new Error('MQTT client is not connected.') |
|
} |
|
|
|
return new Promise((resolve, reject) => { |
|
this.client?.subscribe(topic, (err: any) => { |
|
if (err) { |
|
message.error('订阅失败!请稍后重试') |
|
reject(err) |
|
} |
|
else { |
|
resolve(true) |
|
} |
|
}) |
|
}) |
|
} |
|
|
|
onMessage(topic: string, callback: any) { |
|
if (!this.client || !this.client.connected) { |
|
throw new Error('MQTT client is not connected.') |
|
} |
|
this.client.on( |
|
'message', |
|
(receivedTopic: string, message: { toString: () => any }) => { |
|
if (receivedTopic === topic) { |
|
callback(JSON.parse(message.toString())) |
|
} |
|
}, |
|
) |
|
} |
|
|
|
unsubscribe(topic: string) { |
|
if (!this.client || !this.client.connected) { |
|
throw new Error('MQTT client is not connected.') |
|
} |
|
|
|
this.client.unsubscribe(topic, (err: any) => { |
|
if (err) { |
|
message.error('取消订阅失败!!请联系管理员') |
|
} |
|
else { |
|
console.log('取消订阅成功!', topic) |
|
} |
|
}) |
|
} |
|
|
|
end() { |
|
if (this.client) { |
|
this.client.end() |
|
console.log('mqtt已断开') |
|
} |
|
} |
|
}
|
|
|