freeswitch系列2初始化

1、核心头文件

freeswitch是服务端程序,它的入口main函数在src/switch.c实现,相关的头文件还有switch.h、private/switch_core_pvt.h。先看下switch.h内容。

#include <stdlib.h>  
#include <stdio.h>  
#include <stdarg.h>  
#include <stddef.h>  
#include <assert.h>  
#include <setjmp.h>  
...  
#include "switch_platform.h"  
#include "switch_types.h"  
#include "switch_apr.h"  
#include "switch_mprintf.h"  
#include "switch_core_db.h"  
#include "switch_dso.h"  
#include "switch_regex.h"  
#include "switch_core.h"  
#include "switch_loadable_module.h"  
#include "switch_console.h"  
#include "switch_utils.h"  
#include "switch_caller.h"  
#include "switch_frame.h"  
#include "switch_rtcp_frame.h"  
#include "switch_module_interfaces.h"  
#include "switch_channel.h"  
#include "switch_buffer.h"  
#include "switch_event.h"  
#include "switch_resample.h"  
#include "switch_ivr.h"  
#include "switch_rtp.h"  
#include "switch_log.h"  
#include "switch_xml.h" 

可以看到,switch.h可以说是freeswitch的总include,包含了系统和核心等所有对外头文件。所有模块,都通过include “switch.h”来包含核心。

2、main

#include <switch.h>  
#include "private/switch_core_pvt.h" //核心内部定义  
  
int main(int argc, char *argv[])//switch.c  
{  
    //命令行参数解析  
    SWITCH_GLOBAL_dirs.xx_dir =   
      
    //初始化和加载模块  
    switch_core_init_and_modload();//switch_core.c  
    {  
        switch_core_init();  
          
        switch_loadable_module_init();//switch_loadable_module.c  
          
        switch_load_core_config("post_load_switch.conf");  
    }  
    switch_core_runtime_loop();  
} 

main函数可以简化为以上流程,首先是对命令行参数进行解析,并且存储到一些全局变量,然后调用switch_core_init_and_modload,顾名思义,就是初始化核心和加载模块,最后调用switch_core_runtime_loop循环等待用户输入,然后执行响应的命令。

2.1 命令行参数

命令行参数可以看switch.c的usage数组,这里只介绍几个常用的。
-nc:
“\t-nc – do not output to a console and background\n”
加上这个参数,就不会在前台运行,下面看对此参数的操作,使用nc,则调用daemonize函数,该函数会使用后台运行,该函数不再展开。

1.if (nc) {  
2.ifdef WIN32  
3.    FreeConsole();  
4.else  
5.    if (!nf) {  
6.        daemonize(do_wait ? fds : NULL);  
7.    }  
8.endif  
9.} 

“\t-nonat – disable auto nat detection\n”
Freeswitch默认会尝试在路由器上“打洞”,影响使用速度,使用nonat可以在内网测试时,加速启动。

3、核心初始化

上面提到,main函数会调用switch_core_init_and_modload进行核心初始化和加载模块,现在先来看核心初始化switch_core_init。

1.switch_core_init();  
2.{  
3.    runtime.xxx  
4.    sqlite3_initialize();  
5.    apr_initialize();  
6.    //初始化session_manager  
7.    switch_core_session_init();  
8.    switch_curl_init();  
9.    switch_console_init();  
10.    switch_event_init();  
11.    //初始化channel的globals  
12.    switch_channel_global_init();  
13.    switch_xml_init();  
14.    switch_nat_init();  
15.    switch_log_init();  
16.    //解析全局参数,比如core-db-dsn保存到runtime.odbc_dsn  
17.    switch_load_core_config("switch.conf");  
18.    switch_core_state_machine_init();  
19.    switch_core_sqldb_start();  
20.    switch_core_media_init();  
21.    switch_scheduler_task_thread_start();  
22.    switch_nat_late_init();  
23.    switch_rtp_init(runtime.memory_pool);   
24.}  

3.1、全局结构体runtime

1.struct switch_runtime {  
2.    switch_memory_pool_t *memory_pool;  
3.    const switch_state_handler_table_t *state_handlers[SWITCH_MAX_STATE_HANDLERS];  
4.    int state_handler_index;  
5.    FILE *console;  
6.    uint8_t running;  
7.    uint32_t flags;  
8.    char *odbc_dsn;  
9.    char *dbname;  
10.    uint32_t debug_level;  
11.    uint32_t runlevel;  
12.    char hostname[256];  
13....  
14.};  
15.  
16.extern struct switch_runtime runtime;  

这里只列出几个重要结构体,其中odbc_dsn和dbname,就是从配置文件switch.conf.xml解析出来的,其它有些成员也是。

1.  <!-- <param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='' options='-c client_min_messages=NOTICE'" /> -->  
2.  <!-- <param name="core-db-dsn" value="dsn:username:password" /> -->  
3.  <!--   
4.Allow to specify the sqlite db at a different location (In this example, move it to ramdrive for  
5.better performance on most linux distro (note, you loose the data if you reboot))  
6.  -->  
7.  <!-- <param name="core-db-name" value="/dev/shm/core.db" /> -->  

3.2、子核心初始化

核心会初始化各个子模块,注意,这里是核心的模块,而不是扩展模块mod。一般核心子模块的初始化,都是设置一个全局结构体参数,分析具体该模块的时候再讲。

