找回密码
 立即注册

微信扫码登录

查看: 214|回复: 11

如何上报zcl的一些属性改变

[复制链接]

18

主题

40

回帖

190

积分

荣耀黄金

积分
190
发表于 2024-12-5 16:05:30 | 显示全部楼层 |阅读模式
我使用的8258构建了一个温控器的设备,在我改变设置值与温度发生变化时如何上报呢?

27

主题

166

回帖

571

积分

版主

积分
571
发表于 2024-12-10 11:15:44 | 显示全部楼层
report需要和bind一起使用,可以用网关先向设备发送report config,再发送bind。

18

主题

40

回帖

190

积分

荣耀黄金

积分
190
 楼主| 发表于 2024-12-11 15:16:40 | 显示全部楼层
TL_YB 发表于 2024-12-10 11:15
report需要和bind一起使用,可以用网关先向设备发送report config,再发送bind。

也就是说我需要先收到网关的report config然后我向网关进行绑定,然后按我写的条件来就能触发上报了是吧,低功耗的情况下有没有什么差异呢

27

主题

166

回帖

571

积分

版主

积分
571
发表于 2024-12-11 20:08:29 | 显示全部楼层
是的,report config和bind都是网关发给设备。

18

主题

40

回帖

190

积分

荣耀黄金

积分
190
 楼主| 发表于 6 天前 | 显示全部楼层
TL_YB 发表于 2024-12-11 20:08
是的,report config和bind都是网关发给设备。

有关于终端设备上报的示例嘛,终端是要往上报表中注册然后等待poll时间到达,然后查表里是否有需要上报嘛?

18

主题

40

回帖

190

积分

荣耀黄金

积分
190
 楼主| 发表于 6 天前 | 显示全部楼层
wx_8236422632 发表于 2024-12-16 09:47
有关于终端设备上报的示例嘛,终端是要往上报表中注册然后等待poll时间到达,然后查表里是否有需要上报嘛 ...

这是我目前的上报test


s32 sampleFloorMeasureCB(void *arg){
//        printf(" i come sampleFloorMeasureCB\n");
    u16 i;
    u8 temp,humi;
    u8 data[4]={0}; //data[0-1]:temp   data[2-3]:humi
        zcl_thermostatAttr_t *pThermostatAttr = zcl_thermostatAttrGet();
        last_temp = pThermostatAttr->thermostatLocalTemperature;
    for(i = 0; i < N; i++)
        {
                Sht40Handler();
                WaitMs(1);
        }
    if(GetSht40Temp() != -32768)
    {
            temp = GetSht40Temp();
            local_temp = temp * 100;
    }
    if(GetSht40Hum() != 0)
    {
            humi = GetSht40Hum();
    }
    pThermostatAttr->thermostatLocalTemperature = local_temp;
    current_temp = pThermostatAttr->thermostatLocalTemperature;
    data[0] = lcd_set_temp_data[temp/10];
    data[1] = lcd_set_temp_data[temp%10];
    data[2] = lcd_set_humi_data[humi/10];
    data[3] = lcd_set_humi_data[humi%10];
    tx_data_show_open[9] = (data[0] >> 4) & (tx_data_show_open[9] | 0x0f);
    tx_data_show_open[10] =  (tx_data_show_open[10] | 0xff) & ((data[0] << 4)|(data[1] >> 4));
    tx_data_show_open[11] = (tx_data_show_open[11] | 0xf0) & (data[1] << 4);
    tx_data_show_open[17] = data[3] | 0x10;
    tx_data_show_open[18] = data[2];

    if(onoff_status_flag == 0)
    {
            LcdShowOff();
            pThermostatAttr->thermostatSystemMode = 0x00;
    }

    if(onoff_status_flag == 1 && set_temp >= temp)
    {
            LcdShowOpenMode(tx_data_show_open);
            pThermostatAttr->thermostatSystemMode = 0x04;
    }
    else if(onoff_status_flag == 1 && set_temp < temp)
    {
            LcdShowOff();
            pThermostatAttr->thermostatSystemMode = 0x00;
    }

    TheLocalTempChangeReport(last_temp,current_temp);
//    printf("temp = %d,humi = %d\n",temp,humi);
        return 0;
}

#ifdef ZCL_REPORT

