zigbee学习自我总结.docx
- 文档编号:12260481
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:16
- 大小:464.96KB
zigbee学习自我总结.docx
《zigbee学习自我总结.docx》由会员分享,可在线阅读,更多相关《zigbee学习自我总结.docx(16页珍藏版)》请在冰点文库上搜索。
zigbee学习自我总结
1、 Zigbee网络节点类型
Zigbee网络有三类节点类型:
即协调器Coordinator、路由器Router与终端设备EndDevice,其中协调器与路由器均为全功能设备,而终端设备选用精简功能设备、
2、Zigbee协议栈各层主要功能模块
3、Zigbee网络节点地址
Zigbee网络协议的每一个节点皆有两个地址:
64位的IEEEMAC地址及16位网络地址、EUI-64(64—bitextended uniqueidentifier)
1)64-bit地址,又称为MAC地址或IEEE地址、
每个ZigBee节点都应该有全球唯一的64位IEEE地址、这个地址需要向IEEE组织申请才能使用。
通信时,将待发送的数据包的目的地址设为此64位IEEE地址,从而实现数据包的正确投递。
2)16-bit地址,即网络地址,或称为短地址、当一个ZigBee网络形成后,ZigBee网络内的每个节点,都会分配到一个16位的网络地址、通信时,将待发送的数据包的目的地址设为此16位网络地址、
4、Zigbee协议术语
配置文件(profile):
Zigbee协议的配置文件是对逻辑组件及其相关接口的描述,是面向某个应用类不的公约、准则、通常没有程序代码与配置文件相关联、
属性(attribute):
设备之间通信的每一种数据像开关的状态或温度计值等皆可称为属性、每个属性可得到唯一的ID值、
簇(cluster):
多个属性的汇集形成了簇,每个簇也拥有一个唯一的ID、尽管个体之间传输的通常是属性信息,但所谓的逻辑组件的接口指的却是簇一级的操作,而非属性一级、
终端(endpoint):
每个支持一个或多个簇的代码功能块称为终端。
不同的设备通过它们的终端及所支持的簇来进行通信、
PANIDs:
PANIDs是用来在逻辑上分离在同一领域内的多个节点组、如此不同组之间节点通信就可不能干扰,且能够在同一通道channel上(zigbee2007不行,因为它通信时能够改变频率的)Panid是16位,范围是0x0000~03fff。
当建立或加入网络时没有指定PANID的话,就会依照defaultPANID确定。
它是个常量。
Extended PANID:
zigbee增加了一个8字节的扩展PANID,便于提供服务与PAN ID冲突检测、
5、Zigbee协议结构
●物理层(PHY)
物理层定义了物理无线信道与MAC子层之间的接口,提供物理层数据服务与
物理层管理服务、物理层内容:
1)ZigBee的激活;2)当前信道的能量检测;3)接收链路服务质量信息;4)ZigBee信道接入方式;5)信道频率选择;6)数据传输与接收。
●介质接入控制子层(MAC)
MAC层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持PAN连接与分离,提供两个对等MAC实体之间可靠的链路、
MAC层功能:
1)网络协调器产生信标;
2)与信标同步;
3)支持PAN(个域网)链路的建立与断开;
4)为设备的安全性提供支持;
5)信道接入方式采纳免冲突载波检测多址接入(CSMA—CA)机制;
6)处理与维护保护时隙(GTS)机制;
7)在两个对等的M AC实体之间提供一个可靠的通信链路。
●网络层(NWK)
ZigBee协议栈的核心部分在网络层。
网络层主要实现节点加入或离开网络、接收或抛弃其她节点、路由查找及传送数据等功能、网络层功能:
1)网络发现;2)网络形成;3)允许设备连接;4)路由器初始化;5)设备同网络
连接;6)直截了当将设备同网络连接;7)断开网络连接;8)重新复位设备;9)接收机
同步;10)信息库维护、
●应用层(APL)
ZigBee应用层框架包括应用支持层(APS)、ZigBee设备对象(ZDO)与制造商所定义的应用对象。
应用支持层的功能包括:
维持绑定表、在绑定的设备之间传送消息、
ZigBee设备对象的功能包括:
定义设备在网络中的角色(如ZigBee协调器与终端设备),发起与响应绑定请求,在网络设备之间建立安全机制、ZigBee 设备对象还负责发现网络中的设备,同时决定向她们提供何种应用服务、ZigBee应用层除了提供一些必要函数以及为网络层提供合适的服务接口外,一个重要的功能是应用者可在这层定义自己的应用对象、
●应用程序框架(AF)
运行在ZigBee协议栈上的应用程序实际上就是厂商自定义的应用对象,同时遵循规范(profile)运行在端点1———240上、在ZigBee应用中,提供2种标准服务类型:
键值对(KVP)或报文(MSG)。
●Zigbee设备对象(ZDO)
远程设备通过ZDO请求描述符信息,接收到这些请求时,ZDO会调用配置对象获取相应描述符值。
另外,ZDO提供绑定服务、
6、 Z—Stack软件构架
Z-Stack由main()函数开始执行,main()函数共做了2件事:
一是系统初始化,另外一件是开始执行轮转查询式操作系统,如下图所示:
7、 Z-Stack系统运行流程图
8、Z—Stack在项目中的目录结构
(1)App:
应用层目录,这个目录下的文件就是创建一个新项目时自己要添加的文件,
(2)HAL:
硬件层目录,mon目录下的文件是公用文件,基本上与硬件无关,其中hal_assert、c是断言文件,用于调用,hal_drivers、c是驱动文件,抽象出与硬件无关的驱动函数,包罗有与硬件相关的配置与驱动及操作函数、Include目录下主要包罗各个硬件模块的头文件,而Target目录下的文件是跟硬件平台相关的,估计看到有两个平台,分不是Cc2430DB平台与一个CC2430EB平台。
后面的DB与EB表示的是TI公司开发板的型号,事实上还有一种类型是BB的,BB:
BatteryBoardﻫDB:
DevelopmentBoard EB:
EvaluationBoardﻫ分不对应TI公司开发的三种板型,其功能按上顺序依次变强。
能够参看"Z—StackUser'sGuideforCC2430"的图片,能够获得更直观的认识。
(3)MAC:
MAC层目录,High Level与LowLevel两个目录表示MAC层分为了高层与底层两层,Include目录下则包罗了MAC层的参数配置文件及基MAC的LIB库函数接口文件,这个地方的MAC层的协议是不开源的,以库的形式给出
(4)MT:
监制调试层目录,该目录下的文件主要用于调试目的,即实现通过串口调试各层,与各层进行直截了当交互、
(5)NWK:
网络层目录,含有网络层配置参数文件及网络层库的函数接口文件,及APS层库的函数接口
(6)OSAL:
协议栈的操作系统抽象层目录
(7)Pro层目录,ApplicationFarmework 应用框架,包罗AF层处理函数接口文件、
(8)Security:
安全层目录,包罗安全层处理函数接口文件
(9)Services:
ZigBee与802、15、4设备地址处理函数目录,包括地址模式的定义及地址处理函数
(10)Tools:
工作配置目录,包括空间划分及Z—Stack相关配置信息
(11)ZDO:
指ZigBee设备对象,可认为是一种公共的功能集,文件用户用自定义的对象调用APS子层的服务与NWK层的服务
(12)ZMAC:
其中Zmac、c是Z-StackMAC导出层接口文件,zmac_cb、c是ZMAC需要调用的网络层函数
(13)Zmain:
Zmain、c主要包罗了整个项目的入口函数main(),在OnBoard、c包罗硬件开始平台类外设进行控制的接口函数
(14)Output:
输出文件目录,这个是EW8051IDE自动生成的
9、Z—stack中实现自己的任务
在Zstack(TI的Zigbee协议栈)中,关于每个用户自己新建立的任务通常需要两个相关的处理函数,包括:
①用于初始化的函数
如:
SampleApp_Init(),这个函数是在osalInitTasks( )这个osal(Zstack中自带的小操作系统)中去调用的,其目的就是把一些用户自己写的任务中的一些变量,网络模式,网络终端类型等进行初始化;
②用于引起该任务状态变化的事件发生后所需要执行的事件处理函数
如:
SampleApp_ProcessEvent(),这个函数是首先const pTaskEventHandlerFn
tasksArr[]中进行设置(绑定),然后在osalInitTasks()中假如发生事件进行调用绑定的事件处理函数。
1)用户自己设计的任务代码在Zstack中的调用过程
main()执行(在Zmain目录中ZMain、c)—→osal_init_system()(在OSAL目录中的OSAL、c 中)-→调用osalInitTasks()(在APP目录中的OSAL_SerialApp、c)—→调用SerialApp_Init( ),(在APP目录中的SerialApp、c中)。
在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit(taskID++)到ZDApp_Init(taskID++)的几行代码表示关于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这个地方taskID随着任务的增加也随之递增、因此用户自己实现的任务的初始化操作应该在osalInitTasks()中增加。
(在APP目录中的OSAL_SerialApp、c中增加)、
2)任务处理调用的重要数据结构
在Zstack里,关于同一个任务估计有多种事件发生,那么需要执行不同的事件处理,为了方便,关于每个任务的事件处理函数都统一在一个事件处理函数中实现,然后依照任务的ID号(task_id)与该任务的具体事件(events)调用某个任务的事件处理函数,进入了该任务的事件处理函数之后,再依照events再来判不是该任务的哪一种事件发生,进而执行相应的事件处理、
pTaskEventHandlerFn是一个指向函数(事件处理函数)的指针,这个地方实现的每一个数组元素各对应于一个任务的事件处理函数,比如SampleApp_ProcessEvent关于用户自行实现的事件处理函数uint16 SampleApp_ProcessEvent( uint8 task_id,uint16events),因此这个地方假如我们实现了一个任务,还需要把实现的该任务的事件处理函数在这个地方添加。
注意,tasksEvents(在APP目录中的OSAL_SerialApp、c的osalInitTasks(void)函数中)与tasksArr[](在APP中的OSAL_SerialApp、c中)里的顺序是一一对应的,tasksArr[]中的第i个事件处理函数对应于tasksEvents中的第i个任务的事件、
3)关于不同事件发生后的任务处理函数的调用
osal_start_system()特不重要,决定了当某个任务的事件发生后调用对应的事件处理函数(在Zmain目录中ZMain、c)、
10、Z-stack 添加一个新的任务
在osalInitTasks()与tasksArr[]添加相应的项就能够了、osalInitTasks()为初始化系统的任务,tasksArr[]为任务处理事件矩阵。
在osalInitTasks()与 tasksArr[]添加相应的项就能够。
1)修改osalInitTasks()
voidosalInitTasks(void )
{
……
OuhsApp_Init(taskID++);
PhotoApp_Init(taskID);
}
2)修改tasksArr[]
const pTaskEventHandlerFntasksArr[] = {
……
OuhsApp_ProcessEvent
PhotoApp_ProcessEvent
};
3)添加_Init()与_ProcessEvent()
voidPhotoApp_Init(uint8task_id)
{
PhotoApp_TaskID=task_id;
PhotoInit();
RegisterForPhoto(PhotoApp_TaskID );
}
uint16PhotoApp_ProcessEvent(uint8 task_id uint16events)
{
afIningMSGPacket_t *MSGpkt;
if(events&SYS_EVENT_MSG )
{
MSGpkt =(afIningMSGPacket_t*)osal_msg_receive(PhotoApp_TaskID);
while ( MSGpkt )
{
switch ( MSGpkt-〉hdr、event)
{
casePHOTO_CHANGE:
HalLedblink( HAL_LED_1330300 );
//P0IE=1;
break;
}
// Releasethe memory
osal_msg_deallocate( (uint8*)MSGpkt);
//Next— if oneisavailable
MSGpkt=(afIningMSGPacket_t*)osal_msg_receive(PhotoApp_TaskID );
}
//return unprocessed events
return (events^SYS_EVENT_MSG);
}
//Discardunknownevents
return0;
}
TI节点地址的获得:
NLME_GetShortAddr();//调用NLME_GetShortAddr()函数,获得16位短地址。
ﻫ(void)NLME_GetExtAddr(); //Load thesaveExtAddr pointer//获得64位的IEEE地址、ﻫ实例分析一:
SampleApplication工程:
远程按键无线控制灯
实例分析二:
按键处理
硬件层对按键的处理:
InitBoard—--——(HalKeyConfig(
OnboardKeyIntEnable,OnBoard_KeyCallback);//按键配置,设置回调函数对按键进行处理-—-——--——→HalDriverInit();//初始化外设—----—-→HalKeyInit()-—-- →HalKeyConfig()-—-- /* Register thecallbackfucntion/注册回调函数*/
pHalKeyProcessFunction=cback;//设置回调函数-——-→OnBoard_KeyCallback()或如没有使用中断,osal_start_timerEx(Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);/*Kickoffpolling———-—-→uint16 Hal_ProcessEvent( uint8 task_id, uint16events)对按键进行扫描-—-→HalKeyPoll();//检查按键—-——-→OnBoard_KeyCallback(uint8keys,
uint8state)---—〉OnBoard_SendKeys( keys, shift)--→osal_msg_send(
registeredKeysTaskID, (uint8 *)msgPtr );//发送消息KEY_CHANGE
应用层对按键的处理:
GenericApp_ProcessEvent( bytetask_id,UINT16 events)--—————→在应用层是通过消息来处理按键的。
通过标识KEY_CHANGE来识不----—→GenericApp_HandleKeys(((keyChange_t*)MSGpkt)—〉state,((keyChange_t*)MSGpkt)->keys )
实例分析三:
串口处理过程:
SerialAPP工程
Main()--→HalDriverInit( )————[HAL:
hal_drivers、c----HalDriverInit]-—→
HalUARTInit()——[HAL:
Target:
hal_uart、c---HalUARTInit()—]—→HalUARTInitDMA()
或HalUARTInitISR()————[ZStack-cc2530—2、2、2—1、3、0\ponents\hal\target\
CC2530EB\ _hal_uart_isr、c:
HalUARTInitISR(void)]或[ZStack-cc2530—2、2、2-1、3、0\
ponents\hal\target\CC2530EB\_hal_uart_dma、c:
HalUARTInitDMA(void)]
osal_init_system()—→osalInitTasks()-→SerialApp_Init(taskID)——-[APP--——
SerialApp、c:
SerialApp_Init(taskID )———---——--→HalUARTOpen()— —---——-→
HalUARTOpenISR(config)-——-—→
初始化及配置完成之后剩下的就是如何使用:
SerialApp_ProcessEvent( uint8task_id,UINT16events ):
收:
caseAF_INING_MSG_CMD:
SerialApp_ProcessMSGCmd(MSGpkt);
break;
发:
if(events& SERIALAPP_SEND_EVT )
{
SerialApp_Send();
return (events^ SERIALAPP_SEND_EVT);
}
SerialApp_Send();//发送数据—-→
AF_DataRequest(&SerialApp_TxAddr,
(endPointDesc_t*)&SerialApp_epDesc,
SERIALAPP_CLUSTERID1,
SerialApp_TxLen+1,SerialApp_TxBuf,
&SerialApp_MsgID,0,AF_DEFAULT_RADIUS))
实例分析四:
SimpleAPP测温分析
SimpleSensor:
采集温度值并发送:
Mian()-→初始化HAL,在HAL目录下的hal_board_cfg、h的HAL_BOARD_INIT()
——→Initialize board I/O,在ZMain目录下的OnBoard、c里 InitBoard()—-→在HAL目录下的hal_drivers、c里HalDriverInit()--—→在OSAL目录下的OSAL、C里
osal_init_system()--—-———→在APP目录下的sapi、c里 osalInitTasks()—-———》在APP目录下的sapi、c里SAPI_Init(),同时设置了应用开始事件ZB_ENTRY_EVENT用osal_set_event(task_id,ZB_ENTRY_EVENT)实现---—-》在APP目录下的sapi、c里SAPI_ProcessEvent()事件处理——-——》在APP目录下的SimpleSensor、c里zb_HandleOsalEvent()读取温度值----》在APP目录下的sapi、c里通过zb_SendDataRequest()调用AF_DataRequest()把温度发出去——-—-—---——---—--—》
注:
zb_SendDataRequest(0xFFFE,SENSOR_REPORT_CMD_ID, 2,pData,0,AF_ACK_REQUEST,0);参数pData就是采集到的温度值、
SimpleCollector:
温度值接收并上报:
Mian()—→osal_init_system()--—-—--→在APP目录下的sapi、c里 osalInitTasks()-———-》在APP目录下的sapi、c里SAPI_Init()----——》tasksArr[]———-—》SAPI_ProcessEvent
—--———》case AF_INING_MSG_CMD:
SAPI_ReceiveDataIndication()-—-—————-》
zb_ReceiveDataIndication( source,mand, len, pData)该函数在APP目录的SimpleCollector、c里-—--————》if(mand==SENSOR_REPORT_CMD_ID),执行DataChange(pData,buf)数据处理,该函数在DS18B20、C里-——----—》通过调用debug_str();函数发送到串口、
实例分析五:
无线串口透明传输
typedef struct
{
osal_event_hdr_thdr; /* OSALMessageheader*/
uint16 groupId; /*Message’sgroup ID-0 ifnotset*/
uint16 clusterId; /*Message’s cluster ID*/
afAddrType_tsrcAddr; /*SourceAddress, if endpoint isSTUBAPS_INTER_PAN_EP,
it’s an InterPAN message*/
uint16macDestAddr;/*MACheader destination short address */
uint8 endPoint; /* destinationendpoint */
uint8wasBroadcast; /*TRUE ifnetwork destinationwasabroadcast address */
uint8LinkQuality; /*Thelinkquality ofthereceiveddata frame */
uint8 correlation; /* Therawcorrelation valueofthereceiveddata frame*/
int8 rssi; /* ThereceivedRF powerinunitsdBm */
uint8SecurityUse; /*deprecated*/
uint32timestamp; /*receipttimestamp fromMAC*/
afMSGmandFormat_t cmd;/*Application Data */
}afIningMSGPacket_t;
typedefstr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zigbee 学习 自我 总结