Files
ESPDocs/public/exemplos/zh-CN/esp-zigbee.c
T

98 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 面向 ESP32-H2 和 ESP32-C6 的 ESP-Zigbee-SDK 示例(IEEE 802.15.4)
* 设备:Zigbee 3.0 智能灯(Home Automation End Device)
*
* 依赖(idf_component.yml):
* espressif/esp-zigbee-lib: "^1.6.0"
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_zigbee_core.h"
static const char *TAG = "zigbee_light_device";
#define HA_ESP_LIGHT_ENDPOINT 1
#define ESP_ZB_PRIMARY_CHANNEL_MASK (1l << 15) // Zigbee 默认信道 15
/* Zigbee 属性写入回调(例如通过 Home Assistant 开关) */
static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message)
{
if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) {
if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID &&
message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) {
bool on_off_state = message->attribute.data.value ? *(bool *)message->attribute.data.value : false;
ESP_LOGW(TAG, ">>> COMANDO ZIGBEE RECEBIDO: Lâmpada %s", on_off_state ? "LIGADA" : "DESLIGADA");
}
}
return ESP_OK;
}
/* Zigbee 协议栈事件回调 */
void esp_zb_app_signal_handler(esp_zb_app_signal_msg_t *signal_msg)
{
uint32_t *p_sg_p = signal_msg->p_app_signal;
esp_err_t err_status = signal_msg->esp_err_status;
esp_zb_app_signal_type_t sig_type = *p_sg_p;
switch (sig_type) {
case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP:
ESP_LOGI(TAG, "Iniciando comissionamento na rede Zigbee...");
esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING);
break;
case ESP_ZB_BDB_SIGNAL_STEERING:
if (err_status == ESP_OK) {
ESP_LOGI(TAG, "Conectado com sucesso à rede Zigbee 3.0!");
} else {
ESP_LOGW(TAG, "Buscando coordenador Zigbee novamente...");
esp_zb_scheduler_alarm((esp_zb_callback_t)esp_zb_bdb_start_top_level_commissioning, ESP_ZB_BDB_MODE_NETWORK_STEERING, 1000);
}
break;
default:
break;
}
}
static void esp_zb_task(void *pvParameters)
{
// 将 Zigbee 节点配置为 End Device
esp_zb_cfg_t zb_nwk_cfg = {
.esp_zb_role = ESP_ZB_DEVICE_TYPE_ED,
.install_code_policy = false,
.nwk_cfg.zed_cfg = {
.ed_timeout = ESP_ZB_ED_0_5_MIN,
.keep_alive = 3000,
},
};
esp_zb_init(&zb_nwk_cfg);
// 创建住宅照明 On/Off 集群
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();
esp_zb_ep_list_t *ep_list = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg);
// 注册端点和属性处理程序
esp_zb_device_register(ep_list);
esp_zb_core_action_handler_register(zb_attribute_handler);
esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK);
ESP_ERROR_CHECK(esp_zb_start(false));
esp_zb_main_loop_iteration();
}
void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
// 初始化 IEEE 802.15.4 射频协议栈
esp_zb_platform_config_t config = {
.radio_config = { .radio_mode = ZB_RADIO_MODE_NATIVE },
.host_config = { .host_connection_mode = ZB_HOST_CONNECTION_MODE_NONE },
};
ESP_ERROR_CHECK(esp_zb_platform_config(&config));
xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL);
}