创建 Zigbee 设备

更新时间:2022-11-24 09:20:19下载pdf

Zigbee 设备创建和对应的网络行为是密不可分的,这部分需要您实现 dev_power_on_init()

Zigbee 路由设备

Zigbee 路由设备的创建,以一个继电器开关为例:

const attr_t g_group_attr_list[] = {
    GROUP_ATTR_LIST
};

const attr_t g_scene_attr_list[] = {
    SCENE_ATTR_LIST
};

#define ON_OFF_PRIVATE_ATTR_LIST \
    { 0x0000, ATTR_BOOLEAN_ATTRIBUTE_TYPE, 1, (ATTR_MASK_TOKEN_FAST),  (uint8_t*)0x00 }, \

const attr_t g_light_attr_list[] = {
    ON_OFF_PRIVATE_ATTR_LIST
};

const cluster_t g_server_cluster_id[] = {
    DEF_CLUSTER_GROUPS_CLUSTER_ID(g_group_attr_list)
    DEF_CLUSTER_SCENES_CLUSTER_ID(g_scene_attr_list)
    DEF_CLUSTER_ON_OFF_CLUSTER_ID(g_light_attr_list)
};


#define SERVER_CLUSTER_LEN  get_array_len(g_server_cluster_id)

/**
 * @note 代表一个ON_OFF_LIGHT 设备,1个endpoint,
 * 支持 Server端 group、scene、onoff cluster。
 * 分别支持GROUP_ATTR_LIST、SCENE_ATTR_LIST、ON_OFF_PRIVATE_ATTR_LIST属性
*/
const dev_description_t g_dev_des[] = {
    { 0x01, ZHA_PROFILE_ID, ZG_DEVICE_ID_ON_OFF_LIGHT, SERVER_CLUSTER_LEN, (cluster_t *)&g_server_cluster_id[0], 0, NULL},
};

void dev_power_on_init(void)
{
    zg_dev_config_t g_zg_dev_config;
    join_config_t cfg;

    /**
    * @note 描述是一个什么设备,多少 endpoint,每个 endpoint 有什么 cluster 和 attributes。
    */
    dev_register_zg_ep_infor((dev_description_t *)g_dev_des, EP_SUMS);

    /**
    * @note 把 Zigbee 设备设置配成一个路由设备。
    */
    memset(&g_zg_dev_config, 0, sizeof(zg_dev_config_t));
    g_zg_dev_config.dev_type = ZG_ROUTER;
    dev_register_zg_dev_config(&g_zg_dev_config);

    /**
    * @note 配置上电或者远程删除后立即进入组网状态,组网超时1分钟。
    */
    memset(&cfg, 0, sizeof(cfg));
    cfg.auto_join_power_on_flag = TRUE;
    cfg.auto_join_remote_leave_flag = TRUE;
    cfg.join_timeout = 60000;
    dev_zg_join_config(&cfg);

    return;
}

Zigbee 低功耗设备

Zigbee 低功耗设备的创建,以一个单火开关为例:

#define ON_OFF_PRIVATE_ATTR_LIST \
    { 0x0000, ATTR_BOOLEAN_ATTRIBUTE_TYPE, 1, (ATTR_MASK_TOKEN_FAST),  (uint8_t*)0x00 }, \

const attr_t g_light_attr_list[] = {
    ON_OFF_PRIVATE_ATTR_LIST
};

const cluster_t g_server_cluster_id[] = {
    DEF_CLUSTER_ON_OFF_CLUSTER_ID(g_light_attr_list)
};


#define SERVER_CLUSTER_LEN  get_array_len(g_server_cluster_id)

/**
 * @note 代表一个ON_OFF_LIGHT 设备,1个endpoint,
 * 仅仅支持 Server端 onoff cluster。同时也支持ON_OFF_PRIVATE_ATTR_LIST属性
*/
const dev_description_t g_dev_des[] = {
    { 0x01, ZHA_PROFILE_ID, ZG_DEVICE_ID_ON_OFF_LIGHT, SERVER_CLUSTER_LEN, (cluster_t *)&g_server_cluster_id[0], 0, NULL},
};

void dev_power_on_init(void)
{
    zg_dev_config_t zg_dev_config;
    join_config_t   cfg;

    /**
    * @note 描述是一个什么设备,多少 endpoint,每个 endpoint 有什么 cluster 和 attributes。
    */
    dev_register_zg_ep_infor((dev_description_t *)g_dev_des, EP_SUMS);

    /**
    * @note 把 Zigbee 设备设置配成一个路由设备。
    */
    memset(&zg_dev_config, 0, sizeof(zg_dev_config_t));
    zg_dev_config.dev_type = ZG_SLEEPY_END_DEVICE;
    zg_dev_config.config.sleep_dev_cfg.poll_conifg.poll_failed_times = 3;     ///< 3次poll失败后进入NET_LOST状态(父节点失联)
    zg_dev_config.config.sleep_dev_cfg.poll_conifg.poll_forever_flag = TRUE;  ///< 设备保持poll
    zg_dev_config.config.sleep_dev_cfg.poll_conifg.poll_interval = 250;       ///< poll间隔是250ms
    zg_dev_config.config.sleep_dev_cfg.poll_conifg.wait_app_ack_time = 1000;  ///< 发送应用数据后跟(2+wait_app_ack_time/poll_interval)个poll,对poll_forever_flag为FALSE有效

    zg_dev_config.config.sleep_dev_cfg.rejoin_config.auto_rejoin_send_data = TRUE;     ///< 当发送数据失败后自动rejoin
    zg_dev_config.config.sleep_dev_cfg.rejoin_config.next_rejoin_time = 5000;          ///< 这次rejoin失败后,过5s后再进行下次rejoin
    zg_dev_config.config.sleep_dev_cfg.rejoin_config.power_on_auto_rejoin_flag = TRUE; ///< 程序启动后自动rejoin
    zg_dev_config.config.sleep_dev_cfg.rejoin_config.rejoin_try_times = 5;             ///< 一次rejoin尝试的beacon request的次数
    zg_dev_config.config.sleep_dev_cfg.rejoin_config.wake_up_time_after_join = 30000;  ///< 组网成功后poll持续的时间,对poll_forever_flag为FALSE有效
    zg_dev_config.config.sleep_dev_cfg.rejoin_config.wake_up_time_after_rejoin = 5000; ///< rejoin成功后poll持续的时间,对poll_forever_flag为FALSE有效
    zg_dev_config.beacon_send_interval_for_join = 300;    ///< 组网发送beacon request的间隔
    zg_dev_config.beacon_send_interval_for_rejoin = 300;  ///< 尝试rejoin 时,发送beacon request的间隔
    zg_dev_config.zb_scan_duration = ZB_SCAN_DURATION_3;  ///< 发送beacon request后持续接收的时间
    dev_register_zg_dev_config(&zg_dev_config);


    /**
    * @note 配置上电不进行自组网,远程删除后自动组网,组网超时1分钟。
    */
    memset(&cfg, 0, sizeof(cfg));
    cfg.auto_join_power_on_flag = FALSE;
    cfg.auto_join_remote_leave_flag = TRUE;
    cfg.join_timeout = 60000;
    dev_zg_join_config(&cfg);

    return;
}