admin 管理员组文章数量: 887018
TI Zigbee Light Link 参考设计
原文出处:
http://processors.wiki.ti/index.php/Category:ZigBee_Light_Link
有如下五个部分资料:
§ ZStack-Lighting Kit
§ ZStack-Lighting-1.0.1 FAQ
§ ZStack-Lighting-1.0.1 Host Interface C Examples
§ ZigBee Lighting Gateway
§ ZigBee Lighting Gateway SW
目录
1. ZStack-Lighting Kit3
1.1. 套件概述... 3
1.2. 使用该工具包... 4
1.2.1. 第一次供电时,CC2531EMK ZLL遥控器远程连接到ZLights. 5
1.2.2. 选择控制哪个ZLight6
1.2.3. 返回到出厂默认值... 6
1.2.4. 高级控制... 6
1.3. 从ZStack-Lighitng-1.0.1版本生成ZStack照明套件固件... 10
1.4. 使用Windows的引导程序工具更新套件固件... 10
2. ZStack-Lighting-1.0.x FAQ.. 11
2.1. 如何去掉参考平台上Zlight2的按钮... 11
2.1.1. 不按压按钮的情况下,使Zlight2允许其他设备加入网络的方法... 12
2.1.2. 不按压按钮的情况下,Zlight2重置到出厂设置的方法... 12
2.1.3. 不按压按钮的情况下,使Zlight2以传统方式加入Zigbee网络的方法... 13
2.2. 市场中,ZStack-Lighting-1.0.x的设备能够和ZLL设备互操作吗... 13
2.3. ZStack-Lighitng-1.0.1飞利浦hue兼容吗... 14
2.3.1. 为了正确的被Hue Hub识别,Zstack-Lighting-1.0.1灯需要做一些改变... 14
3. ZStack-Lighting-1.0.1_Host_Interface_C_Examples. 16
3.1. ZStack-Lighting-1.0.1 主机接口限制... 17
3.2. ZStack-Linghting-1.0.1 主机接口C语言例子... 17
3.2.1. HW 设置... 18
3.2.2. 使用 Stack-Lighting-1.0.1 主机接口C语言例子... 18
3.2.3. 移植zllSocCmd 模块到你的应用程序... 20
3.3. ZStack-Lighting-1.0.1 Host Interface. 21
3.3.1. Remote Procedure Call21
1.1.1.1. Frame Check Sequence(帧检验序列)... 21
3.3.2. 管理和测试报文... 22
3.3.3. MT APP报文... 23
3.3.3.1. ZLL MT APP报文... 23
3.3.3.2. 3.3.2 ZCL MT APP Message. 27
4. ZigBee Lighting Gateway. 31
4.1. Setting Up The ZigBee Lighting Gateway Demo. 31
4.1.1. 获得必备的硬件组件... 31
4.1.2. 下载并安装必备软件... 32
4.1.3. 下载必备的BeagleBone Linux镜像文件... 32
4.1.4. 为BeagleBone创建可引导的SD卡文件... 32
4.1.5. 启动BeagleBone. 32
4.1.6. 准备ZigBee网关功能的CC2531EMK USB Dongle. 35
4.1.6.1. 使用ZLL套件的中CC2531EMK. 35
4.1.6.2. 使用未编程的CC2531EMK. 36
4.1.6.3. 将CC2531EMK连接到Beaglebone. 36
4.1.7. 在Ninja Blocks门户网站上创建一个帐户(只需要一次)... 37
4.1.8. 使BeagleBone/CC2531EMK Block与 Ninja Blocks Web Portal配对... 37
4.1.9. 将ZigBee设备连接到网关... 37
4.1.10. 一旦搭建好... 38
4.1.11. 在Ubuntu PC上运行演示... 38
4.2. 客户端应用程序... 40
4.2.1. C客户端应用程序... 40
4.2.1.1. 客户端应用listDevsCmdLine. 41
4.2.1.2. 客户端应用lightFlashCmdLine. 41
4.2.2. Android客户端应用程序... 42
4.2.2.1. Android应用程序菜单... 43
4.2.2.2. Android应用设备列表... 43
4.2.2.3. Android应用绑定... 43
4.2.2.4. Android应用组... 44
4.2.2.5. Android应用场景... 44
4.3. 源代码和更多详情... 44
5. ZigBee Lighting Gateway SW:... 45
5.1. Introduction:... 45
5.2. ZigBee照明网关固件(ZigBee Lighting Gateway FW)... 46
5.2.1. ZigBee照明网关固件的开关和LED分配... 46
5.2.2. ZigBee Lighting Gateway Host Interface. 47
5.2.2.1. MT APP头... 47
5.2.2.2. 传入的(从主机发出)MT APP消息... 48
5.2.2.3. MT APP消息传出(到主机)... 51
5.3. Linux Lighting Gateway SW:... 53
5.3.1. Linux照明网关的ZigBee驱动程序... 53
5.3.2. Linux照明网关的ZigBee抽象... 56
5.3.3. Linux照明网关的数据文件... 56
5.3.3.1. 设备数据文件( Device Data File )56
5.3.3.2. 组数据文件(Group Data File)57
5.3.3.3. 场景数据文件(Scene Data File)... 57
5.3.4. 照明网关插座API (Lighting Gateway Socket API)58
5.3.4.1. 发送到照明网关的命令... 58
5.3.4.2. 从照明网关发送的命令... 71
5.4. Client Examples. 79
1. ZStack-Lighting Kit
1.1. 套件概述
ZStack-Lighting 1.0.1套件包括2个按照ZigBee Light Link 彩灯的标准编程的彩灯和一个按照ZLL color scene Remote标准[c1] 编程的CC2531EMK USB转换器。 远程(遥控器)的基本功能可以通过2个按钮来实现,远程只需要由USB连接器供电即可完成这些基本功能。Windows控制台应用程序可以通过USB接口完成更多高级的功能。
套件FW是基于ZStack-Lighting-1.0.1的示例应用程序而成的,只不过要对这些例程做一些修改。
§ ZLight ZLL彩灯:
§ Zlight硬件平台得到了ZStack-Lighting-1.0.1和认证的ZLL硬件平台的支持。
§ 由于安全因素,我们做了一个修改,添加了一个热关断。
§ RSSI滤波器非常严格,最初的测试是在SmartRF05 +的CC2530EM硬件平台进行的,这个平台有一个高性能的天线。
§ 添加一个引导程序,就不需要CC-Debugger来进行固件的更新。
§ CC2531EMK ZLL远程USB转换器:
§ 这并不是一个被ZStack-lighting-1.0.1支持的平台,所以这个硬件目标是作为一个新的配置加入到远程项目中。
§ CC2531EMK ZLL远程USB转换器只有2个按钮,改变按钮的逻辑能让它完成更多的功能。
§ 改变LED的行为表现,来提供更好的用户反馈。
§ 改变RSSI滤波器,以适应该硬件的天线的性能。
§ 添加一个引导程序,就可以在不需要CC-Debugger情况下更新固件。
1.2. 使用该工具包
CC2531EMK ZLL远程中公开了以下功能,通过按键S1和S2:
ZStack-Lighting-1.0.1 CC2531EMK按钮分配 | ||
钮 | 按 | 功能 |
S1 | 按下 | TouchLink(通信连接) |
S1 | 松开 | TouchLink(通信连接)中止 |
S2 | 短按(<1S) | 打开命令和关闭命令之间的切换 |
S2 | 中按(>2S) | 选择下一个设备(选择组的最后一个设备) |
S1 + S2 | 长按(> 10S) | 重新置为出厂设置 |
CC2531EMK ZLL远程用户反馈通过LED,具有以下含义:
ZStack-Lighting-1.0.1LED分配 | ||
LED | 状态 | 功能 |
红色LED | 启动时闪烁 | 远程厂新 |
绿色LED | 启动时闪烁 | 远程端不是厂新 |
红色LED | 亮 | 按下按钮 |
红色LED | 灭 | 松开按钮 |
绿色LED | 启动后闪烁 | 通信连接成功 |
红色和绿色LED | 启动后闪烁 | 重置为出厂设置 |
开发包中的Zlight(也就是LED灯)的按钮的功能:
ZStack-Lighting-1.0.1 ZLight的按钮分配 | |
按 | 功能 |
短按(<2S) | 允许加入(高级功能) |
中按(> 2s和<5秒) | 重设出厂设置 |
长按(> 10秒) | 传统加入(高级功能) |
1.2.1. 第一次供电时,CC2531EMK ZLL遥控器远程连接到ZLights
收到包后,只要按照这些指示操作:
1. 接通电源CC2531EMK的的Zlights和USB转换器。
2. 按住按钮> 10将Zlight恢复出厂设置。
§ Zlight复位后,闪烁5秒。
3. 长按S1和S2超过10s后将CC2531EMK恢复出厂设置。
§ 5秒后,红色LED应该闪烁4次,以表明它恢复为出厂设置。
4.把其中一个Zlight放在CC2530EMK USB 转换器很近的地方,大约在0.3m的范围内。与其他ZLight放在离CC2530EMK USB 转换器很远的地方,约0.6m.
5按住S1后, Zlight将会闪烁,然后CC2531EMK上的绿色指示灯会闪烁,然后释放S1(而不是之前)。
6. 现在,您可以按S2开启/关闭ZLight,确保它是一个快速的按压(按的时候一定要快速)。
7. 将其他Zlights移近到离CC2530EMK USB 转换器 0.3m的范围内,其他的ZLight的距离依旧保持为0.6m。
8.按住S1 ,Zlight将会闪烁,然后CC2531EMK上的绿色指示灯会闪烁,现在你可以释放S1(而不是之前)。
§ 如果不是自己所希望的那个Zlight灯在闪烁[c2] ,简单地释放的S1按钮和重新定位所需的Zlight或CC2531EMK来让ZLight离CC2531EMK更近。
9. 现在,您可以按S2开启/关闭ZLight的,确保它是一个快速的按压。
10. 按住S2(>2s)来选择要控制的Zlights, 被选定的灯将会闪烁,表示被选择。
§ 这样按下一次会选择第一ZLight。
§ 按下第二次会选择两个ZLights
§ 按下第三次会再次选择第二Zlight。
§ 选择将会循环遍历这些连接了的Zlight灯泡;[c3]
§ 注:如果一个灯已经重置为出厂设置和重新和CC2531EMK建立了连接,但是没有重置CC2531EMK,通信连接选择列表中会出现冗余的设备,有可能会造成会选择并没有和CC2531EMK连接的设备。
电源接通,通信连接将会一直保持,而且这个过程并不需要重复一遍,除非该设备需要被重新编程或重置为出厂设置(稍后介绍)。
1.2.2. 选择控制哪个ZLight
和Zlight建立连接以后,这个灯就可以被控制了,如果想要改变选择,去控制另一个先前已经被控制过的灯,需要按住S2超过1S的时间。 松开S2时,被选的ZLight会闪烁,当依次在和剩下的灯建立连接,被选的对象也在依次变化,当选择绕回到第一个灯之前,所有的灯都被选择过了。
1.2.3. 返回到出厂默认值
要使套件返回到默认状态(假设你没有重新编程),你需要重设为出厂设置。 要执行一个复位使之重置为出厂设置:
§ 关于ZLight:按下ZLight上较高位置的开关多于5S的时间(但小于10S)。 5秒后,它会闪烁,表明它已经重置了。
§ 关于CC2531EMK ZLL遥控器[c4] :按下S1和S2多余5S(但小于10S)。 远程的红色和绿色的LED均闪烁5秒钟,然后短暂闪烁的红色LED,表明它被复位了。
1.2.4. 高级控制
Zlight是一种彩灯, CC2531EMK一个有彩色屏幕的远程,但到现在为止,你还只是控制灯的亮灭。 为了实现更多的功能,你需要使用ZStack-Lighting-1.0.1远程的“主机接口”。 Linux和Windows命令行应用程序的完整源代码可以在这里到: https://git.ti/zllhostinterfaceexample/zllhostinterfaceexample/archive-tarball/master
要使用ZStack-Lighting-1.0.1远程主机接口和CC2531EMK ZLL远程,需要做的是:
1.下载Windows ZLL命令行控制器。
https://git.ti/zllhostinterfaceexample/zllhostinterfaceexample/blobs/master/Win32/zllCmdLine/Release/zllCmdLine.exe
2.将usb_cdc_driver_cc2531.inf和zllCmdLine.exe提取到同一个目录下。
3.将CC2531EMK远程的USB转换器插入你的电脑中。
4。 当系统提示需要驱动程序时:File:Usb cdc driver cc2531.zip 。
5。 查找Windows已经分配给它的COM端口号:
a .打开设备管理器:Windows“开始”菜单 - >右键单击“我的电脑” - >管理 - >设备管理器
b. 在端口列表中找到CC2531:
6。 启动Windows控制台应用程序zllCmdLine.exe:
a . 单击Windows“开始”菜单后,在搜索框中输入RUN,然后输入你在第二个步骤中提取的zllCmdLine.exe的文件的路径以及设备的COM端口号:
7.将其中一个Zlight移近到CC2530EMK USB 转换器0.5米的范围内。
8.在控制台中键入“TouchLink”。就算这个Zlight之前已经和CC2531EMK远程建立了通信连接也没有关系。(CC2531EMK ZLL远程连接到ZLights他们第一次供电)
9.Zlight应闪烁,控制台应出现以下信息:
C:\Users\a0741319\Documents\temp\zllCmdLine.exe-- Mar 24201317:02:45
touchlink
touchlink command executed
processRpcSysApp: Command Received Successfully
tlIndicationCb:
Network Addr :0x0002
End Point :0x0b
Profile ID :0xc05e
Device ID :0x0200
Version :0x02
Status :0x57
记下“Network Addr :0x0002”和“End Point:0x0b”。
10.灯的类型的控制:
SETSTATE - n0x0002 - e0x0b - M2 - V1
你应该会看到控制台显示下面的内容,而且Zlight亮起。
setstate -n0x0002 -e0x0b -m2 -v1
setstate command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0x01
processRpcSysApp: Command Received Successfully
第一行是执行的命令,第二行显示命令执行时的参数:
网络地址:0x0002
终端节点:0x0b
寻址模式:0x02
值:0x01
最后一行返回命令执行的情况。
11. 现在把饱和度调到最大(你现在可以忽略其他参数,因为你控制的是还是之前那盏灯):
setsat -v0xfe
setsat command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0xfe
Transition Time :0x0001
processRpcSysApp: Command Received Successfully
第一行是执行的命令,由于是同一盏灯,所以只用写出命令值:0xfe,其他参数可以省略
第二行表示命令所携带的参数:
网络地址:0x0002
终端节点:0X0b
寻址模式:0X02
值:0XFE
转换时间:0X0001
最后一行是返回命令执行的状态
12.现在把hue调成红色(色调0):
sethue -v0
sethue command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0x00
Transition Time :0x0001
processRpcSysApp: Command Received Successfully
执行的命令是:sethue - V0
命令执行时的参数:
网络地址:0x0002
终端节点:0X0b
寻址模式:0X02
值:0x00
转换时间:0X0001
返回命令执行情况:processRpcSysApp:命令成功接收
12.现在将hue的色调转换到蓝色(0xAA),持续时间大于3秒:
sethue -v0xAA -t30
sethue command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0xaa
Transition Time :0x001e
processRpcSysApp: Command Received Successfully
§ 我们可以通过和其它灯建立通信连接并记录它们的网络地址和终端节点编号来控制它们。
§ 我们可以通过把所有的灯划分到一组中并对这个组定义一个地址,从而来控制所有的灯,使用-m1来选择组模式,-n0x0001代表的是组1,所有的灯在建立通信连接之后会被默认添加到组1中。当你想控制的是ZLL Lights而不是TI ZStack-Lighting-1.0.1 Lights时,需要使用广播终端节点(-e0xff)。
1.3. 从ZStack-Lighitng-1.0.1版本生成ZStack照明套件固件
ZStack-Lighting-1.0.1版本可以在http://www.ti/tool/z-stack 下载到。 要更新此版本生成固件预编程套件需要一个补丁。 这个补丁可以在这里找到:
File-Z-Stack-Lighting-add-on-lighting-kit.zip 。
1.4. 使用Windows的引导程序工具更新套件固件
要更新Zlight或远程FW,我们要做的是:
1. 下载Windows串行引导: Fil:SBDemo.zip
2. 将usb_cdc_driver_cc2531.inf和SBDemo.exe提取到一个目录下。
3. 在按着按键不放的情况下将Zlight插入PC,或按着S1键不放将CC2531EMKZLL遥控器插入PC。
a .按住按钮的同时给设备供电,设备会进入bootloader模式。 当它在等待一个新的固件的时候,绿色的LED会不停的闪烁。
4. 当系统提示的驱动程序使用File:Usb cdc drive cc2531.zip。
5. 查找Windows已分配给它的COM端口号:
a . 打开设备管理器:Windows“开始”菜单 - >右键单击“我的电脑” - >管理 - >设备管理器
b. 查找CC2531COM端口号:
6。 启动SBDemo.exe
a. 选择要更新的文件。
b. 选择的COM端口。
c. 点击加载固件。
7.过程中,绿色LED会在一段很短的时间间隔里快速闪烁。
8.一旦更新完成,红色和绿色的LED闪烁,将启动的新固件。
2. ZStack-Lighting-1.0.x FAQ
2.1. 如何去掉参考平台上Zlight2的按钮
ZLight2板有一个用于简单开发的按钮,它有三个功能,这些功能由于不再需要ZLL/Zigbee设备发送命令而使开发更为简单,这些功能包括:
●按压按钮(<2S):允许加入60S.
●按压按钮(2S-10S):重置为出厂设置.
●按压按钮(>10S):尝试以传统方式加入一个zigbee网络.
所有这些功能都可以通过其他方式来实现。
2.1.1. 不按压按钮的情况下,使Zlight2允许其他设备加入网络的方法
允许加入要求其他的ZigBee设备通过ZLight2和网络关联。在一个典型的用例中,一个网关上有一个按钮,通过用户按压按钮,新的设备会被添加到网络中。其中包括在网关上按下此按钮后,可以将消息发送到所有设备,并指示他们将被允许加入一个指定的时间长度,从而免除了此按钮在ZLight2上的功能。借助TI ZStack,这可以用下面的代码实现:
static void enablePermitJoin( byte duration )
{
zAddrType_t dstAddr;
//only needs to be done once, can be moved to init code只需要执行一次,可以移到初始化代码中
ZDSecMgrPermitJoining( 0xFF );
//permit join on the device允许加入的设备
NLME_PermitJoiningRequest( duration );
//Permit join to network允许加入到网络
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVZCZR;
dstAddr.addrMode = Addr16Bit;
ZDP_MgmtPermitJoinReq( &dstAddr, duration, 1, 0 );
}
2.1.2. 不按压按钮的情况下,Zlight2重置到出厂设置的方法
这个问题可以通过一个编程有ZLL认证密钥的ZLL初始化来实现,比如ZStack-Lighting-1.0.x 中提供的ZLL远程例程。启动一个TouchLink并确保灯和远程是在邻近的范围内是TouchLink成功所需要做到的:
static void enablePermitJoin( byte duration )
zllInitiator_StartDevDisc();
当ZLight处于闪烁识别状态时,发送重置为出厂设置的互联个域网命令:
static void enablePermitJoin( byte duration )
zllInitiator_ResetToFNSelectedTarget();
2.1.3. 不按压按钮的情况下,使Zlight2以传统方式加入Zigbee网络的方法
当ZLight2通电同时处于出厂设置时,会自动尽可能的加入一个ZigBee网络,这意味着当它第一次通电后,它会搜索并加入一个ZigBee网络,如果没有找到ZigBee网络,它会等待TouchLink。在随后的供电周期,它会一直重复这些工作,直到发现一个ZigBee网络,或ZLight2已经建立了通信连接。如果ZLight2重置为出厂设置,那么它也会重复这些动作。这个功能可以通过在Projects\zstack\ZLL\SampleLight\Source\zll_samplelight.c添加下面的代码来实现:
●在文件顶端的INCLUDE部分,#include "zll_target.h"的下方添加下面的代码:
#include "zll_target.h"
#include "zll.h"
●在函数void zllSampleLight_Init( byte task_id )的末尾,加上下面的代码:
if( zll_IsFactoryNew() )
{
zllTarget_ClassicalCommissioningStart();
}
2.2. 市场中,ZStack-Lighting-1.0.x的设备能够和ZLL设备互操作吗
可以,但是需要我们理解这些限制。
市场上的ZLL产品都经历了相同的ZigBee Light Link认证过程(ZStack-Lighting-1.0.0),这个过程中使用了公开的ZLL认证密钥。然而,产品制造商已采取其他的行动从Zigbee联盟获得秘密的ZLL主秘钥[c5] ,而这个主秘钥,由于ZLL主秘钥的保密性,TI没有将其公开,也没有将它放入ZStack-Lighting版本中。
ZLL的TouchLink过程中采用密钥的位掩码的方式来让设备知道其他设备支持什么秘钥。一个随机产生的网络钥密匙由Touchlink的发起者用ZLL秘钥加密后,从秘钥的位掩码上看,远程和灯的秘钥是很相似的。然后ZLL target(ZLL Light)使用同样的ZLL秘钥将随机产生的网络密钥解码。
在认证过程,开发和运间事件中,ZLL设备的密钥位掩码被设定为ZLL认证密钥,ZLL认证密钥被存储在设备中来对TouchLink过程中传输的随机网络秘钥进行编码/解码。ZLL产品秘钥的位掩码中没有设置ZLL认证密钥位,而是设置ZLL主密钥位,有ZLL的主密钥存储在设备。
这意味着,包含有ZLL认证秘钥的ZStack-Lighting-1.0.x设备将无法与现有市场上的ZLL产品建立通信连接和加入同一个网络。然而,在ZLL有一个“传统配置”的概念,它被包括在HA 运行期间。一旦两个设备建立通信连接并创建一个“ZLL网络”,其他设备可以采用不需要建立连接的一般的ZigBee联通的方式加入该网络,但是,这个ZLL的网络中没有协调器,设备以传统方式加入网络,使用一个ZLL 秘钥以一种类似的方式在HA作为trustcentre链路秘钥。所以即使在这种情况下,ZStack-Lighting-1.0.x 设备还是不能以传统方式和ZLL网络联通。
让ZStack-Lighting-1.0.x 设备能和ZLL产品一起工作的方法是:让ZLL产品以传统方式与HA网络联通。现在,他们使用众所周知的的HA trustcentre链路密钥,ZStack-Lighting-1.0.x设备也可以采用传统方式加入同一个网络。既然ZLL产品和ZStack-Lighting-1.0.x的设备现在在同一网络中,他们就可以使用的TouchLink,ZStack-Lighting-1.0.x远程将会添加ZLL Light产品到目标列表中并且控制这些灯,同样的,ZLL产品远程也能够进行Touchlink。完成以上过程之后,ZStack-Lighting-1.0.x远程能够发送ZLL lighting commands给ZLL light product,反之亦然。
如何让市场上现有的ZLL设备加入HA网络
ZLL规范强制规定ZLL设备必须加入HA网络。但是具体以何种方式加入是由制造商决定的,如何做到这一点可从ZLL产品工厂得到详细的信息。对于ZLL遥控器,这很可能是由一些按钮组成,对于灯(由于灯一般没有按钮)按钮,当他们通电且还没有加入一个HA网络时,它们将会搜索一个HA网络,这是一种很常见的方式。
如何使用ZStack-Lighting-1.0.1远程重置认证的ZLL产品,使它离开旧的网络
现在市场上的ZLL产品可以被ZStack-Light-1.0.1设备重置为出厂设置,前提启用主秘钥,实际的秘钥在复位过程中并不使用,只是在TouchLink初始阶段你需要正确的秘钥位掩码。如何启用主秘钥,详情请见“ZStack Lighting Developers Guide.pdf”的3.1节。为了从ZStack-Lighting 远程发送一个reset命令,你需要使用zllInitiator_StartDevDisc()来启动一个通信连接,然后当ZLL灯闪烁时,再发送zllInitiator_ResetToFNSelectedTarget()。
2.3. ZStack-Lighitng-1.0.1飞利浦hue兼容吗
ZStack-Lighting-1.0.x经过ZigBee-Light-Link认证,但是默认设置时不能与飞利浦的Hue Hub进行互操作。ZigBee-Light-Link的主密钥有一些难点,而偏偏主密钥是保密的,所以不能包含在TI公开的版本中,这个问题在上面的常见问题解答有所讨论,但是,还有一些其他的要点需要我们去理解。
注意:ZStack-Lighitng-1.0.1中有一个重要的参数需要被改变,这个参数是ZStack-Lighitng-1.0.1灯的默认值,只有改变这个参数后,才可以被Hue Hub识别。 ZStack-Lighitng-1.0.1中的简单描述符的形成是通过使用HA文档和当前定义的HA照明设备ID,这是为了让它能够被ZLL或HA网关识别,同时代价是ZLL网关将不会发送增强的ZLL命令(因为设备显示为HA设备)。然而,Hue Hub并不会在当前检查Profile ID并认为连接的设备就是ZLL设备(因为它形成的是一个ZLL网络),基于这个原因,默认情况下,使用一个ZStack-Lighitng-1.0.1 的HA设备ID将不会被Hue Hub所识别。
2.3.1. 为了正确的被Hue Hub识别,Zstack-Lighting-1.0.1灯需要做一些改变
对于一个ZStack-Lighitng-1.0.1的灯而言,要想被Hue Hub识别,你需要修改zll_samplelight.c,使HA设备ID变为ZLL设备ID。
#define ZLL_HUB_COMPATIBILITY
#ifndef ZLL_DEVICEID
#ifdef ZCL_COLOR_CTRL
#define ZLL_DEVICEID ZLL_DEVICEID_COLOR_LIGHT
#ifdef ZLL_HUB_COMPATIBILITY
#define HA_DEVICEID ZLL_DEVICEID
#else
#define HA_DEVICEID ZCL_HA_DEVICEID_COLORED_DIMMABLE_LIGHT
#endif
#else
#ifdef ZCL_LEVEL_CTRL
#define ZLL_DEVICEID ZLL_DEVICEID_DIMMABLE_LIGHT
#ifdef ZLL_HUB_COMPATIBILITY
#define HA_DEVICEID ZLL_DEVICEID
#else
#define HA_DEVICEID ZCL_HA_DEVICEID_DIMMABLE_LIGHT
#endif
#else
#define ZLL_DEVICEID ZLL_DEVICEID_ON_OFF_LIGHT
#ifdef ZLL_HUB_COMPATIBILITY
#define HA_DEVICEID ZLL_DEVICEID
#else
#define HA_DEVICEID ZCL_HA_DEVICEID_ON_OFF_LIGHT
#endif
#endif
#endif
#endif
ZLL开/关光灯,电平控制灯的设备ID与HA设备ID相互冲突,如上述的变化对一个试图识别HA和ZLL的设备(仅适用于ZLL开/关灯与电平控制灯)造成麻烦。ZLL 1.1规范和HA 1.2规范将ZLL设备ID一致化,ZLL开/关灯和电平控制灯设备的ID号将会改变来避免今天所出现的冲突。
Changing the Profile ID for the Application end point to be the ZLL Profile ID is not trivial and should not be attempted.?
TouchLink端点设备ID也应改变,以避免ZLL控制器不检查看到的TouchLink端点的可控装置的简单描述符(包括Hue Hub)。要做到这一点,改变zll_target.c中的AppDeviceId:
SimpleDescriptionFormat_t zllTarget_SimpleDesc =
{
ZLL_TARGET_ENDPOINT, // int Endpoint;
ZLL_PROFILE_ID, // uint16 AppProfId[2];
#ifdef ZLL_HUB_COMPATIBILITY
0x2BEE, // uint16 AppDeviceId[2] - set to an invalid device ID;
#else
ZLL_DEVICEID_COLOR_LIGHT, // uint16 AppDeviceId[2];
#endif //ZLL_HUB_COMPATIBILITY
ZLL_TARGET_DEVICE_VERSION, // int AppDevVer:4;
ZLL_TARGET_FLAGS, // int AppFlags:4;
ZLL_TARGET_MAX_INCLUSTERS, // byte AppNumInClusters;
(cId_t *)zllTarget_InClusterList, // byte *pAppInClusterList;
ZLL_TARGET_MAX_OUTCLUSTERS, // bytAppNumInClusters;
(cId_t *)zllTarget_OutClusterList // byte *pAppInClusterList;
3. ZStack-Lighting-1.0.1_Host_Interface_C_Examples
ZStack-Lighting-1.0.1远程工程包括一个主机接口,通过UART允许主处理器通过UATR连接到一个CC253x和使用一个抽象的ZLL API 控制ZLL网络。这个主机接口的说明,在第六节有关"Z-Stack Lighting API.pdf"中,可以在 "Z-Stack Lighting 1.0.1\Documents\API"文件夹里找到。Z-Stack-Lighting-1.0.1 的安装程序可以在 http://www.ti/tool/z-stack 下载。
这个wiki详细的描述了ZLL主机接口,提供了在一个linux主处理器上C语言的例子。可以很容易的被移植到其他的操作系统。当开发一个基于ZStacking-lighting-1.0.1的ZLL 远程设备的主机应用程序时,这些代码可以作为开发起点的参考代码被共享。
3.1. ZStack-Lighting-1.0.1 主机接口限制
下面是有人想创造一个zll主机的两个原因:
·一个便捷式高端ZLL远程。
·一个固定的ZLL控制器
ZStack-lighting-1.0.1主机接口用于一个ZLL遥控的实施,也就是一个高端的遥控. 需要强调的是实施一个使用 ZStack-Lighting- 1.0.1 远程示例应用程序的ZLL主机控制器存在一定的局限性。
§ ZLL远程示例应用程序仅仅作为终端设备被实施。因此它不能创建一个网络链接或作为一个路由器
§ ZLL示例应用程序必需触动连接灯,为了发现网络地址和终端,这是需要控制灯。这个需要接近触摸连接网络上所有的灯。
对于不开发高端遥控器的用户,而是开发固定ZLL控制设备,这些局限性是不可接受的,可以通过以下方式克服:
1) 使用HA协调器照明网关[c6] (ZLL 设备采用经典的配置模式能够加入HA网关)。在这个wiki 页面
http://processors.wiki.ti/index.php/ZigBee_Lighting_Gateway. 这个工作已经完成。这个wiki 提供:
§ CC2530 HA 协调器 FW 实现设备和 ZStack-lighting-1.0.1 主机接口。
§ Linux 主机ZigBee 网关服器SW
§ 云服务链接控制灯
§ Android 应用程序控制灯,绑定一个HA灯控制设备(HA 开关和感应器)。
2) 在 ZStack-Lighting-1.0.1 里创建一个ZLL控制桥应用。在未来的版本中将会解决这个问题。
3.2. ZStack-Linghting-1.0.1 主机接口C语言例子
基于Linux 系统的C语言例子实现 ZStack-Linghting-1.0.1 主机接口C语言例子的例子已经被创造。ZStack-Linghting-1.0.1主机接口 C语言例子的完整源代码在一个 git 上,可以在这儿下载压缩文件。
例子中包含两个模块:
1) ·zllSocCmd.c/h 这个模块包含ZStack-Linghting-1.0.1的主机接口的主函数功能。主机接口和公开的抽象的API发送命令和控制ZLL设备。
2) ·zll_controller.c 这个使用zllSocCmd 模块的示例应程序。它通过命令行公开zllSocCmd函数。
3.2.1. HW 设置
运行这些例子你需要:[c7]
(1) ZStack-Lighting Remote:
§ 1 x SmartRF05+CC2530EM for programming as a ZStack-Lighting Remote and Light, available as part of the CC2530DK from here.
(2) ZStack-Lighting Light(s):
§ SmartRF05+CC2530EM(s) for programming as a ZStack-Lighting Light(s) (2 available in above kit).
AND/OR
(1) ZLight(s) for programming as a ZStack-Lighting Light(s), HW available soon.
(2) Linux 机器或者 VM用于构建和运行主机接口 C语言例子。
(3) 一个串口USB转换线如果 Linux 机器上没有串行接口。
A SmartRF05-EB+CC2530EM must be programmed with the ZStack-Lighting-1.0.1 Remote FW and the SmartRF05-EB+CC2530EM(s)/Zlight(s) must be programmed with the ZStack-Lighting-1.0.1 Light FW.关于说明在第三节的the Z-Stack Lighting Sample Application Users Guide.pdf ,可以在 "Z-Stack Lighting 1.0.1\Documents" 文件中找到。
The SmartRF05-EB+CC2530EM 程序作为the ZStack-Lighting remote 必须通过一个USB 串口线连接到Linux机器(除非Linux机器有一个 UART 接口然后可以直接链接串行线)
3.2.2. 使用 Stack-Lighting-1.0.1 主机接口C语言例子
ZLL 控制器应用程序提供命令行允许你控制ZLL设备在网络上。
你首先创建Linux应用程序的例子,如果本机编译器的Linux机器被使用,和运行Makefile 一样简单,在实例中提供:
如果本地编译不能使用,你应该改写 gcc 命令在生成文件中去调用交叉编译器。
一旦应用程序创建,你应该启动命令行和指定设备,the ZStack-Lighting Remote 出现在你的系统。如果你使用USB转串口线这通常是/dev/ttyUSB0:
在控制灯之前,你必须线先配对ZLL灯控制器。这通过Touchlink[c8] 是可以做到的。
一旦经过连接的设备可以被控制了,多个设备可以进行连接,设备选择使用通过the -n<network address paramter>,可利用的命令是:
参数是:
一个成功的触摸连接会设置网络地址和新配对的设备的端点。新配对的灯用下面的命令打开:
下面的例子将会发送一个 MoveToHue命令到网络地址 0x003端点0xb,这将导致设备移动到红色调超过3秒(饱和度设置为高,看到变化):
参数被记住,键入下面的命令后就会变为蓝色调:
色调的值范围0x0-0xFF代表the 360Deg color wheel,这里:
饱和度的值是 0x0-0xFE ,这里:
3.2.3. 移植zllSocCmd 模块到你的应用程序
首先主机需要打开串口到CC253x,在zllSocOpen函数中被执行。
返回字符文件以便应用程序可以poll(轮询) the CC253x device。这样可以用来poll(轮询)在串口上的输入,当数据可用时,CC253x 处理函数必须调用读取和解析的消息。
Messages from the CC253x are then transalted to call back functions. The host application can then register the following callback functions
这是通过填充回调表中的回调,应用程序有兴趣接受,那些不需要设置为空,把它传递到下面的回调注销函数:
一旦串行口打开,主机可以发送命令,使用下面的函数:
3.3. ZStack-Lighting-1.0.1 Host Interface
ZStack-Lighting-1.0.1主机接口公开使用的是MT(管理和测试)接口,此接口允许UART的数据包(be routed to)发送到运行在ZStack上的应用程序上。包含MT报文的UART数据包按照2.1节中“Z-Stack Monitor and Test API.pdf”说明的RPC(Remote Procedure Call,远程过程调用)协议(are formatted)来规范;在RPC数据包里有一个MT(header)标头指定这个报文在ZStack内(be routed)连接的位置,在这种情况下,MT(header)标头需要以报文发送给运行在CC253x ZStack FW上的应用程序的方式(are formatted)来规范。
数据包的结构,如下所示:
RPC Message Format RPC报文格式 | ||||
RPC标头 | MT标头 | MT_APP标头 | ZLL_MT_APP / ZCL_MT_APP命令 | RPC帧校验序列 |
3.3.1. Remote Procedure Call
RPC数据包包含一个SOF(帧开始)字节帮助实现UART发送的数据包同步,接着是RPC的有效载荷(在这种情况下是MT报文)最后以FCS(帧校验序列)结束。
RPC Packet Format | ||
SOF | Payload | FCS |
1 Byte | 3 - 256 Bytes | 1 Byte |
· SOF:必须设置为0xFE
· 有效载荷:在这种情况下,它是MT报文,请参阅第XXX \ N
· FCS:请参阅XXX节
1.1.1.1. Frame Check Sequence(帧检验序列)
The FCS can be calculated by the below C code:(FCS由下面的C代码,可以计算:)
/*********************************************************************
* @fn calcFcs
*
* @brief populates the Frame Check Sequence of the RPC payload.
*
* @param msg - pointer to the RPC message
*
* @return none
*/
void calcFcs(unsignedchar*msg,int size)
{
unsignedchar result =0;
int idx =1; //skip SOF
int len =(size - 1); // skip FCS
while((len--)!= 0){
result ^= msg[idx++];
}
msg[(size-1)]= result;
}
3.3.2. 管理和测试报文
MT报文组成了RPC数据包的有效载荷。MT报文的格式在下面的表中所示:
MT报文格式 | |||
长度 | CMD0 | CMD1 | 数据 |
1字节 | 1字节 | 1字节 | 0 - 251字节 |
· 长度:MT数据的长度(0 - 251)
· CMD0:7-5位是指令类型,4-0位是子系统ID
o 对于MT_APP指令,指令方式:SREQ是将报文发送给CC253x,AREQ是报文从CC253x送出。
o 对于MT_APP报文,子系统ID应设置为0x09
指令类型 | |
Type类型 | Value值 |
POLL | 0X00 |
SREQ | 0X20 |
AREQ | 0X40 |
SRSP | 0X60 |
· CMD1:这是MT_APP的指令ID,应该被设置为0。
3.3.3. MT APP报文
MT的APP照明ZStack-1.0.1主机接口中使用的消息有2种类型:
· ZLL_MT_APP报文
· ZCL_MT_APP报文
3.3.3.1. ZLL MT APP报文
ZLL_MT_APP报文公开一个接口发送命令,指定ZLL的(profile)配置文件。这些消息可以被认为是(control plane)控制层面消息,他们在网络上控制设备的(behavior)状态(例如加入或离开网络)。
ZLL_MT_APP报文的结构如下所示:
ZLL_MT_APP报文格式 | |||||||
应用程序端点 | 保留的 | 集群ID | 日期长度 | 保留的 | ZLL_MT_APP命令ID | 保留的 | ZLL_MT_APP命令有效载荷 |
1字节 | 3个字节 | 2个字节 | 1字节 | 3个字节 | 1字节 | 2个字节 | X字节(定义命令) |
· 应用程序端点: ZLL的应用程序端点,应设置为0x0B
· (Reserved)保留字:所有保留的字节应设置为0x00
· ZLL_MT_APP集群ID:应设置为0xFFFF
· 日期长度:这应该是6(+)加上 ZLL_MT_APP命令参数的数量
· 命令ID:见下文支持的命令
ZLL MT APP报文目前支持ZLL控制器应用程序是:
ZLL MT APP发送给CC253x的命令 | ||
ZLL_MT_APP命令 | 值 | 参数(1个字节) |
ZLL_MT_APP_RPC_CMD_TOUCHLINK | 0X01 | N / A |
ZLL_MT_APP_RPC_CMD_RESET_TO_FN | 0X02 | N / A |
ZLL_MT_APP_RPC_CMD_CH_CHANNEL | 0X03 | 目标通道 |
ZLL_MT_APP_RPC_CMD_JOIN_HA | 0x04 | N / A |
ZLL_MT_APP_RPC_CMD_SEND_RESET_TO_FN | 0X06 | N / A |
从CC253x 发送的ZLL MT APP命令 | ||
命令 | 值 | 参数 |
MT_APP_ZLL_TL_IND | 0X81 | EpInfo结构,EEE在下面。 |
ZLL_MT_APP_RPC_CMD_TOUCHLINK
此命令将(cause)触发CC253x ZLL控制器开始Touch Link事务。 (TouchLink is proximity based, so for a succulence TouchLink the traget light must be close the the controller.) TouchLink是接近为基础的,所以对于一个TouchLink,目标灯必须靠近控制器。一个典型的距离为小于2米,但是这依赖于天线的质量和环境。
这是“限制”一节中详细讨论。
ZLL_MT_APP_RPC_CMD_RESET_TO_FN
此命令将触发CC253x ZLL控制器恢复出厂设置。控制器将发出一个网络离开报文告知其他设备,它将离开网络。然后,它会在5秒后重置。
ZLL_MT_APP_RPC_CMD_CH_CHANNEL
This command will cause the CC253x ZLL controller to initiate a channel change procedure the move the network to a new channel defined by the "Target Channel" parameter.
此命令将导致列出CC253x ZLL控制器来启动一个通道来改变程序-移动网络为一个定义为“Target Channel”参数的新通道。
ZLL_MT_APP_RPC_CMD_JOIN_HA
This command will cause the CC253x ZLL controller to initiate a "Classical Join" procedure. The CC253x ZLL controller will scan for a ZigBee network and attempt to association in the classical ZigBee way.
此命令将导致列出CC253x的ZLL控制器启动“Classical Join”程序。ZLL控制器将扫描一个ZigBee网络,并尝试以传统的ZigBee方式连接。
ZLL_MT_APP_RPC_CMD_SEND_RESET_TO_FN
此命令将触发的CC253x ZLL控制器发送一个“Reset To Factory New”命令。当前的实现需要发送上下文中的TouchLink事务,所以首先,用户必须启动TouchLink,那么当目标指示灯标识别“Reset To Factory New”,命令必须发送。一旦“Reset To Factory New”命令被一个ZLL灯接收,将停留在TouchLink事务,灯将恢复出厂设置。TI的一个ZLL灯的实现,这意味着灯将发送网络离开命令,然后5s后复位。其他实现可能稍有不同的时间,但最终的结果将是相同的。
ZLL_MT_APP_CMD示例
一个规范和发送的ZLL_MT_APP_CMD例子如下所示。在这个例子中它是一个ZLL_MT_APP_RPC_CMD_TOUCHLINK的命令:
/*********************************************************************
* MACROS
*/
#define APPCMDHEADER(len) \
0xFE, \
len, /*RPC payload Len */ \
0x29, /*MT_RPC_CMD_AREQ + MT_RPC_SYS_APP */ \
0x00, /*MT_APP_MSG */ \
0x0B, /*Application Endpoint */ \
0x02, /*short Addr 0x0002 */ \
0x00, /*short Addr 0x0002 */ \
0x0B, /*Dst EP */ \
0xFF, /*Cluster ID 0xFFFF invalid, used for key */ \
0xFF, /*Cluster ID 0xFFFF invalid, used for key */ \
#define BUILD_UINT16(loByte, hiByte) \
((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))
/*********************************************************************
* CONSTANTS
*/
#define ZLL_MT_APP_RPC_CMD_TOUCHLINK 0x01
...
/*********************************************************************
* @fn zllSocTouchLink
*
* @brief Send the touchLink command to the CC253x.
*
* @param none
*
* @return none
*/
void zllSocTouchLink(void)
{
uint8_t tlCmd[]={
APPCMDHEADER(13)
0x06, //Data Len
0x02, //Address Mode
0x00, //2dummy bytes
0x00,
ZLL_MT_APP_RPC_CMD_TOUCHLINK,
0x00, //
0x00, //
0x00 //FCS - fill in later
};
calcFcs(tlCmd,sizeof(tlCmd));
write(serialPortFd,tlCmd,sizeof(tlCmd));
tcflush(serialPortFd, TCOFLUSH);
}
MT_APP_ZLL_TL_IND
该命令将被CC253x ZLL控制器发送在(a successful TouchLink)配置好的TouchLink。该报文将包含目标设备的端点信息。
MT报文格式 | ||||
网络地址 | 端点 | 配置 ID | ID设备ID | 版本 |
2个字节 | 1字节 | 2个字节 | 1字节 | 1字节 |
· 网络地址:16位目标设备的网络地址
· 端点:端点目标设备
· 配置编号:资料编号的目标设备
· 设备ID:目标设备的设备ID
· 版本:目标设备的版本:
ZLL控制器应用程序必须存储端点信息来发送ZCL_MT_APP的报文在网络上控制灯光。
3.3.3.2. 3.3.2 ZCL MT APP Message
ZCL_MT_APP报文公开一个接口发送ZCL部分的命令。这些消息可以被认为是数据平台消息,它们控制在网络中的灯(例如,开/关,水平等)。该接口可用于任何ZCL命令,开发人员应该查阅ZCL规格来决定哪些命令应该被产品支持。
如下所示的ZCL_MT_APP消息的结构:
MT Message Format MT消息格式 | |||||||||
Application End Point应用程序端点 | Network Address网络地址 | Destination End Point目的地端点 | ZCL Cluster ID ZCL集群ID | Date Len日期长度 | Address Mode地址模式 | ZCL Frame Control Field ZCL帧控制字段 | ZCL Transaction Sequence Number ZCL事务序列号 | ZCL Command ID ZCL命令ID | ZCL Command Payload ZCL命令有效载荷 |
1字节 | 2字节 | 1字节 | 2字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | X字节(定义命令) |
· 应用程序端点:这是应用的端点ZLL的应用程序,应设置到0x0B
· 保留字:所有保留的字节应设置为0x00。
· 网络地址:发送ZCL报文的设备的网络地址(或groupId取决于地址mmode),设备的TouchLink的网络地址发送在MT_APP_ZLL_TL_IND报文。
· 目标端点:发送ZCL报文的设备的端点,端点设备的TouchLink在MT_APP_ZLL_TL_IND报文中发送。
· ZCL集群ID:集群ID ZCL命令的发送。请参阅ZCL规范。
· 日期长度:这应该是6(+)加上ZCL命令参数的数量
· 地址模式:ZCL报文地址模式
Address Mode地址模式 | |
AddrNotPresent | 0 |
AddrGroup | 1 |
Addr16Bit | 2 |
Addr64Bit | 3 |
AddrBroadcast | 15 |
对大多数的应用程序,仅仅单点传播报文有一个16位的地址模式,其他的(groupcast)多点传播报文需要一个AddrGroup地址模式。
· ZCL帧控制字段:定义ZCL框架的特点:
ZCL帧控制字节 | ||||
位7 .. 5 | 第4位 | 第3位 | 第2位 | 位1 .. 0 |
Reserved保留字 | Disable Default Response禁用默认响应 | Direction (Client/Server) 方向(客户端/服务器) | Manufacturer Specific 制造商专用 | ZCL Command Type ZCL命令类型 |
· ZCL帧控制字段:
o 保留字:应该是0x0
o 禁用默认响应:定义是否接收器收到ZCL消息应该发送一个默认的响应。
o 方向(客户端/服务器):定义是否将消息发往客户端或服务器的集群。
o 制造商专用:定义它是一个ZCL消息ZCL规格,或者它是一个制造商特定的扩展。
o ZCL命令类型:定义特定于一个集群命令。例如,一个开/关的消息是特定的“开/关”群集,但一个ZCL读的开/关属性不是。
· ZCL事务序列号:事务ID应该为每个ZCL报文增加。
· ZCL指令ID:ZCL的指令ID要发送的指令。请参阅ZCL规范。
· ZCL命令有效载荷:有效载荷的ZCL命令发送。请参阅ZCL规范。
ZCL_MT_APP_CMD示例
下面的例子显示,格式化并发送ZCL_MT_APP_CMD消息。在这种情况下,它是一个MoveToLevel命令:
#define COMMAND_LEVEL_MOVE_TO_LEVEL 0x00
#define ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL 0x0008
...
/*********************************************************************
* @fn zllSocSetLevel
*
* @brief Send the level command to a ZLL light.
*
* @param level - 0-128 = 0-100%
* @param dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.
* @param endpoint - endpoint of the Light.
* @param addrMode - Unicast or Group cast.
*
* @return none
*/
void zllSocSetLevel(uint8_t level, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode)
{
uint8_t cmd[]={
0xFE,
14, //RPC payload Len
0x29, //MT_RPC_CMD_AREQ + MT_RPC_SYS_APP
0x00, //MT_APP_MSG
0x0B, //Application Endpoint
(dstAddr & 0x00ff),
(dstAddr & 0xff00)>>8,
endpoint,//Dst EP
(ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL & 0x00ff),
(ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL & 0xff00)>>8,
0x07, //Data Len
addrMode,
0x01, //0x01 ZCL frame control field. (send to the light cluster only)
transSeqNumber++,
COMMAND_LEVEL_MOVE_TO_LEVEL,
(level & 0xff),
(time & 0xff),
(time & 0xff00)>>8,
0x00 //FCS - fill in later
};
calcFcs(cmd,sizeof(cmd));
write(serialPortFd,cmd,sizeof(cmd));
tcflush(serialPortFd, TCOFLUSH);
}
4. ZigBee Lighting Gateway
4.1. Setting Up The ZigBee Lighting Gateway Demo
此过程将包含TI ZigBee照明网关演示所需的所有步骤。大多数步骤只需要完成一次。设置完成后,示例可以很容易多次运行。
该演示允许云服务器上的一个web应用程序或连接到同一个局域网网关的Android设备上的Android应用程序来控制ZigBee照明设备。
除了可以在BEAGLEBONE上进行完整的演示,ZigBee服务器可以运行在任何支持Android应用程序来控制灯的Linux机器上。点击这里有更多细节。
4.1.1. 获得必备的硬件组件
(1) 从http://www.beagleboard订购BEAGLEBONE 。
(2) 获取一个4GB的Micro-SD卡。
(3) 从TI订购ZLL HW参考套件
(https://estore.ti/CC2530ZDK-ZLL-CC2530-ZigBee-Light-Link-Development-Kit-P4539.aspx)的。这里有如何使用这个工具包的更多信息。然而CC2531EMK将被重新编程作为HA(home automation)协调器使用而不是作为ZLL遥控器使用。
(4) (可选),建议您还要为BEAGLEBONE购买一个5V电源。
(5) (可选)获得ZLL 认证的设备。重要注意事项:确保它们为出厂新品或者你知道如何恢复出厂设置。在这里可以找到更多将ZLL认证设备恢复出厂设置的信息
(6) (可选)从TI或TI分销商订购一个CC调试器:http://www.ti/tool/CC-Debugger
(7) 注意:如果你想尝试ZigBee服务器和Android应用程序,你可以仅使用LinuxPC / VM。请参阅这里的指示。
4.1.2. 下载并安装必备软件
在Windows PC上开始安装步骤之前,下面的软件需要下载并安装:
1. 下载并安装7-Zip。这是一个可以支持很大文件的文件解压工具。 http://www.7-zip/download.html。
2. 下载并安装写镜像软件。这将用于创建SD卡文件用于引导BeagleBone。 https://sourceforge/projects/win32diskimager/files/latest/download
3. 下载并安装TeraTerm。这将被用来建立一个控制台终端到BeagleBone的连接。 http://en.sourceforge.jp/projects/ttssh2/releases/
4. 下载并安装BeagleBone驱动http://beagleboard/static/beaglebone/latest/README.htm 。
4.1.3. 下载必备的BeagleBone Linux镜像文件
1. 从这个页面下载最新的BeagleBone原始镜像,This is just a safety net for getting back to ground zero。http://beagleboard/latest-images/。
2. 从http://wiki.ninjablocks/images#BEAGLEBONE下载BeagleBone 的Ninja Blocks SD卡镜像,该镜像已经经过测试,但可能有更新的镜像可以使用。
4.1.4. 为BeagleBone创建可引导的SD卡文件
1. 使用7-ZIP从刚刚下载的palladium.img.zip文件解压缩出img文件。(解压后大约4GB)
2. 使用写镜像工具,将img文件写入到一个4GB的micro-SD卡。
3. 标记这个SD卡“Ninja”,使它可以与原始工厂SD卡区分开来。
4.1.5. 启动BeagleBone
1. 将一根以太网电缆连接到BeagleBone以太网插孔
2. 将新创建的SD卡插入到BeagleBone的插槽。
3. 重要注意事项: 应从5V电源或“带电”USB端口为BeagleBone供电。如果直接使用您的PC的USB插头供电它可能无法正常运行。
4. 将BeagleBone 板子自带的USB线插入PC,另一端插到BeagleBone上的Mini-USB接口。
5. 现在使用TeraTerm连接到BeagleBone的控制台端口
§ 检查“设备管理器”中“端口(COM和LPT)”,现在应该有一个新的USB串行端口。记下端口号(如COM12)。如果它没有出现在设备管理器中,那么需要安装beaglebone USB驱动程序,按照这里的提示.。
§ 启动TeraTerm,执行 文件 - >新建连接,File->New连接到上面的串行端口。
§ 在TeraTerm上执行设置 - >串行端口,Setup->Serial Port...设置通信设置为115200波特,8位,无奇偶校验位,1个停止位,无流量控制。
6. 登录到BeagleBone控制台端口
§ 在TeraTerm窗口,按下回车键,你应该看到:
Ubuntu 12.04 LTS ninjablock ttyO0
ninjablock login:
1.
§ 输入“ubuntu”的用户名(不带引号)
§ 密码输入'temppwd'(不带引号)
§ 您应该看到:
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.18-psp14 armv7l)
* Documentation: https://help.ubuntu/
* Ninja Block Help: http://help.ninjablocks/
MMMMMMMMMMMMMMMMMM -----------------------------------------
MMMMMMMMMMMMMMMMMMMMMM | |
MM MM | |
MM MMMM MMMM MM | Serial:xxxxxxxxxxxx |
MM MMMM MMMM MM | | MM MMMM MMMM MM | HACK ME
MM MMMM MMMM MM -----------------------------------------
MM MM
MMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMM
MMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMM
MMMMMMMMMMMM
MMMMMMMMMMMM
MMMMMMMMMMMMMM
MMMMM MMMMM
MMMMM MMMMM
MMMMM MMMMM
ubuntu@ninjablock:~$
1. 注意框内HACK ME.上面的序列号Serial number,稍后您将需要用到。它也应该与BeagleBone上的以太网插孔标签上的序列号相匹配。
2. 查看NinjaBlocks日志文件,在控制台中键入:
tail -f /var/log/ninjablock.log
1. f NinjaBlock第一次启动并连接到互联网的NinjaBlock镜像将被更新。一旦更新,它会自动重新启动。
2. 一旦beaglebone NinjaBlock已更新,你会看到下面的日志:
3. ubuntu@ninjablock:~$ tail -f /var/log/ninjablock.log
4. [Thu, 06 Jun 2013 10:00:54 GMT] (info) Express server listening on port 8000
5. [Thu, 06 Jun 2013 10:00:54 GMT] (info) platform: Device connection established (/dev/ttyO1)
6. [Thu, 06 Jun 2013 10:00:54 GMT] (info) loadModule: ninja-limitlessLED
7. [Thu, 06 Jun 2013 10:00:54 GMT] (info) loadModule: ninja-usbcam
8. [Thu, 06 Jun 2013 10:00:55 GMT] (info) loadModule: network
9. [Thu, 06 Jun 2013 10:00:55 GMT] (info) loadModule: ninja-zwave
10.[Thu, 06 Jun 2013 10:00:55 GMT] (info) loadModule: ninja-ipcam
11.[Thu, 06 Jun 2013 10:00:56 GMT] (info) loadModule: ninja-philips-hue
12.[Thu, 06 Jun 2013 10:00:56 GMT] (info) usbcam: No camera detected
13.[Thu, 06 Jun 2013 10:01:01 GMT] (info) Attempting to activate...
1. 现在,你需要更新ninja-zigbee的驱动程序。在这个阶段你需要确保beaglebone与外部Internet连接。在BeagleBone控制台窗口类型:
git clone -b zigbee-lighting https://github/ninjablocks/ninja-zigbee /opt/ninja/drivers/ninja-zigbee
输出应该是这个样子:
ubuntu@ninjablock:~$ sudo git clone -b zigbee-lighting https://github/ninjablocks/ninja-zigbee /opt/ninja/drivers/ninja-zigbee
Cloning into 'ninja-zigbee'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (142/142), done.
remote: Total 201 (delta 120), reused 123 (delta 51)
Receiving objects: 100% (201/201), 138.66 KiB | 250 KiB/s, done.
Resolving deltas: 100% (120/120), done.
4.1.6. 准备ZigBee网关功能的CC2531EMK USB Dongle
4.1.6.1. 使用ZLL套件的中CC2531EMK
这个步骤将重新对ZLL套件提供的CC2531EMK进行编程,实现远程遥控,得到拥有一个主机接口HA协调器。如果需要,可以将其重新编程成一个ZLL遥控器。
1. 将ZLL参考硬件(HW)套件中的CC2531EMK插到您的PC上的USB插槽中。
2. 重要注意事项:串行引导装载程序不会删除存储在闪存中的网络参数。这样一个固件更新时就不需要对ZigBee网络上的任何设备进行重新调试。但是当CC2531EMK已被编程为一个ZLL遥控器(终端设备)时,我们现在要将其编程为HA协调器,我们就需要重新设置存储在闪存中的网络参数。要做到这一点,保持CC2531EMK上的S1 + S2按钮按下大于10s。红色和绿色LED会闪烁5秒钟,CC2531EMK将重新启动。CC2531EMK按钮功能的更多信息,可在这里查看。重要的是,CC2531EMK保持在出厂状态,在编程为HA协调器之前,未曾touchlinked ..
3. 下载文件:LightingGateway USB.zip提取SampleGateway-USB-SBL.bin
4. 使用SampleGateway-USB-SBL.bin更新CC2531EMK的固件(FW),参考下面的指导http://processors.wiki.ti/index.php/ZStack-Lighting_Kit#Updating_the_Kit_FW_images_using_the_Windows_bootloader_tool.
4.1.6.2. 使用未编程的CC2531EMK
另外,如果你有一个CC调试器和一块未编程的CC2531EMK,你可以按照下面的说明操作:
- 将CC调试线连接到CC2531EMK 请特别注意距离CC2531EMK上连接器引脚1最近的红线(即距离USB接口最远的)。. Pay careful attention to have the red line on the cable nearest pin 1 of the connector on the CC2531EMK (i.e. furthest away from the USB connector).
2. 将CC2531EMK插入到PC上的一个USB接口用来供电。
3. 用CC调试器的USB调试线将PC和CC调试器连接起来。CC调试器上应该有一个绿灯是亮的。如果没有,请检查CC2531EMK的电源供电和引脚1电缆的走线。并尝试推CC调试器上的按钮。
4. 使用SmartRF闪存编程器对CC2531EMK进行编程。
§ 下载文件:LightingGateway USB.zip,提取SampleGateway-USB-ProdSBL..hex 。
§ 在“What do you want to program?” 窗口中,选择CCxxxx SoC或MSP430。
§ 在闪存镜像窗口,使用“...” 按钮来选择SampleGateway-USB-ProdSBL.hex文件。
§ 在动作部分选择擦除,编程和验证。
§ 单击“执行操作”按钮。
§ 经过30秒左右的时间,底部的状态窗口会提示成功。
4.1.6.3. 将CC2531EMK连接到Beaglebone
1. 从PC中移除CC2531EMK。
2. 从CC2531 EMK上移除CC调试线(如果使用了)。
3.将CC2531EMK插入到BeagleBone上的USB-A插座。
4.推动BeagleBone上的S1 (以太网插孔旁的微小按钮开关)重新启动Linux。
BeagleBone和CC2531EMK ZigBee照明网关现在应该可以运作了。在Ninja Blocks 协议中现在被称为一个NinjaBlock。In Ninja Blocks terms this is now called a NinjaBlock.
4.1.7. 在Ninja Blocks门户网站上创建一个帐户(只需要一次)
要创建一个NinjaBlocks帐户:
1. 浏览http://a.ninja.is/home
2. 使用beaglebone序列号的前5位(数字)作为邀请码。
4.1.8. 使BeagleBone/CC2531EMK Block与 Ninja Blocks Web Portal配对
1. 浏览http://a.ninja.is/home。
2. 登录到一个帐户。
3. 进入到仪表板,点击配对块。然后就应该询问块的序列号。输入BeagleBone以太网插孔上的号码(在之前的步骤中已经指出)。
现在,BeagleBone Block应该成功与Ninja Blocks portal.配对了。
The BeagleBone Block should now be successfully paired with the Ninja Blocks portal
4.1.9. 将ZigBee设备连接到网关
1. 按下CC2531EMK dongle上的S1按钮,红色LED将闪烁60秒,在这期间,设备将连接到网络。
2. 其它ZigBee设备按照设备的具体说明,让它们加入ZigBee网络。
§ 对于Zlights您需要:
§ 按住按钮3秒,重设恢复出厂设置,并等待5秒,直至LED闪烁(这一步可以跳过,如果ZLight已经恢复出厂设置)。
§ 按住按钮大于10s,使其加入网络。
3. 一旦加入,灯设备将出现在Ninja仪表板。
4. 设备测试以及正常工作过程是:
§ TI的ZigBee光链路Zlight:https://estore.ti/CC2530ZDK-ZLL-CC2530-ZigBee-Light-Link-Development-Kit-P4539.aspx
§ 飞利浦色调灯泡:Bulbs:http://store.apple/uk/product/HA780ZM/A/philips-hue-connected-bulb-single-pack?fnode=6f
§ Cleode SmartPlug:http://www.cleode.fr/en/produits.php?page=zplug
§ Cleode ZRC(开关):http://www.cleode.fr/en/produits.php?page=zrc
§ Cleode ZMOVE(动作感应器):http://www.cleode.fr/en/produits.php?page=zmove
一旦加入,该设备在NinjaBlocks仪表板上应该有相关的部件。
一旦加入,该设备在NinjaBlocks仪表板上应该有相关的部件。
4.1.10. 一旦搭建好
示例一旦搭建好,BeagleBone 和灯的电源可以关闭,重新供电时,无需重复上述步骤就可以重新运行。但是目前也发现到一些错误,为避免出现问题,先断开ZLights的电源和再断开网关的电源。当系统加电时,先给beaglebone加电再给ZLights供电。在添加新设备之前,确保beaglebone上的软件正在运行,在a.ninja.isWeb应用程序执行设置 - >块。to do the got to settings->blocks on the a.ninja.is web application.
4.1.11. 在Ubuntu PC上运行演示
ZigBee服务器可以运行在任何Linux机器上,在Linux PC上运行演示,下从这里下载zip源文件或在服务器/目录克隆这个git。您使用的是:您将需要改变你使用的Linux机器的server/i486-linux-gnu中makefile中的GCC线目标为GCC编译器: SBU_REV =“0.1”
You will need to change the GCC line in makefile in server/i486-linux-gnu to target the gcc compiler for the Linux Machine you are using: SBU_REV= "0.1"
GCC=/usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc
CFLAGS = -Wall -DVERSION_NUMBER=${SBU_REV} ....
然后可以从命令行创建ZigBee服务器。
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# make clean
rm -rf *.o zllGateway.bin
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# make
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o zll_controller.o ../Source/zll_controller.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o zllSocCmd.o ../Source/zllSocCmd.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_devicelist.o ../Source/interface_devicelist.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_grouplist.o ../Source/interface_grouplist.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_scenelist.o ../Source/interface_scenelist.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_srpcserver.o ../Source/interface_srpcserver.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o socket_server.o ../Source/socket_server.c
一旦建成,应用程序可能需要改变权限才能够执行:
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# chmod +x zllGateway.bin
然后服务器可以从命令行起动,它会等待客户端连的接:
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# ./zllGateway.bin
./zllGateway.bin -- Jun 7 2013 08:27:24
Usage: ././zllGateway.bin <port>
Eample: ././zllGateway.bin /dev/ttyACM0
attempting to use /dev/ttyACM0
zllMain: waiting for poll()
4.2. 客户端应用程序
除了Java脚本的NinjaBlocks驱动NinjaBlocks drivers,还有一些由TI开发的C和JAVA(安卓)客户端应用程序示例。
4.2.1. C客户端应用程序
C客户端应用程序压缩文件在这里,或克隆这个 git,在client/CClients/ directory。已提供了2个例子。它们应该使用client\CClients\<app>CmdLine\i486-linux-gnu提供的制作文件在Linux机器上搭建。当打开本地套接字(127.0.0.1)时可以在作为服务器的Linux机器上运行C客户端的例程,要构建示例,您将需要改变你使用的Linux机器的server/i486-linux-gnu中makefile中的GCC线目标为GCC编译器: SBU_REV =“0.1”
You will need to change the GCC line in makefile in server/i486-linux-gnu to target the gcc compiler for the Linux Machine you are using: SBU_REV= "0.1"
GCC=/usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc
CFLAGS = -Wall -DVERSION_NUMBER=${SBU_REV} ....
然后就可以搭建客户端的例子:
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/client/CClients/lightFlashCmdLine/i486-linux-gnu# make clean
/bin/rm -f flashled.bin *.o
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/client/CClients/lightFlashCmdLine/i486-linux-gnu# make
gcc -c -Wall -g -std=gnu99 -I../../../../server/Source -I../../Source -I../Source ../Source/flashled.c
gcc -c -Wall -g -std=gnu99 -I../../../../server/Source -I../../Source -I../Source ../../Source/socket_client.c
gcc flashled.o socket_client.o -lpthread -o flashled.bin
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/client/CClients/lightFlashCmdLine/i486-linux-gnu#
一旦建成,应用程序将需要被复制到服务器正在运行的机器上并修改运行的权限:
ubuntu@ninjablock:~$ chmod +x flashled.bin
4.2.1.1. 客户端应用listDevsCmdLine
当运行示例时,打印出目前在服务器设备列表中的设备:
IP addresses for 127.0.0.1:
IPv4: 127.0.0.1
Trying to connect...
Connected.
RPSC_ZLL_NewDevice[0]: 2b4f:b
该示例将继续运行并报告新的设备加入网络,直到有按键按下。
4.2.1.2. 客户端应用lightFlashCmdLine
这个例子允许你点亮一个灯。其用法如下:
./flashled.bin <device/group addr> <addr mode> <ep> <periodms> <loops>
下面的操作将使由listDevsCmdLine报告的灯以每秒一次开关的速度闪烁10次:
./flashled.bin 0x2b4f 2 0xb 1000 10
Port: 11235
IP addresses for 127.0.0.1:
IPv4: 127.0.0.1
Trying to connect...
Toggling Light 2b4f:b - 0
Toggling Light 2b4f:b - 1
Toggling Light 2b4f:b - 2
Toggling Light 2b4f:b - 3
Toggling Light 2b4f:b - 4
Toggling Light 2b4f:b - 5
Toggling Light 2b4f:b - 6
Toggling Light 2b4f:b - 7
Toggling Light 2b4f:b - 8
Toggling Light 2b4f:b - 9
4.2.2. Android客户端应用程序
要安装一个Android设备上的应用程序,从这里获取apk文件,将其复制到手机内存卡,并在文件浏览器打开,,或选择发送到手机上的一个帐户,并打开附件。
应用程序需要你在beagleBone所在的同一网络上,输入beagleBone的IP地址[c9] 。这可以从云服务的Web界面 设置 - >块中(settings->block)获得,或在BeagleBone的控制台窗口中键入'ifconfig<enter>',,应该输出下面的信息:
ubuntu@ninjablock:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 78:c5:e5:d9:ba:f7
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::7ac5:e5ff:fed9:baf7/64 Scope:Link
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1
RX packets:12241 errors:0 dropped:0 overruns:0 frame:0
TX packets:3827 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2024982 (2.0 MB) TX bytes:627017 (627.0 KB)
上面的例子获得的IP地址是192.168.1.12
照明控制器应用程序允许您选择一盏灯,并使用APP控制它。您还可以绑定开关(如:Cleode ZRC with 5 switches)或运动传感器(如Cleode ZMOVE),以便开关/或运动传感器可以直接控制灯。
该应用程序还支持其他功能,如:
§ 显示网络上的设备列表
§ 捆绑
§ 创建组
§ 存储和调用场景。
Android应用程序完整的源代码和Eclipse项目可以在这里的下载或克隆thisgit。
4.2.2.1. Android应用程序菜单
这些功能都可以通过菜单进入,可以通过按下硬键盘软键盘菜单键,具体取决于Android设备的型号和版本:
AndroidAppMenu
我们试图使这项工作对所有品牌的Android设备和所有版本的Android都能使用,但如果你发现一个不允许你选择菜单的设备或Android版本,请报告E2E - http://e2e.ti/support/的的low_power_rf/f/158.aspx,使用“ZigBee网关”作为标记。
4.2.2.2. Android应用设备列表
下面的菜单选项被选中时,会显示一个设备列表。
AndroidAppMenuList
4.2.2.3. Android应用绑定
选择“绑定”菜单项:
AndroidAppMenuBind
4.2.2.4. Android应用组
选择“组”菜单项:
AndroidAppMenuGroups
4.2.2.5. Android应用场景
选择“场景”菜单项:
AndroidAppMenuScenes
4.3. 源代码和更多详情
接口和源更详细的信息可以在这里找到。
5. ZigBee Lighting Gateway SW:
5.1. Introduction:
本wiki描述了zigbee 点灯网关的软件层及其接口
软件系统结构框图如下所示:
主要有一下几层:
l 提供了许多的客户端例程:
n 基于javaScript的Ninja zigbee 用户驱动,用于与NinjaBlock提供的云端服务进行连接。
n 基于java的Zigbee 用户驱动,用于android应用程序中
n 基于C的zigbee用户驱动,用于Linux命令行例程
l Linux下的点灯网关软件提供:
Socket API:高度抽象的socket接口,用于通知zigbee网络上的更高层设备和通过TCP/IP实现与zigbee设备间信息的收发
ZigBee 抽象层:为了让网络上设备相关的信息在系统重启后依然存在,该层以文件的形式维护和存储了设备列表、分组、情景模式。
Zigbee驱动:定义网关与连接的Zigbee芯片间的USB/UART接口,实现了一系列的函数:
n 实现物理层传输协议
n 实现到高层软件模块的ZCL信息抽象。实现了像“发送颜色命令”这样的高层Zigbee API,以及解析接收到的ZCL帧数据和收到诸如“报警指示”等消息时去调用回调函数。
l Zigbee 点灯网关固件:
实现了Zigbee协议栈-Home Automation Profile。通过为主机提供一个简单的Zigbee点灯网关主机接口,固件库使上层主机有效避免了直接实现复杂Zigbee协议的问题。
ZStack-Lighting-1.0.1 Host Interface C Examples
5.2. ZigBee照明网关固件(ZigBee Lighting Gateway FW)
现在提供的ZigBee照明网关是基于ZStack CCC2530-2.5.1a家庭自动化示例应用程序。 主机接口是从实施的ZStack-Lighting-1.0.1远程移植过来的。
ZigBee照明网关固件的特点是:
- 建立一个ZigBee网络作为协调器。
- HA网关主机接口是通过USB / UART来实现的。
- 发现设备加入网络和传递信息到主机。
- 新设备加入时,使用开关S1打开网络。
- 从主机的串行引导更新固件。
ZigBee网关固件的源代码是以一个ZStack-CC2530-2.5.1a版本补丁来提供的。
- 这里 可以得到ZStack-CC2530-2.5.1a版本
- 这个补丁可以在这里找到File:Z-Stack-Lighting-gateway.zip
5.2.1. ZigBee照明网关固件的开关和LED分配
§ 目前只使用了S1按钮, 有2个功能:
§
§ 简单照明网关的开关分配
开关 | 按压 | 功能 |
S1 | 上电时按下按钮。 | 将设备设置成bootloader模式。 具体描述在这里。 |
S1 | 运行的ZigBee照明网关时的任何按压 | 打开网络为60s。 在这期间,新设备可以连接。 |
§
§ CC2531评估包中有两个LED灯,分别为红色和绿色,这些灯的状态的意思是:
§
§ 简单照明网关的LED分配
LED | 状态 | 功能 |
绿色 | 启动时闪烁 | 正在进行初始化 |
绿色 | 常亮 | 已完成初始化 |
红色 | 闪烁(每隔1s短闪) | 网络对新的设备的加入开放。 |
绿色 | 闪烁(在2秒的时间内8次快速闪烁) | 发现了新的设备。 |
5.2.2. ZigBee Lighting Gateway Host Interface
ZigBee照明网关主机接口暴露使用的MT(管理和测试)接口。 MT子系统常常给这些消息是规定路线的是MT_APP,这个通常被测试团队所使用,并且MT包允许在ZStack应用和UART之间传递。 这种机制第一次被使用在ZStack-Lighting-1.0.1主机接口上,并已经被移植到了ZigBee照明网关中。
5.2.2.1. MT APP头
MT APP头由2个命令字节和有效载荷组成:
MT_APP头 | |||
LEN | CMD0 | CMD1 | 有效载荷 |
1字节 | 1字节 | 1字节 | LEN字节 |
CMD0 总是被设置为0X49(MT_RPC_CMD_AREQ | MT_RPC_SYS_APP),代表MT_APP。
CMD1总是被设置为0x0,代表主机接口消息。
5.2.2.2. 传入的(从主机发出)MT APP消息
有2种类型的传入MT_APP的消息,控制平面和数据平面。 消息类型是数据平面型或者控制平面型是由MT_APP消息中的集群 ID来决定的,如果cluster ID是0xFFFF,那么它是一个控制平面的消息。 如果cluster ID不是OxFFFF,那么它是一个数据平面消息,这将永远是一个的ZCL帧,并有有效的(非0xFFFF)cluster ID。
传入的(从主机发出)MT APP控制平面消息
的MT_APP控制平面消息的结构如下所示:
MT消息格式 | |||||||
应用的终端节点 | 保留的 | ZLL_MT_APP集群ID | Date长度 | 保留的 | ZLL_MT_APP 命令ID | 保留的 | ZLL_MT_APP命令 有效载荷 |
1字节 | 3个字节 | 2个字节 | 1字节 | 3个字节 | 1字节 | 2个字节 | X字节(命令定义) |
- 应用程序终端节点:这是应用程序的应用程序的终端节点,它应该被设置为0x0B
- 保留的:所有保留的字节应设置为0x00
- MT_APP集群ID:应设置为0xFFFF
- Date长度:这应该是6 +MT_APP命令中参数的个数
- MT_APP命令ID:见下文支持的命令
ZigBee照明网关目前支持的MT APP消息是:
发送给CC253x的MT APP命令 | ||
ZLL_MT_APP命令ID | 值 | 参数(1个字节) |
保留(用于ZLL_MT_APP_RPC_CMD_TOUCHLINK) | 0X01 | N / A |
MT_APP_RPC_CMD_RESET_TO_FN | 0X02 | N / A |
保留(ZLL_MT_APP_RPC_CMD_CH_CHANNEL) | 0X03 | 目标通道 |
保留(用于ZLL_MT_APP_RPC_CMD_JOIN_HA) | 0x04 | N / A |
MT_APP_RPC_CMD_PERMIT_JOIN | 0X05 | 持续时间,发送允许连接 |
保留(用于ZLL_MT_APP_RPC_CMD_SEND_RESET_TO_FN) | 0X06 | N / A |
MT_APP_RPC_CMD_RESET_TO_FN
这个命令被发送到照明网关。 这将导致CC253x的ZigBee照明网关复位到出厂新,它会清除NV(非易失性存储器)并在5s后复位。
MT_APP_RPC_CMD_PERMIT_JOIN
这个命令被发送到照明网关。 这个命令将导致的CC253x ZigBee照明网关为新设备的加入打开网络。 这个命令有2个参数:
MT_APP_RPC_CMD_PERMIT_JOIN参数 | |
1字节 | 1字节 |
持续时间 | 发送允许加入 |
- 持续时间(可选):打开网络的时间(以秒为单位)。 默认为60秒。
- 发送允许加入(可选):如果为真,ZigBee照明网关将允许设备与之连接,同时广播一个允许加入信息,连接设备可通过网络与其他设备关联。 因此,连接并不仅仅局限于ZigBee照明网关设备的范围。如果为假,只有ZigBee照明网关被允许加入网络而且也不会有消息被广播到其它设备。 默认为真。
传入(从主机发出)MT APP数据平面消息
ZCL_MT_APP消息产生一个接口发送ZCL命令。 这些消息控制网络中设备的属性(如:开/关,电平等),ZCL消息并不能告知一个设备离开网络。 该接口可用于支持任何ZCL命令,开发人员应研读ZCL 规范来决定主机应该支持何种命令。
如果Cluster ID是有效的,那么CMD1字节就可以被忽略。 由于集群ID是可以改变的,所以CMD1是用来区分数据平面和控制平面。对于传入的消息,一个单一CMD1值可以以同样的方式来指定数据平面。来自ZStack-Lighting-1.0.1的 执行情况并在审查过程中被错过了。
如下所示的是ZCL_MT_APP消息的结构:
MT APP ZCL消息格式 | |||||||||
应用终端节点 | 网络地址 | 目的终端节点 | ZCL 集群ID | Date 长度 | 地址模式 | ZCL 帧控制域 | ZCL业务序列号 | ZCL 命令ID | ZCL命令 有效载荷 |
1字节 | 2个字节 | 1字节 | 2个字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | X字节(由命令定义) |
- 应用程序终端节点:这是应用的终端节点ZLL的应用程序,应设置为0x0B
- 保留的:所有保留的字节应设置为0x00。
- 网络地址:ZCL消息发送到该设备的网络地址(或GROUP ID取决于地址模式),TouchLink时发送MT_APP_ZLL_TL_IND消息到设备的网络地址。
- 目标终端节点:ZCL消息发送到该设备的终端节点, TouchLink时发送T_APP_ZLL_TL_IND消息到设备的终端节点。
- ZCL集群ID:命令所要发送的集群的ID。 请参阅ZCL规范 。
- Date长度:这应该是6 +ZCL命令中参数的个数。
- 地址模式:ZCL消息寻址模式:
地址模式 | |
AddrNotPresent | 0 |
AddrGroup | 1 |
Addr16Bit | 2 |
Addr64Bit | 3 |
AddrBroadcast | 15 |
对于大多数应用程序而言,一个16位的单播地址或者一个地址模式为AddrGroup模式的组播地址是必需的。
- ZCL帧控制域:定义ZCL帧的特点:
帧控制字节 | ||||
位7 - 5 | 第4位 | 第3位 | 第2位 | 位1 .. 0 |
保留的 | 禁用默认响应 | 方向(客户端/服务器) | 制造商专用 | ZCL命令类型 |
- ZCL帧控制域的位:
- 保留的:应该为0x0
- 禁用默认响应:定义接收器收到ZCL消息是否应该发送一个默认的响应。
- 方向(客户端/服务器):定义消息被发往客户端或服务器的集群。
- 制造商专用:定义一个ZCL消息是由ZCL规格定义,或者它是一个制造商的特定的扩展。
- ZCL命令类型:定义的是具体到群集的命令。 例如,一个开/关的消息是特定的“开/关”群集,但不读出的开/关的属性是一个ZCL。
- ZCL事务序列号:每个ZCL消息的业务序列号应该是递增的。
- ZCL命令ID:要发送的的ZCL命令的命令ID。 请参阅ZCL规范 。
- ZCL命令有效载荷:被发送的的ZCL命令的有效载荷。 请参阅ZCL规范 。
5.2.2.3. MT APP消息传出(到主机)
同样的,传出的MT_APP消息也分为两种,控制平面和数据平面。 然而,不再使用的集群ID来识别消息类型,所有的消息都是相同的格式并使用CMD1的MT_APP的标头来区分消息类型。
数据平面消息都使用命令ID的MT_APP_RSP(0X80),其他所有的命令ID为控制平面消息。
MT APP命令发送的CC253x | |||
命令 | 值 | 参数 | 控制(c)或数据(d)平面 |
MT_APP_RSP | 0X80 | ZCL有效载荷,见下文。 | d |
保留(MT_APP_ZLL_TL_IND) | 0X81 | N / A | |
MT_APP_ZLL_NEW_DEV_IND | 0X81 | 见下文。 | c |
MT_APP_RSP
有效载荷MT_APP_RSP 和传入(从主机发出)MT APP数据平面消息一样。
MT_APP_ZLL_NEW_DEV_IND
当一个设备加入该网络时,CC253x ZigBee家庭自动化网关发送该命令。
MT消息格式 | |||||
网络地址 | 终端节点 | 文档编号 | 设备ID | 版本 | IEEE地址 |
2个字节 | 1字节 | 2个字节 | 1字节 | 1字节 | 8个字节 |
- 网络地址:16b目标设备的网络地址
- 终端节点:目标设备的终端节点
- 文档编号:目标设备的文档编号
- 设备ID:目标设备的设备ID
- 版本:目标设备的版本
- IEEE地址:64b目标设备的IEEE地址
ZigBee照明网关主机的应用程序必须存储网络地址和端点的信息,以便于发送ZCL_MT_APP消息来控制网络上的设备。IEEE地址也要被 存储来绑定请求消息。
物理传送
UART数据包中含有的MT消息,消息是按照2.1节中的“Z-Stack Monitor and Test API.pdf”解释的RPC(Remote Procedure Call,远程过程调用)协议格式形成的,RPC数据包中有一个指定路由的MT头消息,在这种情况下,MT header需要改变其格式,改变格式是依据消息传到运行在CC253x ZStack FW的ZLL应用程序的路由决定 。
数据包的结构如下所示:
RPC报文格式 | ||||
RPC头 | MT头 | MT_APP头 | ZLL_MT_APP / ZCL_MT_APP的命令 | RPC帧校验序列 |
远程过程调用
RPC数据包包含一个SOF(帧开始)字节来同步UART发送的数据包,然后由RPC有效载荷(这个情况下是MT消息)和最后的FCS(帧校验序列)。
RPC数据包格式 | ||
SOF | 有效载荷 | FCS |
1字节 | 3 - 256字节 | 1字节 |
- SOF:必须设置为0xFE
- 有效载荷:在这种情况下,它是MT消息,请参阅第XXX \ N
- FCS:参阅第XXX节
帧检验序列
FCS可以由下面的C代码计算:
/*********************************************************************
* @fn calcFcs
*
* @brief populates the Frame Check Sequence of the RPC payload.
*
* @param msg - pointer to the RPC message
*
* @return none
*/
void calcFcs(unsignedchar*msg,int size)
{
unsignedchar result =0;
int idx =1;//skip SOF
int len =(size - 1); // skip FCS
while((len--)!= 0){
result ^= msg[idx++];
}
msg[(size-1)]= result;
}
5.3. Linux Lighting Gateway SW:
Linux网关源代码在这里,在下面的章节中将更详细的描述。
5.3.1. Linux照明网关的ZigBee驱动程序
ZigBee的驱动程序连接到CC2531EMK的主机接口并将主机接口的消息翻译成功能活动。
主机首先需要打开到CC253x的串口,这个功能在zllSocOpen中实现。
zllSoc_fd = zllSocOpen( argv[1]);
函数返回一个文件描述符,以便应用程序可以测试CC253x设备。这可以用来监测串行端口上的输入,当有来自于CC253x的数据时,必须调用消息处理函数进行来数据读取和解析。
zllSocProcessRpc ();
从CC253x传送来消息,接下来被转化为回调函数。主机应用程序注册的回调函数如下:
§ zllSocTlIndicationCb -TouchLink触摸指示回调(用于ZLL控制的桥梁,而不是关于HA照明网关)
§ newDevIndicationCb -新设备指示回调
§ zllSocZclGetStateCb –ZCL状态响应回调
§ zllSocZclGetLevelCb –ZCL等级响应回调
§ zllSocZclGetHueCb –ZCL色调响应回调
§ zllSocZclGetSatCb –ZCL饱和度响应回调 // saturation
这是通过填充有兴趣接收消息的回调函数表中的回调函数来完成的,设置那些不为空的回调函数,并把它传递给下面的回调注册函数:
static zllSocCallbacks_t zllSocCbs =
{
null, // pfnTlIndicationCb - TouchLink Indication callback (used for ZLL control bridge, not relevant for HA Lighting Gateway)
newDevIndicationCb, // pfnNewDevIndicationCb - New Device Indication callback
zclGetStateCb, // pfnZclGetHueCb - ZCL response callback for get Hue
zclGetLevelCb, // pfnZclGetSatCb - ZCL response callback for get Sat
zclGetHueCb, // pfnZclGetLevelCb_t - ZCL response callback for get Level
zclGetSatCb // pfnZclGetStateCb - ZCL response callback for get State
};
...zllSocRegisterCallbacks( zllSocCbs );
一旦打开串行端口,主机可以使用以下函数发送命令:
/ ///Control API's
void zllSocResetToFn(void); //Resets the Gateway to its Factory New state.
void zllSocSendResetToFn(void);//Reserved for use with ZLL Controller
void zllSocOpenNwk(void); //Opens the network for 60s for new devices to join.
//ZCL Set API's
void zllSocSetState(uint8_t state, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetLevel(uint8_t level, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetHue(uint8_t hue, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetSat(uint8_t sat, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetHueSat(uint8_t hue, uint8_t sat, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
//ZCL Get API's
void zllSocGetState(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocGetLevel(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocGetHue(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocGetSat(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
5.3.2. Linux照明网关的ZigBee抽象
“ZigBee抽象层用来存储设备,组和ZigBee网络上存在的场景列表。
5.3.3. Linux照明网关的数据文件
Linux照明网关创建和维护.dat文件来存储信息,这些信息需要持续一个电源周期。此信息是:
§ 已经加入ZigBee网络的设备。
§ 已创建的群组。
§ 已创建的场景。
5.3.3.1. 设备数据文件( Device Data File )
Linux照明网关在同一目录下创建一个设备列表的可执行文件,文件被称为interface_devicelist.dat,是一个二进制文件。当zllSocCmd模块接收到一个MT_APP_ZLL_NEW_DEV_IND,它增加了一个设备到列表中。列表中的设备用';'分隔;设备信息存储的格式是:
Linux照明网关的设备清单格式 | |
字节Bytes | 描述Description |
8 | IEEE地址 IEEE Address |
2 | 网络地址 Network Address |
1 | 端点 Endpoint |
2 | 配置文件ID profile ID |
2 | 设备ID Device ID |
1 | 版本 Version |
1 | 设备名称长度 n。Device name length n. |
n | 设备名称 Device name |
1 | 状态(以供将来使用) status (for future use) |
5.3.3.2. 组数据文件(Group Data File)
Linux照明网关在同一目录下创建一个组列表的可执行文件,文件被称为interface_grouplist.dat,是一个二进制文件。当Linux照明网关模块接收到一个创建组的TCP / IP命令时,它发送相关的ZigBee消息来创建组,并将组添加到列表中。此ZigBee消息会引起ZigBee网络中设备将它们自己添加到列表中,该列表中的成员不存储在interface_grouplist.dat文件中,在文件中仅组被创建。列表中的每个组用';'分隔。组信息存储的格式是:
Linux的照明网关设备清单格式 | |
字节 | 描述 |
2 | 组ID Group ID |
1 | 组名称长度 n。 Group name length n. |
n | 组名称 Group name |
5.3.3.3. 场景数据文件(Scene Data File)
Linux照明网关在同一目录下创建一个场景列表的可执行文件,文件被称为interface_scenelist.dat,是一个二进制文件。当Linux照明网关模块接收到创建一个场景TCP / IP命令时,它会发送相关的ZigBee消息来创建场景,并将其添加到列表中。ZigBee消息会导致ZigBee网络上的设备创建和存储一个场景,场景的设置存储在ZigBee设备中而不是用interface_scenelist.dat文件存储的。列表中的每一个场景用';'分隔;。场景信息存储的格式是:
Linux的照明网关设备清单格式 | |
字节 | 描述 |
2 | 组ID Group ID |
1 | 场景ID Scene ID |
1 | 场景名称长度 Scene name length n |
n | 场景名称 |
5.3.4. 照明网关插座API (Lighting Gateway Socket API)
经过TCP / IP套接字发送的命令是二进制命令,消息的结构引用了一个Socket远程过程调用,其格式如下表所示:
SRPC消息格式 | ||
CMD字节 | 命令长度(N) | 数据 |
1字节 | 1字节 | n个字节 |
5.3.4.1. 发送到照明网关的命令
可以发送到照明网关的命令是:
SRPC发送的命令 | |
描述 | CMD ID |
0X80 | RPCS_CLOSE |
0X81 | RPCS_GET_DEVICES |
0X82 | RPCS_SET_DEV_STATE |
0X83 | RPCS_SET_DEV_LEVEL |
0X84 | RPCS_SET_DEV_COLOR |
0X85 | RPCS_GET_DEV_STATE |
0x86 | RPCS_GET_DEV_LEVEL |
0x87 | RPCS_GET_DEV_HUE |
0x88 | RPCS_GET_DEV_SAT |
0x89 | RPCS_BIND_DEVICES |
0x8a | Reserved |
0x8b | Reserved |
0x8c | Reserved |
0x8d | Reserved |
0x8E | RPCS_GET_GROUPS |
0x8f | RPCS_ADD_GROUP |
0x90 | RPCS_GET_SCENES |
0x91 | RPCS_STORE_SCENE |
0x92 | RPCS_RECALL_SCENE |
0x93 | RPCS_IDENTIFY_DEVICE(TBD) |
0x94 | RPCS_CHANGE_DEVICE_NAME(TBD) |
0x95 | RPCS_REMOVE_DEVICE(TBD) |
0x96 | Reserved |
RPCS_CLOSE
此命令将关闭ZigBee HA Gateway SW Linux应用。为了避免错误地关闭应用程序,这个命令的有效负载是一个2字节的幻数。
(在c语言中,把直接使用的常数叫做幻数。在编程时,应尽量避免使用幻数,因为当常数需要改变时,要修改所有使用它的代码,工作量巨大,还可能有遗漏。因此通常把幻数定义为宏或枚举。建议使用枚举,因为它是编译阶段存在的符号,编译器的提示会更清晰、更准确。
#define ARRAY_SIZE 10
enum{ARRY_SIZE = 10}
)
RPCS_CLOSE消息格式 | ||
字节Bytes | 描述Description | 值 Value |
1 | 命令ID Command ID | 0X80 |
1 | 长度 Length | 0X2 |
2 | 幻数值 Magic Value | 0x2536 |
RPCS_GET_DEVICES
该命令将被用来请求设备列表。这将导致的ZigBee HA网关为列表中每个设备发送RPCS_NEW_ZLL_DEVICE消息。
RPCS_GET_DEVICES消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X81 |
1 | 长度 Length | 0 |
RPCS_SET_DEV_STATE
此命令是用来改变一个设备或一组设备的状态。它有两个模式,单播,针对一个特定的设备;组播,针对先前已通过RPCS_ADD_GROUP命令创建的一组设备。
RPCS_SET_DEV_STATE消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X82 |
1 | 长度 Length | 13 |
1 | 地址模式 Address Mode | 1 = 组播或2 =单播 1=groupcast OR 2=unicast |
2 | 网络地址 Network Address | NwkAddr或组ID NwkAddr OR Group ID |
6 | 保留的 Reserved | 0 |
1 | 端点 Endpoint | 设备端点或为0xFF Devices Endpoint OR 0xFF |
2 | 保留的 Reserved | 0 |
1 | 状态 State | 0或1(开启或关闭) 0 or 1 (on or off) |
RPCS_SET_DEV_LEVEL
此命令是用来改变一个设备或一组设备的光的水平。它有2个模式,单播,针对一个特定的设备;组播,针对先前已通过RPCS_ADD_GROUP命令创建的一组设备。
RPCS_SET_DEV_LEVEL消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X83 |
1 | 长度 Length | 15 |
2 | 地址模式 Address Mode | 1 = 组播或2 =单播 1=groupcast OR 2=unicast |
2 | 网络地址 Network Address | NwkAddr或组ID NwkAddr OR Group ID |
6 | 保留的 Reserved | 0 |
2 | 端点 Endpoint | 端点或为0xFF Endpoint OR 0xFF |
2 | Reserved | 0 |
2 | 转换时间 Transition time | 0-0xFFFF的(100ms单位) |
1 | 水平 Level | 0-0xFF |
RPCS_SET_DEV_COLOR
此命令是用来改变一个设备或一组设备的光的颜色。它有两个模式,单播,针对一个特定的设备;组播,针对先前已通过RPCS_ADD_GROUP命令创建的一组设备。
RPCS_SET_DEV_COLOR消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X84 |
1 | 长度 Length | 16 |
2 | 地址模式 Address Mode | 1 = 组播或2 =单播 1=groupcast OR 2=unicast |
2 | 网络地址 Network Address | NwkAddr或组ID NwkAddr OR Group ID |
6 | 保留的 Reserved | 0 |
1 | 端点 Endpoint | 端点或为0xFF Endpoint OR 0xFF |
2 | 保留的 Reserved | 0 |
1 | 色调 Hue | 0-255 |
1 | 饱和度 Saturation | 0-255 |
RPCS_GET_DEV_STATE
此命令用于请求设备的开/关状态。当命令发送到支持开/关状态读取的设备时,响应将导致ZigBee HA Gateway SW发送RPCS_GET_DEV_STATE_RSP消息。
RPCS_GET_DEV_STATE消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X85 |
1 | 长度 Length | 0 |
RPCS_GET_DEV_LEVEL
此命令用于请求设备的光照水平。当命令发送到支持光照水平读取的设备时,响应将导致ZigBee HA Gateway SW发送RPCS_GET_DEV_LEVEL_RSP消息。
RPCS_GET_DEV_LEVEL消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x86 |
1 | 长度 Length | 0 |
RPCS_GET_DEV_HUE
此命令用来请求设备色调。当发送到支持色调读取的设备时,响应将导致ZigBee HA Gateway SW发送RPCS_GET_DEV_HUE_RSP消息。
RPCS_GET_DEV_HUE消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 87H |
1 | 长度 Length | 0 |
RPCS_GET_DEV_SAT
此命令用来请求设备的色饱和度。当发送到支持色饱和度读取的设备时,响应将导致ZigBee HA Gateway SW发送RPCS_GET_DEV_SAT_RSP消息。
RPCS_GET_DEV_SAT消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x88 |
1 | 长度 Length | 0 |
RPCS_BIND_DEVICES
This command is used to request a devices add another device to its binding table. When sent to the source device supports the output cluster of the ClusterID specified the source device will add the desitnation device to its binding table. The will result in the source device sending cluster specific messages to the distination device. an example use case would be a PIR sensor as the source device binding its on/off cluster to a Light to turn the light on/off based on motion detect or not detected.
此命令是用来请求一个设备添加其他设备到其绑定列表。当该命令发送到支持集群ID为“ClusterID”输出簇的源设备时,指定的的源设备将添加目的设备到其绑定表。这将导致源设备发送集群特定消息给目的设备。一个示例如:将一个红外传感器作为源设备将其开/关集群绑定到一个灯,是否有运动侦测到决定灯的亮/灭。
RPCS_BIND_DEVICES消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x88 |
1 | 长度 Length | 0 |
RPCS_GET_GROUPS
此命令将用于请求组列表。这将导致ZigBee HA Gateway SW为组列表中每个组(由RPCS_ADD_GROUP创建)发送RPCS_GET_GROUPS_RSP消息。
RPCS_GET_GROUPS消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x8e |
1 | 长度 Length | 0 |
2 | 源网络地址 Source Network Address | NWK地址 Nwk Addr |
1 | 源端点 Source Endpoint | 端点 Endpoint |
8 | 源IEEE地址 Source IEEE Addr | IEEE地址 IEEE Addr |
1 | 目标端点 Destination Endpoint | 端点 Endpoint |
8 | 目的地IEEE地址 Destination IEEE Addr | IEEE地址 IEEE Addr |
2 | 集群ID Cluster ID | 集群ID ClusterID |
RPCS_ADD_GROUP
此命令用来发送一个ZigBee消息将一个设备添加到一个组,如果该组不存在,则在组列表中创建该组。它有两个模式,单播,针对一个特定的设备;组播,针对先前已通过RPCS_ADD_GROUP命令创建的一组设备。此命令将得到一个含有该组的组ID的RPCS_ADD_GROUP_RSP。
RPCS_ADD_GROUP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x8f |
1 | 长度 Length | 13 + n |
1 | 地址模式 Address Mode | 1 = 组播或2 =单播 1=groupcast OR 2=unicast |
2 | 网络地址 Network Address | NwkAddr或组ID NwkAddr OR Group ID |
6 | 保留的 Reserved | 0 |
1 | 端点 Endpoint | 设备端点或为0xFF Devices Endpoint OR 0xFF |
2 | 保留的 Reserved | 0 |
1 | 组名称长度 Group name length | n |
Ñ | 组名称字符串 | 例如:“饭厅” "Dinning Room" |
RPCS_GET_SCENES
该命令将被用来请求一个场景列表。它会导致ZigBee HA Gateway SW为场景列表中的每个场景(由RPCS_STORE_SCENE创建)发送RPCS_GET_SCENE_RSP消息。
RPCS_GET_SCENES消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 为0x90 |
1 | 长度 Length | 0 |
RPCS_STORE_SCENE
This command is used to send a ZigBee message to store a scene to a group and to create the scene in the scene list if it does not yet exist. It has 2 modes, unicast to target a particular device or groupcast to target a group of devices that has previously been created a previous RPCS_ADD_GROUP command. It is highly recommended that this is only used in groupcast mode to store a scene to the entire group that it applies to rather than individual devices. This command will result in a RPCS_ADD_SCENE_RSP containing the Group ID and Scene ID of the scene.
此命令是用来发送一个ZigBee消息将一个场景储存到一个组,如果该场景不存在,则新建该场景。它有两个模式,单播,针对一个特定的设备;组播,针对先前已通过RPCS_ADD_GROUP命令创建的一组设备。强烈建议,这个命令仅使用组播模式来存储整个组的一个场景而不是单个设备。此命令将产生包含该场景的组ID和场景ID 的RPCS_ADD_SCENE_RSP命令。
RPCS_STORE_SCENE消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x8f |
1 | 长度 Length | 13 + n |
1 | 地址模式 Address Mode | 1 = 组播或2 =单播 1=groupcast OR 2=unicast |
2 | 网络地址 Network Address | NwkAddr或组ID NwkAddr OR Group ID |
6 | 保留的 Reserved | 0 |
1 | 端点 Endpoint | 设备端点或为0xFF Devices Endpoint OR 0xFF |
2 | 保留的 Reserved | 0 |
2 | 组ID(该组RPCS_ADD_GROUP_RSP返回) Group ID(returned in the RPCS_ADD_GROUP_RSP for that group) | 0 |
1 | 场景名称长度 Scene name length | n |
n | 场景名称字符串 | 例如:“放松” "Relax" |
RPCS_RECALL_SCENE
此命令用来发送一个ZigBee消息来回忆一个组的场景This command is used to send a ZigBee message to recall a scene to a group。它有两个模式,单播,针对一个特定的设备;组播,针对先前已通过RPCS_ADD_GROUP命令创建的一组设备。强烈建议此命令仅用在组播模式下来重新调用整个组一个场景,它适用于整个组,而不是单个设备。
RPCS_RECALL_SCENE消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x8f |
1 | 长度 Length | 13 + n |
1 | 地址模式 Address Mode | 1 = 组播或2 =单播 1=groupcast OR 2=unicast |
2 | 网络地址 Network Address | NwkAddr或组ID NwkAddr OR Group ID |
6 | 保留的 Reserved | 0 |
1 | 端点 Endpoint | 设备端点或为0xFF Devices Endpoint OR 0xFF |
2 | 保留的 Reserved | 0 |
2 | 组ID(该组RPCS_ADD_GROUP_RSP返回) Group ID (returned in the RPCS_ADD_GROUP_RSP for that group) | 0 |
1 | 组名称长度 Group name length | n |
n | 组名称字符串 Group name string | “组名” |
5.3.4.2. 从照明网关发送的命令
从照明网关发送的命令如下表:
SRPC commands sent | |
Description | CMD ID |
0x01 | RPCS_NEW_ZLL_DEVICE |
0x02 | reserved (was for RPCS_DEV_ANNCE in Linux ZAP) |
0x03 | reserved (was for RPCS_SIMPLE_DESC in Linux ZAP) |
0x04 | RPCS_TEMP_READING |
0x05 | RPCS_POWER_READING |
0x06 | resevered |
0x07 | RPCS_GET_DEV_STATE_RSP |
0x08 | RPCS_GET_DEV_LEVEL_RSP |
0x09 | RPCS_GET_DEV_HUE_RSP |
0x0a | RPCS_GET_DEV_SAT_RSP |
0x0b | RPCS_ADD_GROUP_RSP |
0x0c | RPCS_GET_GROUP_RSP |
0x0d | RPCS_ADD_SCENE_RSP |
0x0e | RPCS_GET_SCENE_RSP |
0x0f | Reserved |
0x10 | Reserved |
RPCS_NEW_ZLL_DEVICE
该命令跟随RPCS_GET_DEVICES将被发送到ZigBee网络中的每个设备的客户端。This command will be sent to the client for each device in the ZigBee network following a RPCS_GET_DEVICES.当一个新的设备加入网络时,消息也将被发送。
RPCS_NEW_ZLL_DEVICE消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X01 |
1 | 长度 Length | 0x7 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
2 | 资料编号 Profile ID | 0x0104 |
2 | 设备ID Device ID | 0x0102 |
RPCS_TEMP_READING
当照明网关接收到一个温度读数时,该命令将被发送到所有客户端。温度是在DEGC * 100 The temperature is in DegC * 100(-273.15°C <=温度<= 327.67ºC,相应的测量值在0x954d到0x7FFF之间。这种格式允许的最高分辨率为0.01°C。
RPCS_TEMP_READING消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x04 |
1 | 长度 Length | 0X5 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
2 | 温度 Temperature | 0x89ab |
RPCS_POWER_READING
当照明网关接收到功率读数时,该命令将被发送到所有客户端。该电源是在W * 100,The power is in W * 100用一个24b的数字表示(在这个消息的数据包中打包成32b的数字)。
RPCS_POWER_READING消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X05 |
1 | 长度 Length | 0x7 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
4 | 功率 Power | 0x0089abcd |
RPCS_GET_DEV_STATE_RSP
当照明网关接收到一个状态读数时,该命令将被发送到所有客户端。该状态是0或0xFF,反映设备的开/关状态。
RPCS_GET_DEV_STATE_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X07 |
1 | 长度 Length | 0x4 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
2 | 状态 state | 0X0 |
RPCS_GET_DEV_LEVEL_RSP
当照明网关接收到一个水平读数时,该命令将被发送到所有客户端。该状态为0-0xFF时,反映设备的光的暗淡级别。
RPCS_GET_DEV_LEVEL_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X08 |
1 | 长度 Length | 0x4 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
2 | 水平 level | 0x78 |
RPCS_GET_DEV_HUE_RSP
当家庭自动化网关接收到一个色调读数时,该命令将被发送到所有客户端。状态为0-0xFF,反映该设备的色调。
RPCS_GET_DEV_HUE_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X09 |
1 | 长度 Length | 0x4 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
2 | 色调 Hue | 0x78 |
RPCS_GET_DEV_SAT_RSP
当照明网关接收到饱和度读数时,该命令将被发送到所有客户端。状态为0-0xFF的,反映了设备的饱和度。
RPCS_GET_DEV_SAT_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X0A |
1 | 长度 Length | 0x4 |
2 | 网络地址 Network Address | 0x1234 |
1 | 端点 End Point | 0X56 |
2 | 饱和度 Saturation | 0x78 |
RPCS_ADD_GROUP_RSP
当照明网关建立一个群组时,该命令将被发送到一个客户端。客户端可以使用这个消息将一个组字符串连接到一个组ID。当网关收到一个RPCS_ADD_GROUP命令时将创建一个组。
RPCS_ADD_GROUP_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X0B |
1 | 长度 Length | 0X3 +组名称字符串长度 |
2 | 组ID Group ID | 为0x1234 |
1 | 组名称字符串长度 Group Name String Length | x |
x | 组名称 Group Name | “第1组” |
RPCS_GET_GROUP_RSP
当照明网关响应一个RPCS_GET_GROUPS命令时,该命令将被发送到客户端。此消息将被发送到已在照明网关上创建的每个组。
RPCS_GET_GROUP_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0X0C |
1 | 长度 Length | 0X3 +组名称字符串长度 |
2 | 组ID Group ID | 0x1234 |
1 | 组名称字符串长度 Group Name String Length | x |
x | 组名称 Group Name | “第1组” |
RPCS_ADD_SCENE_RSP
当照明的网关创建了一个场景时,该命令将被发送到客户端,客户端可以使用这个消息将一个场景字符串连接到一个场景ID和一个组ID。网关收到一个RPCS_ADD_SCENE命令将创建一个场景。
RPCS_ADD_SCENE_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x0d |
1 | 长度 Length | 0x3+场景名称字符串长度 0x3 + Scene Name String Length |
2 | 组ID Group ID | 0x1234 |
1 | 场景ID Scene ID | 0X56 |
1 | 场景名称字符串长度 Scene Name String Length | x |
x | 场景名称 Scene Name | “场景1” |
RPCS_GET_SCENE_RSP
照明的网关创建了一个场景时,该命令将被发送到客户端,客户端可以使用这个消息将一个场景字符串连接到一个场景ID和一个组ID。此消息将被发送到已在照明网关上创建的每个场景。
RPCS_GET_SCENE_RSP消息格式 | ||
字节 | 描述 | 值 |
1 | 命令ID Command ID | 0x0d |
1 | 长度 Length | 0x3+场景名称字符串长度 0x3 + Scene Name String Length |
2 | 组ID Group ID | 0x1234 |
1 | 场景ID Scene ID | 0X56 |
1 | 场景名称字符串长度 Scene Name String Length | x |
x | 场景名称 Scene Name | “场景1” |
5.4. Client Examples
[c1]
[c2]之前的翻译有错误。这里的light是指的的灯泡,而不是板子上的指示灯。
[c3]这里应该是原文中拼写错误,though应该原为through,cycle through,重复循环或遍历的意思。
[c4]ZLL Remote,直接翻译为ZLL遥控器即可。这个CC2531的板子此时就是一个遥控器。
[c5]之前的翻译有点问题,这个主密钥是不公开的。
[c6]实际上相当于是一种临时的解决方案。
[c7]问题:为什么是使用SmartRF05+CC2530EM,而不是直接使用CC2531 dongle? 且代码是使用ZStack-Lighting-1.0.1 Remote FW 而不是使用网关的代码?
[c8]Touchlink是ZLL定义的一组特定操作,不必翻译为韩语。
[c9]从用户体验的角度,这个过程会显得麻烦。
附件列表
转载于:https://wwwblogs/star91/p/4888302.html
版权声明:本文标题:TI Zigbee Light Link 参考设计 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726421508h957622.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论