从零开始学习Zigbee开发 - 图文(5)

2019-08-03 13:05

一个任务事件SYS_EVENT_MSG (0x8000), 被保留必须通过OSAL任务设计。

2.2.6.1、SYS_EVENT_MSG (0x8000)

任务事件管理者应该处理如下的系统信息子集,下面只列出了部分信息,但是是最常用的几个信息处理,推荐根据例子复制到自己项目中使用。

1.2.6.1.1、AF_DATA_CONFIRM_CMD

调用AF_DataRequest()函数数据请求成功的指示。Zsuccess确认数据请求传输成功,如果数据请求设置AF_ACK_REQUEST标志位,那么,只有最终目的地址成功接收后,Zsuccess确认才返回。如果如果数据请求没有设置AF_ACK_REQUEST标志位,那么,数据请求只要成功传输到下跳节点就返回Zsuccess确认信息。 1.2.6.1.2、AF_INCOMING_MSG_CMD AF信息输入指示 1.2.6.1.3、KEY_CHANGE 键盘动作指示

1.2.6.1.4、ZDO_NEW_DSTADDR

匹配描述符请求(Match Deor Request)响应指示。(例如:自动匹配)

1.2.6.1.5、ZDO_STATE_CHANGE 网络状态改变指示 1.3、网络格式化

示例应用程序编译为协调器的在default_chanlist指定的通道上形成一个网络,协调器将建立一个随机编号源于自身的IEEE地址或由 zdapp_config_pan_id指定的网络PAN ID(如果zdapp_config_pan_id不为0xFFFF)。

示例应用程序编译为路由器或结束设备的将尝试加入网络在default_chanlist指定的通道上,如果zdapp_config_pan_id没有定义为0 xFFFF ,路由器将受到限制,只有加入参数zdapp_config_pan_id规定的网络PAN ID。 1.3.1、自动启动

设备自动开始尝试组建或加入网络。如果设备设置为等待计时器或其他外部事件发生后才启动,那么HOLD_AUTO_START必须被定义。为了稍后以手动启动方式启动设备,那么需要调用ZDApp_StartUpFromApp(函数 1.3.2、软件启动

为了在形成网络过程中节省所需的设备类型,那么所有的路由器设备可以被通过soft_star定义作为一个协调器。如果自动启动是需要的话,那么auto_soft_start必须被定义。 1.3.3、网络恢复

通过设置NV_RESTORE和/或NV_INIT,可以让设备断电或者意外掉电重新启动后重新回复网络。 1.3.4、加入通告

当设备形成或加入网络后会发通报到ZDO_STATE_CHANGE信息事件。

从零开始学Z-Stack之4(2009-03-23 20:18:30) 标签:it

分类:WSN学习

-----------------Sample Application分析(下)

上节介绍了建立一个应用需要做的几个必须的事情,现在就来通过分析Sample Application来具体看看需要做哪些事情,才能建立一个ZIGBEE应用功能。当然这里只是做点简单的必须的工作。

The Sample Application (SampleApp) 1、 介绍

主要是介绍一个应用建立的结构及需要进行的程序流程。 1.1、程序流程 1.1.1、初始化

首先需要调用初始化函数SampleApp_Init()。 SampleApp_TaskID = task_id;

初始化应用建立的任务ID号,其实用过OS的人都应该晓得这个是干啥的,我没用过,不是很理解,但是我知道是必须的,就相当于一个任务的标识,这样才能区分运行过程中不同任务中的不同事件。我是这么认为的,ID说白了就是给该任务取了各名字,就向人名字一样,区分不同的人,就是一个代号。人名可以重复,重复了有时候叫起来就容易混淆;所以才程序中为了避免这种混淆,就强制性的规定任务ID不能重复。要是哪天国家或者联合国姓名管理委员会规定,人民不能重复,那么这个人名就需要全球统一管理了。那给娃取个名字就要向联合国姓名管理委员会申请了。呵呵!? SampleApp_NwkState = DEV_INIT;

初始化应用设备的网络状态。怎么说呢,据说是设备类型的改变都要产生一个事件,叫

ZDO_STATE_CHANGE,从字面理解为ZDO状态发生了改变。所以在设备初始化的时候一定要把它初始化为什么状态都没有。那么它就要去检测整个环境,看是否能重新建立或者加入存在的网络。但是有一种情况例外,就是当 NV_RESTORE被设置的时候(NV_RESTORE是把信息保存在非易失存储器中),那么当设备断电或者某种意外重启时,由于网络状态存储在非易失存储器中,那么此时就只需要恢复其网络状态,而不需要重新建立或者加入网络了。我也是从文档中这么理解的,至于为什么只有有待进一步考证。

SampleApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent; SampleApp_DstAddr.endPoint = 0; SampleApp_DstAddr.addr.shortAddr = 0;

看见这几句话从字面理解为:初始化不标设备地址模式及目标设备EP号和网络地址。从代码可以看出,这些地址或EP均为0。也就是说目标设备为协调者的ZDO,这个意义就很明显了,就是设备建立后可以直接与协调器的ZDO交互信息。 SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; ----- SampleApp EP描述符的EP号

SampleApp_epDesc.task_id = &SampleApp_TaskID;------ SampleApp EP描述符的任务ID SampleApp_epDesc.simpleDesc =------------------ SampleApp EP简单描述符 SimpleDeionFormat_t *)&SampleApp_SimpleDesc; SampleApp_epDesc.latencyReq = noLatencyReqs; //在AF层中登记注册改应用EP afRegister( &SampleApp_epDesc );

