学习记录:基于Z-Stack 3.0.1的Zigbee智能插座实现

引言

本文记录了笔者基于Z-Stack 3.0.1协议栈,通过学习Zigbee通信协议,实现一个简单的智能插座控制过程。通过这个过程,笔者对Zigbee网络的形成、设备间的通信以及低功耗设计有了更深入的理解。

工程代码链接:
链接:https://pan.baidu.com/s/1J58LBN3H_sZg5ZD6UY6t7A?pwd=zwha 
提取码:zwha

这里推荐一个学习zigbee 3.0的网址:

其中笔者也是在这个地方学习的zigbee相关知识

Zigbee 3.0 开发指南

一、前期准备

1.1 下载与安装

首先,从官方渠道下载Z-Stack 3.0.1协议栈,并进行安装。Z-Stack是TI公司提供的Zigbee协议栈,它包含了构建Zigbee网络所需的所有基础组件和示例代码。

1.2 学习基础

在学习实现智能插座之前,笔者已经对Zigbee的基础知识有了一定的了解,包括网络拓扑结构、设备类型(协调器、路由器、终端)以及ZCL(Zigbee Cluster Library)等。特别是ZCL,它是Zigbee设备间通信的标准语言,通过发送和接收ZCL命令,可以实现设备间的控制和数据交换。

二、实现过程

2.1 打开示例工程

在Z-Stack 3.0.1中,提供了多个示例工程,本文选择GenericApp作为起点。这个示例工程展示了如何使用Zigbee协议进行基本的设备通信。

2.2 初始化与网络形成

协调器是Zigbee网络的中心节点,负责创建和管理网络。在zclGenericApp_Init函数中,通过宏定义ZDO_COORDINATOR来区分协调器和其他设备(路由器或终端)。协调器的初始化过程包括注册ZDO消息、启动网络形成过程以及允许设备加入网络。

1.在APP组  ->  zcl_genericapp.c  ->   void zclGenericApp_Init( byte task_id )的末尾添加

#ifdef ZDO_COORDINATOR

  ZDO_RegisterForZDOMsg ( zclGenericApp_TaskID, Device_annce );
  
  bdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_FORMATION |
                          BDB_COMMISSIONING_MODE_FINDING_BINDING );

  NLME_PermitJoiningRequest(255);
#else
  bdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_STEERING |
                          BDB_COMMISSIONING_MODE_FINDING_BINDING );
  
  zclGenericapp_DeviceAnnce();
#endif

2.3 网络加入状态处理

在路由器或终端中,需要处理网络加入的状态。如果加入成功,则加快LED闪烁频率;如果加入失败,则减慢LED闪烁频率,并尝试重新加入网络。

需要定义,初始化500ms:

static uint16 zclGenericapp_ONOFF_TEST_PERIOD = 500;

在这里初始化了一个任务:在void zclGenericApp_Init( byte task_id )

osal_start_timerEx( zclGenericApp_TaskID, GENERICAPP_EVT_1, zclGenericapp_ONOFF_TEST_PERIOD );

uint16 zclGenericApp_event_loop( uint8 task_id, uint16 events )

  if ( events & GENERICAPP_EVT_1 )
  {
    // toggle LED 2 state, start another timer for 500ms
    HalLedSet ( HAL_LED_2, HAL_LED_MODE_TOGGLE );
    osal_start_timerEx( zclGenericApp_TaskID, GENERICAPP_EVT_1, zclGenericapp_ONOFF_TEST_PERIOD );
    
    return ( events ^ GENERICAPP_EVT_1 );
  }

2.4 设备发现与通信

2.4.1 设备广播

路由器或终端在加入网络后,会通过ZDP_DeviceAnnce函数广播自己的设备信息,包括网络地址、物理地址等。协调器接收到这些信息后,会保存设备的网络地址,以便后续通信。

    static void zclGenericapp_DeviceAnnce( void )
    {    
        ZDP_DeviceAnnce(
            NLME_GetShortAddr(),//获取本设备的网络地址(短地址)
            NLME_GetExtAddr(),//获取本设备的物理地址(通常就是MAC地址)
            ZDO_Config_Node_Descriptor.CapabilityFlags,//暂不展开简介,可忽略
            0//暂不展开讲解,可忽略
         );    
    }
2.4.2 协调器处理设备广播

协调器在接收到设备广播后,会自动调用zclGenericapp_processZDOMgs函数处理这些信息,并保存设备的网络地址。

这里的zclGenericapp_processZDOMgs函数需要在zclGenericApp_event_loop函数中调用:

    #ifdef ZDO_COORDINATOR
       case ZDO_CB_MSG:
          zclGenericapp_processZDOMgs( (zdoIncomingMsg_t *)MSGpkt );
          break; 
    #endif 
    static void zclGenericapp_processZDOMgs(zdoIncomingMsg_t *pMsg)
    {
      switch ( pMsg->clusterID )
      {
        case Device_annce:
        {
          zclGenericapp_OnOffTestAddr = pMsg->srcAddr.addr.shortAddr;
          zclGenericapp_ONOFF_TEST_PERIOD = 200;
        }
            break;

        default:
            break;
      }
    }
