ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:73KB ,
资源ID:8923111      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8923111.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(SampleApp函数.doc)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

SampleApp函数.doc

1、Sample Application工程 一、Sample Application工程概况描述      Sample Application是ZStack协议栈提供的一个非常简单的演示实例,实例中的每个设备都可以发送和接收两种信息:周期信息和闪烁信息。 周期信息---------当设备加入该网络后,所有设备每隔 5S(加上一个随机数,毫秒mS为单位)发送一个周期信息,该信息的数据载荷为发送信息的次数。 闪烁信息---------通过按下按键 SW1发送一个控制LED灯闪烁的广播信息,该广播信息只针对组 1 内的所有设备。所有设备初始化都被加入组 1,所以网络一旦建立完成便可执行

2、LED灯闪烁实验。可以通过按下设备的 SW2 退出组 1,如果设备退出组1则不再接收来自组1的消息,其按键SW1发送的消息也不再控制组1LED灯的闪烁。通过再次按下 SW2 便可让设备再次加入到组1,从而又可以接受来自组1的消息,其SW1也可以控制组1内设备的LED灯闪烁了。 当设备接收到闪烁信息会闪烁LED灯,而当接收到周期信息时协议栈没有提供具体的实验现象,留给了用户自行处理,可以根据实际需要自行更改实验代码。 在该工程中使用了两个按键SW1和SW2。即ZStack协议栈中的HAL_KEY_SW_1和HAL_KEY_SW_2。同时工程中也定义了一个事件用来处理周期信息事件,即SAMPL

3、EAPP_SEND_PERIODIC_MSG_EVT[SampleApp.h]。 二、一般工程说明: 在学习ZStack协议栈的时候我们要把握一个重点就是事件的产生和事件的处理。任务的初始化为事件的产生制造了“温床”,是事件产生的前提,任何工程都需要先初始化。当有事件产生OS就会调用相应的处理函数进行处理。在OS循环那一节我们可以看到在任务初始化的最后一项就是应用层的初始化,而在指向处理函数的指针数组中最后一项是对应的应用层的处理函数。应用层相关事件会由应用层处理函数进行处理。每一层都是相互对应,各司其职。 三、Sample Application工程初始化与事件的处理

4、3.1、Sample Application工程初始化如下: void SampleApp_Init( uint8 task_id ) { SampleApp_TaskID = task_id;// OS通过数参数的传递为每一层分发任务ID, SampleApp_NwkState = DEV_INIT;//设定设备的网络状态为“初始化” SampleApp_TransID = 0; #if defined ( SOFT_START ) /*SOFT_START 是一个编译选项,如果一个网络中没有协调 器可以让设备以协调器的形式启动*/ //

5、这里我们根据跳线决定设备是路由器或者是协调器,如果检测到 //跳线则为协调器否则为路由器,在设备启动提及如果定义了SOFT_START //则设备初始化时设备的类型为可选类型。当程序执行到这里就明确了具 //体是什么类型的设备 if ( readCoordinatorJumper() )//如果检测到跳线则设备为协调器 zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; else//如果没有检测到跳线则设备为路由器 zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER; #en

6、dif // SOFT_START #if defined ( HOLD_AUTO_START ) //如果编译了 HOLD_AUTO_START则执行以下函数 ZDOInitDevice(0); #endif // 设定周期信息的地址,此地址为广播地址0xFFFF SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Per

7、iodic_DstAddr.addr.shortAddr = 0xFFFF; //设定闪烁信息的地址,此地址为组1的地址 SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP; // 对端点SAMPLEAPP_ENDPOINT进行描述 SampleA

8、pp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID; SampleApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_epDesc.latencyReq = noLatencyReqs; // 注册端点描述符 afRegister( &SampleApp_epDesc ); // 注册按键

9、在按键机制详细解释 RegisterForKeys( SampleApp_TaskID ); //默认情况,所有的设备都加入组1 SampleApp_Group.ID = 0x0001;//设定组ID osal_memcpy( SampleApp_Group.name, "Group 1", 7 );//设定组名 aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );//加入组 //如果编译了LCD_SUPPORTED,在液晶上显示"SampleApp"。注意:需要底层硬//件的支持 #if de

10、fined ( LCD_SUPPORTED ) HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 ); #endif } 3.2、Sample Application工程初始化事件处理函数如下: uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) { afIncomingMSGPacket_t *MSGpkt; if ( events & SYS_EVENT_MSG ) { //从信息列表中获取SampleApp_TaskID相关的