这里其实是对SampleApp的EP描述符进行初始化。

本人理解:要对改应用进行初始化并在AF进行登记,告诉应用层有这么一个EP已经可以使用,那么下层要是有关于改应用的信息或者应用要对下层做哪些操作,就自动得到下层的配合,至于这个配合是怎么回事,那么就需要好好研究下层的协议了。当然在这里肯定是没那时间精力和能力研究了!?

其实在这个应用中,只是让AF配合SAMPLEAPP_PROFID / SAMPLEAPP_ENDPOINT这两个应用。那么通过什么呢,通过发送OSAL SYS_EVENT_MSG消息中的(AF_INCOMING_MSG_CMD)事件到SampleApp任务ID。

RegisterForKeys( SampleApp_TaskID );

登记按键事件到SampleApp_TaskID,在前面已经说了按键这个是唯一的,也就是所有任务中有且只有各任务能登记键盘事件。前面还说了还有一个也是唯一,你猜是什么?? SampleApp_Group.ID = 0x0001;

osal_memcpy( SampleApp_Group.name, “Group1” ); aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

闪灯信息被发送到组1,同样也只有在组1的设备才能接收这个信息。设备启动时已经被设定为组1设备了,但是可以通过按SW1推出/加入组1。这里提到了组的概念,我反正暂时不是很清楚这个是什么东西,在程序中怎么实现也很模糊,但是应用中的好处还是不难想象的,不外呼是就是想控制谁可以事先规定好,还可以动态更改。

1.2、事件处理

玩过OS的人都知道,OS中最重要的概念不外呼就是任务啦,消息啦,事件啦等。从我们自己平时的工作中也不难想象,如果老板安排了某项工作,那么我们就需要做的,这个工作可能是预先计划好的,也有可能是临时的,那么这些预先定好或者临时的工作可以称之为事件。而老板让您做的方式,比如通过文件下达,或者叫:某某你把XXX做下。那么让老板下达的文件内容或者说的内容我这里可以称之为消息。老板给了你不同的消息那么就需要干不同的事件,至于任务可以理解为公司的不同的员工,呵呵!我简直是理解的天才,这样举例居然也能忽悠通过!!!o(∩_∩)o?哈哈 言归正传

在 Z-Stack中,每个应用任务都通过SampleApp_ProcessEvent()函数来处理任务中的事件。一旦SampleApp_TaskID 任务的某个OSAL事件发生,那么就可以通过调用

SampleApp_ProcessEvent()函数来处理。在 SampleApp_ProcessEvent()中有一个事件处理循环,循环检测是哪个事件发生。 if ( events & SYS_EVENT_MSG ) {

MSGpkt = (afIncomingMSGPacket_t*)osal_msg_receive( SampleApp_TaskID ); while ( MSGpkt ) {

?????????????..

可以看到是通过检测SYS_EVENT_MSG是否有事件信息发生。 switch ( MSGpkt->hdr.event )

这里是判断SYS_EVENT_MSG事件类型,不同的SYS_EVENT_MSG类型需要不同的处理。 case KEY_CHANGE:

SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break;

比如这里判断是否是键盘事件,如果键盘事件就调用键盘处理函数。

如果一个OSAL任务已经被登记组侧,那么任何键盘事件都将接受一个KEY_CHANGE事件信息。可能有如下几种方式得到键盘事件信息

1)、HAL检测到键盘按下(中断或者查询检测)

2)、HAL的OSAL任务检测到一个键盘状态改变调用回叫函数产生

3)、OSAL键盘改变回叫函数发送一个OSAL系统事件信息(KEY_CHANGE)。 case AF_DATA_CONFIRM_CMD:

// The status is of ZStatus_t type [defined in ZComDef.h] // The message fields are defined in AF.h afDataConfirm = (afDataConfirm_t *)MSGpkt; sentEP = afDataConfirm->endpoint; sentStatus = afDataConfirm->hdr.status;


从零开始学习Zigbee开发 - 图文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2014高考物理大一轮复习讲义第十三章第3课时原子与原子核解读

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: