Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息

摘要: 本文将介绍如何构建一个基于Zigbee和微信小程序的智能家居网关,实现对家居传感器数据的采集、汇总和展示。用户可通过微信小程序实时查看家中温湿度、光照等环境数据,为智能家居系统提供数据支撑。

关键词: Zigbee,网关,微信小程序,传感器,智能家居,物联网

一、系统架构

本系统采用星型网络拓扑,由Zigbee网关、Zigbee传感器节点和微信小程序客户端三部分构成:

  • Zigbee传感器节点: 负责采集环境数据 (例如温湿度、光照等),并将数据发送至Zigbee网关。
  • Zigbee网关: 作为网络中心节点,负责接收、解析和汇总来自各个传感器节点的数据,并通过MQTT协议将数据上传至云端服务器。
  • 微信小程序客户端: 用户通过微信小程序连接云端服务器,实时查看传感器数据,实现对家居环境的远程监控。

二、硬件平台

  • Zigbee 模块: CC2530、CC2652 等
  • 微控制器: STM32、ESP32 等
  • 传感器: DHT11 温湿度传感器、BH1750 光照传感器等

三、软件设计

3.1 Zigbee传感器节点
  • 初始化 Zigbee 协议栈: 配置节点为终端设备 (End Device) 角色。
  • 采集传感器数据: 周期性读取传感器数据。
  • 发送数据至网关: 使用 Zigbee 点对点通信将数据发送至网关节点。

代码示例 (以Z-Stack为例):

// 定义数据结构
typedef struct {
  uint16 temp;
  uint16 humidity;
  uint16 light;
} SensorData;

// 发送传感器数据
void sendSensorData(SensorData* data) {
  AF_DataRequest(
    &gatewayAddr, // 网关短地址
    &sensorEp, // 传感器端点
    ZIGBEE_CLUSTER, // 集群ID
    sizeof(SensorData),
    (uint8 *)data,
    &transID, // 事务ID
    AF_DISCV_ROUTE,
    AF_DEFAULT_RADIUS
  );
}

// 主函数
void main() {
  // 初始化 Zigbee 协议栈
  // ...

  // 初始化传感器
  // ...

  while(1) {
    // 采集传感器数据
    SensorData data;
    data.temp = readTemperature();
    data.humidity = readHumidity();
    data.light = readLight();

    // 发送数据至网关
    sendSensorData(&data);

    // 休眠一段时间
    // ...
  }
}

 

3.2 Zigbee 网关
  • 初始化 Zigbee 协议栈: 配置节点为协调器 (Coordinator) 角色,允许其他 Zigbee 设备加入网络。
  • 接收传感器数据: 持续监听来自已加入网络的传感器节点的数据。
  • 解析数据包: 根据预定义的数据格式,从接收到的数据包中提取传感器类型和数值信息。
  • 连接 MQTT 服务器: 使用 MQTT 客户端库,建立与云端 MQTT 服务器的连接。
  • 发布 MQTT 消息: 将解析后的传感器数据,按照 MQTT 协议规范,发布到对应的主题,以便微信小程序订阅和接收。

代码示例 (以 Python 为例):

import zigbee
import paho.mqtt.client as mqtt
import json

# 初始化 Zigbee 模块 (假设使用 XBee 模块,使用 Python-XBee 库进行操作)
try:
    import serial
    from digi.xbee.devices import XBeeDevice
    PORT = "COM3"  # 替换为实际端口号
    BAUD_RATE = 9600
    xbee = XBeeDevice(PORT, BAUD_RATE)
    xbee.open()
    print("成功连接到 XBee 模块")
except Exception as e:
    print(f"无法连接到 XBee 模块: {e}")
    exit()

# 连接 MQTT 服务器
MQTT_BROKER = "mqtt.example.com"  # 替换为实际 MQTT 服务器地址
MQTT_PORT = 1883
MQTT_CLIENT_ID = "zigbee_gateway"
MQTT_TOPIC_PREFIX = "home/sensors"

client = mqtt.Client(client_id=MQTT_CLIENT_ID)
try:
    client.connect(MQTT_BROKER, MQTT_PORT)
    print("成功连接到 MQTT 服务器")
except Exception as e:
    print(f"无法连接到 MQTT 服务器: {e}")
    exit()

