°___念旧 2024-07-12 17:20 采纳率: 0%
浏览 4

微信小程序结合阿里云

我是在使用阿里云来读取温度,湿度,光照强度等一系列数据并传到微信小程序制作一个简单的智能家居系统,但阿里云上显示了连接我的微信小程序里却一直没有数据读入。我想问一下这是什么问题,是不是因为我没有用那个按一下开关来订阅消息才没有数据传入的。下面是读取数据的代码,希望有好兄弟能帮我看看。

import mqtt from'../../utils/mqtt.js';
const aliyunOpt = require('../../utils/aliyun/aliyun_connect.js');

let that = null;

Page({
    data:{

      //设置温度,湿度,气体浓度,启用人体感应,光照强度的值
      temperature:"",
      Humidity:"",
      GasConcentration:"",
      DetectEanbled:"",
      LightLux:"",

      client:null,//记录重连的次数
      reconnectCounts:0,//MQTT连接的配置
      options:{
        protocolVersion: 4, //MQTT连接协议版本
        clean: false,
        reconnectPeriod: 1000, //1000毫秒,两次重新连接之间的间隔
        connectTimeout: 30 * 1000, //1000毫秒,两次重新连接之间的间隔
        resubscribe: true, //如果连接断开并重新连接,则会再次自动订阅已订阅的主题(默认true)
        clientId: 'k1kd5ZKyrMS.ESP-01S|securemode=2,signmethod=hmacsha256,timestamp=1720764480573|',
        password: '24cd031694a736ec99feaf1087aebf124945c63b593279d6115bd634430533b6',
        username: 'ESP-01S&k1kd5ZKyrMS',
      },

      aliyunInfo: {
        productKey: 'k1kd5ZKyrMS', //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
        deviceName: 'WeChat', //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
        deviceSecret: '28536b57e968e94f175785cca0cec640', //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
        regionId: 'cn-shanghai', //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
        pubTopic: '/k1kd5ZKyrMS/WeChat/user/WeChat', //发布消息的主题
        subTopic: '/k1kd5ZKyrMS/ESP-01S/user/ESP01S', //订阅消息的主题
      },
    },

  onLoad:function(){
    that = this;
    let clientOpt = aliyunOpt.getAliyunIotMqttClient({
      productKey: that.data.aliyunInfo.productKey,
      deviceName: that.data.aliyunInfo.deviceName,
      deviceSecret: that.data.aliyunInfo.deviceSecret,
      regionId: that.data.aliyunInfo.regionId,
      port: that.data.aliyunInfo.port,
    });

    console.log("get data:" + JSON.stringify(clientOpt));
    let host = 'wxs://' + clientOpt.host;
    
    this.setData({
      'options.clientId': clientOpt.clientId,
      'options.password': clientOpt.password,
      'options.username': clientOpt.username,
    })
    console.log("this.data.options host:" + host);
    console.log("this.data.options data:" + JSON.stringify(this.data.options));

    //访问服务器
    this.data.client = mqtt.connect(host, this.data.options);

    this.data.client.on('connect', function (connack) {
      wx.showToast({
        title: '连接成功'
      })
      console.log("连接成功");
    })

    //接收消息监听
    that.data.client.on("message", function (topic, payload) {
      //message是一个16进制的字节流
      let dataFromALY = {};
      try {
        dataFromALY = JSON.parse(payload);
        console.log(dataFromALY);
       that.setData({
        //转换成JSON格式的数据进行读取
        temperature:dataFromALY.temperature,
        Humidity:dataFromALY.H,
        GasConcentration:dataFromALY.GasConcentration,
        DetectEanbled:dataFromALY.DetectEanbled,
        LightLux:dataFromALY.LightLux,
      })
      } catch (error) {
        console.log(error);
      }
    })

    //服务器连接异常的回调
    that.data.client.on("error", function (error) {
      console.log(" 服务器 error 的回调" + error)

    })
    //服务器重连连接异常的回调
    that.data.client.on("reconnect", function () {
      console.log(" 服务器 reconnect的回调")

    })
    //服务器连接异常的回调
    that.data.client.on("offline", function (errr) {
      console.log(" 服务器offline的回调")
    })
  },
  
  onClickOpen() {
    that.sendCommond(1);
  },
  onClickOff() {
    that.sendCommond(0);
  },
  sendCommond(data) {
    let sendData = {
      temperature:data,
      Humidity:data,
      GasConcentration:data,
      DetectEanbled:data,
      LightLux:data,
    };

//此函数是订阅的函数,因为放在访问服务器的函数后面没法成功订阅topic,因此把他放在这个确保订阅topic的时候已成功连接服务器
//订阅消息函数,订阅一次即可 如果云端没有订阅的话,需要取消注释,等待成功连接服务器之后,在随便点击(开灯)或(关灯)就可以订阅函数
   /* this.data.client.subscribe(this.data.aliyunInfo.subTopic,function(err){
      if(!err){
        console.log("订阅成功");
      };
      wx.showModal({
        content: "订阅成功",
        showCancel: false,
      })
    })  */
    

    //发布消息
    if (this.data.client && this.data.client.connected) {
      this.data.client.publish(this.data.aliyunInfo.pubTopic, JSON.stringify(sendData));
      console.log(this.data.aliyunInfo.pubTopic)
      console.log(JSON.stringify(sendData))
    } else {
      wx.showToast({
        title: '请先连接服务器',
        icon: 'none',
        duration: 2000
      })
    }
  }
})

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-12 17:20
    关注

    引自免费微信小程序:皆我百晓生

    理解你的问题和需求,你正在尝试将阿里云中的数据读取并传输到微信小程序中构建一个智能家居系统,但遇到了数据无法成功传输的问题。这个问题可能涉及到多个方面,包括阿里云的设置、微信小程序的代码实现以及两者之间的连接。下面我会从这几个方面进行分析并提供可能的解决方案。

    首先,关于是否需要“按一下开关来订阅消息”,这取决于你的具体实现方式。如果你在微信小程序中设置了消息订阅的逻辑,并且用户已经成功订阅了消息,那么理论上应该能够接收到来自阿里云的数据。但如果未设置订阅逻辑或用户未进行订阅,确实可能导致无法接收数据。

    接下来,我们来分析可能存在的其他问题和解决方案:

    1. 阿里云设置:

      • 确保你的阿里云账户已经正确配置了数据读取的权限和访问控制策略。
      • 检查是否成功建立了从阿里云到微信小程序的API调用通道。
      • 确认数据是否正在被正确生成并存储在阿里云的服务中。
    2. 微信小程序代码实现:

      • 检查微信小程序的代码是否正确实现了与阿里云的数据交互逻辑。例如,使用合适的API接口进行数据读取和传输。
      • 确保微信小程序的网络请求权限设置正确,以便能够访问阿里云的数据。
      • 在小程序界面上正确显示了接收到的数据,并进行相应处理。
    3. 连接问题:

      • 如果你的微信小程序与阿里云之间的连接是通过网络请求实现的,确保网络连接稳定且没有防火墙或其他网络策略阻止数据传输。
      • 检查是否有任何错误日志或提示信息,这有助于定位问题所在。

    为了更好地帮助你解决问题,你可以按照以下步骤进行排查:

    步骤1:检查阿里云的设置,确保你有正确的访问权限和数据存储状态。 步骤2:检查微信小程序的代码实现,确保网络请求和数据处理逻辑正确。 步骤3:测试网络连接和API调用是否正常工作。 步骤4:查看是否有任何错误日志或提示信息,以便进一步定位问题所在。 步骤5:如果问题仍然存在,考虑寻求专业的技术支持或查阅相关文档和社区论坛以获取更多帮助。另外,你也可以尝试简化你的代码和功能,分步实现和测试每个部分的功能,以便更容易定位问题所在。如果你需要具体的代码示例或模拟图来帮助你更好地理解或解决问题,请提供更多具体信息,我会尽力提供帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月12日
  • 创建了问题 7月12日

悬赏问题

  • ¥20 为什么安装CSiBridge时出现了这个问题,尝试了很多方法都不行,求详细操作步骤?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术