2.4.3 绑定命令回调

路由器或终端在初始化时,会绑定一系列ZCL命令的回调函数。当接收到相应的命令时,会调用对应的回调函数进行处理。例如,接收到开关命令时,会调用zclGenericapp_OnOffCB函数控制LED的开关。

在zclGenericApp_Init函数初始化:

#ifdef ZDO_COORDINATOR
  NULL,
#else
  zclGenericapp_OnOffCB,    // On/Off cluster commands
#endif

这里需要绑定函数,接收到开关命令时,会调用zclGenericapp_OnOffCB函数控制插座的开关。

 static void zclGenericapp_OnOffCB( uint8 cmd )
    {
        if(cmd == COMMAND_ON) // 命令为ON时  
        {               
            HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);  // 开启所有LED  
        }    
        else if(cmd == COMMAND_OFF) // 命令为OFF时  
        {    
           HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF);  // 关闭所有LED  
        }    
    }

2.5 发送与控制

协调器通过zclGenericapp_OnOffTest函数发送开关命令给路由器或终端。这个函数会根据当前状态发送开或关的命令,并切换状态。

在这里是通过按键来出发这个函数的

 static void zclGenericapp_OnOffTest(void)
    {
        afAddrType_t destAddr;
        static uint8 txID = 0;
        static bool  on   = true;
        
        destAddr.endPoint = GENERICAPP_ENDPOINT;
        destAddr.addrMode = Addr16Bit;
        destAddr.addr.shortAddr = zclGenericapp_OnOffTestAddr;
        
        if(on)
        {
          zclGeneral_SendOnOff_CmdOn(GENERICAPP_ENDPOINT, &destAddr, TRUE, txID++);
        }
        else
        {
          zclGeneral_SendOnOff_CmdOff(GENERICAPP_ENDPOINT, &destAddr, TRUE, txID++);
        }
        
        on = !on;
    }

2.6 按键控制

在协调器的代码中,通过按键来控制发送开关命令。当按下指定按键时,会调用zclGenericapp_OnOffTest函数发送命令。

static void zclGenericApp_HandleKeys( byte shift, byte keys )
{

  if ( keys & HAL_KEY_SW_6 )
  {
    #ifdef ZDO_COORDINATOR
        zclGenericapp_OnOffTest();
    #else
    #endif
        
    HalLedSet(HAL_LED_1, HAL_LED_MODE_TOGGLE);
  }
}

2.7 开启宏设置

在路由器或者终端设备编写代码时,为了确保代码正确运行,使用“开关命令收发”时需要开启对应的宏开关

ZCL_ON_OFF

三、问题与思考

3.1 网络重连问题

目前,如果协调器与路由器或终端断开连接,需要复位设备才能重新连接。这在实际应用中是不方便的。未来可以考虑实现更健壮的网络重连机制,如定时尝试重连、保存网络配置等。

3.2 命令确认与反馈

目前,协调器发送命令后,没有收到路由器或终端的确认反馈。这可能导致命令丢失或执行失败而不知情。未来可以实现命令确认机制,确保命令的可靠传输和执行。

3.3 低功耗设计

Zigbee设备的一个重要特点是低功耗。目前,本实现还没有进行低功耗设计。未来可以通过优化代码、使用低功耗硬件、设置休眠模式等方式来降低设备功耗。

3.4 工程裁剪与优化

Z-Stack 3.0.1协议栈包含了大量的功能和示例代码,对于特定的应用来说,可能有很多不需要的部分。未来可以根据实际需求对工程进行裁剪和优化,去除不需要的功能和代码,减少资源占用和功耗。

四、总结与展望

通过本次学习实践,笔者成功实现了基于Z-Stack 3.0.1的Zigbee智能插座控制。这个过程不仅加深了对Zigbee协议的理解,还提高了编程实践和问题解决的能力。未来,笔者将继续深入探索Zigbee技术的更多应用场景和优化方法,为物联网技术的发展贡献自己的力量。

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

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

相关文章

Python Matplotlib 如何处理大数据集的绘制,提高绘图效率

Python Matplotlib 如何处理大数据集的绘制,提高绘图效率 在数据分析和可视化的过程中,处理大数据集常常是我们面临的挑战。绘制大数据集不仅需要时间和计算资源,还可能导致图形显示不流畅,甚至崩溃。Matplotlib 是 Python 中一个…

2016-2020年全国保护性耕作/常规耕作农田分类数据集

2016-2020年全国保护性耕作/常规耕作农田分类数据集 数据介绍 基于Sentinel-2遥感产品,使用来自文献调研和目视解译产生的保护性/常规耕作样本点,通过交叉验证方法训练随机森林分类器,生成了2016-2020年全国保护性耕作/常规耕作农田分类数据…

VMware系统镜像推荐网站

今天准备找一个Mac系统的镜像,在网上搜大部分都是广告,有的还做的很隐蔽,不点进去都无法确定,非常麻烦,不如多花点时间自己整理一个使用的网站。 如果有更优推荐,请在评论中说明,我会及时更新并…

国标GB28181-2022平台EasyGBS国标GB28181软件:GB/T28181-2022解读、应用和技术实现

