Z-Stack协议——发送函数AF_DataRequest.doc_第1页
Z-Stack协议——发送函数AF_DataRequest.doc_第2页
Z-Stack协议——发送函数AF_DataRequest.doc_第3页
Z-Stack协议——发送函数AF_DataRequest.doc_第4页
Z-Stack协议——发送函数AF_DataRequest.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

By:AdamZ-Stack协议发送函数AF_DataRequestZ-Stack 中发送数据通过在应用层调用函数void SampleApp_SendFlashMessage( uint16 flashTime )完成,其中flash Time 为发送的数据,这个函数在应用中通过调用AF.cafStatus_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.htypedef structunionuint16 shortAddr; addr;afAddrMode_t addrMode; /afAddrMode_t是一个枚举类型模式参数byte endPoint; /指定的端点号 端点241254保留端点 范围 1-240 afAddrType_t;下面的是 afAddrMode_t结构体的定义目的地址模式可以设置为以下几个值:AF.htypedef enumafAddrNotPresent = AddrNotPresent,/间接传送(Indirect) afAddr16Bit = Addr16Bit,/指定地址单点传送(Unicast) 16位afAddrGroup = AddrGroup,/组寻址(Group Addressing)afAddrBroadcast = AddrBroadcast/广播传送(broadcast) afAddrMode_t;下面详细解释各种地址模式单点传送(Unicast) Uicast 是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将 afAddrMode 设置为 Addr16Bit 并且在数据包中携带目标设备地址。间接传送(Indirect)当应用程序不清楚数据包的最终目标的时候使用间接传送。将模式设置为AddrNotPresent 并且不指定目标地址。取而代之的是,从发送设备的栈的绑定表中查找到的目标。这种特点称之为源绑定(在后面的绑定一节详细介绍)。当数据向下发送到栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。上一个版本的 ZigBee(ZigBee04),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)。广播传送(broadcast)当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为 AddrBroadcast。目标地址可以设置为下面广播地址的一种:NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点 直到查询到它或者消息超时(NWK_INDIRECT_MSG_TIMEO在f8wConifg.cfg 中)。NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)数据包将被传送到网络上的所有的打开接收的空闲设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)数据包发送给所有的路由器,包括协调器。组寻址(Group Addressing)当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为 afAddrGroup 并且 addr.shortAddr 设置为组 ID。在使用这个功能之前,必须在网络中定义组。(参见 Z-stack API 文档中的aps_AddGroup()函数)。注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。下面的代码是一个设备怎样加入到一个 ID 为 1 的组当中:aps_Group_t group;/ Assign yourself to group 1group.ID = 0x0001;0 = 0; / This could be a human readable stringaps_AddGroup( SAMPLEAPP_ENDPOINT, &group );ZComDef.henumAddrNotPresent = 0,AddrGroup = 1,Addr16Bit = 2,Addr64Bit = 3, / 指定IEEE地址进行单播传输 64位AddrBroadcast = 15;注意:ZigBee设备有两种类型的地址。一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16为网络地址是当设备加入网络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。第二个参数endPointDesc_t *srcEP,也是一个结构体的指针,目的网络地址描述,每个终端都必须要有一个ZigBee的简单描述。AF.htypedef structbyte endPoint; /端点号byte *task_id; / Pointer to location of the Application task ID.SimpleDescriptionFormat_t *simpleDesc; /设备的简单描述afNetworkLatencyReq_t latencyReq; /枚举结构 必须用 noLatencyReqs 填充 endPointDesc_t;目标设备的简单描述结构AF.htypedef structbyte 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;AF.htypedef enumnoLatencyReqs,fastBeacons,slowBeacons afNetworkLatencyReq_t;第三个参数:uint16 cID 簇ID第四个参数:len 要发送的数据的长度第五个参数:uint8 *buf 指向发送数据缓冲的指针第六个参数:uint8 *transID事务序列号指针。如果消息缓存发送,这个函数将增加这个数字第七个参数:发送选项,可以由下面一项,或几项相或得到AF_ACK_REQUEST 0x10 要求APS应答,这是应用层的应答,只在直接发送(单播)时使用。 AF_DISCV_ROUTE 0x20 总要包含这个选项 AF_SKIP_ROUTING 0x80 设置这个选项将导致设备跳过路由而直接发送消息。终点设备将不向其父亲发送消息。在直接发送(单播)和广播消息时很好用。返回值:该函数的返回值:afStatus_t类型枚举型的,成功或AF.htypedef enum afStatus_SUCCESS, afStatus_FAILED = 0x80, afStatus_MEM_FAIL, afStatus_INVALID_PARAMETER afStatus_t;下面是这个函数完整的源代码:/* * fn AF_DataRequest * * brief Common functionality for invoking APSDE_DataReq() for both * SendMulti and MSG-Send. * * input parameters * * param *dstAddr - Full ZB destination address: Nwk Addr + End Point. * param *srcEP - Origination (i.e. respond to or ack to) End Point Descr. * param cID - A valid cluster ID as specified by the Profile. * param len - Number of bytes of data pointed to by next param. * param *buf - A pointer to the data bytes to send. * param *transID - A pointer to a byte which can be modified and which will * be used as the transaction sequence number of the msg. * param options - Valid bit mask of Tx options. * param radius - Normally set to AF_DEFAULT_RADIUS. * * output parameters * * param *transID - Incremented by one if the return value is success. * * return afStatus_t - See previous definition of afStatus_. types. */afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP, uint16 cID, uint16 len, uint8 *buf, uint8 *transID, uint8 options, uint8 radius ) pDescCB pfnDescCB; ZStatus_t stat; APSDE_DataReq_t req; afDataReqMTU_t mtu; / 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.shortAddr ) ) / Force mode to broadcast强制转换成广播模式 dstAddr-addrMode = afAddrBroadcast; else / Address is not a valid broadcast type地址不是一个有效的广播地址类型 if ( dstAddr-addrMode = afAddrBroadcast ) return afStatus_INVALID_PARAMETER; else if ( dstAddr-addrMode != afAddrGroup & dstAddr-addrMode != afAddrNotPresent ) return afStatus_INVALID_PARAMETER; req.dstAddr.addrMode = dstAddr-addrMode; fileID = ZDO_PROFILE_ID; if ( (pfnDescCB = afGetDescCB( srcEP ) ) uint16 *pID = (uint16 *)(pfnDescCB( AF_DESCRIPTOR_PROFILE_ID, srcEP-endPoint ); if ( pID ) fileID = *pID; osal_mem_free( pID ); else if ( srcEP-simpleDesc ) fileID = 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 ); else stat =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论