本文介绍: 如果我们需要在freeswitch中来执行这个脚本可以在控制台或者在fs_cli中使用lua或者luarun来执行。如果我们需要该脚本长期运行,并且跟随freeswitch一起启动,我们可以在frewswitch中作如下配置,找到freeswitch/conf/autoload_configs/lua.conf.xml文件增加如下配置。上面介绍的是使用嵌入式的脚本来完成会议相关事件的监听,如果是大事件更推荐使用event socket来处理,以Java语言为例,我们可以使用。配置完毕重启或者执行。
EventConsumer
通过freeswitch.EventConsumer("CUSTOM")
来创建一个消费者,用来监听字自定义事件,当然我们也可以通过freeswitch.EventConsumer("all")
来监听所有事件,但是这样会导致事件处理函数被频繁调用,所以不推荐这样做。如果我们确实需要监听多个事件,可以参考下面这种写法
local con = freeswitch.EventConsumer()
con:bind("CUSTOM")
con:bind("CHANNEL_HANGUP")
例如我们需要在会议开始、会议中有成员加入、成员退出以及会议结束时进行一些业务逻辑处理,我们可以参考一下代码来实现
-- 创建一个消费者
local con = freeswitch.EventConsumer("CUSTOM")
local function event_handle()
local conference_name = event:getHeader("Conference-Name")
local conference_size = event:getHeader("Conference-Size")
local action = event:getHeader("Action")
local caller_name = event:getHeader("Caller-Caller-ID-Name")
-- 判断当前接收到的是什么事件
if action == "conference-create" then
freeswitch.consoleLog("INFO", "Conference started:" .. conference_name)
--- 会议创建事件,执行对应的业务逻辑
elseif action == "conference-destroy" then
freeswitch.consoleLog("INFO", "Conference ended:" .. conference_name)
--- 会议销毁事件,执行对应的业务逻辑
elseif action == "add-member" then
freeswitch.consoleLog("INFO", "Conference info add-member: " .. conference_name .. " callerName: " .. caller_name .. " conferenceSize: " .. conference_size)
--- 会议中有成员加入,执行对应的业务逻辑
elseif action == "del-member" then
freeswitch.consoleLog("INFO", "Conference info del-member: " .. conference_name .. " callerName: " .. caller_name)
--- 会议有成员退出,执行对应的业务逻辑
end
end
--- 消费事件pop中可以使用0也可以使用1,1表示阻塞,0表示不阻塞,如果使用0的话需要在监听的逻辑中加入sleep,否则会导致CPU占用过高
--- 此处可以使用pcall来捕获异常
for event in (function() return con:pop(1) end) do
if event and run_tag == '1' then
local ok, res = pcall(event_handle, event)
if not ok then
freeswitch.consoleLog("ERR", "event_handle error: " .. res)
end
end
end
如果我们需要在freeswitch中来执行这个脚本可以在控制台或者在fs_cli中使用lua或者luarun来执行。如果我们需要该脚本长期运行,并且跟随freeswitch一起启动,我们可以在frewswitch中作如下配置,找到freeswitch/conf/autoload_configs/lua.conf.xml文件增加如下配置
<settings name="LUA_SCRIPTS">
<param name="startup-script" value="/usr/local/freeswitch/conf/directory/listen.lua"/>
</settings>
配置完毕重启或者执行reloadxml
即可
Event socket
上面介绍的是使用嵌入式的脚本来完成会议相关事件的监听,如果是大事件更推荐使用event socket来处理,以Java语言为例,我们可以使用esl-client
来完成我们的需求
import ch.qos.logback.classic.Logger;
@Slf4j
@Service
public class FreeswitchClient {
private static final String FREESAWITCH_HOST = "127.0.0.1";
private static final Integer FREESAWITCH_PORT = 6666;
private static final String FREESAWITCH_PASSWORD = "123456789";
private static final Integer FREESAWITCH_CLIENT_TIMEOUT = 20;
public static void main(String[] args) {
try {
// 创建esl连接
Client client = new Client();
client.connect(FREESAWITCH_HOST, FREESAWITCH_PORT, FREESAWITCH_PASSWORD, FREESAWITCH_CLIENT_TIMEOUT);
client.setEventSubscriptions("plain", "all");
// 注册监听事件
client.addEventListener(new IEslEventListener() {
@Override
public void eventReceived(EslEvent eslEvent) {
String eventName = eslEvent.getEventName();
if ("CUSTOM".equals(eventName)) {
Map<String, String> eventHeaders = eslEvent.getEventHeaders();
// 当前会议名称
String conferenceName = eventHeaders.get("Conference-Name");
String jsonString = JSONObject.toJSONString(eslEvent);
// 当前会议人数
String conferenceSize = eventHeaders.get("Conference-Size");
log.info("conference info:{},人数:{}", conferenceName, conferenceSize);
String action = eventHeaders.get("Action");
if ("add-member".equals(action)) {
// todo: 执行对应的业务逻辑
}
if ("del-member".equals(action)) {
// todo: 执行对应的业务逻辑
}
if ("conference-destroy".equals(action)) {
// todo: 执行对应的业务逻辑
}
} else if ("CHANNEL_DESTROY".equals(eventName)) {
// todo: 执行对应的业务逻辑
}
}
@Override
public void backgroundJobResultReceived(EslEvent eslEvent) {
}
});
} catch (Exception e) {
log.error("freeswitch client error:{}", e.getMessage());
}
}
}
原文地址:https://blog.csdn.net/qq_22331931/article/details/135828698
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_62239.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。