ZigBee HomeAutomation分析
引用请注明出处!联系邮箱是huhao0126@163.com
本例程讲解,基于TI CC2530-2.5.1a中的HomeAutomation文件夹中的SampleLight和SampleSwitch例子来讲解。
由于使用了ZCL标准簇库和HA profile,在数据传输处理上,相对比较复杂,只要耐心的去看,多和别人沟通交流,搞懂流程是迟早的事。
1. 功能介绍
双方板子上电后,在Switch的板子上,按下SW_2,会向SampleLight板子发送绑定请求,SampleLight的板子接收此请求后,建立绑定关系。之后,Switch的板子上面,按下SW_1,会向SampleLight的板子发送切换灯状态的命令,SampleLight收到此命令后,进行相关的操作。
samplesw 规定了三个按键:
SW_1:向灯泡发起开关的命令
SW_2:初始化终端设备绑定请求(开关只有输出命令)
SW_4:初始化匹配描述请求(我给出输入配置,周围哪个设备可以接收此输入配置)
samplelight 定义了一个按键的:
SW_2:初始化终端设备绑定请求
2. ZCL详细初始化
需要使用ZCL层,必须先把应用程序的简单描述符注册到HA profile里面去,zclHA_Init初始化里面,比较重要的一句话是
基于ZCL的应用程序,注册端点信息时,需要将自己接受任务的ID赋予为ZCL_TaskID,这意味着,发向应用程序的消息,会首先被ZCL层接收并且处理,ZCL层处理不了的数据,会转发到应用层来处理。
注册ZCL通用簇库的回调函数列表,通用簇库已经定义好了不同命令处理程序的框架表,我们需要实现什么功能,就填充对于的回调函数处理。
注册应用程序属性列表,表明此端点绑定的相关属性信息,一个簇,可以有多个属性,每个属性有属性ID,数据类型,权限,数据组成。对命令(簇)的操作,实际上是对之前已经和簇建立关系的属性值的操作,簇属性由ZCL_samplelight_data.c来定义。
下图是ZCL簇命令和对于的回调函数列表
1. 标准簇ID(ZCL_CLUSTER_ID_GEN_BASIC)下面,可以有硬件版本的属性、ZCL版本属性、制造商名称属性等。
当收到ZCL_CLUSTER_ID_GEN_BASIC命令时,会调用zclSampleLight_BasicResetCB来响应,其他的类似。
2. 认证簇(ZCL_CLUSTER_ID_GEN_IDENTIFY)下面,可以有认证时间的属性。
当接收到认证簇下面的Identify command命令时,通过zclSampleLight_IdentifyCB来响应
当接收到认证簇下面的Identify Query Response命令,通过zclSampleLight_IdentifyQueryRspCB来响应。
当接收到On/Off簇下面的On/Off/Toggle命令时,通过zclSampleLight_OnOffCB来响应。
上面是对ZCL层大致处理流程的接收,接下来,是对ZCL如何处理这些流程,进行详细的分析。
1. 首先是ZCL的初始化,它的初始时是在应用程序初始化之前进行的,主要进行插件和属性列表的初始化。
2. 在应用程序的初始化中,有如下调用
初始化时,zcl_RegisteredMsgTaskID为0xFF,所以,这条函数执行后,zcl_RegisteredMsgTaskID会为应用程序的TaskID。
在ZCL的事件处理循环中,有如下语句:
在ZCL的事件轮训处理中,当端点接收到发向ZCL或者应用程序的消息时,会触发SYS_EVENT_MSG消息,在消息列表中取出zcl_TaskID的消息,如果是数据,则由 zclProcessMessageMSG 来处理,如果是其他类型的数据,则向应用程序(zclSampleLight_TaskID)发送SYS_EVENT_MSG事件,并且携带msgPtr消息信息。
下面来,分析ZCL的具体事件处理函数 zclProcessMessageMSG。
从函数的说明上来说,此函数处理所有到来的数据消息,基于消息中的簇ID来分发消息,执行对于的消息回调函数,下面来看看,具体是怎么个流程。
先把收到的信息进行简单的解析,然后,根据端点号找到对应的端点描述符(epDesc),
然后根据端点号和簇ID,找到对应的发送选项值。
再然后,根据簇ID到合适的处理插件(plugin),具体函数为zclFindPlugin。每一种处理插件,都只针对一定范围内的簇ID起作用,以下是插件的数据结构:
在不同的插件,通过不同的簇ID范围来区分,针对一个特定的簇ID,获取对于的回调函数来处理。问题来了,插件的初始化在ZCL_init中是为空的呀?那具体填充簇ID和对于处理函数的操作在哪里呢?跟着这个问题,继续往下找。
在这里:
看到没有,对于每一个插件的注册,都需要起始簇ID,结束簇ID,他们规定了插件的使用范围,后面一个参数,就是不同簇对于的回调函数列表了,插件与插件之间,通过链表相连。插件的初始化是在
插件的回调函数统一由zclGeneral_HdlIncoming来处理,这个函数,对收到的命令,进行一些基本的过滤
上述函数的下半部分:
根据传入进来的回调函数数组指针,赋值为全局ZCL通用回调指针。
在zclGeneral_HdlInSpecificCommands中,在根据收到信息的端点,在找到对应的回调函数
根据端点找对于的回调函数,是在zclGenCBs链表中去找,具体函数为zclGeneral_FindCallbacks。问题又来了,zclGenCBs由是在哪里初始化的呢?上文已经提及到了。这里就不再提及的。
后面的处理流程,就比较好理解了,根据簇ID,来调用不同的处理函数,由于是统一的回调处理,不同的处理函数的调用格式是完全一样的,在这里,就以开关灯来说明。
pInMsg为接收到的数据,pCBs为指定端点对于的回调函数列表。
处理函数,首先判断接收到的数据方向和命令ID的有效范围,如果通过的话,则调用对于的处理函数来处理。从这里面可以看出,不同命令ID和处理函数之间,是人为的指定对应关系。上述的调用,就会跳到:
zclSampleLight_OnOffCB
上述,从开关的发送命令
zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );
到灯光这边的接收处理,zclSampleLight_OnOffCB
基本上流程,大体上分析清楚了,其他的命令和响应,只需要遵旨一定的操作,就可以完成。
2014-06-16 浩天之家 完成
ZigBee HomeAutomation分析的更多相关文章
- 基于ZigBee的家居控制系统的设计与应用
基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘 要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...
- ZigBee介绍
ZigBee网络 什么是ZigBee技术 Zigbee在中国被译为"紫蜂",是一种基于IEEE802.15.4协议的最近发展起来的一种短距离无线通信技术,功耗低,被业界认为是最有可 ...
- Zigbee安全基础篇Part.1
原文地址: https://www.4hou.com/wireless/14211.html 导语:ZigBee是一种开源无线技术,用于低功耗嵌入式设备(无线电系统).本文探讨了ZigBee协议的可用 ...
- ZigBee HA示例程序分析
ZigBee协议栈中自带的HomeAutomation例程,虽然也是操作灯泡,但是,是通过ZCL来统一处理的,符合HA profile规范,互连互操作性较好.下面就简要分析以下ZCL的使用. 在任务数 ...
- [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)
说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...
- ZIGBEE report机制分析
ZIGBEE提供了report机制(现在只学习了send, receive还没学习) 主要目的是实现attribute属性的report功能,即提供了一种服务端和客户端数据同步的机制 以EMBER的H ...
- 【转】zigbee终端无法重连的问题解决
zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...
- 【转】ZigBee终端入网方式深入分析
前述 继之前对终端Direct Join的分析,发现很多东西还很模糊,存在很多问题.终于找到时间继续深入挖下去,这次应该比较完整地搞清了终端的入网机制,并纠正之前的几个认识偏差. 由于Z-Stack网 ...
- zigbee学习之路(十四):基于协议栈的无线数据传输
一.前言 上次实验,我们介绍了zigbee原理的应用与使用,进行了基于zigbee的串口发送协议,但是上个实验并没有实现数据的收发.在这个实验中,我们要进行zigbee的接受和发送实验. 二.实验功能 ...
随机推荐
- C# 手动读写app config 的源码
public class ConfigOperator { public string strFileName; public string configName; public string con ...
- USACO prefix TrieTree + DP
/* ID:kevin_s1 PROG:prefix LANG:C++ */ #include <iostream> #include <cstdio> #include &l ...
- T4 文本模板编写准则
如果要在 Visual Studio 中生成程序代码或其他应用程序资源,遵守以下一般准则可能非常有帮助. 它们并不是一成不变的规则. 设计时 T4 模板准则 设计时 T4 模板是在设计时在 Visua ...
- c语言例子递归与整数逆序
例一 #include <stdio.h> //将一整数逆序后放入一数组中(要求递归实现) void convert(int *result, int n) { if(n>=10) ...
- 琐碎-关于hadoop2.2.0
HDFS模块功能 namenode:主节点,存储文件的元数据如文件名.文件目录结构.文件属性(生成时间.副本数.文件权限).以及每个文件的块列表和块所在的datanode等: datanode:在本地 ...
- Boxes in a Line
Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...
- Jessica's Reading Problem
Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...
- A Simple Problem with Integers(线段树入门题)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- X-Sequence
Description Let {xi} be the infinite sequence of integers: 1) x0 = A; 2) xi = (alpha * xi-1^2 + beta ...
- Android(java)学习笔记91:泛型接口的概述和使用
package cn.itcast_06; /* * 泛型接口:把泛型定义在接口上 */ public interface Inter<T> { public abstract void ...