例程GenericApp中zclgenericapp.c分析(ZStack 3.0.2)

本文深入分析了ZStack 3.0.2版本中Zigbee应用框架的zclgenericapp.c文件,涵盖了AF地址类型结构体、用户层初始化函数、任务处理逻辑、按键处理、信息接收处理、Profile命令响应以及LCD显示等功能实现。通过详细解读关键代码,揭示了Zigbee设备在交互和管理中的工作原理。
摘要由CSDN通过智能技术生成

1.AF地址类型结构体位于AF.h
地址模式:

typedef enum
{
  afAddrNotPresent = AddrNotPresent,
  afAddr16Bit      = Addr16Bit,
  afAddr64Bit      = Addr64Bit,
  afAddrGroup      = AddrGroup,
  afAddrBroadcast  = AddrBroadcast
} afAddrMode_t;     //地址模式
typedef struct
{
  union
  {
    uint16      shortAddr;
    ZLongAddr_t extAddr;
  } addr;
  afAddrMode_t addrMode;
  uint8 endPoint;
  uint16 panId;  // used for the INTER_PAN feature
}  afAddrType_t;         //地址类型

2.用户层zclgenericapp.c中常用函数
用户初始化函数:

void zclGenericApp_Init( byte task_id )

3.任务处理函数:

uint16 zclGenericApp_event_loop( uint8 task_id, uint16 events )

任务处理函数中的重要代码
接收消息事件:

if ( events & SYS_EVENT_MSG )
  {
    while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclGenericApp_TaskID )) )   //判断消息类型
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZCL_INCOMING_MSG:    //接收消息事件
          // Incoming ZCL Foundation command/response messages
          zclGenericApp_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt );
          break;

        case KEY_CHANGE:    //按键触发事件
          zclGenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
          break;

        case ZDO_STATE_CHANGE:     //网络中设备状态发生改变发生的事件
          zclGenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);   //获得当前的状态

          // now on the network
          if ( (zclGenericApp_NwkState == DEV_ZB_COORD) ||
               (zclGenericApp_NwkState == DEV_ROUTER)   ||
               (zclGenericApp_NwkState == DEV_END_DEVICE) )
          {
            giGenAppScreenMode = GENERIC_MAINMODE;
            zclGenericApp_LcdDisplayUpdate();
          }
          break;

        default:
          break;
      }

      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

4.按键处理函数

static void zclGenericApp_HandleKeys( byte shift, byte keys )

5.接收信息处理函数

static void zclGenericApp_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg )

接收信息处理函数重要代码:

  switch ( pInMsg->zclHdr.commandID )  //判断消息类型
  {
#ifdef ZCL_READ
    case ZCL_CMD_READ_RSP:
      zclGenericApp_ProcessInReadRspCmd( pInMsg );
      break;
#endif
#ifdef ZCL_WRITE
    case ZCL_CMD_WRITE_RSP:
      zclGenericApp_ProcessInWriteRspCmd( pInMsg );
      break;
#endif
    case ZCL_CMD_CONFIG_REPORT:
    case ZCL_CMD_CONFIG_REPORT_RSP:
    case ZCL_CMD_READ_REPORT_CFG:
    case ZCL_CMD_READ_REPORT_CFG_RSP:
    case ZCL_CMD_REPORT:
      //bdb_ProcessIncomingReportingMsg( pInMsg );
      break;
      
    case ZCL_CMD_DEFAULT_RSP:
      zclGenericApp_ProcessInDefaultRspCmd( pInMsg );
      break;
#ifdef ZCL_DISCOVER
    case ZCL_CMD_DISCOVER_CMDS_RECEIVED_RSP:
      zclGenericApp_ProcessInDiscCmdsRspCmd( pInMsg );
      break;

    case ZCL_CMD_DISCOVER_CMDS_GEN_RSP:
      zclGenericApp_ProcessInDiscCmdsRspCmd( pInMsg );
      break;

    case ZCL_CMD_DISCOVER_ATTRS_RSP:
      zclGenericApp_ProcessInDiscAttrsRspCmd( pInMsg );
      break;

    case ZCL_CMD_DISCOVER_ATTRS_EXT_RSP:
      zclGenericApp_ProcessInDiscAttrsExtRspCmd( pInMsg );
      break;
#endif
    default:
      break;
  }

  if ( pInMsg->attrCmd )
    osal_mem_free( pInMsg->attrCmd );
}

6.处理“Profile”读响应命令

static uint8 zclGenericApp_ProcessInReadRspCmd( zclIncomingMsg_t *pInMsg )

7.处理“Profile”写响应命令

static uint8 zclGenericApp_ProcessInWriteRspCmd( zclIncomingMsg_t *pInMsg )

8.处理“Profile”默认响应命令

static uint8 zclGenericApp_ProcessInDefaultRspCmd( zclIncomingMsg_t *pInMsg )

9.处理Discover命令响应命令

static uint8 zclGenericApp_ProcessInDiscCmdsRspCmd( zclIncomingMsg_t *pInMsg )

10.处理“Profile”Discover Attributes响应命令

static uint8 zclGenericApp_ProcessInDiscAttrsRspCmd( zclIncomingMsg_t *pInMsg )

11.处理“Profile”Discover Attributes扩展响应命令

static uint8 zclGenericApp_ProcessInDiscAttrsExtRspCmd( zclIncomingMsg_t *pInMsg )

12.更新LCD

void zclGenericApp_LcdDisplayUpdate( void )

13.在LCD上显示主屏幕

static void zclGenericApp_LcdDisplayMainMode( void )

14.在LCD上显示操作提示

static void zclGenericApp_LcdDisplayHelpMode( void )

15.报告调试过程的状态

static void zclGenericApp_ProcessCommissioningStatus(bdbCommissioningModeMsg_t *bdbCommissioningModeMsg)

16.处理对IdentifyTime属性的任何更改

static void zclGenericApp_ProcessIdentifyTimeChange( uint8 endpoint )

17.当添加新的绑定时调用

static void zclGenericApp_BindNotification( bdbBindNotificationData_t *data )

18.当touchlink功能使能或者禁用时调用

static void zclGenericApp_ProcessTouchlinkTargetEnable( uint8 enable )

19.从ZCL通用群集库进行回调,以将所有“基本群集属性”设置为默认值。

static void zclGenericApp_BasicResetCB( void )

20.电池电量低报警

void zclSampleApp_BatteryWarningCB( uint8 voltLevel )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值