|
致ZigBee初学者 浅谈ZigBee学习方法
随着ZigBee的兴起,以及国内物联网的快速发展。越来越多的人开始学习ZigBee技术。但是往往初学者会感到ZigBee很难想,尤其是当面对数十万行的协议栈,手足无措,很多人半途而废。我们从09年开始一直致力于ZigBee国内的推广工作,希望每一个用户都能快速的开发出自己的产品。
但近年来,市场上ZigBee产品出现鱼目混珠的现象,质量参差不齐,把能传输几百米的cc2530做到几十米,把网上随便找的资料塞给客户让用户学习。在浩如烟海的代码中,再加上支离破碎的“资料”中,初学者往往浪费大量的时间而没有成效。
我们数年来一直秉承着质量第一效率第一,让用户快速入门的宗旨,产品一个版本再一个版本的升级,文档一遍又一遍的修改。我们提供的不只是硬件,我们更提供的是一种时效,一种效率!
关于我们的硬件:
我们的硬件推出近五年了,09年初我们就推出了自己的开发板,国内是什么时候开始刮起ZigBee 这场大风呢?老将驰骋疆场好多年!以其极简的风格,优良的特性,使无数工程师快速入门ZigBee开发。
ZigBee开发不是搞单片机学习,没有必要专注于连多少传感器。我们需要做的是把无线传输的任务交给ZigBee来完成,如果过分强调传感器的控制,我们可以选择MCU,现在更火的Cortex系列的单片机,没有必要来花大量的时间来研究ZigBee协议栈,我们没有必要浪费本来就不多的青春!
精简的风格,精细的做工,我们只为高品质的产品,我们只为传输的稳定性与传输的距离。那一块射频板上会堆砌一些杂乱无章的传感器?!空中的干扰已经够多了,还要自身来干扰自己?
我们的开发板默认功率无功放轻松达到250多米(中间有树林遮挡),这个…..一般工程使用也能达到要求了吧?
各有所长,我们做的是ZigBee,不是单片机。我们提供的是无线产品,不是控制器。如果您寻求的是一种“积木”式的ZigBee产品,不如直接学习单片机来的更快一些。
关于我们的软件
首先必须强调的是ZigBee不是单片机!
每一个寻找ZigBee客户,尤其是没有接触过ZigBee的新手,往往会被表面迷惑,如果您学习过单片机,您是否还会被华而不实的“大板子”迷惑,我们真正需要的是一款小巧精悍,资料丰富而不冗余的开发板。
经过这几年的快速发展,ZigBee的资料可以说是漫天飞了,现在不是资料稀缺的时代,而是我们如何找到有价值的资料。电脑中关于ZigBee文档资料就几个G,如果我们不吃不喝把这些看完,姑且认为是有用的,需要花费多长时间?往往花费的时间是别人的数十倍之多。
是否还有哪家会想客户推荐ZigBee wireless networking 这部巨作,这是学习ZigBee技术必读手册!它会让你更透彻的了解ZigBee技术,而不是停滞在空中楼阁,也不是让你停留在CC2530或者CC2430的Zstack上,而是带你到ZigBee的世界中。后面会推荐大家阅读此书的时间段。
当然还有另一部关于ZigBee的巨作ZigBee Wireless Networks and Transceivers,此书只是简单翻阅,没有发言权。如果对英文不感冒,当然国内还是有一些书的,只是我们很遗憾的无法从这些书中深刻的理解ZigBee,我们只能用自己宝贵的时间和经验慢慢总结。
如果有哪家推荐客户ZigBee Specification 也就是我们说的协议栈规范,笔者只能说路漫漫其修远了,相信大多数人都不是去搞理论的,搞理论为何来买我们的硬件呢?几百页的文档,如果一切顺利也需要几天十几天看完,但是枯燥无味,看完一头雾水。看后除了打击学习ZigBee的自信心还是打击学习ZigBee的自信心。当我们在回首去看ZigBee的Zstack协议栈时只能丢盔弃甲了。
以上都是学习ZigBee重量级的材料,如果不慎选择错误,代价是花费我们大量的时间,再加上各个商家提供了无数肢解了的ZigBee资料,还有互联网上浩瀚如烟的资料。初学者往往会迷失方向,好的情况会是一种螺旋式上升,也是极其艰难的。
我们很早就看出了其中的问题,因为笔者也是从一个初学者过来,无穷无尽参差不齐的资料,再加上Zstack协议栈中无尽的代码,没有指导的情况下走了不少弯路。鉴于此,为了后人的学习少走弯路,我们录制了ZigBee教学视频,同时编写了ZigBee教程。如果您学习过单片机,那一定对郭天祥很熟悉了,因为他的视频,我们可以很快的零基础的入门单片机。我们的目标就是零基础快速入门ZigBee,快速入门只为客户少走弯路,青春不是用来走弯路的。
这里也王婆卖瓜,自卖自夸一下,我们的视频和教程是对应的,视频主要讲的是两部分,基础部分和协议栈提高部分,基础部分主要是熟悉CC2430 寄存器操作,而重点是后面协议栈部分,如果让每一个客户快速的实现无线通信。教程主要分为三大部分,第一部分是ZigBee相关软件安装使用说明,因为我们针对的初学者,很多人不知道ZigBee需要什么软件,软件怎么使用。我们将每个软件的安装、配置步骤进行详细的图解。第二部分和视频的第一部分对应,学习CC2430 内置8051内核的寄存器操作,第三部分是协议栈部分。所有视频和资料都着重强调协议栈部分,再次强调,我们学习的是ZigBee,不是单片机。
初学者往往是拿到一套开发板,信心满满的安装好各种软件,打开协议栈突然发现数十万行的代码,无从下手。甚至学了十几天连主函数还没找到。有的初学者认为不就是些代码,一点点看不就可以了。数十万行的代码,等你看完了,黄瓜菜都凉了。所以我们这里需要讲究一定的学习方法,可以用四个字概括,那就是整体把握。需要提纲挈领的方式去学习,不要拘泥于太多细节,除了需要理解整个协议栈的框架,还需要把握其数据信息的处理流程。我们不只是流于表面,更注重底层的消化吸收。下面是我们协议栈部分目录:
整体把握 140
第六章:Zstack OSAL操作系统 141
6.1 Zstack协议栈框架 141
6.1.1 操作系统概述 141
6.1.2 Zstack总体框架说明 142
6.1.3 Zstack入口函数说明 142
6.2 OASL深度解析 143
6.2.1 OSAL任务的初始化[需要深刻理解 143
6.2.2 OSAL系统主循环 145
6.2.3 OSAL事件的产生 148
第七章:设备启动 150
7.1 设备启动预备知识 150
7.1.1 设备类型 150
7.1.2 设备启动模式与设备状态 152
7.1.3 预编译选项 154
7.1.4 网络启动状态 156
7.1.5 地址结构体 156
7.1.6 注册机制 157
7.2 协调器启动 158
7.2.1 协调器创建网络规范说明 158
7.2.2 协调器启动协议栈代码说明 159
7.3 路由器启动 171
7.3.1 终端、路由器加入网络规范说明 171
7.3.2 路由器启动协议栈代码说明 176
第八章:数据收发与SampleApp工程 191
8.1 数据的发送和接收 191
8.1.1 数据的发送 191
8.1.2 数据的接受 194
8.1.3 数据收发实例 195
8.2 SampleApp工程 196
8.2.1 SampleApp工程概述 196
8.2.2 一般工程说明 196
8.2.3 SampleApp工程初始化与事件的处理 196
8.2.4 SampleApp工程流程 199
8.3 通过ZDO消息注册机制深入了解TI协议栈的注册机制 204
8.4 创建一个属于自己的工程 209
综合提高 217
第九章:按键机制 218
9.1 Zstack的按键机制 218
9.1.2 轮询方式处理 222
9.1.3 中断方式处理 230
9.2 LED驱动修改 233
9.2.1 修改LED 235
9.2.2 添加LED 236
9.3 KEY驱动修改 237
第十章:绑定机制 240
10.1 绑定概述 240
10.1.1 绑定(Binding) 240
10.1.2 建立绑定表(Building a Binding Table) 241
10.1.3 绑定表的配置 242
10.1.4 删除绑定 248
10.2 灯开关实验 249
10.2.1 灯开关实验概述 249
10.2.2 灯开关实验初始化与事件的处理 251
10.2.3 灯开关实验流程 252
10.3 温度传感器实验 261
10.3.1 温度传感器实验概述 261
10.3.2 温度传感器实验初始化与事件的处理 263
10.3.3 温度传感器实验流程 264
10.4 GenericApp工程实验 270
10.4.1 GenericApp工程概述 270
10.4.2 ZDO终端绑定请求 270
10.4.3 GenericApp工程的初始化与事件的处理 271
10.4.4 GenericApp工程流程 273
第十一章:串口机制 278
11.1 Zstack 2006 串口机制学习 278
11.1.1 Zstack 2006串口配置 278
11.1.2 Zstack 2006串口初始化 280
11.1.3 Zstack 2006串口接收数据 284
11.1.4 Zstack2006串口发送数据 297
11.1.5 Zstack串口常用函数图解 302
11.2 SerialApp工程 307
11.2.1 SerialApp工程概述 307
11.2.2 SerialApp工程按键说明 308
11.2.3 SerialApp工程编译选项 308
11.2.4 SerialApp工程初始化与事件处理 309
11.2.5 确定目标设备的地址 311
11.2.6 SerialApp工程流程 314
11.3 ZigBee串口透传 323
11.3.1 串口透明传输工程说明 323
11.3.2 编译选项说明 324
11.3.3 工程初始化与事件的处理 324
11.3.4 工程修改 325
11.3.5 数据流程 327
看到这里会发现,我们的章节排布和大多数都不同,因为这是笔者认为最为合理的方式,可以引导读者递进式学习。所有内容都经过笔者多次推敲,只是希望初学者能快速入门!我们推出的不但是硬件,扔给用户一堆积木式的硬件。
我们在不到200页文档中,从源码角度深入分析整个协议栈的结构,以及TI公司提供的各个实例,下面是我们教程中的一页。完整的中文注解。同时每个函数后面都会有函数注解,注解该函数内调用的函数,同时文档中会有大量的原创性的流程图,引导读者沿着正确的方向快速前进。
#if !defined( ZDO_COORDINATOR ) || defined( SOFT_START )
void ZDApp_ProcessNetworkJoin( void )
{
//加入网络或者路由器以孤点的方式加入网络
if ( (devState == DEV_NWK_JOINING) ||((devState == DEV_NWK_ORPHAN) &&
(ZDO_Config_Node_Descriptor.LogicalType == NODETYPE_ROUTER)) )
{
if ( nwkStatus == ZSuccess ) //如果加入成功
{
osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );//触发ZDO事件
//通过下面的if条件语句可以得知设备是以路由器、孤点方式加入网络
if ( devState == DEV_NWK_ORPHAN
&& ZDO_Config_Node_Descriptor.LogicalType != NODETYPE_DEVICE )
{
// Change NIB state to router for restore 修改NIB信息
_NIB.nwkState = NWK_ROUTER;
}
devState = DEV_END_DEVICE;//标示设备以加入网络
if ( ZDO_Config_Node_Descriptor.LogicalType != NODETYPE_DEVICE )
{
//以路由器启动设备
NLME_StartRouterRequest( 0, 0, false );
}
}
else // -------这里是没有成功加入网络
{
if ( (devStartMode == MODE_RESUME) && (++retryCnt >= MAX_RESUME_RETRY) )
{
//恢复失败需加入或者重新加入网络
if ( _NIB.nwkPAN ID == 0xFFFF || _NIB.nwkPAN ID == INVALID_PAN_ID )
devStartMode = MODE_JOIN; //加入网络
else
{
devStartMode = MODE_REJOIN;//重新加入网络
_tmpRejoinState = true;
}
}
//重新初始化,准备再次加入网络
ZDApp_NetworkInit( (uint16)(NWK_START_DELAY
+ ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))) );
}
}
//孤点加入或者重新加入
else if ( devState == DEV_NWK_ORPHAN || devState == DEV_NWK_REJOIN )
{
// results of an orphaning attempt by this device
if (nwkStatus == ZSuccess)
{
devState = DEV_END_DEVICE;//标示设备加入网络
osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
}
else
{
if ( (devStartMode == MODE_RESUME) && (++retryCnt >= MAX_RESUME_RETRY) )
{
//恢复失败需加入或者重新加入网络
if ( _NIB.nwkPAN ID == 0xFFFF || _NIB.nwkPAN ID == INVALID_PAN_ID )
devStartMode = MODE_JOIN; //加入网络
else
{
devStartMode = MODE_REJOIN;//重新加入网络
_tmpRejoinState = true;
}
}
//重新初始化,准备再次加入网络
ZDApp_NetworkInit( (uint16)(NWK_START_DELAY+ (osal_rand()&EXTENDED_JOINING_RANDOM_MASK)) );
}
}
}
#endif // !ZDO_COORDINATOR
函数说明:
1 、ZStatus_t NLME_StartRouterRequest( byte BeaconOrder, byte SuperframeOrder,byte BatteryLifeExtension )
说明:通过该函数可以使设备成为路由器。该函数会触发其对应的回调函数
void ZDO_StartRouterConfirmCB( ZStatus_t Status )。
当设备加入网络后,会触发事件ZDO_STATE_CHANGE_EVT,如果是该设备是路由器,则会调用函数NLME_StartRouterRequest()使设备成为路由器。当调用NLME_StartRouterRequest时会触发其对应的回调函数ZDO_StartRouterConfirmCB().其中如果设备只是终端设备那么剩余的和协调器启动类似,这里不再赘述。我们这里是路由器的启动,所以会调用函数NLME_StartRouterRequest()。
除了上述资料以外,我们给每一套开发板量身打造了一套基础资料,我们提供的cc2430和cc2530开发套件的资料都印刷成册,随开发板一起发给用户。我们花费大量的精力去完成一件事,就是用户可以快速入门,快速开发出自己的产品。
关于资料的使用:
资料使用建议,每一套开发板我们都提供了使用手册和基础源代码,建议用户快速参照TI的datasheet熟悉这些程序,达到简单熟悉就好,如果已经学习过单片机的,那一个星期足矣。
接下来,推荐观看我们的教学视频,主要是协议栈部分,教学视频和我们的教程结合使用,相信学习效率会突飞猛进。这个期间,如果有不懂得概念,可以看ZigBee wireless networking ,虽然笔者尽量让用户快速入门,但是并不是所有的概念都能绵绵涉及,在这些大牛们面前,我们永远都是初学者,如果有精力,可以在看协议栈初期将这部著作通篇看一次。
当看完视频教程,下面的任务就是开发自己的工程了,如果有问题可以返回去在教程中找,但这个时候往往会遇到非常具体的问题,这个时候我们就往往需要求助百度和Google。
后期提高,当然项目过后我们的水平会飞跃一个层次,这个时候我们可以翻阅一下ZigBee Specification ,会更加深刻的了解协议栈的数据流程。
我们的目标:
节约用户有限的时间,化繁为简,快速入门。Take your time! TYT!
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|