11、信息 MSGpkt = (afIncomingMSGPacket_t) osal_msg_receive(SampleApp_TaskID); while ( MSGpkt )//不为空,说明有信息 { switch ( MSGpkt->hdr.event )//消息的事件 { // 按键事件 case KEY_CHANGE: SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->ke

12、ys ); break; //OTA消息事件 case AF_INCOMING_MSG_CMD: SampleApp_MessageMSGCB( MSGpkt ); break; // 设备状态改变事件 case ZDO_STATE_CHANGE: SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if ( (SampleApp_NwkState ==

13、DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) ) { // Start sending the periodic message in a regular interval. osal_start_timerEx( SampleApp_TaskID, SAMP

14、LEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); } else { // Device is no longer in the network } break; default: break; } // 释放内存以防内存泄露 osal

15、msg_deallocate( (uint8 *)MSGpkt ); //在列表中检索下一条信息 MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); } // 返回没有处理的事件 return (events ^ SYS_EVENT_MSG); } // 周期信息事件 if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) { // 发送周期信息 SampleA

16、pp_SendPeriodicMessage(); // Setup to send message again in normal period (+ a little jitter) osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) ); // 返回没有处理的事件 return (events ^ SAMPLEAPP_SEND

17、PERIODIC_MSG_EVT); } // Discard unknown events return 0; } 三、Sample Application工程流程: 1、周期信息: 在上一节我们看到设备上电就会自动启动(Sample Application没有编译HOLD_AUTO_START),当设备启动成功最终触发了事件ZDO_STATE_CHANGE,而此事件会向所有注册过的端点(除ZDO)发送。在Sample Application的初始化代码中SampleApp_epDesc 调用函数afRegister()进行了注册,所有OS会调用Sample

18、Application的处理函数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) ) {

19、 // Start sending the periodic message in a regular interval. osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); } else { // Device is no lo

20、nger in the network } break; 处理ZDO_STATE_CHANGE:如果设备的网络状态为DEV_ZB_COORD、DEV_ROUTER或者DEV_END_DEVICE表明设备启动成功。网络状态在设备启动时被设定。如果设备启动成功,则调用了函数osal_start_timerEx()定时触发了事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT。该事件的任务ID为SampleApp_TaskID,即该事件还是由Sample Application的处理函数进行处理。定时长度为SAMPLEAPP_SEND_PERIODIC_MSG_TIME

21、OUT(5000mS[SampleApp.h])。 处理代码如下: if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) { //发送周期信息 SampleApp_SendPeriodicMessage(); //定时再次触发事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_M

22、SG_TIMEOUT + (osal_rand() & 0x00FF)) ); // 返回没有处理完成的事件 return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); } 在处事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT时,协议栈调用了函数SampleApp_SendPeriodicMessage()。在SampleApp_SendPeriodicMessage()处理完成后再次定时触发了事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT,其任务ID依旧是SampleApp_TaskID,定时

23、长度SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT(5000mS[SampleApp.h])。可以看出周期信息就是这样被周期性地触发SAMPLEAPP_SEND_PERIODIC_MSG_EVT产生的。间隔时间就是定时长度SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT(5000mS[SampleApp.h])。下面我们看SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件的处理函数SampleApp_ SendPeriodicMessage()。 程序代码: void SampleApp_SendPeriodicMessag

24、e( void ) { if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc, SAMPLEAPP_PERIODIC_CLUSTERID, 1, (uint8*)&SampleAppPeriodicCounter, &SampleApp_TransID, AF_DISC

25、V_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) { } else { // Error occurred in request to send. } } 在SampleApp_SendPeriodicMessage()函数中调用了数据发送函数AF_DataRequest()函数发送数据。参数中地址为SampleApp_Periodic_DstAddr在SampleApp_Init()被初始化。其中的参数簇ID为SAMPLEAPP_PERIODI

26、C_CLUSTERID,数据载体为SampleAppPeriodicCounter。当接收端接收到该信息后会触发事件AF_INCOMING_MSG_CMD进行处理,根据簇ID接收端做出响应的处理。事件AF_INCOMING_MSG_CMD事件的处理如下: 程序代码: case AF_INCOMING_MSG_CMD: SampleApp_MessageMSGCB( MSGpkt ); break; 在处理AF_INCOMING_MSG_CMD事件时调用了事件处理函数SampleApp_MessageMSGCB()进行处理。SampleApp_MessageMSGCB()

27、函数如下: 程序代码: void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) { switch ( pkt->clusterId ) { case SAMPLEAPP_PERIODIC_CLUSTERID: break; …… } } 在SampleApp_MessageMSGCB()函数中根据簇ID的不同进行处理。但是Sample Application对事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT的处理时什么都没有做,用户可以根据实际需要自