void reportLocalTemperature(s16 current_temp) {
    // 设置发送端点和目标设备信息
        epInfo_t dstEpInfo;
        memset((u8 *)&dstEpInfo, 0, sizeof(epInfo_t));

        dstEpInfo.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
        dstEpInfo.dstEp = SAMPLE_SENSOR_ENDPOINT;
        dstEpInfo.dstAddr.shortAddr = 0x0000;
        dstEpInfo.profileId = HA_PROFILE_ID;

    // 本地温度属性信息
    u16 attrID = ZCL_ATTRID_HVAC_THERMOSTAT_LOCAL_TEMPERATURE;
    u8 dataType = ZCL_DATA_TYPE_INT16;
    s16 temperatureValue = current_temp;  // 示例温度值 20.00°C
    u8 disableDefaultRsp = 1;    // 禁用默认响应

    // 调用 zcl_report 上报属性
    u8 status = zcl_report(1, &dstEpInfo, disableDefaultRsp,
                           ZCL_FRAME_SERVER_CLIENT_DIR, 0, 0,
                           ZCL_CLUSTER_HAVC_THERMOSTAT, attrID, dataType,
                           (u8 *)&temperatureValue);

    if (status == ZCL_STA_SUCCESS) {
        printf("Temperature reported successfully.\n");
    } else {
        printf("Failed to report temperature, status: %d\n", status);
    }
}



static void TheLocalTempChangeReport(s16 last_temp,s16 current_temp)
{
        if(abs(current_temp - last_temp) > STEPBYSTEP && zb_isDeviceJoinedNwk())
        {
                reportLocalTemperature(current_temp);
        }
}




#endif

11

主题

31

回帖

219

积分

华贵铂金

积分
219
发表于 5 天前 | 显示全部楼层
本帖最后由 wes58 于 2024-12-17 13:24 编辑
wx_8236422632 发表于 2024-12-16 10:23
这是我目前的上报test

Hi,
If you are sending reports by yourself, you don't need to use device binding. I can see from your code that it is what you are doing. And you can send the report any time you want.
If you use the report handing functions - you can see in the examples code like this:

void report_handler(void)
{
        if(zb_isDeviceJoinedNwk()){
                if(zcl_reportingEntryActiveNumGet()){
                        u16 second = 1;//TODO: fix me

                        reportNoMinLimit();
                        //start report timer
                        reportAttrTimerStart(second);
                }
                else{
                        //stop report timer
                        reportAttrTimerStop();
                }
        }
}


Doing it this way you have to have a device bound before the report is send by device. And the reporting parameter have to be defined similar to this

bdb_defaultReportingCfg(DEV_ENDPOINT, HA_PROFILE_ID, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF,
                            0x0000, 120, (u8 *)&reportableChange);


One thing I noticed in you code, which I think is not correct: You have:
dstEpInfo.dstAddr.shortAddr = 0x0000;
When you look in nwk.h file you will see the following definition:

/****************************************************************************
* @brief        Network broadcast addresses types
*/
typedef enum
{
        NWK_BROADCAST_ALL_DEVICES        = 0xFFFF, /*!< All devices in PAN */
        NWK_BROADCAST_RESERVED           = 0xFFFE,
        NWK_BROADCAST_RX_ON_WHEN_IDLE    = 0xFFFD, /*!< macRxOnWhenIdle = TRUE */
        NWK_BROADCAST_ROUTER_COORDINATOR = 0xFFFC, /*!< All routers and coordinator */
        NWK_BROADCAST_LOW_POWER_ROUTER   = 0xFFFB  /*!< Low power routers only */
}nwk_broadcast_address_t;

/**


So it shouldn't be 0x0000.

27

主题

166

回帖

571

积分

版主

积分
571
发表于 4 天前 | 显示全部楼层
微信截图_20241218193356.png
void reportTemp(void){
        epInfo_t dstEpInfo;
        TL_SETSTRUCTCONTENT(dstEpInfo, 0);

        dstEpInfo.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
        dstEpInfo.dstEp = 1;
        dstEpInfo.dstAddr.shortAddr = 0x0000;
        dstEpInfo.profileId = HA_PROFILE_ID;

        s16 temp = 0x0834;//21.00

        zcl_report(1, &dstEpInfo, TRUE, ZCL_FRAME_SERVER_CLIENT_DIR,
                        ZCL_SEQ_NUM, MANUFACTURER_CODE_NONE,
                        ZCL_CLUSTER_HAVC_THERMOSTAT, ZCL_ATTRID_HVAC_THERMOSTAT_LOCAL_TEMPERATURE,
                        ZCL_DATA_TYPE_INT16, (u8 *)&temp);
}


11

主题

31

回帖

219

积分

华贵铂金

积分
219
发表于 3 天前 | 显示全部楼层
本帖最后由 wes58 于 2024-12-19 05:31 编辑
TL_YB 发表于 2024-12-18 19:34
《---myCode-C---》

void reportTemp(void){

Sorry, you are correct. You can use address 0x0000 because it is Gateway network address. This means that the report will only be received by the Gateway.

1

主题

4

回帖

25

积分

英勇黄铜

积分
25
发表于 3 天前 | 显示全部楼层
奇怪,我的wx_8236422632这个账号怎么登录不了了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2024-12-22 13:06 , Processed in 0.089713 second(s), 21 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表