随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一变革中,国标GB28181-2022平台EasyGBS作为一款基于GB28181标准的视频监控集成与管理平台,凭借其卓越的性能、高度的灵活性和用户友好的设计&#…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中,ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案,赢得了全球用户的青睐。随着 8.2 版本的发布,ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF:团队合…

什么是人工智能学习框架?——人工智能技术科普指南

随着人工智能(AI)的快速发展,AI应用已经广泛覆盖到我们的日常生活中:从智能推荐系统到语音助手,再到自动驾驶技术。然而,很多人并不清楚人工智能模型是如何构建的。要理解这一点,首先得了解人工…

基于Spring Boot的高校物品捐赠管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息处理的作用&a…

部署istio应用未能产生Envoy sidecar代理

1. 问题描述及原因分析 在部署Prometheus、Grafana、Zipkin、Kiali监控度量Istio的第2.2章节,部署nginx应用,创建的pod并没有产生Envoy sidecar代理,仅有一个应用容器运行中 故在随后的prometheus中也没有产生指标istio_requests_total。通…

跨越科技与文化的桥梁——ROSCon China 2024 即将盛大开幕

在全球机器人技术飞速发展的浪潮中,ROS(Robot Operating System)作为一款开源的机器人操作系统,已成为无数开发者、研究人员和企业的首选工具。为了进一步推动ROS的应用与发展,全球知名的机器人操作系统会议——ROSCon…

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件: 1. Deployment:跑起来N个pod;指定NVIDIA官方的triton&trt-llm的docker image,指定好model放在哪个…

AJAX学习笔记总结

目录 AJAX简介 XML简介 AJAX的特点 AJAX的优点 AJAX的缺点 服务端框架 GET请求 绑定事件步骤: 需求案例 body代码 POST请求 跨域 同源策略 如何解决跨域 JSONP JSONP是什么? JSONP怎么工作的 JSONP的使用 CORS CORS是什么&#xff1…

谷粒商城のsentinelzipkin

文章目录 前言一、Sentinel1、什么是Sentinel2、项目配置3、使用案例3.1、流控3.2、降级3.3、黑白名单设置 二、Zipkin1、什么是Zipkin2、项目配置3、整合案例 前言 本篇介绍Spring Cloud Ali的sentinel组件,用于对微服务的熔断降级,以及链路追踪zipkin的…

25国考照片处理器使用流程图解❗

1、打开“国家公务员局”网站,进入2025公务员专题,找到考生考务入口 2、点击下载地址 3、这几个下载链接都可以 4、下载压缩包 5、解压后先看“使用说明”,再找到“照片处理工具”双击。 6、双击后会进入这样的界面,点击&…

UE5.4 PCG Layered Biomes插件

B站学习链接 官方文档 一、PCGSpawn Preset:负责管理PCG要用到的植被资产有哪些 二、BiomesSettings:设置要使用的植被资产Layer、Spawn参数 1.高度Layer参数: 2.地形Layer:我这里用地形样条线绘制了一块地形Layer 绘制点和…

vrrp和mstp,vrrp和byd

vrrp和mstp 思路 vrrp是用来虚拟网关,噢,是虚拟一条虚拟网关 优先级,priority越大越优先,优先级相同,哪个的路由器的vrrp先起来,谁就是主 mstp是快速生成树协议,防止环路用的 优先级越小越优…

pycharm设定代码模板

1、在文件点击设置 ​​​​​​​ ​​​​​​​ 2、点击编辑器--实时模板--找到需要插入模板的位置如我要插入HTML的模板---选择--点击实时模板 3、如图: 4、添加模板内容,如果模板有变量可以在编辑变量处点击编辑 5、编辑变量 6、点…

什么是红客?红客入门基础(非常详细)零基础入门到精通,收藏这篇就够了

什么是红客: 提到红客,我们不得不想到2001年中美黑客大战,红客联盟等这些词汇。曾几何时这个群体给尚且稚嫩的国内安全环境带来了一枚种子,从此网络安全在这片土地开始发芽。不知道有多少人是受到红客的影响走上了安全这条路&…

从新手到专家:7款电脑平面设计软件评测

平面设计在时尚、广告等多个领域扮演着重要角色,而创作出独特且富有创意的设计作品则需要依赖优秀的电脑平面设计软件。市场上的电脑平面设计软件众多,每款软件都有其独到之处。本文将为你推荐几款值得关注的电脑平面设计软件,并分析它们的特…

文献翻译如何一键完成?推荐2024年11款翻译软件

学英语的时候,好多人都觉得语法太复杂,单词太多记不住。不过,现在科技这么发达,有很多在线的中英文翻译工具,就像我们学外语的好帮手,帮我们轻松搞定语言问题,让我们在中文和英文之间自由切换。…

Grafana+Prometheus监控篇-Nginx

一、监控exporter安装 ①、下载地址 nginx-exporter 这里是Windows下监控,选择amd64. ②、nginx-exporter配置 打开nginx的配置文件nginx.conf,启用nginx的基本状态. server {listen 8088;location /status {stub_status;allow 127.0.0.1; deny all;}} ③…