概述
之前的文章中,我们讲解了freeswitch的源码基本结构,如何新增一个插件式模块,以及如何在模块中新增一个命令式API接口。
freeswitch的架构非常适合这种业务开发模式,即以freeswitch的基本功能为开发平台,新增插件式模块来适配各种不同的业务场景,开发效率很高,学习成本相对较低。
对于APP接口,我们可以把它理解为业务接口,每一个APP接口完成一项具体的任务,多个APP接口组合起来完成复杂的呼叫流程,后续我们会在dialplan拨号计划中详细的讲述如何通过组合多个APP接口实现定制化的呼叫流程。
对于freeswitch中的API和APP接口,我们要理解它们的区别:
- 场景的区别,API是外部命令式接口,APP是内部业务接口。
- 参数的区别,API接口参数中的session一般是空值,因为外部调用API时是没有呼叫会话的,而APP则不同,APP一般在呼叫流程中调用,参数session表示当前的会话,可以获取到当前呼叫的所有参数。
- 粒度的区别,API接口一般用于完成一整套完整的流程,而APP接口的粒度更小,更多用于完成具体的一项任务。
- 使用的区别,API接口可以使用命令行、脚本或事件套接字发起调用,而APP接口多在dialplan拨号计划或脚本中调用。
本节我们来介绍如何在模块中新增加APP接口,提供给呼叫流程使用。
开发环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5
新增模块APP
新增模块的方法请参考之前的内容,本节内容在模块mod_task的基础上修改。
mod_task.c内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189#include <switch.h> SWITCH_MODULE_LOAD_FUNCTION(mod_task_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_task_shutdown); SWITCH_MODULE_DEFINITION(mod_task, mod_task_load, mod_task_shutdown, NULL); SWITCH_STANDARD_API(task_api_function) { //SWITCH_STANDARD_API have three args: (cmd, session, stream) char *mycmd = NULL; int argc = 0; char *argv[16]; bzero(argv, sizeof(argv)); //split cmd and parse if (cmd) { mycmd = strdup(cmd); if (!mycmd) { stream->write_function(stream, "Out of memoryn"); return SWITCH_STATUS_FALSE; } if (!(argc = switch_split(mycmd, ' ', argv)) || !argv[0]) { argc = 0; switch_safe_free(mycmd); return SWITCH_STATUS_FALSE; } } //parse cmd, brach process if(0 == strcmp("test1", argv[0])) { stream->write_function(stream, "task api test1, cmd:%s, session:%p", cmd, session); } else if(0 == strcmp("test2", argv[0])) { stream->write_function(stream, "task api test2, cmd:%s, session:%p", cmd, session); } else { stream->write_function(stream, "unknown cmd, cmd:%s, session:%p", cmd, session); } switch_safe_free(mycmd); return SWITCH_STATUS_SUCCESS; } SWITCH_STANDARD_APP(task_app_function) { //task_app(session, data); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "task_app_function start, session=%p, data=%sn", (void*)session, data); } SWITCH_MODULE_LOAD_FUNCTION(mod_task_load) { switch_api_interface_t* api_interface = NULL; switch_application_interface_t* app_interface = NULL; *module_interface = switch_loadable_module_create_module_interface(pool, modname); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "mod_task_load startn"); // register APP SWITCH_ADD_APP(app_interface, "task_app", "task_app", "task_app", task_app_function, "NULL", SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC); // register API SWITCH_ADD_API( api_interface, "task", "task api", task_api_function, "<cmd> <args>"); // 注册终端命令自动补全 switch_console_set_complete("add task test1 [args]"); switch_console_set_complete("add task test2 [args]"); return SWITCH_STATUS_SUCCESS; } SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_task_shutdown) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "mod_task_shutdown stopn"); return SWITCH_STATUS_SUCCESS; }
编译安装
进入task模块目录,编译安装,在Makefile.am文件未变化的情况下,不需要重新config。
1
2
3cd $(top_srcdir)/src/mod/applications/mod_task make install
配置
修改dialplan拨号计划
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21cd /usr/local/freeswitch/conf/dialplan vi public.xml … <include> <context name="public"> <extension name="test"> <condition> <action application="task_app" data="${destination_number}"/> </condition> </extension> …
加载测试
1
2
3cd /usr/local/freeswitch/bin/ ./freeswitch –nonat
freeswitch启动成功后,在freeswitch命令行中输入API命令加载mod_task模块:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17freeswitch@localhost.localdomain> load mod_task 2021-08-26 09:58:06.056989 [INFO] mod_task.c:96 mod_task_load start 2021-08-26 09:58:06.056989 [CONSOLE] switch_loadable_module.c:1540 Successfully Loaded [mod_task] +OK Reloading XML +OK 2021-08-26 09:58:06.056989 [NOTICE] switch_loadable_module.c:292 Adding Application 'task_app' 2021-08-26 09:58:06.056989 [NOTICE] switch_loadable_module.c:338 Adding API Function 'task'
通过其他sip服务器发起invite呼叫到本机的5080端口,在日志中可以查看到:
1
2
3
4
5
6
7
8
9
10
11
12
132021-08-26 09:59:10.417036 [NOTICE] switch_channel.c:1114 New Channel sofia/external/10011@192.168.0.110 [daeaaf00-5705-428f-a4a3-17b94a3678d1] 2021-08-26 09:59:10.417036 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->10012 in context public 2021-08-26 09:59:10.417036 [INFO] mod_task.c:86 task_app_function start, session=0x7fada402fba8, data=10012 2021-08-26 09:59:10.417036 [NOTICE] switch_core_state_machine.c:385 sofia/external/10011@192.168.0.110 has executed the last dialplan instruction, hanging up. 2021-08-26 09:59:10.417036 [NOTICE] switch_core_state_machine.c:387 Hangup sofia/external/10011@192.168.0.110 [CS_EXECUTE] [NORMAL_CLEARING] 2021-08-26 09:59:10.417036 [NOTICE] switch_core_session.c:1744 Session 2 (sofia/external/10011@192.168.0.110) Ended 2021-08-26 09:59:10.417036 [NOTICE] switch_core_session.c:1748 Close Channel sofia/external/10011@192.168.0.110 [CS_DESTROY]
OK,今天我们这一节的新增模块APP的说明就完成了。
空空如常
求真得真
最后
以上就是老迟到山水最近收集整理的关于freeswitch新增模块APP概述开发环境新增模块APP编译安装配置加载测试的全部内容,更多相关freeswitch新增模块APP概述开发环境新增模块APP编译安装配置加载测试内容请搜索靠谱客的其他文章。
发表评论 取消回复