Page 1 of 2
子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 11:54
by jafil10
使用 TLSR8258 Zigbee SDK 3.12.0 进行二次开发,连接涂鸦双模网关能正常上报与下发,但连接HA(使用标准Zigbee 3.0 Dongle作为网关)时,report attribute时,callback不产生,同时也没有发出数据来。
麻烦帮忙看看是什么原因导致发不出包来。
Code: Select all
static void report_single_zg_cluster_attr_value(uint16_t cluster_id, uint16_t attr_id, uint8_t type, uint8_t size)
{
TAL_ZG_SEND_DATA_T send_data;
uint8_t zcl_id;
switch (cluster_id) {
case CLUSTER_ON_OFF_CLUSTER_ID:
zcl_id = USER_ZCL_ID_ON_OFF; // 0x65
break;
case CLUSTER_POWER_CONFIG_CLUSTER_ID:
zcl_id = USER_ZCL_ID_BATTER_PERCENT; // 0x66
break;
default:
break;
}
tal_system_memset(&send_data, 0, sizeof(TAL_ZG_SEND_DATA_T));
send_data.addr.mode = SEND_MODE_DEV;
send_data.addr.type.dev.src_ep = DEV_ENDPOINT; // 0x01
send_data.addr.type.dev.dst_ep = 0x01;
send_data.addr.type.dev.dst_addr = TUYA_GATEWAY_ADDRESS; // 0x00
send_data.addr.type.dev.cluster_id = cluster_id;
send_data.zcl_id = zcl_id;
send_data.qos = QOS_1;
send_data.frame_type = ZG_ZCL_FRAME_TYPE_GLOBAL;
send_data.direction = ZG_ZCL_DATA_SERVER_TO_CLIENT;
send_data.command_id = CMD_REPORT_ATTRIBUTES_COMMAND_ID;
send_data.data.zg.attr_sum = 1;
send_data.data.zg.attr[0].attr_id = attr_id;
send_data.data.zg.attr[0].type = type;
send_data.data.zg.attr[0].size = size;
tal_zg_read_attribute(DEV_ENDPOINT, cluster_id, attr_id,
&send_data.data.zg.attr[0].value[0], size);
TAL_PR_DEBUG("cluster_id = %d, attr_id = %d, type = %d, size = %d\n", cluster_id, attr_id, type, size);
tal_zg_clear_send_data(ZG_CLEAR_ALL_ZCL_ID, &send_data.zcl_id);
tal_zg_send_data(&send_data, dp_send_result_cb, SPROP_SEND_TIMEOUT);
}
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 12:00
by jafil10
补充一下,每次上电,都有“nwk_rejoin_ok”的日志
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 13:42
by 心_远
连接第三方网关时,请走订阅方式,而非主动 report
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 14:10
by jafil10
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 14:21
by huanghuan
1.请先了解一下,Zigbee 3.0标准中有关bind和report table相关内容。
2.tuyaos 中配置 report table 参数可以参考 https://www.tuyaos.com/viewtopic.php?t=4941 中的使用说明 TAL_API\Zigbee_API\tal_reporting.md 进行配置
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 14:50
by jafil10
网关和子设备已经通过bind request和bind response建立了绑定关系。
子设备也通过 tal_zg_reporting_init 创建了report table。
我想了解的是,当子设备的属性发生变化,通过 tal_zg_write_attribute 也更新了attribute的值,但子设备如何触发report attibute命令上报呢?
Code: Select all
static TAL_REPORT_TABLE_T g_dp_cluster_tbl[] =
{
{TAL_REPORT_DIRECTION_REPORTED, DEV_ENDPOINT, CLUSTER_ON_OFF_CLUSTER_ID, ATTR_ON_OFF_ATTRIBUTE_ID, ZG_CLUSTER_MASK_SERVER, 0,
{{0, 65534, 0}}},
};
tal_zg_reporting_init((TAL_REPORT_TABLE_T *)g_dp_cluster_tbl, ARRAY_LEN(g_dp_cluster_tbl));
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 15:01
by huanghuan
Code: Select all
typedef struct {
TAL_REPORT_DIREC_E direction; ///< reporting direction
UINT8_T ep_id; ///< endpoint id
UINT16_T cluster_id; ///< cluster id, see TUYA_CLUSTER_ID_E
UINT16_T attr_id; ///< attribute id
ZG_CLUSTER_MASK_E mask; ///< reporting cluster mask
UINT16_T manuf_code; ///< manufacturer code
union {
struct {
UINT16_T min_interval; ///< mini reporting interval, measured in seconds
UINT16_T max_interval; ///< max reporting interval, measured in seconds
UINT_T report_change; ///< mini change to the attribute that will result in a report being sent
} reported;
struct {
UINT16_T source_addr; ///< node id of the source of the received reports
UINT8_T endpoint; ///< remote endpoint from which the attribute is reported
UINT16_T timeout; ///< max expected time between reports, measured in seconds
} received;
} data;
} TAL_REPORT_TABLE_T;
你的report table里面的 report_change需要置为 可以触发上报的发生变化的最小值(非0)
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 15:14
by jafil10
也就是说只要值的变化超过了report_change,就会自动上报?不需要应用程序主动上报是吧?
如果是这样的话,那report_change设置0,当 ON_OFF 的值有变化就会自动上报才对,实测抓包时并没有抓到这样的数据我
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 15:15
by huanghuan
report_change设置0时,变化不触发上报,得要非零值
Re: 子设备连HA,能正常连接,但无法report数据
Posted: 2025年 Nov 20日 15:37
by jafil10
配网时,网关有下发bind request和configure reporting,如图所示。
Code: Select all
static TAL_REPORT_TABLE_T g_dp_cluster_tbl[] =
{
{TAL_REPORT_DIRECTION_REPORTED, 1, CLUSTER_ON_OFF_CLUSTER_ID, ATTR_ON_OFF_ATTRIBUTE_ID, ZG_CLUSTER_MASK_SERVER, 0, {{0, 65534, 1}}},
};
OPERATE_RET tuya_init_second(void)
{
TAL_PR_DEBUG("/*********second init*********\r\n");
dev_zigbee_init();
tal_zg_reporting_init((TAL_REPORT_TABLE_T *)g_dp_cluster_tbl, ARRAY_LEN(g_dp_cluster_tbl));
}
tal_zg_read_attribute(DEV_ENDPOINT,
CLUSTER_ON_OFF_CLUSTER_ID,
ATTR_ON_OFF_ATTRIBUTE_ID,
&val_u8, 1);
TAL_PR_DEBUG("before write onoff %d\n", val_u8);
val_u8 = !val_u8;
tal_zg_write_attribute(DEV_ENDPOINT,
CLUSTER_ON_OFF_CLUSTER_ID,
ATTR_ON_OFF_ATTRIBUTE_ID,
&val_u8, ATTR_BOOLEAN_ATTRIBUTE_TYPE);
tal_zg_read_attribute(DEV_ENDPOINT,
CLUSTER_ON_OFF_CLUSTER_ID,
ATTR_ON_OFF_ATTRIBUTE_ID,
&val_u8, 1);
TAL_PR_DEBUG("after write onoff %d\n", val_u8);
如上述代码,当onoff attribute值变化后,抓包也没有抓到有上报