Z-Stack协议学习笔记1-----发送函数AF_DataRequest
描述Z-Stack协议栈中原语通信方式并举例说明
描述Z-Stack协议栈中原语通信方式并举例说明Z-Stack是一个通信协议栈,特别设计用于无线个人局域网(WPAN)中的网络通信。
在Z-Stack协议栈中,原语通信是一种基本的通信方式,它被广泛应用于实现各种网络功能和通信需求。
本文将深入探讨Z-Stack协议栈中原语通信方式,并通过举例说明其应用。
让我们了解一下什么是原语通信。
在通信领域,原语通信是指将通信过程分解为多个原子级别操作的方式。
每个原子操作都是具有明确功能和定义的通信操作,通过将这些原子操作组合使用,可以构建复杂的通信功能。
在Z-Stack协议栈中,各个原语通信操作被封装为接口,为开发人员提供了使用这些操作来实现不同的通信需求的能力。
在Z-Stack协议栈中,常见的原语通信方式包括以下几种:1. 数据发送原语(Data Send Primitive):这是一种用于在Z-Stack 协议栈中发送数据的原始操作。
开发人员可以使用该原语通过指定目标设备、目标端口等参数来发送数据。
开发人员可以使用Data Send Primitive操作将数据包发送到指定的无线设备。
2. 数据接收原语(Data Receive Primitive):这是一种用于在Z-Stack协议栈中接收数据的原始操作。
开发人员可以使用该原语监听指定端口,并在数据到达时接收并处理数据。
开发人员可以使用Data Receive Primitive操作来接收从其他设备发送过来的数据包。
3. 路由原语(Routing Primitive):这是一种用于在Z-Stack协议栈中进行路由操作的原始操作。
开发人员可以使用该原语来管理数据包的路由路径,并控制数据包在网络中的传递。
开发人员可以使用Routing Primitive操作来选择最佳的路由路径以确保数据包能够正确传输到目标设备。
4. 邻居表原语(Neighbor Table Primitive):这是一种用于在Z-Stack协议栈中管理邻居设备信息的原始操作。
Z-stack学习笔记
2、何为 IEEE 802.15.4,其特点。 是 ZigBee 无限传感器网络通信标准,具有短距离(10m) ,低功 耗,低速率,低成本的特点,支持单跳星形(10m 内)和多跳对
等(>10m)两种网络拓扑。
3、何为 Z-Stack? Z-Stack 是 TI 公司开发的 ZigBee 协议栈,并且经过了 ZigBee 联 盟的认可而为全球众多开发商所广泛采用。 Z-Stack 实际上是帮助 程序员方便开发 ZigBee 的一套系统, 它采用轮转查询式操作系统, 包括两个主要流程(如图) :系统初始化和执行操作系统。系统初 始化完成后,就进入执行操作系统,并且在其中是一个死循环。 执行操作系统中主函数即为轮询式操作系统的主体部分,也是我 们需要重点开发、 调用、 掌握的部分。 欲知其详, 且听下文分解。
Check for keys */表示检查按键情况。
这个程序到最后,调用了一个重要的函数指针 pHalKeyProcessFunction
这个指针是指向 void OnBoard_KeyCallback ( uint8 keys, uint8 state ) 在“ZMain\OnBoard .c”文件中可以找到。
其中 0 号 endpoint 是用"ZDO"预留的,不能占用。 4. Cluster ID,这个怎么叫呢?叫信息簇 ID 吧。我的理解是,“这是个哪类的信息”,发送 端和接收端一定要对应,但是具体这个“类”怎么分,是我们可以自己决定的。比如说这个例 子,我可以这样定:Cluster ID=1 代表开关一次,Cluster ID=2 代表连续闪烁。或者定 义 Cluster ID=1 代表点对点控制,而 Cluster ID=2 代表全部控制,等等。
二、开发 Z-Stack 须知。 1、ZigBee 的体系,数据及管理的方式和方向。ZigBee 网络构架。
ZigBee学习之16——ZStack API解读4
ZigBee学习之16——ZStack API解读4应用支持子层(APS)应用支持子层提供如下管理功能:∙邦定表管理∙组表管理∙快速地址查找除了管理功能外,APS还提供数据服务,只是应用不能访问数据服务。
应用需要通过AF数据接口AF_DataRequest()来发送数据。
如果要使用邦定表函数需要包含BindingTable.h头文件。
邦定表管理请注意,绑定服务只能在“互补”设备之间建立。
那就是,只有分别在两个节点的简单描述结构体(simple descriptor structure)中,同时注册了相同的命令标识符(command_id)并且方向相反(一个属于输出指令“output”,另一个属于输入指令“input”),才能成功建立绑定。
APS邦定表是在静态RAM中定义的一张表,定义在nwk_globals.c中。
表的大小可以通过f8wCo nfig.cfg中的[NWK_MAX_BINDING_ENTRIES和MAX_BINDING_CLUSTER_IDS]莱配置。
只有定义了R EFLECTOR或者COORDINATOR_BINDING才能包含此表,用REFLECTOR编译选项来支持APS层的源邦定。
邦定表结构– BindingEntry_ttypedef struct{uint16 srcIdx; // Address Manager indexuint8 srcEP;uint8 dstGroupMode; // Destination address type; 0 - Normal address index, 1 -// Group addressuint16 dstIdx; // This field is used in both modes (group and non-group) to// save NV and RAM space// dstGroupMode = 0 - Address Manager index// dstGroupMode = 1 - Group Addressuint8 dstEP;uint8 numClusterIds;uint16 clusterIdList[MAX_BINDING_CLUSTER_IDS];// Don't use MAX_BINDING_CLUSTERS_ID when// using the clusterIdList field. Use// gMAX_BINDING_CLUSTER_IDS} BindingEntry_t;srcIdx –源地址(绑定记录的源地址)的地址管理器索引,地址管理器保存着源地址的IEEE地址和短地址。
ZigBee学习之17——ZStack API解读5
网络层(NWK)网络层为高层提供下面函数功能:∙网络管理∙地址管理∙网络变量和效能函数除了管理功能外,NWK还提供数据服务,只是应用不能访问数据服务。
应用需要通过AF数据接口AF_DataRequest()来发送数据。
网络管理ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels,byte ScanDuration );用来请求网络层发现邻居路由器。
在加入操作执行网络扫描前应该调用此函数。
扫描确认(结果)将以回调函数ZDO_NetworkDiscoveryConfirmCB()返回。
推荐用户使用ZDO_StartDevice()来代替此函数。
(除非你清楚的知道网络加入过程)ScanChannels -执行发现的通道,2.4GHz条件下只能使用通道11-26(0x07FFF800)ScanDuration -新网络启动前,每个通道被其他网络扫描的时间BEACON_ORDER_15_MSEC 0 15.36 millisecondsBEACON_ORDER_30_MSEC 1 30.72 millisecondsBEACON_ORDER_60_MSEC 2 61.44 millisecondsBEACON_ORDER_120_MSEC 3 122.88 millisecondsBEACON_ORDER_240_MSEC 4 245.76 millisecondsBEACON_ORDER_480_MSEC 5 491.52 millisecondsBEACON_ORDER_1_SECOND 6 983.04 millisecondsBEACON_ORDER_2_SECONDS 7 1966.08 millisecondsBEACON_ORDER_4_SECONDS 8 3932.16 millisecondsBEACON_ORDER_7_5_SECONDS 9 7864.32 milliseconds BEACON_ORDER_15_SECONDS 10 15728.64 milliseconds BEACON_ORDER_31_SECONDS 11 31457.28 milliseconds BEACON_ORDER_1_MINUTE 12 62914.58 millisecondsBEACON_ORDER_2_MINUTES 13 125829.12 milliseconds BEACON_ORDER_4_MINUTES 14 251658.24 milliseconds BEACON_ORDER_NO_BEACONS 15 No Beacons transmitted 返回值:ZStatus_t -ZComDef.h中定义的状态值ZStatus_t NLME_NwkDiscReq2( NLME_ScanFields_t* fields );用来请求网络层发现邻居路由器。
zstack协议栈知识点总结
zstack协议栈知识点总结1. Z-Stack 协议栈架构Z-Stack 协议栈的架构分为四个层次:应用层、安全层、网络层和 MAC 层。
- 应用层:提供应用程序接口,实现应用层协议的处理和应用功能的实现。
- 安全层:实现对数据的加密和认证,确保通信的安全性。
- 网络层:实现 ZIGBEE 网络节点的加入、路由和寻径功能。
- MAC 层:实现对无线通信介质的访问和管理,包括 CSMA/CA 协议、ACK 确认和重传机制等。
2. Z-Stack 协议栈特点Z-Stack 协议栈具有以下几个特点:- 符合 ZigBee 标准:Z-Stack 协议栈严格遵循 ZigBee 标准,保证了与其他 ZigBee 设备的兼容性。
- 易用性:Z-Stack 提供了丰富的开发工具和示例代码,开发者可以快速上手进行开发。
- 灵活性:Z-Stack 支持不同的硬件平台和操作系统,适用于各种嵌入式系统。
- 安全性:Z-Stack 提供了多种安全机制,包括 AES 加密、认证和密钥管理,保证了通信的安全性。
3. Z-Stack 协议栈功能Z-Stack 协议栈实现了 ZigBee 协议的各种功能,包括网络组建、路由管理、数据传输和安全保障等。
- 网络组建:Z-Stack 支持 ZigBee 网络的组建和维护,包括协调器、路由器和终端设备的加入和退出。
- 路由管理:Z-Stack 负责 ZigBee 网络中的路由选择和寻径功能,保证数据的可靠传输。
- 数据传输:Z-Stack 实现了数据的传输和协议控制,包括数据帧封装、数据确认和重传机制。
- 安全保障:Z-Stack 提供了数据的加密、认证和密钥管理功能,保证通信的安全性。
4. Z-Stack 协议栈应用Z-Stack 协议栈广泛应用于物联网、智能家居、工业控制和传感器网络等领域,实现设备之间的无线通信和数据交换。
- 物联网应用:Z-Stack 协议栈可以用于连接各种传感器、执行器和控制器,构建物联网设备之间的通信网。
z-stack协议栈原理及应用
z-stack协议栈原理及应用Z-Stack协议栈是一种用于嵌入式设备的无线通信协议栈,它提供了一套标准的网络协议和应用接口,用于构建各种无线网络应用。
Z-Stack协议栈基于IEEE 802.15.4标准,主要用于低功耗、短距离的无线传感器网络和物联网应用。
Z-Stack协议栈的核心原理是将整个通信过程分解为多个层次,每个层次负责不同的功能,通过层与层之间的接口进行通信和数据传输。
这种分层的设计使得协议栈具有良好的可扩展性和灵活性。
Z-Stack协议栈包括物理层、MAC层、网络层和应用层。
物理层是Z-Stack协议栈的最底层,主要负责无线信号的传输和接收。
它定义了无线传输的频率、功率、调制方式等参数。
物理层的实现通常依赖于硬件,如无线模块或芯片。
MAC层负责控制数据在无线信道中的传输。
它处理数据的帧格式、碰撞检测、ACK确认等功能。
MAC层还负责管理网络中的设备,包括设备的加入、离开等操作。
MAC层的实现通常需要考虑网络的拓扑结构和能耗等因素。
网络层负责路由和寻址等功能。
它将数据包从源节点传输到目标节点,并维护网络拓扑信息。
网络层使用一种特殊的路由协议来确定数据包的传输路径,以保证数据能够正确到达目标节点。
常见的路由协议有AODV、RPL等。
应用层是Z-Stack协议栈的最高层,负责处理应用相关的功能。
它定义了应用的数据格式、应用接口等。
应用层可以根据具体的应用需求,实现各种不同的应用,如传感器数据采集、远程控制等。
Z-Stack协议栈的应用非常广泛。
它可以应用于家庭自动化、智能电网、工业自动化等领域。
例如,在家庭自动化中,Z-Stack协议栈可以用于构建智能家居系统,实现灯光控制、温度调节、安防监控等功能。
在智能电网中,Z-Stack协议栈可以用于实现电力设备的远程监控和控制。
在工业自动化中,Z-Stack协议栈可以用于构建无线传感器网络,实现设备状态的实时监测和控制。
Z-Stack协议栈是一种重要的无线通信协议栈,它通过分层设计和标准接口,提供了一种可靠、灵活的通信解决方案。
Z-Stack协议中几个重要概念的理解
Z-Stack协议中几个重要概念的理解1. 原语ZigBee设备在工作时,各种不同的任务在不同的层次上执行,通过层的服务,完成所要执行的任务。
每一层的服务主要完成两种功能:根据它的下层服务要求,为上层提供相应的服务;另一咱是根据上层的服务要求,对它的下层提供相应的服务。
各项服务通过服务原语来实现。
可以把原语看作是API函数是ZigBee中最基本的操作,一般协议都有对原语进行程序实现在自己开发系统时,只需要调用,设定参数就好了。
如果要自己实现底层的细节那就必须在开源的协议栈中,深入到原语的级别。
也就是说,对于原语我们只需要了解就行,真正开发程序只知道我们给系统哪些参数就行了。
原语通常分为下面4种类型:(1)Request:请求原语是从第N1用户发送到它的第M层,请求服务开始。
(2)Indication:指示原语是从第N1用户的第M层向第N2用户发送,指出对于第N2用户有重要意义的内部M层的事件,该事件可能与一个遥远的服务请求有关,或者可以是由一个M层的内部事件引起(3)Respons:响应原语是从第N2用户向它第M层发送,用来表示对用户执行上一条原语调用过程的响应(4)Confirm:确认原语是由第M层向第N1用户发送,用来传送一个或多个前面服务请求原语的执行结果。
2. 绑定绑定涉及到两个网络节点,在绑定表中,它包含如下信息: IEEE地址、EndpointID。
其中Endpoint描述信息中的ClusterID必须值相等,而且属性方向相反。
节点间的绑定,通常是通过Endpoint的绑定来实现的。
例如节点A 的Endpoint可以和节点B 中的一个或多个Endpoint实现绑定,节点A的Endpoint 也可以和多个节点中的Endpoint进行绑定。
绑定是一种两个(或者多个)应用设备之间信息流的控制机制。
绑定允许应用程序发送一个数据包而不需要知道目标地址,APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。
实验8—基于Z-Stack的无线自组网实验
实验8—基于Z-Stack的⽆线⾃组⽹实验实验题⽬:实验8—基于Z-Stack的⽆线⾃组⽹实验实验时间:2015.12.24⼀、实验⽬的:学习TI ZStack2007协议栈内容,掌握CC2530模块⽆线组⽹原理及过程。
有关Z-Stack2007协议栈的具体内容,请参考附录中相关说明及TI官⽅⽂档。
使⽤IAR 开发环境设计程序,ZStack-2.3.0-1.4.0协议栈源码例程SampleApp⼯程基础上,实现⽆线组⽹及通讯。
即协调器⾃动组⽹,终端节点⾃动⼊⽹,并发送周期信息“~HELLO!~”⼴播,协调器接收到消息后将数据通过串⼝发送给PC 计算机。
⼆、实验原理及程序分析:a)ZigBee(CC2530)模块LED硬件接⼝图1 LED 硬件接⼝ZigBee(CC2530)模块硬件上设计有2个LED灯,⽤来编程调试使⽤。
分别连接CC2530的P1_0、P1_1两个IO 引脚。
从原理图上可以看出,2个LED灯共阳极,当P1_0、P1_1引脚为低电平时候,LED灯点亮。
b)SampleApp实验简介SampleApp实验是协议栈⾃带的ZigBee⽆线⽹络⾃启动(组⽹)样例,该实验实现的功能主要是协调器⾃启动(组⽹),节点设备⾃动⼊⽹。
之后两者建⽴⽆线通讯,数据的发送主要有2中⽅式,⼀种为周期定时发送信息(本次实验采⽤该⽅法测试),另⼀种需要通过按键事件触发发送FLASH信息。
由于实验配套ZigBee模块硬件上与TI公司的ZigBee样板有差异,因此本次实验没有采⽤按键触发⽅式。
Periodic消息是通过系统定时器开启并定时⼴播到group1出去的,因此在SampleApp_ProcessEvent事件处理函数中有如下定时器代码:case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if ( (SampleApp_NwkState == DEV_ZB_COORD)|| (SampleApp_NwkState == DEV_ROUTER)|| (SampleApp_NwkState == DEV_END_DEVICE) ){// Start sending the periodic message in a regularinterval.HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );}else{// Device is no longer in the network}break;当设备加⼊到⽹络后,其状态就会变化,对所有任务触发ZDO_STATE_CHANGE 事件,开启⼀个定时器。
发送函数AF_DataRequest
Z-Stack 中发送数据通过在应用层调用函数voidSampleApp_SendFlashMessage( uint16 flashTime )完成,其中flash Time 为发送的数据,这个函数在应用中通过调用afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,uint16 cID,uint16 len, uint8 *buf, uint8 *transID,uint8 options, uint8 radius )函数完成数据的发送。
如果熟悉了其中的每个参数的含义,就可以很灵活的使用发送函数发送自己的数据。
第一个参数dstAddr,在文件AF.h中,该参数是一个结构体的指针。
在该参数中除了指定了网络地址外,还需要指定目的地址的模式参数。
typedef struct{union{uint16 shortAddr;} addr;afAddrMode_t addrMode; //afAddrMode_t是一个枚举类型模式参数byte endPoint; //指定的端点号端点241—254保留端点范围1-240} afAddrType_t;下面的是afAddrMode_t结构体的定义typedef enum{afAddrNotPresent = AddrNotPresent, //按照绑定表进行绑定传输afAddr16Bit = Addr16Bit, // 指定目标网络地址进行单薄传输16位afAddrGroup = AddrGroup, // 组播传输afAddrBroadcast = AddrBroadcast //广播传输} afAddrMode_t;enum{AddrNotPresent = 0,AddrGroup = 1,Addr16Bit = 2,Addr64Bit = 3, // 指定IEEE地址进行单播传输64位AddrBroadcast = 15};注意:ZigBee设备有两种类型的地址。
描述Z-Stack协议栈中原语通信方式并举例说明
描述Z-Stack协议栈中原语通信方式并举例说明Z-Stack是一种嵌入式协议栈,旨在支持低功耗、无线传感器网络的开发。
原语是Z-Stack协议栈中的一种通信方式,它是指具有原子操作特性的低层通信功能,用于实现更高层次的通信协议。
在Z-Stack协议栈中,原语被组织成不同的层次,每个层次都有一个特定的任务,以实现某种特定的通信协议。
这些层次包括应用层、ZDO层、网络层、MAC层和PHY层。
原语通信方式是指在同一层次的协议栈中,使用预定义的接口实现通信的方式。
因为通信的基本操作被封装在预定义的接口中,所以在不同的应用场景下,可以使用不同的协议来实现相同的通信功能。
举个例子,假设我们想在一个无线传感器网络中实现数据采集和传输。
我们可以使用Z-Stack协议栈中的网络层和MAC层,通过原语通信方式来实现通信。
首先,我们需要在网络层中定义一些通信协议,以实现数据的传输。
例如,我们可以使用广播协议来将数据从一个节点传输到另一个节点,或者使用多跳协议来实现跨越多个节点的数据传输。
其次,我们需要在MAC层中实现这些通信协议。
我们可以使用Z-Stack协议栈中预定义的原语通信方式,如MAC数据请求原语和MAC数据响应原语,来实现数据的传输。
这些原语可以在不同的节点之间进行通信,以实现数据的采集和传输。
最后,我们可以使用Z-Stack协议栈中的API函数来控制节点的行为。
例如,我们可以使用API函数来设置节点的工作模式、修改通信协议和发送数据等。
综上所述,Z-Stack协议栈中的原语通信方式是一种低层次的通信方式,它可以帮助我们实现更高层次的通信协议。
在实际应用中,可以根据需要选择不同的通信协议和原语,以满足不同的应用需求。
Z-Stack协议栈中的原语通信方式是指在协议栈内部,不同层次之间的通信方式。
在Z-Stack协议栈中,通信方式主要包括下面几种原语:1. MAC数据请求(MAC Data Request):该原语用于发送MAC层数据。
第六章 Zstack协议栈
3
第一节 ZSTACK软件架构
4
第一节 ZSTACK软件架构
12
第二节 HAL层分析------TARGET文件夹
1. Config文件夹 Config文件夹中包含了hal_board_cfg.h,在hal_board_cfg.h中定
义了硬件CC2530硬件资源的配置,比如GPIO、DMA、ADC等。 2. Drivers文件夹 在Drivers文件中定义了硬件资源的驱动文件
●参数percent,指LED亮和灭的所用事件占空比,例 如亮和灭所用的事件比例为1∶1,则占空比为 100/2 = 50。
●参数period,指LED闪烁一个周期所需要的时间, 以毫秒为单位。
15
第三节 NWK层分析
Zstack的NWK层负 责的功能有:节点 地址类型的分配、 协议栈模板、网络 拓扑结构、网络地 址的分配和选择等。 在Zstack协议栈中, NWK层的结构如图 所示
层处理函数,比如加密。 ●Tools:工程配置目录,包括空间划分及ZStack相关配置信
息。 ●ZDO:ZDO设备对象目录。
●ZMac:MAC层目录,包括MAC层参数及MAC层的LIB库函 数回调处理函数。
●Zmain:主函数目录,包括入口函数及硬件配置文件。 ●Output:输出文件目录,由IAR自动生成。
●APP:应用层目录,用户可以根据需求添加自己的任务。这个目 录中包含了应用层和项目的主要内容,在协议栈里面一般是以操作 任务实现的。
Z-Stack协议——发送函数AF_DataRequest.doc
Z-Stack 协议 --- 发送函数AF_DataRequestZ-Stack中发送数据通过在应用层调用函数void SampleApp_SendFlashMessage( uintl6 flashTime )完成,其中flash Time 为发送的数据,这不函数在应用中通过调用[AF.c]afStatus_t AF_DataRequest( afAddrType_t *d st Ad dr, endPointDesc_t *srcEP, uintl6clD, uintl6 len, uint8 *buf, uint8 *translD, uint8options, uint8 radius )函数完成数据的发送。
如果熟悉了其中的每个参数的含义,就可以很灵活的使用发送函数发送口己的数据。
第一个参数dstAddr,在文件AF.h中,该参数是一个结构体的指针。
在该参数中除了指定了网络地址外,还需要指定目的地址的模式参数。
[AF. h]typedef struet{union{uint16 shortAddr;} addr;afAddrMode_t addrMode; //afAddrMode_t 是一个枚举类型模式参数byte endPoint; //指定的端点号端点241一254保留端点范围1-240 } afAddrType_t;下而的是afAddrMode_t结构体的定义目的地址模式可以设置亦以下儿个值:[AF. h]typedef enum{afAddrNotPresent 二AddrNotPresent, //间接传送仃ndirect) afAddrl6Bit 二Addrl6Bit, //指定地址单点传送(Unicast) 16 位afAddrGroup 二AddrGroup, //组寻址(Group Addressing) afAddrBroadcast = AddrBroadcast//广播传送(broadcast) } afAddrMode_t;下面详细解释客种地址模式单点传送(Unicast)Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。
Z-Stack协议栈的简单总结
Z-Stack协议栈的简单总结Z-Stack 是通过UCOS来实现的,其中协议的各个层被分配一个任务,共有如下任务:Hal、mac、nwk、MT(Monitor Test简称)、APS、ZDApp和SampleApp。
Hal、mac、nwk、APS就不介绍了(主要完成zigbee协议的各个层)。
TI为了使用户调试方便而编写一些上位机软件(如SmartRF04Prog、sniffer、Z-Location Engine等),而MT(Monitor Test)是用来完成协议栈与这些上位机软件的通信的,通过串口来完成,因而MT中主要完成的是串口指令的收发机解析,并经该消息发给OS,由操作系统对这些消息进行处理。
ZDApp(ZigBee Deviece Application)是zigbee设备的应用层处理函数,可以通过这层的函数来与网络层和APS层进行通信,如完成组网,加入网络,端点匹配、绑定等。
SampleApp是用户完成的部分(也分配了一个任务),主要在这里完成自己的编程设置。
OS中每个任务都有一个任务初始化函数和任务事件处理回调函数,如SampleApp_Init( taskID )和SampleApp_ProcessEvent( byte task_id, UINT16 events )。
如果需要深入了解任务的工作机制,如任务管理、调度任务的同步与通信等,可以去看uC/OS得相关资料。
而任务下面又划分很多事件(可以把事件理解为当前任务下的一些小的任务)。
在OS中事件是为了实现任务间的同步与通信的,如信号量、消息邮箱和消息队列。
单片机基础对于OS不胜了解的可以这样来理解,自己当初也是这样来理解的(可以把任务中的发送事件理解为置标志位,在本任务或另一个任务中查询标志位来完成相应操作)在uCOS中任务和事件的处理是由操作系统来完成的,任务按照优先级来调度,每个任务有自己的任务控制块来决定和记录任务的执行情况,而事件有事件控制块。
Zstack协议栈对串口进行操作
Zstack协议栈对串口进行操作Zstack协议栈中如何对串口进行操作想要使用串口功能,首先要进行初始化操作:halUARTCfg_t uartConfig;uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.uartConfig.baudRate = SERIAL_APP_BAUD;uartConfig.flowControl = TRUE;uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.uartConfig.rx.maxBufSize = SERIAL_APP_RX_SZ; // 2x30 don't care - see uart driver.uartConfig.tx.maxBufSize = SERIAL_APP_TX_SZ; // 2x30 don't care - see uart driver.uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2x30don't care - see uart driver.uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.uartConfig.callBackFunc = SerialApp_CallBack; HalUARTOpen (SERIAL_APP_PORT, &uartConfig);程序首先定义了halUARTCfg类型的变量uartConfig,用来配置跟串口功能相关的波特率、流控制等等,其中最重要的是uartConfig.callBackFunc=SerialApp_CallBack。
Z-Stack协议——发送函数AF_DataRequest
Z-Stack协议——发送函数AF_DataRequestZ-Stack 中发送数据通过在应用层调用函数void SampleApp_SendFlashMessage( uint16 flashTime )完成,其中flash Time 为发送的数据,这个函数在应用中通过调用[AF.c]afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,uint16 cID, uint16 len, uint8 *buf, uint8 *transID,uint8 options, uint8 radius )函数完成数据的发送。
如果熟悉了其中的每个参数的含义,就可以很灵活的使用发送函数发送自己的数据。
第一个参数dstAddr,在文件AF.h中,该参数是一个结构体的指针。
在该参数中除了指定了网络地址外,还需要指定目的地址的模式参数。
[AF.h]typedef struct{union{uint16 shortAddr;} addr;afAddrMode_t addrMode;//afAddrMode_t是一个枚举类型模式参数byte endPoint;//指定的端点号端点241—254保留端点范围 1-240} afAddrType_t;下面的是afAddrMode_t结构体的定义目的地址模式可以设置为以下几个值:[AF.h]typedef enum{afAddrNotPresent = AddrNotPresent,//间接传送(Indirect)afAddr16Bit = Addr16Bit,//指定地址单点传送(Unicast) 16位afAddrGroup = AddrGroup,//组寻址(Group Addressing) afAddrBroadcast = AddrBroadcast//广播传送(broadcast)} afAddrMode_t;下面详细解释各种地址模式单点传送(Unicast)Uicast 是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。
Z-Stack中串口发送接收的流程
Z-Stackxx串口发送接收的流程串口接收发送数据有两种方式,一种是中断的模式,另一种是DMA方式,这里主要以中断的方式,来看一下使用串口来发送,接收数据的整个流程。
这里以SerialApp例程为例子。
在mian函数中的调用HalDriverInit();函数,在函数中初始化串口,主要是配置管脚和DMA通道void HalDriverInit(void){.................................../* UART */#if (defined HAL_UART) && (HAL_UART == TRUE)HalUARTInit();#endif....................................}从程序中可以看出要想使用协议栈中串口,初始化串口必须定义HAL_UART 和HAL_UART TRUE 在hal_board_cfg.h文件中。
#ifndef HAL_UART#if (defined ZAPP_P1) || (defined ZAPP_P2) || (defined ZTOOL_P1) ||(defined ZTOOL_P2)#define HAL_UART TRUE#else#define HAL_UART FALSE#endif /* ZAPP, ZTOOL */#endif /* HAL_UART */然后在osal_start_system()开始系统后,会调用Hal_ProcessPoll()来读取时间和串口。
在CC2430的数据手册中有这样一段话。
Data reception on the UART is initiatedwhen a 1 is written to the UxCSR.RE bit The UART will then search for a valid start bit on the RXDx input pin and set the hardware.当有数据接收时,UxCSR.RE位将被置1,然后,UART将在RXDx的输入引脚上查找一个有效的开始位,当找到这个开始位时,将设置UxCSR.ACTIVE位为高电平。
协议栈-Z-Stack协议栈基础和数据传输实验
「ZigBee模块」协议栈-Z-Stack协议栈基础和数据传输实验花了好久写的...感觉还不错的呢...如果看,请细看...Mua~Z-Stack协议栈基础和数据传输实验一、实验目的终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来。
串口优化把有线串口传输改为无线蓝牙传输。
二、实验平台硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块软件:实验基于SampleApp工程进行。
三、实验步骤1.串口初始化代码2.发送部分代码3.接收部分代码四、协议栈基础做实验之前先了解一点关于协议栈的基础知识吧~什么是协议栈?我们知道使用Zigbee一般都要进行组网、传输数据。
可想而知其中的代码数量是非常庞大的,如果我们每次使用zigbee都需要自己写所以代码的话,会非常麻烦。
因此就有了协议栈。
可以说它是一个小型的操作系统,把很多通信、组网之类的代码都封装起来了。
我们要做的只是通过调用函数来实现我们的目的。
来看一下协议栈的工作流程图(图1)。
然后我会对照流程图对协议栈进行简单的分析。
图1我们就从流程图的“开始”开始分析吧~打开工程文件SampleApp,main函数是程序执行的开始,我们要先找到它。
Main函数在ZMAin文件夹的ZMain.c下,打开它,找到main函数。
main();浏览一下main函数可以看到一开始都是各种初始化函数,即对应流程图中的“各种初始化函数”。
初始化中我们需要注意的是“osal_init_system();”初始化操作系统函数。
等一下会对它进行说明。
继续看下去,“osal_start_system();”这是执行操作系统函数,对应流程中的“运行操作系统”。
注意这个函数进去之后是不会再返回的。
总结main函数就是初始化和执行操作系统两个部分。
我们再来分析一下“osal_init_system();”这个函数,它的功能是初始化操作系统。
学习z-stack协议栈的serialApp例子
halUARTCfg_t *config); 9.2.3 Parameter Details port – specified serial port to be opened. (Read UART Ports Table) 打开相应的串口(在 uart 串口表中可以找到相应的口。 ) config – Structure that contains the information that is used to configure the port 配置相应串口的配置信息。 typedef struct { bool configured; uint16 baudRate; bool flowControl; uint16 flowControlThreshold; uint8 idleTimeout; uint16 rx; uint16 tx; bool intEnable; uint32 rxChRvdTime; halUARTCBack_t callBackFunc; }halUARTCfg_t; config.configured – Set by the function when the port is setup correctly and read to be used. 当串口准备好时由函数设置。 config.baudRate – The baud rate of the port to be opened. (Check UART Ports Table) 串口的速率 config.flowControl – UART flow control can be set as TRUE or FALSE. TRUE value will enable flow control and FALSE value will disable flow control. config.flowControlThreshold – Number of bytes left before Rx buffer reaches maxRxBufSize. When Rx buffer reaches this number (maxRxBufSize – flowControlThreshold) and flowControl is TRUE, a callback will be sent back to the application with HAL_UART_RX_ABOUT_FULL event. 在 RX 缓 存 达 到 maxRxBufSize 之 前 还 有 多 少 字 节 空 余 。 当 到 达 maxRxBufSize – flowControlThreshold 时 并 且 流 控 制 打 开 时 , 会 触 发 相 应 的 应 用 事 件 : HAL_UART_RX_ABOUT_FULL config.idleTimeout – Rx timeout period in milliseconds. If Rx buffer haven’t got new data for idleTimout amount of time, a callback will be issued to the application with HAL_UART_RX_TIMEOUT event. The application can choose to read everything from the Rx buffer or just partial of it. 如果在 idleTimout amount of time 时间内 RX 还没有得到新的数据,将会触发相应的事件 HAL_UART_RX_TIMEOUT ,这时应用可以选择读出所有 RX 的值或者一部分。 config.rx – Contains halUARTBufControl_t structure that used to manipulate Rx buffer 包含 halUARTBufControl_t 数据结构用于控制 RX 缓存 config.tx – Contains halUARTBufControl_t structure that used to manipulate Tx buffer 包含 halUARTBufControl_t 数据结构用于控制 TX 缓存 typedef struct {
Z-Stack协议栈代码介绍
8.1 TI Z-Stack协议栈代码介绍TI公司在提供Zigbee无线单片机CC2530的同时,也提供了Z-Stack协议栈源代码,以方便设计人员将Z-Stack直接移植到CC2530上使用,使其支持IEEE 802. 15. 4/ZigBee 协议。
TI也提供比较多的工具软件,如CC2530的FLASH编程软件,包监视分析软件,以及一些在协议之上的应用案例,简单点对点通信软件、智能家居应用软件等。
为了使我们自己的系统稳定可靠运行,必须保证硬件的设计稳定可靠,满足需要的功能要求外,软件的设计也是同样重要的。
为了使整个系统能很好的正常工作,必须让软硬件协同操作,在TI的Z-Stack协议栈之上开发我们自己的软件系统,不愧为一种很好的、省力的方式。
自己去写Z-Stack协议栈代码并让其稳定运行是不现实的,不是投入太大就是时间太长。
这样,对TI的Z-Stack协议栈代码进行必要的了解是非常必要的。
通过IAR软件打开TI的Z-Stack协议栈,如下图所示:第一次打开工程印象最深刻的就是左边一排文件夹,非常多,很庞杂,感觉无从下手。
我们先不深入目录之下,先了解每个目录放的是什么内容,那么知道各个文件夹大概是什么功能,分布在 ZIGBEE 的哪一层,那么在以后的工作中无论是查询某些功能函数还是修改某些功能函数,甚至是添加或删除某些功能函数就能顺利的找到在什么地方了,方便对Z-Stack协议栈软件的更深入的学习了解。
下面对Z-Stack协议栈的文件夹进行介绍:APP(ApplicationProgramming):应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的。
APP:用户应用程序及接口,包括串口数据处理、无线接收数据处理、用户LCD显示处理、传感器数据读取和发送等。
HAL(Hardware (H/W) Abstraction Layer):硬件层目录,包含有与硬件相关的配置和驱动及操作函数。
ZDO——Z-Stack中的Zigbee设备对象
一个(yīɡè)端点对应一个任务,每一个任务都有唯一的任务号及任务处理函数,ZDO_RegisterForZDOMsg( )在相应(xiāngyīng)的任务中注册事件,并且每一个事件只能被成功注册一次,每一个任务也只能注册一次事件,因为(yīn wèi):ZStatus_t ZDO_RegisterForZDOMsg( uint8 taskID, uint16 clusterID ){ZDO_MsgCB_t *pList;ZDO_MsgCB_t *pLast;ZDO_MsgCB_t *pNew;// Look for duplicatepList = pLast = zdoMsgCBs;//zdoMsgCBs此指针变量(biànliàng)始终指向注册事件链表的头while ( pList ){if ( pList->taskID == taskID && pList->clusterID == clusterID )return ( ZSuccess );//若之这个任务(rèn wu)已注册了事件(本事件或其他事件),那pLast = pList; //么此次注册将不会把注册信息加入链表,就相当于没有注册pList = (ZDO_MsgCB_t *)pList->next;}// Add to the list若没有被注册过(之前链表里没有),则将其添加到链表的末尾(注册)pNew = (ZDO_MsgCB_t *)osal_mem_alloc( sizeof ( ZDO_MsgCB_t ) );if ( pNew ){pNew->taskID = taskID;pNew->clusterID = clusterID;pNew->next = NULL;if ( zdoMsgCBs ){pLast->next = pNew;}elsezdoMsgCBs = pNew;return ( ZSuccess );}elsereturn ( ZMemError );}/***********************************************************遗留问题:链表中的事件,在何时何地,什么情况下被销毁呢?************************************************************/接着说,那么注册(zhùcè)了以后它有什么用?怎么用呢?先看Z-Stack API中对此函数(hánshù)的解释:Call this function request an OTA message. A copy of the message will be send to a task in an OSAL message .The task recevice the OTA message can either prase the message themselves or call a ZDO prase function to prase the message.Only response messages have a ZDO prase function.After registering for a message ,and the message(OTA) is receviced,the message is send to the application/task as a ZDO_CB_MSG(OSAL Msg).大意(dàyì):调用这个函数用来请求一个无线消息,这个消息的备份(bèi fèn)将被作为一个系统消息送给一个任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Z-Stack协议学习笔记1-----发送函数AF_DataRequest (2010-11-18 18:52) 分类:ZigBee 技术学习Z-Stack 中发送数据通过在应用层调用函数voidSampleApp_SendFlashMessage( uint16 flashTime )完成,其中flash Time 为发送的数据,这个函数在应用中通过调用afStatus_tAF_DataRequest(afAddrType_t *dstAddr, endPointDesc_t *srcEP,uint16cID, uint16 len, uint8 *buf, uint8 *transID,uint8 options, uint8 radius )函数完成数据的发送。
如果熟悉了其中的每个参数的含义,就可以很灵活的使用发送函数发送自己的数据。
第一个参数dstAddr,在文件AF.h中,该参数是一个结构体的指针。
在该参数中下面的是 afAddrMode_t结构体的定义MAC地址,另一种是16位网络地址。
64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。
它通常由制造商或者被安装时设置。
这些地址由IEEE来维护和分配。
16为网络地址是当设备加入网络后由协调器或路由器分配的。
它在网络中是唯一的,用来在网络中鉴别设备和发送数据。
第二个参数endPointDesc_t *srcEP,也是一个结构体的指针,目的网络地址描述,每个终端都必须要有一个ZigBeezz的简单描述。
afNetworkLatencyReq_tlatencyReq;//枚举结构必须用 noLatencyReqs 填充}endPointDesc_t;目标设备的简单描述结构typedefstruct{byte EndPoint;//EP ID (EP=End Point)uint16 AppProfId;// profile ID(剖面ID)uint16 AppDeviceId;// Device IDbyte AppDevVer:4;//Device Version 0x00 为 Version 1.0byte Reserved:4;// AF_V1_SUPPORT uses for AppFlags:4.byte AppNumInClusters;//终端支持的输入簇的个数cId_t*pAppInClusterList;//指向输入Cluster ID列表的指针byte AppNumOutClusters;//输出簇的个数cId_t*pAppOutClusterList;//指向输出Cluseter ID列表的指针}SimpleDescriptionFormat_t;typedefenum第三个参数:uint16 cID簇ID第四个参数:len要发送的数据的长度第五个参数:uint8 *buf指向发送数据缓冲的指针第六个参数:uint8 *transID事务序列号指针。
如果消息缓存发送,这个函数将增加这个数字第七个参数:发送选项,可以由下面一项,或几项相或得到AF_ACK_REQUEST 0x10 要求APS应答,这是应用层的应答,只在直接发送(单播)时使用。
AF_DISCV_ROUTE 0x20 总要包含这个选项AF_SKIP_ROUTING 0x80 设置这个选项将导致设备跳过路由而直接发送消息。
终点设备将不向其父亲发送消息。
在直接发送(单播)和广播消息时很好用。
第八个参数:uint8 radius 最大的跳数,用默认值AF_DEFAULT_RADIUS返回值:该函数的返回值:afStatus_t类型枚举型的,成功或下面是这个函数完整的源代码:pDescCBpfnDescCB;ZStatus_t stat;APSDE_DataReq_treq;afDataReqMTU_tmtu;// Verify source end point 判断源节点是否为空if(srcEP==NULL){return afStatus_INVALID_PARAMETER;}#if!defined( REFLECTOR )if(dstAddr->addrMode==afAddrNotPresent){return afStatus_INVALID_PARAMETER;}#endif// Verify destination address 判断目的地址req.dstAddr.addr.shortAddr=dstAddr->addr.shortAddr; // Validate broadcasting 判断地址的模式if((dstAddr->addrMode== afAddr16Bit )||(dstAddr->addrMode==afAddrBroadcast)){// Check for valid broadcast values 核对有效的广播值if( ADDR_NOT_BCAST !=NLME_IsAddressBroadcast(dstAddr->addr.shortAdd r)){// Force mode to broadcast 强制转换成广播模式dstAddr->addrMode=afAddrBroadcast;}else{// Address is not a valid broadcast type 地址不是一个有效的广播地址类型if(dstAddr->addrMode==afAddrBroadcast){return afStatus_INVALID_PARAMETER;}}}elseif(dstAddr->addrMode!=afAddrGroup&&dstAddr->addrMode!=afAddrNotPresent){return afStatus_INVALID_PARAMETER;}req.dstAddr.addrMode=dstAddr->addrMode;req.profileID= ZDO_PROFILE_ID;if((pfnDescCB=afGetDescCB(srcEP)))uint16 *pID=(uint16 *)(pfnDescCB(AF_DESCRIPTOR_PROFILE_ID,srcEP->endPoint)); if(pID){req.profileID=*pID;osal_mem_free(pID);}}elseif(srcEP->simpleDesc){req.profileID=srcEP->simpleDesc->AppProfId; }req.txOptions= 0;if(( options & AF_ACK_REQUEST )&&(req.dstAddr.addrMode!=AddrBroadcast)&& (req.dstAddr.addrMode!=AddrGroup)){req.txOptions|= APS_TX_OPTIONS_ACK;}if( options & AF_SKIP_ROUTING ){req.txOptions|= APS_TX_OPTIONS_SKIP_ROUTING; }if( options & AF_EN_SECURITY )req.txOptions|= APS_TX_OPTIONS_SECURITY_ENABLE;mtu.aps.secure=TRUE;}else{mtu.aps.secure=FALSE;}mtu.kvp=FALSE;req.transID=*transID;req.srcEP=srcEP->endPoint;req.dstEP=dstAddr->endPoint;req.clusterID=cID;req.asduLen=len;req.asdu=buf;req.discoverRoute=TRUE;//(uint8)((options & AF_DISCV_ROUTE) ? 1 : 0); req.radiusCounter= radius;if(len>afDataReqMTU(&mtu)){if(apsfSendFragmented){req.txOptions|= AF_FRAGMENTED | APS_TX_OPTIONS_ACK;stat =(*apsfSendFragmented)(&req);}elsestat =afStatus_INVALID_PARAMETER;}}else{stat =APSDE_DataReq(&req);}/** If this is an EndPoint-to-EndPoint message on the same device, it will not* get added to the NWK databufs. So it will not go OTA and it will not get* a MACCB_DATA_CONFIRM_CMD callback. Thus it is necessary to generate the* AF_DATA_CONFIRM_CMD here. Note that APSDE_DataConfirm() only generates one* message with the first in line TransSeqNumber, even on a multi message. * Also note that a reflected msg will not have its confirmation generated * here.*/if((req.dstAddr.addrMode== Addr16Bit)&&(req.dstAddr.addr.shortAddr==NLME_GetShortAddr())){afDataConfirm(srcEP->endPoint,*transID, stat );}if( stat ==afStatus_SUCCESS)。