基于Zigbee的SHT10温湿度数据采集系统(已实现控制12个终端节点)——Zigbee协调器主要代码解析

article/2025/8/24 9:24:42

之前实现了基于Zigbee的SHT10温湿度数据采集系统,这里来重新复盘一些主要的知识和代码。

写在前面:

  • 1 功能介绍:使用Zigbee终端节点采集环境的温度和湿度数据,然后将数据无线发送的Zigbee协调器,最后在电脑端显示获得到的数据。
  • 2 我没有让Zigbee终端节点 使用周期定时发送,而是通过电脑端的串口来控制 ,即:当电脑需要数据时,就返回终端节点的数据;不需要时终端节点就不会上传数据。 我这样的做法比较方便,因为选择什么时间上传 和 多久上传一次都可以由自己来决定!
  • 3 我设计的Zigbee协调器和Zigbee终端节点没有采用广播的发送方式,因为我之前要控制12个节点,广播的效果实在不太好,而且对首发时间的要求并不算高,所以我采用“单播轮询”的发送方式。
  • 4关于地址的选择,我没有使用64位的IEEE地址,我用的16位的短地址PANID,当然这些在AF_DataRequest()函数都写得很清楚。
  • 5其余细节在说代码的时候,具体再说。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

下面主要介绍一下,Zigbee协调器的SampleApp.c文件的代码:
首先,我们要配置与电脑通信的串口。
这里别忘了在SampleApp.c头文件引入串口头文件#include “hal_uart.h”,我们的波特率设置为115200.

/*  串口基本定义    */
#define MY_DEFINE_UART_PORT 0     //自定义串口号(0,1);
#define RX_MAX_LENGTH       20    //接收缓冲区最大值: 20个字节;
uint8   RX_BUFFER[RX_MAX_LENGTH]; //接收缓冲区;void UartCallBackFunction(uint8 port , uint8 event); //回调函数声明,定义在最后面;/*   配置串口      */
halUARTCfg_t uartConfig; //定义串口配置结构体变量;
void Uart_Config(void); //函数声明;
void Uart_Config(void)  //函数定义;//结构体的定义函数
{ uartConfig.configured            = TRUE;  //允许配置;uartConfig.baudRate              = HAL_UART_BR_115200;//波特率;uartConfig.flowControl           = FALSE;uartConfig.flowControlThreshold  = 64;   //don't care - see uart driver.uartConfig.rx.maxBufSize         = 128;  //串口接收缓冲区大小uartConfig.tx.maxBufSize         = 128;  //串口发送缓冲区大小uartConfig.idleTimeout           = 6;    //don't care - see uart driver.uartConfig.intEnable             = TRUE; //使能中断uartConfig.callBackFunc          = UartCallBackFunction; //指定回调函数名;
}
  • 下面是我的串口回调函数static void UartCallBackFunction(uint8 port , uint8 event)。
  • 在里面我用osal_set_event自定义了任务事件,SAMPLEAPP_SEND_PERIODIC_MSG_EVT1,即:当接收到的字符为01或者02或者03时,在任务事件处理函数,SampleApp_ProcessEvent里处理相应的事件。
  • 01 控制终端节点1~终端节点4(我试过01,控制6个节点效果也是可以的,很少丢包)
  • 02控制终端节点5~终端节点8
  • 03控制终端节点9~终端节点12
static void UartCallBackFunction(uint8 port , uint8 event)
{uint8 shuang[2]={0,0};uint16 nlen = 0; //接收到字符串大小;if(event !=HAL_UART_TX_EMPTY){nlen = HalUARTRead(0,shuang,2);if(nlen > 0) //有数据存在;{if((shuang[0] ==0x30)&&(shuang[1]==0x31))//01 //1END~4END{        chose=1;x1=1;x2=1;x3=1;x4=1;osal_set_event(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT1);            }else if((shuang[0] ==0x30)&&(shuang[1]==0x32))//02 //4END~8END{chose=2;x5=1;x6=1;x7=1;x8=1;//osal_set_event(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT1);           }else if((shuang[0] ==0x30)&&(shuang[1]==0x33))//03 //9END~12END{chose=3;x9=1;xa=1;xb=1;xc=1;//9~12osal_set_event(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT1);            }}} 
}

