跳转到内容

生命周期总览

在本组件中,由 et::Inst 类提供一个 EasyTier 节点实例的生命周期。 et::Inst 是 RAII 对象:构造即完成 TOML 解析、校验与资源准备;析构自动停止并释放。

阶段调用做了什么失败表现
构造Inst(toml, options)解析 TOML、校验配置、准备运行资源valid() == false,原因看 last_error() 与日志
启动start()创建连接、网卡、任务等运行资源返回错误码;状态变为 Error
连接connect()通知组件开始连接入口返回错误码(如队列满 ESP_ERR_NO_MEM)
断开disconnect()关闭连接、撤销路由,回到 WaitingUnderlay返回错误码
停止stop(timeout) / 析构停止任务、释放资源超时返回 ESP_ERR_TIMEOUT,可重试

start() 返回成功只代表资源已创建,不代表组网可用。组网可用看 NetworkReady 事件或 Status.state == Ready。

et::RuntimeOptions options{};
options.on_event = &on_event;
et::Inst inst(toml_text, options);
if (!inst.valid()) {
ESP_LOGE(TAG, "config rejected: 0x%x", inst.last_error());
return;
}
ESP_ERROR_CHECK(inst.start());
// Wi-Fi/以太网取得 IP 后:
ESP_ERROR_CHECK(inst.connect());
// 网络断开时:
(void)inst.disconnect();
// 需要主动停止时:
(void)inst.stop(5000);

定义 et::Inst 对象时,构造函数完成以下工作:

  • 解析 TOML,校验支持的字段;
  • 补齐 hostname / instance_name / UUID;
  • 校验入口、虚拟地址、MTU、网络名;
  • 准备运行组网实例所需资源。

start() 创建运行所需资源:连接槽、虚拟网卡(静态地址时)、任务与队列。任何一步失败都会回滚并进入 Error,返回错误码。

connect() / disconnect() 是非阻塞、幂等的应用侧开关:

  • connect() 通知组件开始连接入口;
  • disconnect() 关闭连接并撤销路由,状态回到 WaitingUnderlay;
  • Wi-Fi 重连后必须再次 connect();
  • 两者可以在 Wi-Fi/IP 事件回调里调用,但更推荐在独立任务/主循环里串行处理。
esp_err_t err = inst.stop(5000);
if (err == ESP_ERR_TIMEOUT) {
// 任务尚未退出,资源仍保留,可以重试
}
  • stop(timeout) 幂等;超时不会释放资源,允许再次 stop();
  • 析构在运行中会等待任务退出,因此不要在事件回调或组件任务里析构。
误用后果正确做法
start() 后立刻认为网络可用误判等 NetworkReady 或 Ready
在 EasyTier 事件回调里 stop()/析构死锁/崩溃交给其他任务
Wi-Fi 重连后不再次 connect()不再连接在 GOT_IP 后调用
构造/停止跨任务并发未定义行为同一实例串行调用
在小栈任务里构造 Inst栈溢出使用 ≥ 8 KiB 栈的任务