基于zstack 3.0.2
2538作为协调器(client),2530作为终端(sever)
协调器和终端互发私有数据,我想基于ZCL_CLUSTER_ID_GEN_ON_OFF,
自定义一个attribute(ATTRID_USER)
请问zcl_sample_data.c里关于attribute的描述
在client和sever端里面都要初始化吗?还是只要在server端初始化即可?
初始化如下,这段代码协调器和终端里面都要加吗?
{
ZCL_CLUSTER_ID_GEN_ON_OFF,
{ // Attribute record
ATTRID_USER,
ZCL_DATATYPE_CHAR_STR,
ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE | ACCESS_REPORTABLE,
(void *)UserData
}
}
Viki Shi:
请参考这边的academy进行属性添加:dev.ti.com/…/node
user5367314:
回复 Viki Shi:
Add attributes
By default, all of the mandatory attributes for the Basic Server and Identify Server are included, and a number of optional attributes for the Basic Server are included as well. In this section we will only need to address the attributes for the Metering Server and On/Off Server.
这里描述only need to address the attributes for the Metering Server and On/Off Server,意思是只需要在server端添加attributes 即可?
client端不需要添加?
YiKai Chen:
回复 user5367314:
server端才有attributes可以添加
user5367314:
回复 YiKai Chen:
@YiKai Chen
我的环境如下:协调器2538,终端2530
协调器作为client,终端作为server
协调器和终端互发私有数据(双方都是通过zcl_SendReportCmd互发私有数据的)
为了简化,我直接在clusterZCL_CLUSTER_ID_GEN_ON_OFF下面定义attribute
协调器
1.client和server啥区别?
2.为什么server端才有attributes可以添加,而client端没有?
3.那client端发数据给server端,直接zcl_SendReportCmd发就了?
4.client端zcl_sampleApp_data.c里的初始化CONST zclAttrRec_t zclSampleSw_Attrs[] ,
这里面不需要像server端一样需要填写相关的attribute?
YiKai Chen:
回复 user5367314:
ZCL架構里,sever就是提供服務的站點,所以才需要設置不同的attribtues給client來存取,所以server端要用主動發出attribute的話要用report attribute,至於client端如果要去存取server的attribtue要用ZCL read/write命令
user5367314:
回复 YiKai Chen:
明白,
如果协调器和终端直接就用zcl_SendReportCmd函数相互发私有数据(初步测试可以)
协调器端参数用ZCL_FRAME_CLIENT_SERVER_DIR
终端参数用ZCL_FRAME_SERVER_CLIENT_DIR
那么client端是否要设置attribute相关参数?
YiKai Chen:
回复 user5367314:
client不用设置attribute相关参数
user5367314:
回复 YiKai Chen:
@YiKai Chen 再请教两个问题:
1.用zcl_SendReportCmd发送数据是,为了提高发送的成功率,安装如下的方式发送是否可以?
if(afStatus_SUCCESS != zcl_SendReportCmd(SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr,ZCL_CLUSTER_ID_GEN_ON_OFF,pReportCmd, ZCL_FRAME_CLIENT_SERVER_DIR, TRUE, bdb_getZCLFrameCounter()) ){zcl_SendReportCmd(SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr,ZCL_CLUSTER_ID_GEN_ON_OFF,pReportCmd, ZCL_FRAME_CLIENT_SERVER_DIR, TRUE, bdb_getZCLFrameCounter());}
2.测试时遇到一个现象:协调器和终端都开启NV,终端正常入网后,把该终端factory reset 后 该终端又自动加到这个协调器里面了,
此时协调器并没有开启permitjoin(因为此时拿一个从未加过该协调器的终端并不能入网),我猜测是该终端之前加过该协调器,
即使factory reset,但是该协调器NV里面有他的信息了,所以直接就又加进去了?是否这样?
3.还有个现象,协调器上电初期,加终端进来很正常,但是持续上电几天后,再加入一个新的终端,该终端会被踢,只要把协调器重启后,才能正常入网(协调器没有被加满),是不是协调器运行几天后,framecounter跟新进来终端的对不上了导致被踢下线?
YiKai Chen:
回复 user5367314:
1. 你是指連續調用zcl_SendReportCmd兩次,如果是,這個方式沒多大作用
2. 照理說終端factory reset 后 该终端就不應該再加到这个协调器,除非协调器又使能permitjoin
3. 這要有抓包檔才能分析