引用请注明出处!联系邮箱是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分析的更多相关文章

  1. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  2. ZigBee介绍

    ZigBee网络 什么是ZigBee技术 Zigbee在中国被译为"紫蜂",是一种基于IEEE802.15.4协议的最近发展起来的一种短距离无线通信技术,功耗低,被业界认为是最有可 ...

  3. Zigbee安全基础篇Part.1

    原文地址: https://www.4hou.com/wireless/14211.html 导语:ZigBee是一种开源无线技术,用于低功耗嵌入式设备(无线电系统).本文探讨了ZigBee协议的可用 ...

  4. ZigBee HA示例程序分析

    ZigBee协议栈中自带的HomeAutomation例程,虽然也是操作灯泡,但是,是通过ZCL来统一处理的,符合HA profile规范,互连互操作性较好.下面就简要分析以下ZCL的使用. 在任务数 ...

  5. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...

  6. ZIGBEE report机制分析

    ZIGBEE提供了report机制(现在只学习了send, receive还没学习) 主要目的是实现attribute属性的report功能,即提供了一种服务端和客户端数据同步的机制 以EMBER的H ...

  7. 【转】zigbee终端无法重连的问题解决

    zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...

  8. 【转】ZigBee终端入网方式深入分析

    前述 继之前对终端Direct Join的分析,发现很多东西还很模糊,存在很多问题.终于找到时间继续深入挖下去,这次应该比较完整地搞清了终端的入网机制,并纠正之前的几个认识偏差. 由于Z-Stack网 ...

  9. zigbee学习之路(十四):基于协议栈的无线数据传输

    一.前言 上次实验,我们介绍了zigbee原理的应用与使用,进行了基于zigbee的串口发送协议,但是上个实验并没有实现数据的收发.在这个实验中,我们要进行zigbee的接受和发送实验. 二.实验功能 ...

随机推荐

  1. 使用GLSL实现更多数量的局部光照 【转】

    原文 http://www.cnblogs.com/CGDeveloper/archive/2008/07/02/1233816.html 众所周知,OpenGL固定管线只提供了最多8盏灯光.如何使得 ...

  2. 第29题:推断一个序列是否是还有一个push序列的pop序列

    github:https://github.com/frank-cq/MyTest 第29题:输入两个整数序列,当中一个序列表示栈的push顺序,推断还有一个序列有没有可能是相应的pop顺序.为了简单 ...

  3. POJ 3074 Sudoku (Dancing Links)

    传送门:http://poj.org/problem?id=3074 DLX 数独的9*9的模板题. 具体建模详见下面这篇论文.其中9*9的数独怎么转化到精确覆盖问题,以及相关矩阵行列的定义都在下文中 ...

  4. iOS开发——图形编程OC篇&OpenGL ES2.0编程步骤

    OpenGL ES2.0编程步骤 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设 ...

  5. Ruby on Rails Tutorial 第六章 用户模型

    1.用户模型(1)数据库迁移Rails默认使用关系数据库存储数据,数据库中的表有数据行组成,每一行都有相应的列,对应数据属性.把列名命名为相应的名字后,ActiveRecord会自动把他们识别为用户对 ...

  6. focusky 购买指南

    升级Focusky动画演示大师 所有版本一次购买,终身使用,无限制作,免费升级.支付方式:支付宝.淘宝.银行转账.支付宝付款:点击表格中的“立即购买“进入购买页面->选择版本.数量,并填写详细的 ...

  7. BootStrap2学习日记2--将固定布局换成响应式布局

    概要:响应式页面是指页面根据浏览平台(尺寸)的不同显示不同的CSS. 原理:在Html的的头加入代码 <style> /*当浏览器宽度大于767是 采用括号里面的CSS样式*/ @medi ...

  8. swift基本数据类型的使用

    // // ViewController.swift // 基本数据类型 // // Created by 叶炯 on 16/9/8. // Copyright © 2016年 叶炯. All rig ...

  9. android开发之路11(用SharedPreferences存储数据)

    Android平台给我们提供了一个SharedPreferences类,实际上SharedPreferences处理的就是一个key-value(键值对),它是 一个轻量级的存储类,特别适合用于保存软 ...

  10. Android 自学之画廊视图(Gallery)功能和用法

    Gallery与之前讲的Spinner有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框.他们之间的区别在于Spinner显示的是一个垂直的列表框,而Gallery显 ...