www.vue 1.8 KB

123456789101112131415161718192021222324
  1. export default { data() { return { clientId: "", mqttClientData: null,
  2. mqttMessageBound: false, // 确保 message 事件只绑定一次 }; }, onLoad(options) {
  3. const devItem = JSON.parse(options.devItem); this.clientId =
  4. uni.getStorageSync("clientIDetail") || devItem.clientId; // 获取全局 MQTT 客户端
  5. this.mqttClientData = this.$mqttClientData; // 如果还没创建或者未连接,等待连接
  6. ready if (!this.mqttClientData || !this.mqttClientData.mqttDataConnected) {
  7. uni.$once("mqttData-ready", (mqtt) => { this.mqttClientData = mqtt;
  8. this.subscribeMqttData(); }); } else { this.subscribeMqttData(); } }, methods: {
  9. subscribeMqttData() { const mqtt = this.mqttClientData; if (!mqtt) return; //
  10. 只绑定一次 message 回调 if (!this.mqttMessageBound) { mqtt.on("message", (topic,
  11. message) => { console.log("收到消息:", topic, message.toString()); const
  12. dataMatch = topic.match(/^\/dev\/(.+)\/tracker_targets$/); const cmdMatch =
  13. topic.match(/^\/mps\/wx_(.+)\/notice$/); if (dataMatch && dataMatch[1] ===
  14. this.clientId) { this.handleMessage(topic, message, this.clientId); } else if
  15. (cmdMatch) { this.$refs.alarmModel?.hanOtherMessage?.(topic, message); } });
  16. this.mqttMessageBound = true; } // 如果已连接,立即订阅 if
  17. (mqtt.mqttDataConnected) { mqtt.subscribeTopic(this.clientId); } else { //
  18. 未连接时监听 connect 再订阅 mqtt.on("connect", () => { console.log("DATA MQTT
  19. 连接成功,订阅 topic"); mqtt.subscribeTopic(this.clientId); }); } }, },
  20. onUnload() { // 页面卸载取消订阅 if (this.mqttClientData) {
  21. this.mqttClientData.unsubscribe(`/dev/${this.clientId}/tracker_targets`, (err)
  22. => { if (err) console.error("取消订阅失败", err); else
  23. console.log(`取消订阅成功: /dev/${this.clientId}/tracker_targets`); }); }
  24. this.mqttMessageBound = false; }, };