下面介绍一下Zigbee协调器的接收消息事件 处理函数SampleApp_MessageMSGCB。

  • 这里有的人会问。为什么你的接收咋就没有short address和endpoint,直接上来就判断clusterId?
  • 因为这个SampleApp_MessageMSGCB( )函数是属于应用层范畴,你的short address和endpoint在NWK层就被解析了我们在APP层就区分一下clusterId就可以了。
  • 接收的数据一共分为两类:其中SAMPLEAPP_P3P1_CLUSTERID是接收1~9号终端节点返回的PANID
  • SAMPLEAPP_P3P2_CLUSTERID是接收10~18号节点返回的PANID.(不是我写错了,因为去年我需要控制18个Zigbee终端节点,当然控制12个这么写也没错)
  • SAMPLEAPP_P2P1_CLUSTERID~SAMPLEAPP_P2PC_CLUSTERID是1到12号Zigbee终端节点返回的SHT10传感器温度和湿度的DATA。
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{switch ( pkt->clusterId ){case SAMPLEAPP_P3P1_CLUSTERID://接受终端  网络ID的镞//ok//1~9{Addrtable[(pkt->cmd.Data[0]*10)+(pkt->cmd.Data[1])]=(((uint16)pkt->cmd.Data[2])<<8)|(((uint16)pkt->cmd.Data[3])&0x00ff);//初始化D2P1SEL&=0Xfd;//1111 1101P1DIR|=0x02;  //P11定义为输出0000 0010P1_1 =0;}break;case SAMPLEAPP_P3P2_CLUSTERID://接受终端  网络ID的镞//ok//10~18{Addrtable[(pkt->cmd.Data[0]*10)+(pkt->cmd.Data[1])]=(((uint16)pkt->cmd.Data[2])<<8)|(((uint16)pkt->cmd.Data[3])&0x00ff);//初始化D2P1SEL&=0Xfd;//1111 1101P1DIR|=0x02;  //P11定义为输出0000 0010P1_1 =0;}break;case SAMPLEAPP_P2P1_CLUSTERID:{if(x1==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x1=0;}}break;case SAMPLEAPP_P2P2_CLUSTERID:{if(x2==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x2=0;}}break;case SAMPLEAPP_P2P3_CLUSTERID:{if(x3==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x3=0;}}break;case SAMPLEAPP_P2P4_CLUSTERID:{if(x4==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x4=0;} }break;case SAMPLEAPP_P2P5_CLUSTERID:{if(x5==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x5=0;}}break;case SAMPLEAPP_P2P6_CLUSTERID:{if(x6==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x6=0;}}break;case SAMPLEAPP_P2P7_CLUSTERID:{if(x7==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x7=0;}}break;case SAMPLEAPP_P2P8_CLUSTERID:{if(x8==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x8=0;}}break;case SAMPLEAPP_P2P9_CLUSTERID:{if(x9==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);x9=0;}}break;case SAMPLEAPP_P2Pa_CLUSTERID://10{if(xa==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);xa=0;}}break;case SAMPLEAPP_P2Pb_CLUSTERID://11{if(xb==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);xb=0;}}break;case SAMPLEAPP_P2Pc_CLUSTERID://12{if(xc==1){HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);xc=0;}}break;}
}

下面介绍一下Zigbee协调器的数据请求函数void SAMPLEAPP_TO_jiedian_shang(uint16 addr)。

  • 在AF_DataRequest里我选择数据发送形式为单播,16位
  • shortAddr的短地址为各个终端节点的PANID。
  • SAMPLEAPP_ENDPOINT为20。
  • SAMPLEAPP_P2P_CLUSTERID为4
    -这个函数的作用就是依次向终端节点发送数据请求,然后终端节点就会返回温湿度的数据
//数据请求函数
void SAMPLEAPP_TO_jiedian_shang(uint16 addr)
{SampleApp_P2P_DstAddr.addr.shortAddr=Addrtable[addr];char theMessageData[]="DATA";if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,SAMPLEAPP_P2P_CLUSTERID,//4(byte)osal_strlen( theMessageData )+1,(byte * )&theMessageData,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){}else{// Error occurred in request to send.}
}

除了SHT10之外,我还加了烟雾传感器,OLED显示屏和一个指示灯,当温度、湿度超过阈值时,指示灯闪烁。后期让好朋友用SolidWorks给Zigbee板子做了一个外壳,看起来更好一看些。
在这里插入图片描述
在这里插入图片描述
下一期,有时间再说一下我程序的Zigbee终端节点相关代码解析。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/MmyBBl1p.shtml

相关文章

ZigBee协调器,ZigBee智能节点盒

新设备下 1.安装CP210xVCPInstaller_x64.exe串口驱动 2.连接USB转串口&#xff0c;RS485转232&#xff0c;蓝色数据线连ZigBee协调器485A&#xff0c;黄色数据线连ZigBee协调器485B&#xff0c;USB口连PC 3.查看COM口 4.打开ZigBeeTool.exe一应用程序 5.选择COM口&#xff0c;…

zigbee基本概念--网络设备类型和PANID

Zigbee 是一种基于802.15.4 物理层协议、支持自组网、多点中继&#xff0c;可实现网状拓扑的复杂的 组网协议&#xff0c;加上其低功耗的特点&#xff0c;使得网络间的设备必须各司其职&#xff0c;有效地协同工作。 Zigbee 网络的设备类型 在Zigbee 网络中&#xff0c;有三种不…

一文带你了解 ZigBee

1、物联网通信协议 常见短距离无线通信协议 物联网通信协议 接入方式-云端协议 支持 TCP/IP 的物联网设备&#xff0c;可以通过 WIFI、蜂窝网络以及以太网&#xff0c;使用 HTTP、MQTT、CoAP、LwM2M 以及 XMPP 等应用层协议协议接入云端。 接入方式-网关协议 网关协议是适用…

大数据产业链包括哪几个环节,具体包含哪些内容

大数据作为继云计算、物联网之后IT行业又一颠覆性的技术&#xff0c;备受关注&#xff0c;要想知道大数据创业方向&#xff0c;一定要知道&#xff0c;大数据产业链包括哪几个环节&#xff0c;具体的包含内容&#xff0c;接下来&#xff0c;为大家一一介绍&#xff1a; IT基础…

不得不说的六个大数据产业园

近年来&#xff0c;随着物联网、云计算的发展&#xff0c;大数据技术也成为了热门词汇。而对于大数据企业的发展&#xff0c;大数据产业园的作用可谓举足轻重。 大数据产业园指大数据产业的聚集区或大数据技术的产业化项目孵化区&#xff0c;简而言之&#xff0c;就是大数据企业…

2021中国大数据产业发展白皮书 附下载

“十三五”时期&#xff0c;我国大数据产业取得了突破性的发展。大数据产业规模持续稳步提升&#xff0c;产业价值不断释放&#xff1b;大数据相关政策陆续出台&#xff0c;产业发展环境日益优化&#xff1b;新型数据中心、5G等大数据相关基础设施部署进程加快&#xff1b;大数…

大数据产业发展状况及企业数据资产化运营核心

用数据说话已经成为所有人的共识&#xff0c;数据也成了堪比石油的战略资源。 “无论是国家、企业还是社会公众&#xff0c;都更直观的感受到了数据的价值。因此&#xff0c;近年来&#xff0c;各地纷纷成立大数据发展组织&#xff0c;企业纷纷推动数据资产化治理&#xff0c;大…

大数据产业发展的国际经验

中国发展大数据产业需要拓展国际视野&#xff0c;借鉴国际经验&#xff0c; 他山之石&#xff0c;可以攻玉。 2012 年被认为是大数据元年。在这一年&#xff0c;美国奥巴马政府推出了《大数据研究和发展计划》&#xff0c;启动了美国国家大数据战略&#xff1b;用户日志管理公司…

“十四五”大数据产业发展锚定3万亿目标

来源&#xff1a;人民数据本文约1100字&#xff0c;建议阅读5分钟 大数据产业迎来更广阔发展空间。 工业和信息化部近日发布的《“十四五”大数据产业发展规划》&#xff08;以下简称《规划》&#xff09;提出&#xff0c;到2025年&#xff0c;我国大数据产业测算规模突破3万亿…

高层次人才需求旺盛!2022年中国大数据产业发展趋势

点击上方 "大数据肌肉猿"关注, 星标一起成长 点击下方链接&#xff0c;进入高质量学习交流群 今日更新| 950个转型案例分享-大数据交流群 1、大数据获重视&#xff0c;产业发展再升级 2015年以来&#xff0c;在国家和各级政府的大力推动下&#xff0c;大数据产业加速…

2021年大数据产业城市发展,前20强出炉!

点击上方 "大数据肌肉猿"关注, 星标一起成长 点击下方链接&#xff0c;进入高质量学习交流群 今日更新| 950个转型案例分享-大数据交流群 来源 | 北京大数据研究院大数据分析技术创新中心 “十三五”期间&#xff0c;我国大数据产业迅猛发展&#xff0c;政策环境日益…

政策推动大数据产业高速发展 2018年市场规模将达180亿

近年来&#xff0c;全球大数据产业不断成熟&#xff0c;各领域大数据应用全面展开&#xff0c;为大数据发展带来强劲动力。数据显示&#xff0c;2016年全球大数据市场规模达到453亿美元&#xff0c;同比增长25.8%。大数据逐渐成为全球IT支出新的增长点。 相对于发达国家而言&am…

你的旧船票能否搭上这艘巨轮?——解读近5年大数据产业发展规划

文|水手 本文出自&#xff1a;知乎专栏《帆软数据应用研究院》——数据干货&资讯集中地&#xff01; 文章导读 一、大数据产业现状和挑战 二、2020年发展目标 三、实现目标的关键举措 四、《规划》对企业的启示 五、《规划》对个人的启示 自2015年党的十八届五中全会提出“…

敲黑板!《大数据产业发展规划(2016-2020年)》要点解读

近年来&#xff0c;随着互联网、云计算、大数据、物联网等新兴技术的飞速发展&#xff0c;全球数据总量出现爆炸式增长&#xff0c;数据正在成为政府和企业越来越重要的基础性战略资源&#xff0c;可谓21世纪的“钻石矿”。面对大数据时代的到来&#xff0c;我国高度重视大数据…

图解大数据产业发展规划(2016-2020)

文章讲的是 图解大数据产业发展规划&#xff08;2016-2020&#xff09;&#xff0c; 近日&#xff0c;工信部公布了《大数据产业发展规划(2016-2020年)》。其中指出&#xff0c;到2020年&#xff0c;大数据相关产品和服务业务收入突破1万亿元&#xff0c;年均复合增长率保持30%…

观点 | 我国大数据产业发展态势如何?

我国高度重视大数据的战略意义和数据资源对社会经济发展的积极作用&#xff0c;国务院于2015年出台了《促进大数据发展行动纲要》&#xff0c;并将“实施国家大数据战略&#xff0c;推进数据资源开放共享”纳入“十三五”期间规划和建设的重要目标。目前国内大数据产业发展已初…

我国目前大数据产业发展现状

我国大数据产业发展现状 2.1政策与法律层面 &#xff08;&#xff11;&#xff09;虽然我国大数据产业目前缺乏国家层面的政策&#xff0c;但是在相关的国家战略中已经涉及大数据技术与发展规划。例如《“十二五”国家战略性新兴产业发展规划》提出支持海量数据存储、处理技术…

《承德大数据产业发展规划》评审会召开

7月14日&#xff0c;《承德大数据产业发展规划》评审会议在我市召开。会议邀请了中科院软件研究所、北京大学软件学院等国内大数据领域知名专家对北方工业大学和工信部电信研究院承担的“承德大数据产业发展规划编制项目”进行了全面评审。 会上&#xff0c;有关市领导介绍了规…

一图读懂|《“十四五”大数据产业发展规划》

来源&#xff1a;工业和信息化部官方网站 本文多图&#xff0c;建议阅读5分钟 工业和信息化部发布了《“十四五”大数据产业发展规划》。 近日&#xff0c;工业和信息化部发布了《“十四五”大数据产业发展规划》&#xff08;以下简称《规划》&#xff09;。《规划》提出&#…

成都市发布大数据产业发展规划 2025年产值达到3000亿元

近日成都市发布《成都市大数据产业发展规划(2017—2025年)》(以下简称&#xff1a;规划)&#xff0c;按照规划&#xff0c;到2025年&#xff0c;成都市大数据产业产值将达到3000亿元(人民币&#xff0c;下同)。 图为成都市大数据产业布局示意图 据了解&#xff0c;成都是中国八…