《TI例程翻译.pdf》由会员分享,可在线阅读,更多相关《TI例程翻译.pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2、GenericApp 2.1、引言GenericApp 介绍了应用、程序和消息流的结构。2.2、程序流2.2.1、初始化系统上电时,会调用初始化函数GenericApp_Init() 。GenericApp_TaskID = task_id; OSAL通过函数参数的调用给GenericApp 分配一个 Id。GenericApp 使用这个任务Id设置自己的时钟、事件、发送OSAL消息。上述的操作将一个比较大的处理注册(processing up )分割成小的部分,它们在OSAL 上连续的时隙上执行,避免了单个时隙消耗太多的时间。当一个任务被分为小的部分以便能够在每个时隙上执行时,这个任务各
2、个部分的协调就必须有OSAL来完成。GenericApp_NwkState = DEV_INIT;维持一个设备网络状态的副本是有用的。上电时的网络状态是“not connected ”或者“DEV_INIT ”。在上电时或上电后,OSA L任务不会收到此默认状态的ZDO_STATE_CHANGE消息,因此, 必须首先初始化系统并维持网络状态。当得到一个新的网络状态时,任务会得到一个ZDO_STATE_CHANGE消息。应该注意的是,使用ZDO_STATE_CHANGE一个设备并在一个电源周期( power cycle )之前与一个网络连接时,上电后不久任务将得到一个ZDO_STATE_CHAN
3、GE消息, 因为“network connected ”这个状态信息将会依照非易失性存储器的内容而被修复。GenericApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent; GenericApp_DstAddr.endPoint = 0;GenericApp_DstAddr.addr.shortAddr = 0; 初始化默认的目的地址以便向协调器(网络地址为0 x0000)发送消息,协调器的ZDO(EndPoint 0 x00 )接收消息。这种传递方式是间接的,它依靠网络反射设备(network reflector device)(通常为协调
4、器)将源地址与目的地址绑定表中的目的端点连接起来。如果没有匹配的绑定存在,消息将在协调器中被终止,而即使一个带有AF_ACK_REQUEST标志位的消息被发送,GenericApp 仍然会收到一个AF_DATA_CONFIRM_CMD消息( Zsuccess状态)。GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT; GenericApp_epDesc.task_id = &GenericApp_TaskID; GenericApp_epDesc.simpleDesc = SimpleDescriptionFormat_t *)&GenericAp
5、p_SimpleDesc; GenericApp_epDesc.latencyReq = noLatencyReqs; / Register the endpoint description with the AF afRegister( &GenericApp_epDesc ); 上述代码描述了GenericApp 应用对象。它告知应用框架层(AF layer )如何路由发送给GENERICAPP_PROFID / GENERICAPP_ENDPOINT的数据包。这个过程是通过向GenericApp_TaskID 发送一个 OSALSYS_EVENT_MSG-message (AF_INCO
6、MING_MSG_CMD)来完成的。RegisterForKeys( GenericApp_TaskID );GenricApp 注册按键服务。2.2.2、事件处理一个 GenericApp_TaskID 事件发生后,调用GenericApp 事件处理函数(GenericApp_ProcessEvent() ),这些事件处理函数在OSA L的任务处理循环中依次被触发。GenericApp_ProcessEvent() 的参数是一个 16位的位掩码(bit mask);调用该函数会设置一位或更多的位。如果有多个事件发生,建议一个任务只处理其中的一个事件(可能为对时间要求高的事件,或者是优先级最高
7、的SYS_EVENT_MSG)。if ( events & SYS_EVENT_MSG ) MSGpkt = (afIncomingMSGPacket_t*)osal_msg_receive( GenericApp_TaskID );while ( MSGpkt ) 在上面虽然建议一个任务调用事件处理函数只处理一个待定的事件,但是在应用例程中也可以在同一个时间片(time slice )内处理所有待定的SYS_EVENT_MSG 消息。switch ( MSGpkt-hdr.event ) 上面的代码表明如何寻找switch ( MSGpkt-hdr.event )的类型。一个任务只执行所有S
8、YS_EVENT_MSG 消息的一个最小子集,这个最小子集由GenericApp 和下面的代码来执行。case KEY_CHANGE:GenericApp_HandleKeys( (keyChange_t *)MSGpkt)-state,(keyChange_t *)MSGpkt)-keys ); break; 如果一个 OSAL任务为按键注册,任何按键按下事件将作为一个KEY_CHANGE系统事件消息被得到。程序中有两种方法使一个任务得到这个KEY_CHANGE消息。物理的按键被按下:-HAL 检测按键的状态(通过H/W 中断或者 H/W 查询)-HAL OSA L任务检测按键状态的改变,调
9、用OSAL按键改变回调函数-OSA L按键改变回调函数向注册到接收按键改变事件函数(RegisterForkeys ()的任务ID 发送一个 OSAL系统事件消息(KEY_CHANGE)。Z-Tool 发送一个按键改变消息:- HA L接收输入的串行数据(通过H/W Rx 中断或 Rx查询)。- HA L调用 API Mgr 回调函数处理接收到的串行数据。- A PI Mgr 回调函数读取并从语法上分析接收到的串行数据直到组装好一个有效的数据包:向 MT 任务 Id发送 OSAL 系统事件消息。- MT 任务事件处理函数依次运行并接收CMD_SERIAL_MSG。如果串口消息是按键按下,则调用
10、 OSA L按键改变回调函数。- OSAL 按键改变回调函数向注册到接收按键改变事件函数(RegisterForkeys()的任务ID发送一个 OSAL系统事件消息(KEY_CHA NGE)。case AF_DATA_CONFIRM_CMD: / The status is of ZStatus_t type defined in ZComDef.h / The message fields are defined in AF.hafDataConfirm = (afDataConfirm_t *)MSGpkt;sentEP = afDataConfirm-endpoint; sentStat
11、us = afDataConfirm-hdr.status; sentTransID = afDataConfirm-transID; 调用 sentTransID = afDataConfirm-transID;返回 Zsuccess,将通过系统事件消息AF_DATA_CONFIRM_CMD产生一个回调函数。sent Transaction Id (sentTransID) 是一种识别消息的方法。虽然GenericApp 只使用单一的Transaction Id (GenericApp_TransID ),对于每一个端点(EndPoint)的 ClusterId ,保持一个独立的Transa
12、ction Id 也许是有用的,一个独立的Transaction Id 对应一个端点或一个事件,这样,端点就可以进行消息的确认(confirmation ) , 重传( retry) , 反汇编(disassembling ) , 和段 (reassembling)等操作。通过AF_DataRequest() 的成功请求,任何Transaction Id 状态变量都会增加(因此这个参数是由 reference传递的,而不是通过数值)。AF_DataRequest() 返回 Zsuccess,意味着网络层已经接收到该消息,并向MAC 层发送, MAC层把它发送到OTA (over the air
13、 )。发送状态是消息的OTA 结果。 Zsuccess意味着消息已经传递到网络中的下一个ZigBee设备。如果 AF_DataRequest() 由AF_ACK_REQUEST标志位触发,Zsuccess意味着消息发送到了目的地址。除非消息的发送模式为间接发送(例如,消息被发送给网络发射器(network reflector )来检查一个绑定表,重新发送消息到连接设备),这种情况下Zsuccess意味着消息发给了网络发射器(network reflector )。有一些可能的发送状态是来表明失败状态的。case ZDO_NEW_DSTADDR: ZDO_NewDstAddr = (ZDO_Ne
14、wDstAddr_t *)MSGpkt;dstEP = ZDO_NewDstAddr-dstAddrDstEP; dstAddr = &ZDO_NewDstAddr-dstAddr; GenericApp_DstAddr.addrMode = (afAddrMode_t)dstAddr-addrMode; GenericApp_DstAddr.endPoint = dstEP;GenericApp_DstAddr.addr.shortAddr = dstAddr-addr.shortAddr; break; 当应用对象通过调用ZDApp_AutoFindDestination()以及正在连接设
15、备响应的ZDO 来向 ZDO请求执行自动连接请求,请求自动发现的设备对象将会得到ZDO_NERW_DSTADDR的系统事件消息作为其请求的响应。在收到连接的网络地址和端点号后将其保存或过滤。虽然上面的代码表明寻址模式可以得到响应,但是,每一种只有唯一的Zigbee16 位afAddr 。case ZDO_STATE_CHANGE:GenericApp_NwkState = (devStates_t)(MSGpkt-hdr.status); if ( (GenericApp_NwkState = DEV_ZB_COORD) |(GenericApp_NwkState = DEV_ROUTER)
16、|(GenericApp_NwkState = DEV_END_DEVICE) ) / Start sending the message in a regular interval. osal_start_timer( GENERICAPP_SEND_MSG_EVT, GENERICAPP_SEND_MSG_TIMEOUT ); break; /Whenever the network state changes, all tasks are notified with the system event message ZDO_STATE_CHANGE. Notice that Generi
17、cApp is implemented to begin a running timer as soon as the device successfully joins a network. When the network state changes to “ joined” , it might also be useful to initiate an auto find so that devices can bind without requiring user action. / Release the memoryosal_msg_deallocate( (uint8 *)MS
18、Gpkt );Notice that the design of the OSAL messaging system requires that the receiving task re-cycle the dynamic memoryallocated for the message. If OSA L cannot enqueue a message (either the Task Id does not exist or the message header is not correct), it will re-cycle the memory. 网络状态发生改变,所有的任务将会得
19、到ZDO_STATE_CHANGE的系统事件消息。当一个设备成功的加入到网络后,CenericApp 将启动一个定时器。当网络状态变为“joined”时,开始自动发现( auto find ),不需要用户的任何操作。/ Release the memoryosal_msg_deallocate( (uint8 *)MSGpkt );OSAL报文通信体统(messaging system)的设计要求分配给每个消息一个动态内存。如果OSA L消息不能进入消息队列(没有Task Id 或消息头不正确),将从新分配内存。if ( events & GENERICAPP_SEND_MSG_EVT ) /
20、 Send the message GenericApp_SendTheMessage(); / Setup to send message again osal_start_timer( GENERICAPP_SEND_MSG_EVT, GENERICAPP_SEND_MSG_TIMEOUT );/ return unprocessed events return (events GENERICAPP_SEND_MSG_EVT); 在 GenericApp.h 中, GenericApp 被定义为 15位任务事件掩码(Task Event Mask )的一个位。#define GENERIC
21、APP_SEND_MSG_EVT 0 x0001 当为了事件 GENERICAPP_SEND_MSG_EVT设置一个时钟时,GenericApp 使用自己的 Task Id去调用 osal_start_timer() 。当收到成功加入网络的确认消息(ZDO_STATE_CHANGE)后,这个时钟自动启动。每一次计时时间结束,时钟将会重新启动。每一个GENERICAPP_SEND_MSG_TIMEOUT时间间隔,GenericApp_SendTheMessage() 将会产生一个数据请求。2.3、消息流( Message Flow )GenericApp 通过使用 OSAL 时钟发送周期消息OT
22、A 。void GenericApp_SendTheMessage( void ) char theMessageData = Hello World; if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc, GENERICAPP_CLUSTERID, (byte)osal_strlen( theMessageData ) + 1, (byte *)&theMessageData, &GenericApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) = afStatus_SUCCE
23、SS ) / Successfully requested to be sent. else / Error occurred in request to send. 应用对象 OTA 消息数据是一串简单的ASCII 字母:“ Hello World ”调用 AF_DataRequest() 来开始向协议栈下层传递用户消息的过程,以便准备向OTA 发送的消息。如果函数返回Zsuccess,一个完整的消息被编译完成,它包括网络层的headers,footers 和整个消息可选择的安全应用。这个消息进入到网络缓冲区准备发到OTA 。只有调用了OSA L任务处理循环函数,并启动了网络任务之后,网络层
24、才会将该条消息传给MAC 层。即使网络任务被启动后,如果消息队列中的前一个消息仍没有发给MA C和 OTA ,这个消息只能等待。如果AF_DataRequest() 返回的值是失败,则表明协议栈的某一层出现错误,多数情况是因为消息队列没有足够的空间,因此消息无法传给OTA 。当网络层成功的将消息传给MAC 层, MA C再传给 OTA ,该条消息将会被路由,直到AF_DataRequest() 所指定的目的地址。当消息到达网络中的目的地址后,由协议栈的低层去掉消息中的安全信息,然后将应用对象有效的数据载荷传给AF_DataRequest() 所指定的目的端点。接收到消息的应用对象将会被SYS_
25、EVENT_MSG的AF_INCOMING_MSG_CMD所标识。case AF_INCOMING_MSG_CMD: GenericApp_MessageMSGCB( MSGpkt ); break; 上面代码, GenericApp 通过 GenericApp_ProcessEvent() 接收到消息 SYS_EVENT_MSG ,下面的代码,处理用户发给OTA 的数据。void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) switch ( pkt-clusterId ) case GENERICAPP_CLUSTERID: /
26、 the message #if defined( LCD_SUPPORTED ) HalLcdWriteScreen( (char*)pkt-cmd.Data, rcvd ); #elif defined( WIN32 ) WPRINTSTR( pkt-cmd.Data ); #endif break; OTA 传送的数据由LCD 显示。 GenericApp 假设 OTA 数据包括一个以NULL 结束的 ASCII 码字符串(作为 HalLcdWriteScreen() 的参数)。而更多的情况是使用afIncomingMSGPacket_t 结构体的长度: pkt-cmd.DataLeng
27、th 。3、SerialApp The Sample Application 3.1、引言SerialApp 取代了两个非 ZigBee 设备( non-ZigBee devices )的有线连接。一个PC(或者任何非ZigBee 设备) 向一个连接到串口上的ZigBee 设备传递数据。 这个应用从一个串口OTA 向另一个同样执行此 SerialApp 应用的 ZigBee 设备传递消息(设备的发现和绑定必须在两个执行SerialApp应用的对象之间完成)。接收到SerialApp OTA 数据流的 ZigBee 设备会把该数据发送到自己的串口上。串口发送为双向全双工设计,这样允许OTA (多
28、跳)的传输时间和数据丢失的重传。3.2、按键SW1:SW2:通过 ZDApp_SendEndDeviceBindReq实现手动绑定SW3:SW4:通过 ZDApp_AutoFindDestination实现自动发现4、The TransmitApp Sample Application 4.1、引言TransmitApp 通过发送数据包来显示OTA 最大的数据吞吐量,这个应用能够计算(并显示,LCD 或串口)每秒字节的数量和发送接收总的数据量。4.2、按键SW1:TransmitApp 触发 OTA 发送消息SW2:通过 ZDApp_SendEndDeviceBindReq实现手动绑定SW3:
29、TransmitApp 清除显示的数据SW4:通过 ZDApp_AutoFindDestination实现自动发现4.3、常量下面的常量被定义为将不同的变量放入消息中。TRANSMITAPP_RANDOM_LEN-使传输的分组(packets)有随机的长度,否则,所有的分组将会是由AF 为网络配置的最大长度。TRANSMITAPP_DELAY_SEND- 两个消息之间有一个额外的时间延迟。TRANSMITAPP_SEND_DELAY-如果定义了TRANSMITAPP_DELAY_SEND ,这个数值为延时的数量。TRANSMITAPP_TX_OPTIONS-为分组分配 TX 选项,如果这个数值
30、被设为AF_MSG_ACK_REQUEST,发出的分组将会使APS ACK 使能,并且接收设备被告知分组已经发送出去。如果APS ACK 使能,传输速率将会因为额外的确认消息而降低。4.4、指标( Metrics)为了能够看到OTA传送的指标, 设备必须有 LCD 或连接到 Ztrace或Ztool。 如果使用 Ztrace或Ztool,按下面步骤设置Debug(SYS_SET_DEBUG_THRESHOLD in ZTool/Ztrace):ComponentID = 7 (COMPID_APP) Threshold = 3 (SEVERITY_INFORMATION) Ztrace或Zto
31、ol的日志窗口(log window )显示下面的参数:参数 1:每秒接收的字节数参数 2:计算出总的接收字节数参数 3:每秒发送的字节数参数 4:计算出总的发送字节数如果是 LCD显示:第一行:参数 1和 2 第二行:参数 3和 4 5、The Home Automation Profile 尽管前面的应用已经使用了假想的Private Profiles , HA Profile Id 0 x0104,为协议栈Profile。5.1、引言通常 HA Profile 依靠 ZCL。5.2、初始化如1.2.2节所描述的那样,用户必须向OSAL任务系统中添加至少一个任务,但是,当执行HA 应用对象
32、时,为了在HA Sample Applications 显示, ZCL 的任务必须添加进来(在其他任务使用 ZCL之前)。/ Must be the first ZCL task. osalTaskAdd( zcl_Init, zcl_event_loop, OSAL_TASK_PRIORITY_LOW ); 就像在 GenericApp中用户初始化过程一样,HA应用对象的初始化同样需要一些必要的步骤来初始化 ZCL 。下面 HA应用程序(点灯和开关)执行相应的初始化函数(如,zclSampleLight_Init() )使用 zclHA_Init() 注册简单描述符 (simple desc
33、riptor ) (如zclSampleLight_SimpleDesc) 使用 zclGeneral_RegisterCmdCallbacks() 注册命令回调表(command callbacks table)(如 zclSampleLight_CmdCallbacks )使用 zcl_registerAttrList() 注册属性表(attribute list )(如 zclSampleLight_Attrs )5.3、点灯应用例程5.3.1、引言这个应用例程使用设备上ON/Off cluster 命令来点亮或关闭LED4,或者使用 ZCL写命令设置 IdentifyTime 属性为非
34、零,使设备进入确认(Identification )模式(如 LED4闪烁)。5.3.2、ZCL 簇属性点灯应用例程支持下面的ZCL簇属性:基本的簇属性:zclSampleLight_HWRevision zclSampleLight_ZCLVersion zclSampleLight_ManufacturerName zclSampleLight_ModelId zclSampleLight_DateCode zclSampleLight_PowerSourcezclSampleLight_LocationDescription zclSampleLight_PhysicalEnvironm
35、ent zclSampleLight_DeviceEnable 识别( Identity )簇属性zclSampleLight_IdentifyTime Scene簇属性zclSampleLight_SceneCount zclSampleLight_CurrentScene zclSampleLight_CurrentGroup zclSampleLight_SceneValid On/Off 簇属性zclSampleLight_OnOffOn/Off 开关配置簇属性zclSampleLight_SwitchTypezclSampleLight_SwitchActions 信号电平控制簇属性
36、zclSampleLight_CurrentLevel zclSampleLight_TransitionTime 5.3.3、ZCL 回调函数这个应用为 ZCL簇提供下面的回调函数:zclSampleLight_BasicResetCB()- 当由基本簇得到一个复位到出厂默认值命令时调用此函数。zclSampleLight_IdentifyRspCB()-由Identity簇得到一个确认请求响应命令时,调用此函数。zclSampleLight_OnOffCB()-由On/Off 簇得到一个开、 关、触发命令时, 调用此函数。zclSampleLight_LevelControlMoveToL
37、evelCB()-由电平控制簇得到一个电平改变命令时,调用此函数。zclSampleLight_LevelControlMoveCB()-由电平控制簇得到一个移动命令时,调用此函数。zclSampleLight_LevelControlStepCB()-由电平控制簇得到一个Step 命令时, 调用此函数。zclSampleLight_SceneStoreCB()- 由Scene簇得到一个 Scene 存储命令时,调用此函数。zclSampleLight_SceneRecallCB()- 由Scene簇得到一个 Scene Recall 命令时,调用此函数。zclSampleLight_Scen
38、eRspCB()- 由Scene簇得到一个 Scene Response 命令时,调用此函数。zclSampleLight_IdentifyTimeWrtHdlr()-由ZCL写命令设置 Identity Time 属性值时, 调用此函数。5.3.4、按键参数 1:无动作参数 2:使用 ZDApp_SendEndDeviceBindReq 手动绑定参数 3:无动作参数 4:无动作zclSampleLight_ProcessIdentifyTimeChange()- 处理 Identify Time 属性值发生的任何变化。该属性可以由 ZCL 写命令修改,由超时事件识别。如果Identify T
39、ime 属性非零,这个函数使设备进入到识别模式。否则,设备进入到正常的操作模式。识别模式时,LED4开始闪烁,Identify Time 值每一秒减 1。5.4、开关应用例程5.4.1、引言设备运行此例程时,通过使用sw1控制 LED4。5.4.2、ZCL 簇属性开关应用例程支持下面的ZCL簇属性:基本的簇属性:zclSampleSw_HWRevision zclSampleSw_ZCLVersion zclSampleSw_ManufacturerName zclSampleSw_ModelId zclSampleSw_DateCode zclSampleSw_PowerSource zcl
40、SampleSw_LocationDescription zclSampleSw_PhysicalEnvironment zclSampleSw_DeviceEnable 识别簇属性zclSampleSw_IdentifyTime On/Off 簇属性zclSampleSw_OnOff 5.4.3、ZCL 回调函数该应用向 ZCL簇提供下面的回调函数。zclSampleSw_BasicResetCB()- 当由基本簇得到一个复位到出厂默认值命令时调用此函数。zclSampleLight_IdentifyRspCB()-由Identity簇得到一个确认请求响应命令时,调用此函数。zclSampl
41、eLight_IdentifyTimeWrtHdlr()-由ZCL写命令设置 Identity Time 属性值时, 调用此函数。5.4.4、按键参数 1:向灯发送一个触发消息参数 2:使用 ZDApp_SendEndDeviceBindReq 手动绑定参数 3:无动作参数 4:使用 ZDApp_AutoFindDestination 自动发现zclSampleLight_ProcessIdentifyTimeChange()- 处理 Identify Time 属性值发生的任何变化。该属性可以由 ZCL 写命令修改,由超时事件识别。如果Identify Time 属性非零,这个函数使设备进入到识别模式。否则,设备进入到正常的操作模式。识别模式时,LED4开始闪烁,Identify Time 值每一秒减 1。