版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、这里给大家截取一篇使用开发系统,学习 ZIGBEE2006 协议栈的文章. 芯片:CC2430 程序部分:深圳市无线龙电子有限公司2. 建立自己的项目 2.1 功能分析 项目的功能一共有按键检测、发送数据、接收数据、小灯控制四种,在协议栈中已经将 CC2430 的底层驱动全部固化在协议栈中,我们直接调用就可以了。 2.2 添加一个任务 整个协议栈是以一个 OS 贯穿的,我们要加入自己的应用,就要添加一个任务,(具体关于操作系统的介绍,请参考 OSAL API_F8W-2003-0002_.pdf 文档),在任务中执行,与协议栈实现无缝连接。 在协议栈中的 OSAL.c 文件中,byte osa
2、l_init_system( void )函数的功能是初始化 OS、添加任务到OS 任务表中。在这个函数中通过调用 osalAddTasks()函数来定制项目所需要应用的任务,该函数属于应用层和 OS 之间的接口函数,一般项目的建立需要根据系统的需要自己编写改函数,并将函数放到应用层。osalAddTasks()函数是通过 osalTaskAdd()函数完成任务添加。 首先,将支持协议栈功能需要的任务加载到该函数中, void osalAddTasks( void )osalTaskAdd (Hal_Init, Hal_ProcessEvent, OSAL_TASK_PRIORITY_LOW)
3、; #if defined( ZMAC_F8W )osalTaskAdd( macTaskInit, macEventLoop, OSAL_TASK_PRIORITY_HIGH ); #endif#if defined( MT_TASK )osalTaskAdd( MT_TaskInit, MT_ProcessEvent, OSAL_TASK_PRIORITY_LOW ); #endifosalTaskAdd( nwk_init, nwk_event_loop, OSAL_TASK_PRIORITY_MED ); osalTaskAdd( APS_Init, APS_event_loop, O
4、SAL_TASK_PRIORITY_LOW ); osalTaskAdd( ZDApp_Init, ZDApp_event_loop, OSAL_TASK_PRIORITY_LOW );这些任务是协议栈运行的先决条件,为了更好的使用协议栈,建议将这些任务都添加到任务列表中。这 些函数的参数条件在协议栈中已经定义好,可以直接使用。 从上面加载的函数中可以发现,要建立一个单独的任务,必须先将 osalTaskAdd()函数所需要的参数条件定义好,这些参数分别是初始化函数 WXL_example_Init,任务处理函数 WXL_example_event_loop 和任务优先级。 2.2.1 任务初
5、始化函数 任务初始化函数的功能是将该任务需要完成的功能的功能部件初始化,在每一个任务的初始化函数中, 必须完成的功能是要得到设置任务的任务 ID。 void WXL_ SampleApp _Init ( uint8 task_id )WXL_ SampleApp _Init = task_id;由于在这个任务中还有其他的功能,所以,我们对其他功能也需要做一定的初始化,包括对发送数据的 设置,按键的设置等。实现的函数为: void WXL_SampleApp_Init ( uint8 task_id )WXL_SampleApp_TaskID = task_id;/任务ID/*/7/*通讯需要的
6、参数*/*/ WXL_SampleApp_NwkState = DEV_INIT;/网络类型WXL_SampleApp_TransID = 0;/ 设置发送数据的方式和目的地址 / 广播到所有的设备 WXL_SampleApp_All_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; WXL_SampleApp_All_DstAddr.endPoint = WXL_SAMPLEAPP_ENDPOINT; WXL_SampleApp_All_DstAddr.addr.shortAddr = 0xFFFF;/ 单播到一个设备 WXL_SampleApp
7、_Single_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; WXL_SampleApp_Single_DstAddr.endPoint = WXL_SAMPLEAPP_ENDPOINT;/ 设置 endpoint description.WXL_SampleApp_epDesc.endPoint = WXL_SAMPLEAPP_ENDPOINT; WXL_SampleApp_epDesc.task_id = &WXL_SampleApp_TaskID; WXL_SampleApp_epDesc.simpleDesc= (SimpleDescrip
8、tionFormat_t *)&WXL_SampleApp_SimpleDesc; WXL_SampleApp_epDesc.latencyReq = noLatencyReqs;/ 登记(或注册)endpoint description 到 AF afRegister( &WXL_SampleApp_epDesc );/ 登记(或注册)所有的按键 RegisterForKeys( WXL_SampleApp_TaskID );2.2.2 任务处理函数任务处理函数是对任务发生后的 进行处理,在这个项目中主要完成的功能是通过协调器上的按键发 送一个数据,控制路由器的小灯。所以里面就应该设计到按键
9、的 处理,网络状态的判断(判断设备 的类型,是协调器还是路由器或者是终端设备)和接收到信息后的处理。处理函数为: /* 函数名WXL_SampleApp_ProcessEvent* 函数功能: 一般应用任务处理,这个函数是处理所有的到任务,包括 * 时间片、消息和所有其他使用者定义过的时间。 * 参 数: task_id - OS 分配的任务ID.这个ID 将用于发送数据和设置时间片.* events- 处理的 * returnnone*/uint16 WXL_SampleApp_ProcessEvent( uint8 task_id, uint16 events )afIncomingMSG
10、Packet_t *MSGpkt;if ( events & SYS_EVENT_MSG )/系统信息 /OS 发送过来的信息 MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WXL_SampleApp_TaskID ); while ( MSGpkt )switch ( MSGpkt-hdr.event )case KEY_CHANGE:/ 按键 WXL_SampleApp_HandleKeys( (keyChange_t *)MSGpkt)-keys );/按键处理函数break;case AF_INCOMING_MSG_CMD:/
11、接收数据WXL_SampleApp_MessageMSGCB( MSGpkt );/接收数据的处理函数break;case ZDO_STATE_CHANGE:/ 网络状态发生变化时间WXL_SampleApp_NwkState= (devStates_t)(MSGpkt-hdr.status);/获取网络状态if ( (WXL_SampleApp_NwkState = DEV_ZB_COORD)/判断网络类型 | (WXL_SampleApp_NwkState = DEV_ROUTER)| (WXL_SampleApp_NwkState = DEV_END_DEVICE) )else/ 设备不
12、属于这个网络 break;default:break;osal_msg_deallocate( (uint8 *)MSGpkt );/ 释放存储器 / Next - 如果有一个空闲的任务 MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WXL_SampleApp_TaskID );return (events SYS_EVENT_MSG);/ 返回未处理的任务 return 0;2.2.3 按键子函数按键子函数的功能是处理所有的按键 ,在这里需要特别申明的是,本程序只实用与无线龙通讯 科技有限公司的硬件。按键的底层驱动函数在 Hal_ke
13、y.c 中,我们在这里按键需要完成的任务是,当协调器按键 1 被按下后,以广播的方式发送数据去让路由器小灯闪烁。 /* 函数名WXL_SampleApp_HandleKeys* 函数功能: 处理所有的按键 * 参数:keys - 返回的按键值 * returnnone*/ void WXL_SampleApp_HandleKeys(uint8 keys )if ( keys & HAL_KEY_SW_1 )if(WXL_SampleApp_NwkState = DEV_ZB_COORD)/如果是协调器WXL_SampleApp_SendFlashMessage( WXL_SAMPLEAPP_F
14、LASH_DURATION ); /发送数据else2.2.4 接收处理函数接收处理函数的功能有两部分,一是路由器的接收函数,二是协调器的接收处理函数。在这个项目里面, 我们将这两种设备的处理函数都固化在了一个函数里面,用串 ID(即 clusterID)来判断他们的设备类型。 当路由器接收到数据后,先判断该信息的串 ID,然后判断命令,如果命令正确,则小灯闪烁,然后单播发送确认信号给协调器,协调器收到信号后,同样先判断串 ID,然后确认命令后小灯闪烁示意。 /* 函数名:SampleApp_MessageMSGCB* 函数功能: 接收的数据处理量.根据不同的串ID 实现不同的功能。 * pa
15、ramnone* returnnone*/ void WXL_SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )unsigned char Rx_Buf4; switch ( pkt-clusterId )case WXL_SAMPLEAPP_CLUSTERID1:/协调器memcpy(Rx_Buf,pkt-cmd.Data,3);if(Rx_Buf0 = Y) & (Rx_Buf1 = E) & (Rx_Buf2 = S)HalLedBlink( HAL_LED_4, 4, 50, 250);/小灯闪烁四次 break;case WXL_
16、SAMPLEAPP_CLUSTERID2:/路由器memcpy(Rx_Buf,pkt-cmd.Data,4);if(Rx_Buf0 = O) & (Rx_Buf1 = P) & (Rx_Buf2 = E) & (Rx_Buf3 = N)HalLedBlink( HAL_LED_4, 4, 50, 250);/小灯闪烁四次SendData(YES,pkt-srcAddr.addr.shortAddr,3);/以单播的方式回复信号 break;2.2.5 发送函数/* 函数名:SampleApp_SendFlashMessage* 函数功能: 广播发送一串数据。 * paramnone* retu
17、rnnone*/ void WXL_SampleApp_SendFlashMessage( uint8 *buffer )if ( AF_DataRequest(&WXL_SampleApp_All_DstAddr,&WXL_SampleApp_epDesc, WXL_SAMPLEAPP_CLUSTERID2, 4,buffer, &WXL_SampleApp_TransID, AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) = afStatus_SUCCESS )else/ Error occurred in request to send./*/函数功能:以短地址方式
18、发送数据 /buf :发送的数据 /addr:目的地址 /Leng:数据长度 /* void WXL_SampleApp_SendData(uint8 *buf, uint16 addr, uint8 Leng)WXL_SampleApp_Single_DstAddr.addr.shortAddr = addr;if ( AF_DataRequest( &WXL_SampleApp_Single_DstAddr, /发送的地址和模式 else&WXL_SampleApp_epDesc,/终端(比如操作系统中任务ID 等) WXL_SAMPLEAPP_CLUSTERID1,/发送串IDLeng,
19、 buf,&WXL_SampleApp_TransID, AF_DISCV_ROUTE,/AF_ACK_REQUEST,AF_DEFAULT_RADIUS ) = afStatus_SUCCESS )发送数据只是调用一个函数,在这里不多做解释。 2.2 完成任务的添加这时候回到 2.2 节中将建立的任务添加在列表中。 void osalAddTasks( void )osalTaskAdd (Hal_Init, Hal_ProcessEvent, OSAL_TASK_PRIORITY_LOW); #if defined( ZMAC_F8W )osalTaskAdd( macTaskInit,
20、macEventLoop, OSAL_TASK_PRIORITY_HIGH ); #endif#if defined( MT_TASK )osalTaskAdd( MT_TaskInit, MT_ProcessEvent, OSAL_TASK_PRIORITY_LOW ); #endifosalTaskAdd( nwk_init, nwk_event_loop, OSAL_TASK_PRIORITY_MED ); osalTaskAdd( APS_Init, APS_event_loop, OSAL_TASK_PRIORITY_LOW ); osalTaskAdd( ZDApp_Init, Z
21、DApp_event_loop, OSAL_TASK_PRIORITY_LOW );osalTaskAdd( WXL_SampleApp_Init, WXL_SampleApp_ProcessEvent, OSAL_TASK_PRIORITY_LOW );2.3 其他定义const cId_t WXL_SampleApp_ClusterListWXL_SAMPLEAPP_MAX_CLUSTERS =WXL_SAMPLEAPP_CLUSTERID1,/协调器WXL_SAMPLEAPP_CLUSTERID2/路由器 ;const SimpleDescriptionFormat_t WXL_Samp
22、leApp_SimpleDesc =WXL_SAMPLEAPP_ENDPOINT,/int Endpoint;WXL_SAMPLEAPP_PROFID,/uint16 AppProfId2;WXL_SAMPLEAPP_DEVICEID,/uint16 AppDeviceId2;WXL_SAMPLEAPP_DEVICE_VERSION,/intAppDevVer:4; WXL_SAMPLEAPP_FLAGS,/intAppFlags:4; WXL_SAMPLEAPP_MAX_CLUSTERS,/uint8AppNumInClusters; (cId_t *)WXL_SampleApp_ClusterList,/uint8 *pAppInClusterList; WXL_SAMPLEAPP_MAX_CLUSTERS,/uint8AppNumInClusters; (cId_t *)WXL_SampleApp_ClusterList/uint8 *pAppInClusterList;endPoin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 神经脊柱科健康宣教
- 实施循证实践提升眼科护理安全
- 2026房屋买卖合同范本下载
- 高新技术企业劳动合同样本
- 个人出租房屋合同范本(2026版)
- MMO钛带阳极的结构、性能与工作原理
- 2026年年度班级工作总结及工作计划(3篇)
- 幼儿园学年第一学期研训工作计划(2篇)
- 江西省南昌市2026届高三年级四月第二次模拟数学试卷(含答案)
- 2025年AR博物馆导览的情境化交互设计
- 小米培训方法教程课件
- 【《微型电动车制动系统结构设计》15000字(论文)】
- 矿厂电工面试题及答案
- 《北京市商品房现房买卖合同示范文本(2025年修订 公开征求意见稿)》
- 2025 ESICM临床实践指南:成人危重患者的液体治疗-第2部分:复苏液体量解读
- 安全生产管理人员准入制度
- 2026年云南省政府采购评审专家考前冲刺备考300题(含答案)
- 国家安全法课件1
- 箱涵结构和配筋计算算表(Excel输入数据自动计算得到计算书)
- 行政事业单位财务与会计试题题库(附答案+解析)
- 相约星期二-课件分享-精简版文档
评论
0/150
提交评论