ZHA Coordinator 如何控制ZLL Light/Philips Hue Light

缩写:

ZHA: ZigBee Home Automation profile

ZLL:  ZigBee Light Link profile

TCLK: Trust Center Link Key

  1. 为什么ZLL 灯加入ZHA网络

在ZLL网络中,设备支持两种方式Join ZigBee网络,一种是通过Touch Link[1]方式入网,遥控器和灯靠近配对的方式把灯拉入到ZLL网络中。另外一种是传统入网,称为Classic Commission Join的方式加入ZigBee 网络。传统入网过程如下,

                                    

(1)         节点以Trust Center(一般是协调器)作为父节点加入到网络中

(2)         节点以路由器作为父节点加入到网络中

以上入网过程都是在使能SECURE的情况下测试的,ZLL灯在通过Classic Commission Join的方式入网时,父设备通过发送Transport Key消息将网络秘钥发送给子设备,这个秘钥称为Network Key,该秘钥用于对网络内的通信数据进行加密。Network Key在从父设备发送给子设备的过程中,如果以明文发送,则有可能会被其他设备监听到,导致Network Key被窃取,使得通信不安全。所以ZigBee协议中使用Trust Center Link Key(TCLK)对通过AES  128bit加密算法对该 Network Key进行加密,过程如下。在TI Z-Stack 协议栈中通过开启TC_LINKKEY_JOIN宏定义。关于ZigBee网络的Security说明,详细参考《Z-Stack Developer's Guide.pdf》 在TI S-Stack 安装目录下的Document里面。

                                              

(3)      Network Key加密/解密过程

在ZHA的协议栈中,TCLK是公开的一个Key,在ZHA Specification[3]里面5.3.3中提到

在ZLL协议中规定默认的Trust Center Link Key和ZHA的默认TCLk是一样,在[1]的8.1.6.2节中,

这也是为什么ZLL的灯能够成功加入到ZHA的网络中去,原因是他们使用的TCLK都是一样的,当然Philips Hue Light也不例外,也可以成功的加入到ZHA网络中。

  1. ZLL灯如何加入到ZHA网络中

本节中使用TI的开发板和ZigBee协议栈Z-Stack让ZLL灯加入到ZHA的网络中。

  • 硬件:

1)  ZHA Coordinator

2) ZLL Light

http://www.ti.com/tool/cc2530zdk-zll?keyMatch=CC2530%20ZLL&tisearch=Search-EN-Everything

  • 软件:

1) ZHA Coordinator

Z-Stack Home 1.2.2   http://www.ti.com/tool/z-stack

2) ZLL Light

Z-Stack Lighting 1.0.2 http://www.ti.com/tool/z-stack

  • 相关工具:

1)  Packet Sniffer Tool

http://www.ti.com/tool/cc2531usb-rd?keyMatch=CC2531%20USB%20Dongle&tisearch=Search-EN-Everything

1)  CC Debugger

http://www.ti.com/tool/cc-debugger?keyMatch=CC%20Debugger&tisearch=Search-EN-Everything

3)  SmartRF Flash Programmer

http://www.ti.com/tool/flash-programmer?keyMatch=smart%20flash%20programer&tisearch=Search-EN-Everything

4)  Packet Sniffer

http://www.ti.com/tool/packet-sniffer?keyMatch=packet%20sniffer&tisearch=Search-EN-Everything

安装Z-Stack Home 1.2.2 协议栈到默认路径下。

1) 利用IAR for 8051 9.10 打开Smapleswitch工程,选择CoordinatorEB

在C:\Texas Instruments\Z-Stack Home 1.2.2.42930\Projects\zstack\HomeAutomation\SampleSwitch\CC2530DB

默认情况下已经使能了TC_LINK_JOIN宏定义,打开NV_RESTORE用于保存网络参数。

编译并下载到SmartRF05EB开发板,

2) 利用CC Debugger和SmartRF Flash Programmer下载ZllLight-ZLIGHT.hex文件到ZLL Light,hex文件位于C:\Texas Instruments\Z-Stack Lighting 1.0.2\Projects\zstack\ZLL\SampleApp\CC253x\hex

注: 如果是从TI购买的ZLL 开发套件,出厂时是已经烧写过该程序的,所以不需要再重复烧写。

1) 将SmartRF05EB上电,Coordinator会建议一个Zigbee PAN 网络

2) 将ZLL Light 上电,按住ZLL Light上按键,保持>10s松开,ZLL Light会触发Classic Commission Join的方式开始加网过程。

3) 将整个过程利用CC2531 USB Dongle和Packet Sniifer抓包如下,

 
这样ZLL Light就通过Classic Commission Join的方式成功加入到ZHA的网络中
  1. ZLL 灯的Service Discovery 过程

虽然ZLL Light已经成功的加入到ZHA网络中了,现在需要通过ZHA Coordinator对ZLL Light实现控制,包括on/off,Level, Color 等方面的控制。但是此时ZHA Coordinator只知道有一个子设备(Router)加入了网络,并不知道这个是个什么设备,也不知道他支持哪些功能,他工作在什么EndPoint上面,每个EndPoint 支持哪些cluster等等。所以这时ZHA Coordinator需要开始Service Discovery过程,去获得该设备应用层面的信息。

这个Service Discovery的过程主要是调用ZDO层的相关API函数,在ZigBee Specification 2.5.5.6 Device and Service Discovery节[4]中也有说明。

1) 利用Active Endpoints Request获取ZLL Light支持的EndPoint