# 定义回调函数,处理接收到的 Zigbee 数据
def data_receive_callback(xbee_message):
    # 获取发送设备的 64 位地址
    sender_address = str(xbee_message.remote_device.get_64bit_addr())
    # 获取数据
    data = xbee_message.data.decode()
    try:
        # 解析数据,假设数据格式为 JSON
        sensor_data = json.loads(data)
        # 遍历传感器数据并发布到 MQTT
        for sensor_type, value in sensor_data.items():
            mqtt_topic = f"{MQTT_TOPIC_PREFIX}/{sender_address}/{sensor_type}"
            client.publish(mqtt_topic, payload=value, qos=0, retain=False)
            print(f"已发布数据到 MQTT 主题: {mqtt_topic}, 值: {value}")
    except json.JSONDecodeError:
        print(f"收到无效的 JSON 数据: {data}")

# 添加数据接收回调函数
xbee.add_data_received_callback(data_receive_callback)

# 持续监听 Zigbee 数据
print("开始监听 Zigbee 数据...")
while True:
    try:
        pass  # 保持程序运行
    except KeyboardInterrupt:
        break

# 关闭连接
xbee.close()
client.disconnect()
print("程序已退出")
3.3 微信小程序客户端
  • 连接 MQTT 服务器: 使用微信小程序提供的网络 API,建立与云端 MQTT 服务器的连接。
  • 订阅主题: 订阅网关发布数据的 MQTT 主题,实时接收传感器数据更新。
  • 数据展示: 将接收到的传感器数据,以直观友好的方式展示在小程序界面上。

代码示例 (以微信小程序框架为例):

const MQTT_BROKER = "wss://mqtt.example.com:8083/mqtt"; // 替换为实际 MQTT 服务器地址
const MQTT_TOPIC_PREFIX = "home/sensors";

Page({
  data: {
    sensorData: {}  // 用于存储传感器数据的对象
  },

  // 连接 MQTT 服务器
  connectMqtt: function () {
    wx.connectSocket({
      url: MQTT_BROKER,
      success: () => {
        console.log("成功连接到 MQTT 服务器");
        this.onSocketOpen();
      },
      fail: (err) => {
        console.error("连接 MQTT 服务器失败:", err);
      }
    });
  },

  // 监听 WebSocket 连接打开事件
  onSocketOpen: function() {
    wx.onSocketOpen(() => {
      console.log("WebSocket 连接已打开");
      this.subscribeTopics();
    });
  },

  // 订阅主题
  subscribeTopics: function () {
    const topic = `${MQTT_TOPIC_PREFIX}/#`;  // 订阅所有传感器数据
    wx.sendSocketMessage({
      data: JSON.stringify({ action: "subscribe", topic: topic }),
      success: () => {
        console.log(`已订阅主题: ${topic}`);
      },
      fail: (err) => {
        console.error(`订阅主题失败: ${topic}`, err);
      }
    });
  },

  // 监听接收消息事件
  onSocketMessage: function () {
    wx.onSocketMessage((res) => {
      const data = JSON.parse(res.data);
      if (data.topic && data.payload) {
        this.updateSensorData(data.topic, data.payload);
      }
    });
  },

  // 更新传感器数据
  updateSensorData: function (topic, payload) {
    const sensorPath = topic.split('/').slice(2); // 获取传感器地址和类型
    const sensorAddress = sensorPath[0];
    const sensorType = sensorPath[1];
    this.setData({
      [`sensorData.${sensorAddress}.${sensorType}`]: payload
    });
  },

  // 页面加载时触发
  onLoad: function () {
    this.connectMqtt();
    this.onSocketMessage();
  }
});

四、代码详解

4.1 Zigbee 网关代码详解
  1. 初始化 Zigbee 模块: 使用 Python-XBee 库连接到 XBee 模块,并打开串口进行通信。
  2. 连接 MQTT 服务器: 使用 Paho MQTT 客户端库连接到 MQTT 服务器。
  3. data_receive_callback 函数:
    • 接收来自 Zigbee 模块的数据。
    • 从数据包中提取发送设备地址和传感器数据。
    • 解析 JSON 格式的传感器数据。
    • 将传感器数据发布到相应的 MQTT 主题。
  4. 添加数据接收回调函数: 将 data_receive_callback 函数注册为 Zigbee 模块的数据接收回调函数,以便在接收到数据时自动调用。
  5. 持续监听 Zigbee 数据: 使用无限循环保持程序运行,以便持续接收 Zigbee 数据。
