在 FreeSWITCH 的 C 代码中,可以通过 switch_event_create() 创建事件,并使用 switch_core_session_queue_event() 将其发送到指定的会话(session)。这里记录实现:


1. 代码示例

#include <switch.h>

void send_event_to_session(const char *uuid) {
    switch_core_session_t *session = NULL;
    switch_event_t *event = NULL;

    // 查找会话
    if ((session = switch_core_session_locate(uuid))) {
        // 创建一个事件
        if (switch_event_create(&event, SWITCH_EVENT_CUSTOM) == SWITCH_STATUS_SUCCESS) {
            // 设置事件子类(可自定义)
            switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Event-Name", "CUSTOM_EVENT");
            switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Custom-Info", "This is a test event");

            // 将事件发送到会话
            switch_core_session_queue_event(session, &event);

            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Event sent to session UUID: %s\n", uuid);
        } else {
            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create event\n");
        }

        // 释放 session
        switch_core_session_rwunlock(session);
    } else {
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "No session found for UUID: %s\n", uuid);
    }
}

2. 代码解析

  1. 查找 Session

    • 通过 switch_core_session_locate(uuid) 获取 switch_core_session_t *。
    • 如果找到,会话的引用计数会增加,因此 需要调用 switch_core_session_rwunlock(session); 释放。
  2. 创建 Event

    • switch_event_create(&event, SWITCH_EVENT_CUSTOM); 创建一个自定义事件。
    • 使用 switch_event_add_header_string() 添加自定义头信息。
  3. 发送 Event

    • switch_core_session_queue_event(session, &event); 将事件加入到该会话的事件队列中。
  4. 释放资源

    • 发送事件后,会话必须通过 switch_core_session_rwunlock(session); 释放。
    • 事件 event 传递给 switch_core_session_queue_event() 后,不需要再手动销毁。

3. 监听自定义事件

        如果你想在 FreeSWITCH 中监听这个事件,可以在 XML 处理逻辑或 FreeSWITCH 模块中注册监听:

<configuration name="event_socket.conf" description="Event Socket Configuration">
    <settings>
        <param name="listen-ip" value="0.0.0.0"/>
        <param name="listen-port" value="8021"/>
        <param name="password" value="ClueCon"/>
    </settings>
</configuration>

然后使用 fs_cli 订阅该事件:

fs_cli -x "event plain CUSTOM_EVENT"


4. 适用场景

  • 通知某个会话执行特定操作,例如播放音频、挂断、修改变量等。
  • 发送自定义事件以触发 Lua、JavaScript 或 ESL 监听器。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