当ZLL Light 成功入网以后,ZHA Coordinator 调用ZDP_ActiveEPReq() API发送Active_EP_req命令给ZLL Light。 ZLL Light在收到Active_EP_req 命令以后,会在ZDP_IncomingData调用call back函数 ZDO_ProcessActiveEPReq,最后调用ZDP_ActiveEPRsp回复Active_EP_rsp,ZHA Coordinator在收到Active_EP_rsp以后,会调用ZDApp_ProcessMsgCBs函数,最后在Switch-Case下面,通过ZDO_ParseEPListRsp对这个消息进行解析。

2) 利用Simple Descriptor Request获取ZLL Light在每个EndPoint下的Cluster

通过以上步骤ZHA Coordinator获得了ZLL Light工作在哪几个EndPoint上面,现在需要对每个Endpoint进行请求获得EndPoint上面支持的In Cluster和Out Cluster。 ZHA Coordinator调用ZDP_SimpleDescReq API发送Simple_Desc_req命令给ZLL Light, ZLL Light在收到命令以后会在ZDP_IncomingData调用call back函数ZDO_ProcessSimpleDescReq,最后调用ZDP_SimpleDescMsg回复Simple_Desc_rsp,ZHA Coordinator在收到Simple_Desc_rsp以后,会调用ZDApp_ProcessMsgCBs函数,最后在Switch-Case下面,通过ZDO_ParseSimpleDescRsp对这个消息进行解析。

3) ZHA Coordinator在收到ZLL Light的device announce以后,开始进入Service Discovery过程,具体实现的程序见附件代码中,搜索ZHAZLL关键字。

在节点入网成功(Device Announce),1s后对该节点发起Service Discovery过程,完成Service Discovery以后,通过CC2530EB开发板上的Joystick-Center,可以实现对ZLL Light的On/Off Toggle, 当然对Level,Color也是类似的。

对于Philips Hue Light也不例外,可以通过同样的方式对Philips Hue Light进行控制。


  1. 对ZLL灯进行控制

1) 节点成功入网
2)Service Discovery
3)Toggle LED
 
测试代码(基于Z-Stack Home 1.2.2)
zcl_SampleSwitch.c
zcl_SampleSwitch.h
 
在IAR定义宏定义 ZHAZLL
 
Reference:

[1] docs-11-0037-10-0zll-zigbee-light-link-zll-profile-specification.pdf

[2] 2654.Z-Stack Developer's Guide.pdf

[3] ZB_AFG-Home_Automation_Profile_for_Public_Download.pdf

[4] docs-05-3474-20-0csg-zigbee-specification.pdf

ZHA profile与ZLL profile的一个例子的更多相关文章

  1. 对Jena的简单理解和一个例子

    本文简单介绍Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处理,输出本体中的Cla ...

  2. 从一个例子入手Istio

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 本篇是Istio系列的第一篇,希望 ...

  3. linux下 /etc/profile、~/.bash_profile ~/.profile的执行过程

    关于登录linux时,/etc/profile.~/.bash_profile等几个文件的执行过程. 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile ...

  4. [转] linux下 /etc/profile、~/.bash_profile ~/.profile的执行过程

    分类: linux 2015-03-13 16:24 1572人阅读 评论(0) 收藏 举报linuxprofile关于登录linux时,/etc/profile.~/.bash_profile等几个 ...

  5. Linux 环境下/etc/profile和/etc/profile.d 的区别

    Linux 环境下/etc/profile和/etc/profile.d 的区别 区别: 1. 两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/pro ...

  6. Linux的环境变量配置在/etc/profile或/etc/profile.d/*.sh文件中的区别是什么?

    @ 目录 login shell non-login shell 它们的区别 Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,~/.bash ...

  7. spring笔记--使用springAPI以及自定义类 实现AOP的一个例子

    Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...

  8. ReCap 360 photo照片建模技术的又一个例子

    这是我做的又一个利用Autodesk ReCap 360 照片建模技术做的一个例子.你可以下载模型自己把玩,或者下载原始照片自己试一试. 拍摄工具: 小米手机 照片数量:约120张 后期处理工具: p ...

  9. 从一个例子中体会React的基本面

    [起初的准备工作] npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web ...

随机推荐

  1. 关于分工的思考 (Thoughts on Division of Labor)

    Did you ever have the feeling that adding people doesn't help in software development? Did you ever ...

  2. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  3. Vue 入门指南

    英文:http://vuejs.org/guide/index.html 介绍 vue.js 是用来构建web应用接口的一个库 技术上,Vue.js 重点集中在MVVM模式的ViewModel层,它连 ...

  4. Android笔记——SQLiteOpenHelper类

    public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...

  5. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  6. 创建分区表和查看分区表的Metadata

    未分区的表,只能存储在一个FileGroup中:对table进行分区后,每一个分区都存储在一个FileGroup中.表分区是将逻辑上一个完整的表,按照特定的字段拆分成Partition set,分散到 ...

  7. C#设计模式系列:享元模式(Flyweight)

    当频繁地从数据源读取数据时,读出的内容存在重复,那么需要使用享元模式(Flyweight)来提高内存效率,Flyweight模式将节省更多空间,共享的Flyweight越多,空间节省越大. 1.享元模 ...

  8. 实战MEF(4):搜索范围

    在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...

  9. SpringMVC那点事

    一.SpringMVC返回json数据的三种方式 1.第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew. 如:<bean id=" ...

  10. 【开源】OSharp框架解说系列(4):架构分层及IoC

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...