import { ElMessage } from 'element-plus' import mqtt, { MqttClient, IClientOptions, IClientSubscribeOptions } from 'mqtt' // 静态导入 mqtt // 定义 MQTT 配置类型接口 interface MqttConfig { host: string options: IClientOptions topic: string } // 定义消息回调函数类型 type MessageCallback = (data: { topic: string; message: Record }) => void // MQTT 连接配置 const MQTT_CONFIG: MqttConfig = { // 替换为你的 MQTT 服务器地址(ws/wss 协议) host: 'ws://172.21.10.65:8083/mqtt', // MQTT 连接选项 options: { username: 'yanfan', // 替换为你的用户名(无则省略) password: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjY0YmM2NjJlLWZhMjQtNGY1Ny1hOTk1LWZiMGM2YjNhYzI4OCJ9.9nxoDUNGTk1szRlZHHG0AcWZctLrzJ16UA5rsBagHNcD10PC-LIMTgAr2CK1Ppafa6cW5XPdn7RqBF6iZjHtww', // 替换为你的密码(无则省略) clean: true, reconnectPeriod: 5000, // 重连间隔 5 秒 clientId: 'web-' + Math.random().toString(16).substr(2), connectTimeout: 10000, // 连接超时 10 秒 }, // 要监听的主题 topic: '/649/YF6660355/property/post' } // 创建 MQTT 客户端实例(添加类型注解) let client: MqttClient | null = null // 消息回调函数 let messageCallback: MessageCallback | null = null /** * 初始化 MQTT 连接 * @param callback 接收消息的回调函数 */ export const initMqtt = (callback: MessageCallback): void => { // 保存消息回调 messageCallback = callback // 避免重复连接 if (client && client.connected) { ElMessage.info('MQTT 已连接') return } try { // 直接使用静态导入的 mqtt 创建连接(核心修复点) client = mqtt.connect(MQTT_CONFIG.host, MQTT_CONFIG.options) // 连接成功 client.on('connect', () => { ElMessage.success('MQTT 连接成功') // 订阅指定主题 const subscribeOptions: IClientSubscribeOptions = { qos: 0 } client?.subscribe(MQTT_CONFIG.topic, subscribeOptions, (err) => { if (err) { ElMessage.error(`订阅主题失败:${err.message}`) } else { ElMessage.info(`已订阅主题:${MQTT_CONFIG.topic}`) } }) }) // 接收消息 client.on('message', (topic: string, payload: Buffer) => { if (topic === MQTT_CONFIG.topic) { try { const messageStr = payload.toString() const messageObj = JSON.parse(messageStr) as Record // 调用回调函数,将消息传递给组件 messageCallback?.({ topic, message: messageObj }) } catch (parseErr) { ElMessage.error(`消息解析失败:${(parseErr as Error).message}`) // 解析失败时直接返回字符串 messageCallback?.({ topic, message: { raw: payload.toString() } }) } } }) // 连接断开 client.on('close', () => { ElMessage.warning('MQTT 连接已断开') }) // 连接错误 client.on('error', (err: Error) => { ElMessage.error(`MQTT 连接错误:${err.message}`) client?.end() }) } catch (err) { const error = err as Error ElMessage.error(`MQTT 初始化失败:${error.message}`) } } /** * 断开 MQTT 连接 */ export const disconnectMqtt = (): void => { if (client) { client.end() client = null ElMessage.info('MQTT 已断开连接') } } /** * 获取当前 MQTT 连接状态 */ export const getMqttStatus = (): boolean => { return !!client?.connected }