在TI的官方论坛中,看到一些知识点记录下,具体可以参考: http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/75525.aspx
1,TI的ZigBee协议栈不同版本的区别,如何选择合适的协议栈进行产品开发
TI ZigBee 协议栈
Z-Stack从最开始的
Z-Stack 0.1到大家熟悉的
Z-Stack 2.5.1a,以及到现在
Z-Stack Home 1.2.1,
Z-StackLghting 1.0.2,
Z-Stack Energy 1.0.1,
Z-Stack Mesh 1.0.0. 在协议栈的升级过程TI主要对协议栈做了两方面的工作,1) 根据ZigBee Alliance的ZigBee Specification进行一些新的Feature添加,比方说ZigBee2007是树形的路由,在ZigBee Pro中有了Mesh路由,并且提出了MTO和Source Routing等路由算法,所以TI的把相应新的功能添加到协议栈上去。当然有一部分是Spec中相关bug的修正,比方说有些描述模棱两可的;2) TI ZigBee协议栈本身软件bug的修复。一个版本的协议栈相对于之前一个版本协议栈的区别,都可以在协议栈安装目录下的Release Note中找到。
在
Z-Stack 2.5.1a以后,TI的协议栈并没有继续以
Z-Stack 2.6.x的形式直接发布,而是按照Application Profile的方式来发布了,原因在于TI希望开发者根据实际的应用选择更有针对的性的协议栈进行开发。像
Z-Stack Home 1.2.1之类的协议栈,主要包括两部分,1)核心协议栈Core Stack,这部分起始就是之前的
Z-Stack 2.5.1a以后的延续版本,可以在协议栈安装目录下
Z-Stack Core Release Notes.txt文件中找到,Version 2.6.2 。2)应用协议栈 Profile相关,这部分主要跟实际应用相关的,Home Automation 协议栈里都是ZigBee Home Automation Profile相关的实现。同样
Z-Stack Lghting 1.0.2和
Z-Stack Energy 1.0.1也是一个Core Stack再加上应用上的Profile。
1)
Z-Stack Home 1.2.1 针对智能家居相关产品的开发
2)
Z-Stack Lighting 1.0.2 针对ZLL相关产品的开发
3)
Z-Stack Energy 1.0.1 针对智能能源,Meter, In Home Display, 等相关产品的开发
4)
Z-Stack Mesh 1.0.0 针对相关私有应用的产品的开发,只利用标准ZigBee协议相关功能, Mesh路由等,应用层有开发者自己定义。
2,产品如何进行标准ZigBee测试认证,需要了解哪些,需要走什么流程
1) 首先加入ZigBee联盟,一般可以有测试实验室帮助完成。
2) 寄送样品到测试实验室,完成PICS文档的填写。
3) 第一轮预测试,测试实验室对测试结果反馈,开发者修改样品代码。
4) 测试实验室对修改后的样品进行验证,然后开始正式测试。
5) 测试实验室协助开发者完成ZigBee联盟网上认证申请资料的准备和提交。
6) 测试实验室提交正式测试报告给ZigBee联盟。联盟会完成审核并发证
3) 第一轮预测试,测试实验室对测试结果反馈,开发者修改样品代码。
4) 测试实验室对修改后的样品进行验证,然后开始正式测试。
5) 测试实验室协助开发者完成ZigBee联盟网上认证申请资料的准备和提交。
6) 测试实验室提交正式测试报告给ZigBee联盟。联盟会完成审核并发证
目前国内可以完成标准ZigBee测试的测试实验室有两家
1) CESI 北京 中国标准化电子研究所。
2) TRAC 深圳办事处(总部在英国)
3,设备的64位 MAC地址是怎么样选取的?
在CC2530中分为两个IEEE地址,一个称为Primary IEEE地址,另外称为Secondary地址。Primary IEEE地址是存放在芯片的Information Page里面,这个地址是TI向IEEE协会购买的,每个芯片的地址都是唯一的。并且用户只能Read这个值,没办法擦除/修改。在协议栈中直接通过读地址可以获得 osal_memcpy(aExtendedAddress, (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), Z_EXTADDR_LEN)。 Secondary地址是存放在CC2530里的Flash最后一个Page里面,用户可以进行Read/Write. 通过函数HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN);。
协议栈运行是,是如何选择Primary IEEE地址或者Secondary地址作为设备的MAC地址的,具体在函数zmain_ext_addr(void)操作。
1) 从NV中读取 IEEE地址,如果已经存在(都不为0xFF),就使用该地址作为MAC地址了。
2) 如果1)中没有,从Secondary IEEE地址存放位置读取,如果有(都不为0xFF),把该地址写入到NV中,以后就用该地址作为MAC地址了。
3) 如果2)中没有,从Primary IEEE地址存放位置读取,如果有(都不为0xFF),把该地址写入到NV中,以后就用该地址作为MAC地址了
4) 如果3)中没有,就随机产生一个64位的变量,写入到NV中,并作为MAC地址。
4,End Device是低功耗设备, 有电池供电, 节点在断网以后,如何能够禁止节点持续搜索网络,或者把发送Beacon Request间隔增大
1)启动搜索网络 uint8 ZDApp_StartJoiningCycle( void )
停止搜索网络 uint8 ZDApp_StopJoiningCycle( void )
2) 更改发送Beacon Request的周期
修改变量zgDefaultStartingScanDuration
// Beacon Order Values
#define BEACON_ORDER_NO_BEACONS 15
#define BEACON_ORDER_4_MINUTES 14 // 245760 milliseconds
#define BEACON_ORDER_2_MINUTES 13 // 122880 milliseconds
#define BEACON_ORDER_1_MINUTE 12 // 61440 milliseconds
#define BEACON_ORDER_31_SECONDS 11 // 30720 milliseconds
#define BEACON_ORDER_15_SECONDS 10 // 15360 MSecs
#define BEACON_ORDER_7_5_SECONDS 9 // 7680 MSecs
#define BEACON_ORDER_4_SECONDS 8 // 3840 MSecs
#define BEACON_ORDER_2_SECONDS 7 // 1920 MSecs
#define BEACON_ORDER_1_SECOND 6 // 960 MSecs
#define BEACON_ORDER_480_MSEC 5
#define BEACON_ORDER_240_MSEC 4
#define BEACON_ORDER_120_MSEC 3
#define BEACON_ORDER_60_MSEC 2
#define BEACON_ORDER_30_MSEC 1
#define BEACON_ORDER_15_MSEC 0
5,如何让End Device进入低功耗状态,休眠时间是如何设定的?
在协议栈宏定义中使能POWER_SAVING后,然后在f8wConfig.cfg文件里面把-DRFD_RCVC_ALWAYS_ON=FALSE,就可以让End Device进入休眠状态。
关于休眠的时间是有OSAL操作系统的调度来决定,每次休眠时间都是按照最新会发生的一个Event Timeout作为休眠时间。具体在协议栈hal_sleep函数中有说明。
这个timeout主要分为两类,一类是应用层事件的timeout,另外一类是MAC层事件的timeout,
1)应用层的timeout的时间,是在osal_pwrmgr_powerconserve( void )函数中,通过osal_next_timeout();获得的。
2)MAC层的timeout时间,是通过halSleep( uint16 osal_timeout )函数里面,通过MAC_PwrNextTimeout();来获得的。