105 lines
2.8 KiB
JavaScript
105 lines
2.8 KiB
JavaScript
import { v4 as uuid } from 'uuid'
|
|
import mqtt from 'mqtt'
|
|
export { Mqtt }
|
|
class Mqtt {
|
|
constructor(config) {
|
|
this.connection = {
|
|
host: config.host,
|
|
port: config.port,
|
|
endpoint: config.endpoint || '/mqtt',
|
|
clean: config.clean || true,
|
|
connectTimeout: config.connectTimeout || 4000,
|
|
reconnectPeriod: config.reconnectPeriod || 4000,
|
|
clientId: config.clientId || uuid(),
|
|
username: config.username || '',
|
|
password: config.password || ''
|
|
}
|
|
this.client = {
|
|
connected: false
|
|
}
|
|
}
|
|
// 创建连接
|
|
createConnection() {
|
|
// 连接字符串, 通过协议指定使用的连接方式
|
|
// ws 未加密 WebSocket 连接
|
|
// wss 加密 WebSocket 连接
|
|
// mqtt 未加密 TCP 连接
|
|
// mqtts 加密 TCP 连接
|
|
// wxs 微信小程序连接
|
|
// alis 支付宝小程序连接
|
|
const { host, port, endpoint, ...options } = this.connection
|
|
const connectUrl = `ws://${host}:${port}${endpoint}`
|
|
try {
|
|
this.client = mqtt.connect(connectUrl, options)
|
|
} catch (error) {
|
|
// 连接错位、
|
|
this.connectError(error)
|
|
}
|
|
}
|
|
connectError(error) {
|
|
console.log('mqtt.connect error', error)
|
|
}
|
|
// 订阅主题
|
|
doSubscribe(subscription) {
|
|
const { topic, qos } = subscription
|
|
let subscribeSuccess = false
|
|
this.client.subscribe(topic, { qos }, (error, res) => {
|
|
if (error) {
|
|
subscribeSuccess = false
|
|
console.log('Subscribe to topics error', error)
|
|
} else {
|
|
subscribeSuccess = true
|
|
console.log('Subscribe to topics res', res)
|
|
}
|
|
})
|
|
return subscribeSuccess
|
|
}
|
|
// 取消订阅
|
|
doUnSubscribe(subscription) {
|
|
const { topic } = subscription
|
|
let unSubscribeSuccess = false
|
|
this.client.unsubscribe(topic, error => {
|
|
if (error) {
|
|
unSubscribeSuccess = false
|
|
console.log('Unsubscribe error', error)
|
|
} else {
|
|
unSubscribeSuccess = true
|
|
}
|
|
})
|
|
return unSubscribeSuccess
|
|
}
|
|
// 发送消息
|
|
doPublish(publish) {
|
|
const { topic, qos, payload } = publish
|
|
let doPublishSuccess = false
|
|
this.client.publish(topic, payload, qos, error => {
|
|
if (error) {
|
|
doPublishSuccess = false
|
|
console.log('Publish error', error)
|
|
} else {
|
|
doPublishSuccess = true
|
|
}
|
|
})
|
|
return doPublishSuccess
|
|
}
|
|
// 断开连接
|
|
destroyConnection() {
|
|
let destroyConnectionSuccess = false
|
|
if (this.client.connected) {
|
|
try {
|
|
this.client.end()
|
|
this.client = {
|
|
connected: false
|
|
}
|
|
destroyConnectionSuccess = true
|
|
console.log('Successfully disconnected!')
|
|
} catch (error) {
|
|
destroyConnectionSuccess = false
|
|
console.log('Disconnect failed', error.toString())
|
|
}
|
|
}
|
|
return destroyConnectionSuccess
|
|
}
|
|
}
|
|
|