HA规范的理解1 - ZStack中节点消息处理的过程
来源:互联网 发布:昆明知行科技有限公司 编辑:程序博客网 时间:2024/06/05 06:47
理解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可以实现向灯节点发送开关切换命令。
- HA规范的理解1 - ZStack中节点消息处理的过程
- Zstack中End Device设备失去父节点时的重新入网处理方法
- Zstack中End Device设备失去父节点时的重新入网处理方法
- Zstack中End Device设备失去父节点时的重新入网处理方法
- Zstack中消息、事件和任务的异同
- Hadoop HA的理解
- Hadoop HA的理解
- 理解JMS规范中消息的传输模式和消息持久化
- 理解JMS规范中消息的传输模式和消息持久化
- 理解JMS规范中消息的传输模式和消息持久化
- 理解JMS规范中消息的传输模式和消息持久化
- WM_CREATE消息的处理过程
- Android系统中异步消息处理线程机制的理解
- [转]理解消息处理过程
- HA规范的理解3 - 初始化函数里的注册回调函数的分析
- DOM中元素节点、属性节点、文本节点的理解
- DOM中元素节点、属性节点、文本节点的理解
- DOM中元素节点、属性节点、文本节点的理解
- NHibernate之旅(18):初探代码生成工具使用
- NHibernate之旅(19):初探SchemaExport工具使用
- PorterDuff.Mode 图片合成模式理解
- 【GDOI2103模拟3.17】电话表
- js去除空格、换行
- HA规范的理解1 - ZStack中节点消息处理的过程
- Leetcode#36||Valid Sudoku
- Leetcode#37||
- LeetCode Rectangle Area
- 接受一个整数输入,显示所有小于或等于该数的素数
- 一起学CC3200之HttpServer数据传输(中序)
- 关键问题可能不是出在技术上
- eclipse 安装jetty最新的地址
- 观察者模式(Observer)