4.2 微信小程序代码详解
  1. connectMqtt 函数: 使用 wx.connectSocket API 连接到 MQTT 服务器。
  2. onSocketOpen 函数: 监听 WebSocket 连接打开事件,并在连接成功后调用 subscribeTopics 函数订阅主题。
  3. subscribeTopics 函数: 使用 wx.sendSocketMessage API 发送订阅主题的请求。
  4. onSocketMessage 函数: 监听接收消息事件,解析接收到的 MQTT 消息,并调用 updateSensorData 函数更新页面数据。
  5. updateSensorData 函数: 将接收到的传感器数据更新到 sensorData 对象中,并使用 this.setData 方法更新页面显示。

五、引脚连接

  • Zigbee 模块: 根据所选 Zigbee 模块的型号,将其串口引脚 (TX, RX) 连接到网关设备的对应串口引脚。
  • 传感器: 根据所选传感器的型号,将其数据引脚连接到 Zigbee 传感器节点的对应引脚,并连接 VCC 和 GND 引脚。

六、总结与展望

本文详细介绍了如何构建一个基于 Zigbee 和微信小程序的智能家居网关,实现了对家居传感器数据的采集、汇总和展示。该系统具有以下优势:

  • 低功耗、广覆盖: Zigbee 技术本身具备低功耗和自组网特性,适用于大范围、多节点的智能家居环境。
  • 实时数据监控: 用户可以通过微信小程序实时查看家中温湿度、光照等环境数据,及时了解家居环境变化。
  • 易于扩展: 系统采用模块化设计,方便接入更多类型的传感器和控制设备,满足不断变化的智能家居需求。

未来,可以进一步完善该系统,例如:

  • 增加控制功能: 用户可以通过微信小程序远程控制家电设备,例如开关灯、调节空调温度等。
  • 数据分析与预警: 对传感器数据进行分析,实现异常情况预警,例如温度过高、湿度过低等。
  • 多用户管理: 支持多个用户同时访问和控制智能家居系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/767112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信创测试与性能测试的差别是什么?

信创测试和性能测试在多个方面存在显著的区别。 首先,信创测试是一个更为全面和系统的测试过程,它主要针对信创工程项目中的产品、系统等进行测试和验证,以确保其自主可控和满足性能要求。这包括适配测试、功能测试、性能测试、安全测试、兼…

Spring Boot集成geode快速入门Demo

1.什么是geode? Apache Geode 是一个数据管理平台,可在广泛分布的云架构中提供对数据密集型应用程序的实时、一致的访问。Geode 跨多个进程汇集内存、CPU、网络资源和可选的本地磁盘,以管理应用程序对象和行为。它使用动态复制和数据分区技术…

【postgresql】索引