28、行添加代码。 2、闪烁信息: 当按键SW1被按下时发送控制灯闪烁的广播信息,该广播信息只针对组 1 内的所有设备。按键会触发事件KEY_CHANGE。关于KEY_CHANGE事件会在按键机制详细讲解。协议栈会调用SampleApp_HandleKeys()对事件KEY_CHANGE。 程序代码: case KEY_CHANGE: SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break; SampleApp_HandleKeys(

29、)处理函数如下: void SampleApp_HandleKeys( uint8 shift, uint8 keys ) { if ( keys & HAL_KEY_SW_1 )//如果是SW1被按下 { SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION ); } …… } 由上面的程序可以看出在处理按键SW1时调用了函数SampleApp_SendFlashMessage()。函数详细代码如下: 程序代码: void SampleApp_SendFlashMessage( uint16 f

30、lashTime ) { uint8 buffer[3]; buffer[0] = (uint8)(SampleAppFlashCounter++); buffer[1] = LO_UINT16( flashTime ); buffer[2] = HI_UINT16( flashTime ); if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc, SAMPLEAPP_FLASH_CLUSTERID,

31、 3, buffer, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) { } else { // Error occurred in request to send. } } 在SampleApp_SendFlashMessage ()函

32、数中调用了数据发送函数AF_DataRequest()函数发送数据。参数中地址为SampleApp_Flash_DstAddr在SampleApp_Init()被初始化,该地址为组地址,AF_DataRequest()会将相关信息发送到属于该组的所有设备。其中的参数簇ID为SAMPLEAPP_FLASH_CLUSTERID,数据载体为buffer,包括了发送信息次数和LED灯闪烁时间。 当接收端接收到该信息后会触发事件AF_INCOMING_MSG_CMD进行处理,根据簇ID接收端做出响应的处理。事件AF_INCOMING_MSG_CMD事件的处理如下: 程序代码: case AF_I

33、NCOMING_MSG_CMD: SampleApp_MessageMSGCB( MSGpkt ); break; 在处理AF_INCOMING_MSG_CMD事件时调用了事件处理函数SampleApp_MessageMSGCB()进行处理。SampleApp_MessageMSGCB()函数如下: 程序代码: void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) { uint16 flashTime; switch ( pkt->clusterId ) { ……

34、 case SAMPLEAPP_FLASH_CLUSTERID: flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); break; } } 在SampleApp_MessageMSGCB()函数中根据簇ID的不同进行处理。Sample Application对事件SAMPLEAPP_FLASH_CLUSTERID的处理时调用了灯闪烁函数 HalLedBlink

35、)控制LED灯的闪烁,闪烁时间由发送端设定值决定。 3、组的加入与退出 组可以将设备按一定的逻辑加以区分。向一个组发送一条信息则组内的所有设备都会收到这条信息。设备可以利用函数aps_AddGroup()加入组,利用函数aps_RemoveGroup()退出组。 协议栈里组结构体定义: typedef struct { uint16 ID; // 组ID uint8 name[APS_GROUP_NAME_LEN]; // 组名 } aps_Group_t; 由以上结构体可以看出一个组由组ID和组名唯一确定。

36、 在Sample Application工程中通过SW2按键来加入或者退出组1。代码如下: 按键首先触发事件KEY_CHANGE 程序代码: case KEY_CHANGE: SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break; SampleApp_HandleKeys()处理函数如下: 程序代码: void SampleApp_HandleKeys( uint8 shift, uint8 keys ) { …… if ( k

37、eys & HAL_KEY_SW_2 ) { aps_Group_t *grp; grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); if ( grp ) { aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); } else { aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

38、 } } 通过函数aps_FindGroup()查找SAMPLEAPP_ENDPOINT是否加入了组1,如果加入组1则突出组1,否则加入组1。 其他常用组操作函数: 1、 ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group ) 将endpoint加入组group 2、 aps_Group_t *aps_FindGroup( uint8 endpoint, uint16 groupID ) 查找endpoint端点是否加入了以groupID为组ID的组 3、 uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID ) 删除endpoint端点上以groupID为组ID的组 4、 void aps_RemoveAllGroup( uint8 endpoint ) 将endpoint端点上所有组全部删除 5、 uint8 aps_CountGroups( uint8 endpoint ) 统计endpoint端点组的个数

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服