打印

(转)HA规范的理解1 - ZStack中节点消息处理的过程

[复制链接]
1031|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heimaojingzhang|  楼主 | 2018-7-24 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

理解HA规范主要从ZStack中以下的两个函数进入分析:

zcl_event_loop();

zclSampleLight_Init();

主要理解:程序的执行过程,相关概念术语在协议栈里的表现和实现,各种数据类型、数据集合的定义。

另外需要理解ZCL API的调用,需要明白对API的参数怎么配置。许多命令都是通过调用API来实现对对方节点的控制的。

一、Light节点

1、        首先需要理解协议栈的任务、事件、消息的概念(关系:任务→ 事件 → 消息)

2、        在ZStack协议栈里用户可以在 osalInitTasks() 中添加自己的应用任务,同时需要在tasksArr[]中添加任务事件进入的函数(如:zclSampleLight_event_loop)。

3、        每个任务都有一个任务ID。在用户自定义的应用任务的上一层是ZCL应用支持子层zcl_event_loop。

进入ZCL应用支持子层(ZCL任务),当中有系统事件if ( events & SYS_EVENT_MSG ),在其中的AF收入消息 if( *msgPtr == AF_INCOMING_MSG_CMD ) 里,提取来自AF层的无线接收的原生数据rawAFMsg,并进入消息处理函数 zcl_ProcessMessageMSG( rawAFMsg ); 中进行处理。

rawAFMsg的数据类型为afIncomingMSGPacket_t,进入可以查看其所包含的数据有哪些。

在消息处理函数zcl_ProcessMessageMSG(rawAFMsg );中的 epDesc =afFindEndPointDesc( pkt->endPoint );  提取设备描述epDesc(若设备描述(端口)不存在或设备不能回应,则return; // Error, ignore the message)。

(接着的 #if defined (INTE_PAN) 是判断网络是否设置成了网络之间的互通,一般很少用到。   )

获取安全选项options = zclGetClusterOption(pkt->endPoint, pkt->clusterId );                     

接下来是根据设备描述和簇ID来发现想要的插件pInPlugin = zclFindPlugin( pkt->clusterId,epDesc->simpleDesc->AppProfId );

(插件pInPlugin的类型为:zclLibPlugin_t;查看可以知道其实就是寻找簇范围内的对应回调函数)

接着的if ( (pInPlugin != NULL ) && !zcl_DefaultRspCmd( inMsg.hdr ) )是对安全选项进行匹配。

之后判断是否为基础类型信息:

// Is this a foundation type message

  if ( !interPanMsg && zcl_ProfileCmd( inMsg.hdr.fc.type ) )

结果进入的是:

else // Not a foundation type message, so it must be specific to the clusterID.

当中的:status =pInPlugin->pfnIncomingHdlr( &inMsg ); 是调用回调函数(例如灯切换的回调函数是:zclSampleLight_OnOffCB();)


二、     switch节点

Switch节点的按键处理函数如下:

static void zclSampleSw_HandleKeys( byteshift, byte keys )

{

      zAddrType_t dstAddr;

      (void)shift; // Intentionally unreferenced parameter

      if ( keys & HAL_KEY_SW_1 )

        {

        //Using this as the "Light Switch"

#ifdefZCL_ON_OFF

zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT,&zclSampleSw_DstAddr, false, 0 );

#endif

        }

... …

}

程序中红色字体的函数为ZCL API,直接调用此API可以实现向灯节点发送开关切换命令。


评论
dirtwillfly 2018-7-24 20:20 回复TA
感谢分享 

相关帖子

沙发
keaibukelian| | 2018-7-24 10:00 | 只看该作者
我在例程中没偶找到zclSampleLight_event_loop则个函数 是不是我看错例程了

使用特权

评论回复
板凳
dirtwillfly| | 2018-7-24 20:21 | 只看该作者
keaibukelian 发表于 2018-7-24 10:00
我在例程中没偶找到zclSampleLight_event_loop则个函数 是不是我看错例程了

需要问问楼主用的哪个型号的无线mcu。不同的mcu,例程会有不同

使用特权

评论回复
地板
vibra2016| | 2018-7-25 22:42 | 只看该作者
在ZStack协议栈里用户可以在 osalInitTasks() 中添加自己的应用任务,同时需要在tasksArr[]中添加任务事件进入的函数(如:zclSampleLight_event_loop)。

使用特权

评论回复
5
heimaojingzhang|  楼主 | 2018-7-26 08:48 | 只看该作者
vibra2016 发表于 2018-7-25 22:42
在ZStack协议栈里用户可以在 osalInitTasks() 中添加自己的应用任务,同时需要在tasksArr[]中添加任务事件 ...

非常感谢啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

4102

帖子

4

粉丝