打印

(转)HA规范的理解2 -关键术词的理解和在协议栈初始化里...

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

1、        节点、设备、端点、簇、属性和命令,如下两图可以理解这几个概念的关系:


(图源于:锋硕的《ZigBee视频教程》的PDF文档)

在协议栈里每个端点应该是对应一个设备的,而上图中所表示的设备应该是指相同设备的集合。同时在HA规范文档中,已经定义了每种设备支持哪些簇(HA规范文档:《Home_Automation_Profile_for_Public_Download》)。

2、        要让zigbee节点实现某些功能(比如灯控制、可调亮度控制、可调颜色控制、窗帘控制等),那么就得在协议栈里注册符合HA规范的相应设备,这些设备可以采用多个zigbee节点分别控制,也可以在一个zigbee节点上同时注册这些设备来控制。那么,要在一个节点上实现这些设备,就得在初始化时注册好,协议栈SampleLight中的初始化程序如下:

void zclSampleLight_Init( byte task_id )

{

  zclSampleLight_TaskID =task_id;


  // Set destination addressto indirect

//zclSampleLight_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;

//zclSampleLight_DstAddr.endPoint = 0;

//zclSampleLight_DstAddr.addr.shortAddr = 0;


  // This app is part of theHome Automation Profile

  zclHA_Init( &zclSampleLight_SimpleDesc );


  // Register the ZCL GeneralCluster Library callback functions

  zclGeneral_RegisterCmdCallbacks(SAMPLELIGHT_ENDPOINT, &zclSampleLight_CmdCallbacks);


  // Register theapplication's attribute list

  zcl_registerAttrList( SAMPLELIGHT_ENDPOINT,SAMPLELIGHT_MAX_ATTRIBUTES,zclSampleLight_Attrs );


  // Register the Applicationto receive the unprocessed Foundation command/response messages

  zcl_registerForMsg(zclSampleLight_TaskID );


  // Register for all keyevents - This app will handle all key events

  RegisterForKeys(zclSampleLight_TaskID );


  // Register for a testendpoint

  afRegister(&sampleLight_TestEp );

}

分析:

(1)    zclHA_Init( &zclSampleLight_SimpleDesc );

注册相关设备的设备描述(端点EndPoint、符合的规范(这里是HA规范ID)、设备ID、设备对应的输入簇和输出簇)

进入zclSampleLight_SimpleDesc参数,可以查看到本示例中的设备为可调灯设备:ZCL_HA_DEVICEID_DIMMABLE_LIGHT

对应规范文档中该设备的输入簇列表为:zclSampleLight_InClusterList

输出簇列表为:zclSampleLight_OutClusterList

(2)    注册好设备描述之后,当节点ZCL层接收到AF层发来的消息时,就会根据消息解析出设备描述,并匹配已经注册的设备描述,进入相应的设备端口(端点),在相应的簇里执行相关的命令。

命令的执行需要回调函数,初始化中对回调函数进行了注册:

zclGeneral_RegisterCmdCallbacks( SAMPLELIGHT_ENDPOINT, &zclSampleLight_CmdCallbacks);

进入zclSampleLight_CmdCallbacks参数中,查看它的类型为zclGeneral_AppCallbacks_t,这个类型实现了HA规范中的General功能域(即簇集,参考文档《07-5123-04-0afg-zigbee-cluster-library-specification》)的回调函数集定义,可以根据实际功能的需要来裁剪和自定义自己的回调函数集。

(功能域:规范中根据功能将簇划分为了不同的域(簇集合)(回调函数集的类型构建也根据功能域划分),这里和设备ID列表有些相似。但要区分开来,设备ID只是给设备一个规定的标号,而簇是要实现的功能。每个设备对应自己的簇,而且对应的簇可以是在不同的功能域(簇集合)里,具体对应哪些簇得看文档规范,与功能域的划分没有毛线关系。。)

(zstack中簇集列表的查看可以搜索General Clusters,设备ID列表的查看可以搜索Generic Device IDs)

General功能域的回调函数表(可以进入其类型zclGeneral_AppCallbacks_t查看):

static zclGeneral_AppCallbacks_tzclSampleLight_CmdCallbacks =

{

  zclSampleLight_BasicResetCB,              // Basic Cluster Reset command

zclSampleLight_IdentifyCB,               // Identify command

zclSampleLight_IdentifyQueryRspCB,  // Identify Query Responsecommand

  zclSampleLight_OnOffCB,         // On/Off cluster command

  NULL,                                     //Level Control Move to Level command

NULL,                                    // Level Control Move command

NULL,                                    // Level Control Step command

NULL,                                     // GroupResponse commands

NULL,                                    // Scene Store Request command

NULL,                                    // Scene Recall Request command

NULL,                                    // Scene Response command

NULL,                                    // Alarm (Response) command

NULL,                                    // RSSI Location commands

NULL,                                    // RSSI Location Response commands

};

其中  zclSampleLight_OnOffCB() 函数正是执行开关命令的回调函数。如果要实现该可调灯设备的亮度调节,则在 // Level Control Move to Level command这一行添加回调函数(自定义)。

而控制端只需通过调用《Z-Stack ZCL API》中的zclGeneral_SendLevelControlMoveToLevel();API来发送控制命令。


相关帖子

沙发
vibra2016| | 2018-7-25 22:55 | 只看该作者
这个参考下的,,现在还不太清楚的

使用特权

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

本版积分规则

85

主题

4142

帖子

4

粉丝