Yuworm 2024-05-26 21:14 采纳率: 20%
浏览 26
已结题

uniapp连接阿里云无法发布消息和订阅

1.uniapp(APP)通过mqtt连接到了阿里云,但是无法发布消息,需要解决发布消息的问题。
2.我并不知道如何订阅topic,也请说说如何在uniapp中,订阅阿里云上的topic。
我的代码如下:

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

var client                          
let mqttConnected = false  //mqtt连接状态,这个可以不要,直接查询client.connected即可
const publishTopic = '/k1bup6fRrSA/ESP8266_Yuworm/user/update'  //发布Topic
const MQTT_IP = 'iot-06z00cg5uyb7vtn.mqtt.iothub.aliyuncs.com' //mqtt地址端口
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 tes(){
    console.log("test")
}

//创建客户端连接
export function mqttConnect() {
    // #ifdef H5
    client = mqtt.connect('wss://' + MQTT_IP + ':443/mqtt', MQTT_OPTIONS,function(err){
        console.log(err)
    })
    // #endif
    // #ifdef MP-WEIXIN||APP-PLUS
    client = mqtt.connect('wxs://' + MQTT_IP + ':443/mqtt', 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('客户端下线')
    })
}
//发布消息
export function mqttPublish(msg){
    if(mqttConnected){
        console.log('mqttConnected',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
    }
    
}


  • 写回答

23条回答 默认 最新

  • 专家-吕布[在线] 2024-05-26 22:07
    关注
    获得7.50元问题酬金

    该回答引用自当下最先进的AI大模型ChatGPT 4o进行答疑,若有帮助,还请题主采纳。


    要解决你在使用 uni-app 通过 MQTT 连接阿里云物联网平台时遇到的发布消息和订阅主题的问题,可以参考以下步骤:

    发布消息问题
    1.确保连接成功:首先确保 MQTT 客户端连接成功。你的代码中使用了 mqttConnected 来判断连接状态,可以通过 client.connected 属性来代替。

    2. 检查 topic 和 msg 的正确性:确保你发布的 topic 和消息格式正确。阿里云的 topic 有严格的命名规则,确保你的 publishTopic 符合这些规则。

    3. 错误处理:在 publish 方法中添加错误处理,确保捕捉到任何可能的错误。

    订阅主题
    你可以使用 client.subscribe 方法来订阅主题。在成功连接后立即订阅主题,并在 message 事件中处理接收到的消息。

    以下是改进后的代码:

    import mqtt from 'mqtt/dist/mqtt.js' // 引入mqtt依赖
    
    var client
    const publishTopic = '/k1bup6fRrSA/ESP8266_Yuworm/user/update' // 发布Topic
    const subscribeTopic = '/k1bup6fRrSA/ESP8266_Yuworm/user/get' // 订阅Topic
    const MQTT_IP = 'iot-06z00cg5uyb7vtn.mqtt.iothub.aliyuncs.com' // mqtt地址端口
    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/mqtt', MQTT_OPTIONS)
        // #endif
        // #ifdef MP-WEIXIN||APP-PLUS
        client = mqtt.connect('wxs://' + MQTT_IP + ':443/mqtt', MQTT_OPTIONS)
        // #endif
    
        client.on('connect', function() {
            console.log('连接成功')
            // 连接成功后立即订阅主题
            client.subscribe(subscribeTopic, { qos: 1 }, (err) => {
                if (err) {
                    console.error('订阅失败:', err)
                } else {
                    console.log('订阅成功:', subscribeTopic)
                }
            })
        }).on('reconnect', function(error) {
            console.log('正在重连...', error)
        }).on('error', function(error) {
            console.log('连接失败...', error)
        }).on('end', function() {
            console.log('连接断开')
        }).on('close', function() {
            console.log('连接关闭')
        }).on('offline', function() {
            console.log('客户端下线')
        }).on('message', function(topic, message) {
            console.log('收到消息:', topic, message.toString())
            // 在此处理接收到的消息
        })
    }
    
    // 发布消息
    export function mqttPublish(msg) {
        if (client.connected) {
            client.publish(publishTopic, msg, { qos: 1, retain: false }, (err) => {
                if (err) {
                    console.error('消息发布失败:', err)
                } else {
                    console.log('消息发布成功:', msg)
                }
            })
        } else {
            uni.showToast({
                title: 'MQTT服务器未连接',
                icon: 'none'
            })
        }
    }
    
    // 断开连接
    export function mqttDisconnect() {
        if (client.connected) {
            client.end(true, () => {
                console.log('连接已断开')
            })
        }
    }
    
    
    

    代码说明
    1. 连接成功后订阅主题:在 client.on('connect') 中添加了订阅主题的代码,确保连接成功后立即订阅所需的主题。

    2. 消息处理:在 client.on('message') 中处理接收到的消息,打印出接收到的 topic 和消息内容。

    3. 错误处理:在 publish 方法中添加了错误处理,确保捕捉到任何可能的错误。

    确保你的 MQTT broker 配置和权限设置正确,topic 命名符合阿里云的规范。这样应该可以解决你发布消息和订阅主题的问题。如果还有其他问题,可以进一步提供更多的调试信息。

    评论

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 赞助了问题酬金15元 5月26日
  • 创建了问题 5月26日

悬赏问题

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