Yuworm 2024-05-27 12:02 采纳率: 20%
浏览 19
已结题

mqtt.js在接收到数据后,如何将数据实时更新到vue界面上的data中

在uniapp中,mqtt.js在接收到数据后,如何将数据实时更新到vue界面上的data中,以实现数据动态更新?
以下是mqtt.js部分的代码

import mqtt from 'mqtt/dist/mqtt.js' //引入mqtt依赖

export var client            
export var monitoredValue 
let mqttConnected = false  //mqtt连接状态,这个可以不要,直接查询client.connected即可
const publishTopic = '/k1bup6fRrSA/uni-app/user/update'  //发布Topic
const MQTT_IP = 'iot-06z00cg5uyb7vtn.mqtt.iothub.aliyuncs.com' //mqtt地址端口
const subscribeTopic = '/k1bup6fRrSA/uni-app/user/get'
const MQTT_OPTIONS = {
    connectTimeout: 5000,      //连接超时时间
    clientId: 'k1bup6fRrSA.uni-app|securemode=2,signmethod=hmacsha256,timestamp=1716717442073|',  //clientId不能重复,这里可以随机生成
    username: 'uni-app&k1bup6fRrSA',         //用户名
    password: 'f5965397dd9cee4cba6a851d3db8fb71c264064252cb4237d4045a367d77e7ef',         //密码
    clean: false        
}

//创建客户端连接
export function mqttConnect() {
    // #ifdef H5
    client = mqtt.connect('wss://' + MQTT_IP + ':443/mqqt', MQTT_OPTIONS, function(err){
        console.log(err)
    })
    // #endif
    // #ifdef MP-WEIXIN||APP-PLUS
    client = mqtt.connect('wxs://' + MQTT_IP + ':443/mqqt', MQTT_OPTIONS, function(err){
        console.log(err)
    })
    // #endif

    client.on('connect', function() {
        console.log('连接成功')
        mqttConnected = true
    }).on('reconnect', function(error) {
        console.log('正在重连...', error)
        mqttConnected = false
    }).on('error', function(error) {
        console.log('连接失败...', error)
        mqttConnected = false
    }).on('end', function() {
        console.log('连接断开')
        mqttConnected = false
    }).on('close',function(){
        console.log('连接关闭')
        mqttConnected = false
    }).on('offline',function(){
        console.log('客户端下线')
    }).on('message', function(topic, message) {
        console.log('收到消息:', topic, message.toString())
        monitoredValue = JSON.parse(message)
        console.log(monitoredValue)
        // 在此处理接收到的消息
    })
}
//发布消息
export function mqttPublish(msg){
    if(mqttConnected){
        client.publish(publishTopic,msg,{qos:1,retain:false});//hello mqtt +
        console.log('发布了一条消息',msg)
    }else{
        uni.showToast({
            title: 'MQTT服务器未连接',
            icon: 'none'
        });
    }
}
//断开连接
export function mqttDisconnect(){
    console.log('mqttConnected',mqttConnected)
    console.log('client',client)
    if(mqttConnected){
        client.end(true)
        mqttConnected = false
    }
    
}

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-05-27 12:02
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在uni-app中,要实现mqtt.js接收到数据后实时更新Vue界面上的data,可以通过Vue的响应式数据绑定机制来实现。以下是实现这一功能的基本步骤和示例代码:

    步骤1:在Vue组件中定义响应式数据

    在你的Vue组件中,定义一个响应式数据dataValue,这个数据将与mqtt.js中的monitoredValue同步。

    // 在Vue组件中
    export default {
      data() {
        return {
          dataValue: {} // 初始化为空对象,后续将与monitoredValue同步
        };
      },
      // 其他Vue组件的选项...
    };
    

    步骤2:在mqtt.js中更新Vue组件的数据

    当mqtt.js接收到消息并更新monitoredValue时,你需要将这个值传递给Vue组件的dataValue。这可以通过Vue的事件系统或者Vuex状态管理来实现。

    使用事件总线

    创建一个简单的事件总线来在组件之间传递消息:

    // event-bus.js
    export default new Vue();
    

    在mqtt.js中,更新monitoredValue后,通过事件总线发送一个事件:

    // 在mqtt.js中
    .on('message', function(topic, message) {
      console.log('收到消息:', topic, message.toString());
      monitoredValue = JSON.parse(message);
      console.log(monitoredValue);
      // 发送事件
      EventBus.$emit('updateData', monitoredValue);
    })
    

    在Vue组件中,监听这个事件并更新数据:

    // 在Vue组件中
    export default {
      data() {
        return {
          dataValue: {}
        };
      },
      created() {
        EventBus.$on('updateData', this.updateData);
      },
      methods: {
        updateData(newData) {
          this.dataValue = newData;
        }
      },
      // 其他Vue组件的选项...
    };
    

    使用Vuex

    如果你的应用比较大,或者需要在多个组件之间共享状态,可以使用Vuex来管理状态。

    1. 创建Vuex store,并定义state、getters、mutations等。
    2. 在mqtt.js中,当接收到消息时,提交一个mutation来更新state。
    3. 在Vue组件中,通过computed properties或者watchers来响应state的变化。

    参考资料

    通过上述步骤,你可以实现mqtt.js接收到数据后,将数据实时更新到Vue界面上的data中,以实现数据的动态更新。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月9日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 网络分析设施点无法识别
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决
  • ¥100 基于SVM的信息粒化时序回归预测,有偿求解!
  • ¥15 物体组批优化问题-数学建模求解答
  • ¥15 微信原生小程序tabBar编译报错
  • ¥350 麦克风声源定位坐标不准
  • ¥15 apifox与swagger使用
  • ¥15 egg异步请求返回404的问题