见的索引类型: B-tree 索引:这是最常用的索引类型,适用于大多数查询。B-tree索引可以高效地处理范围查询。 Hash 索引:适用于等值查询,但不支持范围查询。 GiST 索引:通用搜索树(GiST&#xf…

Django学习第二天

启动项目命令 python manage.py runserver 动态获取当前时间 javascript实现数据动态更新代码 <script>setInterval(function() {var currentTimeElement document.getElementById(current-time);var currentTime new Date();currentTimeElement.textContent Curren…

基于Java废物回收机构管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

基于康养大模型和健康设备平台的智能蓝牙语音合成芯片VTX326

AI健康监护智能体是基于康养大模型和**智能语音芯片技术的健康设备平台&#xff0c;**旨在应对我国日益严峻的老龄化挑战。当前&#xff0c;中国总人口约为14.12亿&#xff0c;其中60周岁及以上老年人口占比19.8%&#xff0c;65周岁及以上老年人口占比14.9%&#xff0c;且老年人…

苹果p12证书最简单最新申请流程

使用uniapp打包&#xff0c;在ios上打正式包需要苹果的p12证书和证书profile文件&#xff0c;点进去uniapp的ios证书申请教程&#xff0c;通篇就是使用mac电脑申请的教程&#xff0c;假如没有mac电脑就无法继续了。 因此&#xff0c;假如没有mac电脑的同志们&#xff0c;可以参…

MATLAB—— 流程语句(1)

一、if elseif else end 语句 例子 x 88; % x表示成绩 if x>90 && x < 100 dj 1; % 等级为1级 elseif x>80 && x < 90 dj 2; % 等级为2级 elseif x>60 && x < 80 dj 3; % 等级为…

第4章 第一个程序

第4章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步&#xff1a;编写汇编程序第二步&#xff1a;对源程序进行编译连接第三步&#xff1a;执行可执行文件中的程序 4.2.源程序 汇编语言中包含两种指令&#xff1a;汇编指令 和 伪指令 汇编指令&#xff1a;有对应机器…

中国国产AI芯片的崛起

一、CUDA的垄断 当讨论半导体行业面临的挑战时&#xff0c;你首先想到的是什么&#xff1f;光刻机&#xff1f;3纳米或者5纳米技术&#xff1f;我们无法生产的完美方形芯片&#xff1f;是的&#xff0c;但也不完全是。 人们经常把半导体芯片归类为硬件产业&#xff0c;但实际上…

C语言----文件操作

1.为什么使用文件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化…

递归(二)—— 初识暴力递归

如何理解暴力递归&#xff1f; 字面意思就是——“暴力的递归”&#xff0c;就是——“别纠结细节&#xff0c;开整&#xff08;递归&#xff09;&#xff01;” 暴力递归就是尝试。即&#xff1a;只要满足递归条件就不断的递归下去&#xff0c;直到达到base case&#xff0c…

力扣习题--哈沙德数

一、前言 本系列主要讲解和分析力扣习题&#xff0c;所以的习题均来自于力扣官网题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 二、哈沙德数 1. 哈沙德数 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&…

LeetCode刷题之HOT100之除自身以外数组的乘积

2024 7/3 今天天气依旧很好&#xff0c;想起来做一题。 1、题目描述 2、算法分析 给定一个数组&#xff0c;要返回初自身以外数组的乘积。咋做呢&#xff1f;是的&#xff0c;我只能想到暴力解法&#xff0c;这不符合时间复杂度O(n)的要求&#xff0c;所以我只能看一下题解了…

零一万物: Yi Model API的使用

一、获取API Key 通过官方网址注册账号并且认证: 零一万物大模型开放平台 创建API Key 二、安装及调用 安装OpenAI SDK ​ 零一万物API 接口兼容 OpenAI 的 Python SDK&#xff0c;只需要简单配置即可使用。 安装 OpenAI SDK。请确保使用的 Python 版本至少为 3.7.1&a…

检索生成(RAG) vs 长文本大模型:实际应用中如何选择?

编者按&#xff1a;大模型的上下文理解能力直接影响到 LLMs 在复杂任务和长对话中的表现。本期内容聚焦于两种主流技术&#xff1a;长上下文(Large Context Windows)和检索增强生成(RAG)。这两种技术各有何优势&#xff1f;在实际应用中&#xff0c;我们又该如何权衡选择&#…

数据质量管理-可访问性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档&#xff0c;当前数据质量评价指标框架中包含6评价指标&#xff0c;在实际的数据治理过程中&#xff0c;存在一个关联性指标。7个指标中存在4个定性指标&#xff0c;3个定量指标&#xff1b; 定性指标&am…

【Windows】draw.io(免费的开源跨平台绘图软件)软件介绍

软件介绍 draw.io 是一款免费且易于使用的在线流程图绘图软件&#xff0c;后来更名为 diagrams.net。它最初作为一个基于 Web 的应用程序提供&#xff0c;支持用户创建各种类型的图表、流程图、网络图、组织结构图、UML 图等。它是完全免费的、强大的、专业的、易于使用的和高…

C++使用Poco库封装一个HTTP客户端类--Query参数

0x00 概述 我们使用Poco库的 Poco::Net::HTMLForm 类可以轻松实现表单数据的提交。 0x01 ApiPost提交表单数据 0x02 HttpClient类 #ifndef HTTPCLIENT_H #define HTTPCLIENT_H#include <string> #include <map> #include <Poco/URI.h> #include <Poco/N…

引领视觉基础模型新纪元! | 微软宣布开源Florence-2

01 模型介绍 &#x1f389;重大突破&#xff01;微软宣布开源Florence-2视觉基础模型&#xff0c;引领AI新纪元&#xff01;&#x1f680; Florence-2这一创新力作&#xff0c;以统一的提示为基础&#xff0c;跨越式地解决了计算机视觉与视觉语言领域的多样任务难题。从字幕生…