3.3、解析主配置文件switch.conf.xml

25.//解析全局参数,比如core-db-dsn保存到runtime.odbc_dsn  
26.    switch_load_core_config("switch.conf");  

这个函数就不进去细讲,无非就是解析xml字段。我们只需要明白,全局配置switch.conf在这里解析到全局变量runtime。

4、可加载模块初始化

1.switch_loadable_module_init();//switch_loadable_module.c  
2.{  
3.    char *cf = "modules.conf";  
4.    char *pcf = "post_load_modules.conf";  
5.     //载入核心默认模块  
6.     switch_loadable_module_load_module("", "CORE_SOFTTIMER_MODULE", SWITCH_FALSE, &err);  
7.     switch_loadable_module_load_module("", "CORE_PCM_MODULE", SWITCH_FALSE, &err);  
8.     switch_loadable_module_load_module("", "CORE_SPEEX_MODULE", SWITCH_FALSE, &err);  
9.     //循环解析modules.conf和post_load_modules.conf  
10.     switch_loadable_module_load_module_ex();  
11.     switch_loadable_module_runtime();  
12.     chat_thread_start(1);  
13.} 

首先加载三个包含在核心的模块,softtimer、pcm、speex,然后根据配置文件modules.conf和post_load_modules.conf加载对应的模块,这里的模块就是mod。如何加载,后面再单独一篇说明。

### 回答1: Freeswitch是一种开放源代码的语音和通信软件,提供语音、视频和多媒体通信能力。为了方便用户操作和管理,开发者为Freeswitch开发了简单图形化界面。 Freeswitch图形化界面基于Web技术实现,并采用Bootstrap框架和React.js技术。它具有简洁、易用的界面和友好的用户体验。用户只需在浏览器中输入相关的IP地址和端口号即可进入图形化界面。在界面中,用户可以登录、配置路由、管理通话、监控系统状态等操作。 图形化界面默认包含一些基本配置,例如:用户、呼入路由、呼出路由,用户可以根据自己的需求进行修改或者新增配置。用户也可以在界面中管理通话,例如:发起呼叫、挂断电话、进行转移等等。此外,Freeswitch图形化界面还提供系统日志、性能监控等功能,方便用户进行系统维护和管理。 总体来看,Freeswitch 1.10.7图形化界面为用户提供了方便、高效的使用体验,并提高了系统管理的可视化程度,这对于语音和通信行业的从业者及其管理者来说具有很大的意义。 ### 回答2: FreeSWITCH是一款强大的开源电话系统,其中1.10.7版本是最新的稳定版本。它支持Voice over IP(VoIP)和其他通信技术,如电话、传真和视频。同时,这款软件也支持多种协议,例如SIP、H.323和WebRTC,可以在 Linux、Windows 和 macOS 等不同平台上运行。 不过,对于一些初学者来说,命令行界面较为复杂,很难驾驭,因此出现了一些可以在图形界面下进行FreeSWITCH的配置和管理的工具。其中一些工具功能繁多,但使用起来相对复杂,很难快速掌握。而在这些工具中,Sangoma的FreePBX可能是比较著名的一个,但它需要安装在 FreeSWITCH 系统之外。 这里介绍一个能够在 FreeSWITCH 系统内完成图形化界面配置的工具,它是由FreeSWITCH的社区成员开发的。这个工具名为FreeSWITCH Desktop GUI (FSgui),目前已经实现了基础的系统配置以及呼叫中心方面的功能。 关于FSgui的使用,它提供了可视化的配置界面,在功能区中可以快捷地调整相关配置。例如,在呼叫中心方面,可以通过可视化配置,添加、编辑和删除IVR,管理呼叫、管理坐席分机等功能,缩短了用户配置的时间,从而提高效率。此外,其还支持SIP Trunks的管理,可以方便地配置多个SIP Trunks,以便于用户同时使用多种语音服务提供商。 总之,FreeSWITCH Desktop GUI 是一款简单易用的图形化工具,它为用户提供了快捷的配置方式,能够帮助使用者快速完成系统的配置与调整。同时,它是开源软件,可以在 GitHub 上进行下载。 ### 回答3: freeswitch是一款功能强大的开源电话交换机软件,但对于一些非技术人员来说,其操作和配置可能会比较复杂。为了能够更简单、更直观地使用freeswitch,一些第三方开发者开发了一些针对freeswitch的图形化界面,使得用户只需要通过鼠标点击和填写一些基本信息就可以完成freeswitch的配置和操作。 针对freeswitch 1.10.7,开发者已经开发出了一些好用的图形化界面,比如“FusionPBX”和“FreeSWITCH-GUI”。这些界面的主要特点是简单、易用、可扩展,可用于管理用户、呼叫路由、语音信箱等等freeswitch的相关服务。 以“FusionPBX”为例,其界面设计比较简洁,主要分为左侧的菜单栏和右侧的内容展示区。通过菜单栏的操作,用户可以完成一些相应的功能,比如添加、删除用户,配置呼叫路由,设置CallCenter等等。同时,FusionPBX也提供了一些实用的功能,比如在线音频播放和录制,呼叫会议等等。 值得注意的是,图形化界面只是对freeswitch的操作和配置进行了简化和优化,并不代表可以完全替代命令行操作。因此,对于freeswitch的使用者,仍需掌握一些基本的命令行操作和配置知识,以便更好地利用图形化界面完成自己的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值