freeswitch通过uuid定位session并发送event
·
在 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. 代码解析
-
查找 Session
- 通过
switch_core_session_locate(uuid)获取switch_core_session_t *。 - 如果找到,会话的引用计数会增加,因此 需要调用
switch_core_session_rwunlock(session);释放。
- 通过
-
创建 Event
switch_event_create(&event, SWITCH_EVENT_CUSTOM);创建一个自定义事件。- 使用
switch_event_add_header_string()添加自定义头信息。
-
发送 Event
switch_core_session_queue_event(session, &event);将事件加入到该会话的事件队列中。
-
释放资源
- 发送事件后,会话必须通过
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 监听器。
更多推荐
所有评论(0)