### asterisk下自动寻呼系统设计文档 #### 一、功能说明 自动寻呼系统是基于Asterisk IP电话平台构建的一个子系统,主要用于管理IP话机之间的呼叫逻辑。该系统能够实现以下功能: 1. **通话逻辑判别**: - 当用户A通过按键或者AM(Asterisk Management Interface)输入另一个用户B的号码时,系统会根据B的状态决定呼叫逻辑。 - 如果B正在通话中,系统将向A播放提示音:“对方忙,请输入其他号码”。 - 如果B处于空闲状态,系统会尝试建立A与B之间的通话。 - 如果系统中不存在B这个用户,将提示A:“您拨的是空号,请重新输入其他号码”。 2. **话机优先级**: - Asterisk平台支持多线程操作,当多个话机同时执行MSQLDial应用时,只有优先级最高的话机能同时使用按键和AMI方式进行拨号。 - 如果同时有按键和AMI两种方式输入,优先使用按键方式输入的号码。 - 其他话机仅能通过按键方式拨号。 - 每个话机的优先级预先存储在MySQL数据库中,可以通过查询数据库获得每个话机的优先级值。 - 当当前优先级最高的话机挂断后,系统会从剩余的话机中选择优先级最高的一个,并赋予其AMI方式拨号的权限。 #### 二、运行环境 - **操作系统**:Fedora12 - **IP电话平台**:Asterisk-1.6.2.11 - **数据库**:MySQL - **代码编辑器**:Source Insight #### 三、系统框架 1. **注册话机**: - 主要实现函数为`static int chan_reg(struct ast_channel *chan)`。 - 功能包括将新注册的话机加入全局链表的尾部,并更新最高优先级(Goptimum)值。 - 全局链表使用`struct chan_list`来维护当前正在执行MSQLDial应用的话机列表。 - `struct chan_list`结构体包含: - `char name[20]`:用于记录话机的名称,例如SIP/2000。 - `struct ast_channel *lis_chan`:用于记录话机所在的channel信息。 - `int id_priority`:用于记录该话机对应的优先级值。 - `int lvalid`:标识该话机是否拥有AMI方式拨号的权限。 - `struct chan_list *next`:指向下一个`chan_list`指针。 - `*lbackends`变量作为链表的头指针。 - `Goptimum`变量记录优先级值最大的`chan_list`变量。 - 数据库连接、查询及结果集的操作如下: ```c mysql_init(&mysql); mysql_options(&mysql, MYSQL_OPT_RECONNECT, &my_bool_true); mysql_real_connect(&mysql, "localhost", "asterisk", "123456", "CHDIAL", 3306, NULL, 0); mysql_query(&mysql, sql); result = mysql_store_result(&mysql); row = mysql_fetch_row(result); mysql_free_result(result); mysql_close(&mysql); ``` - `CHDIAL`数据库需事先建立,话机的优先级值需事先设定并存入数据库中,当话机注册时,通过访问数据库获取优先级值。 2. **执行(被)呼叫**: - 主要实现函数为`static void* func_call(struct ast_channel *chan)`。 - **拨号方案**: - 按键输入:使用`ast_readstring(chan, s, sizeof(s) - 1, 8200, 30000, "#")`读取按键输入,以“#”号结束。 - AMI输入:使用`pbx_builtin_getvar_helper(chan, "DIALEDPEERNUMBER")`获取AMI方式的输入值。 - **呼叫话机**: - 当被呼叫方已经摘机时,系统会检查被呼叫方的状态,并根据状态决定是否建立通话连接。 - 如果被呼叫方空闲,系统将尝试建立呼叫。 - 如果被呼叫方正在通话,系统将播放提示音给呼叫方。 - 如果被呼叫方不存在,系统同样播放相应的提示音给呼叫方。 3. **注销话机**: - 注销话机的功能是为了释放资源并确保系统稳定运行。 - 在话机注销时,需要从全局链表中移除该话机,并更新最高优先级值(Goptimum)。 #### 四、核心模块介绍 1. **主函数**: - 负责初始化系统,加载配置信息,启动各个服务模块。 2. **呼叫、等待呼叫**: - 实现了自动寻呼系统的呼叫逻辑处理。 - 根据话机状态判断是否可以建立呼叫,并播放相应的提示音。 3. **全局链表维护**: - 维护全局链表的完整性,确保话机的正确注册与注销。 - 更新优先级信息,以便在话机挂断后能够正确地重新分配权限。 #### 五、系统的可扩展性 - 系统采用模块化设计,易于添加新的功能模块。 - 支持多线程操作,可以在不影响现有呼叫的情况下添加新的话机。 - 可以轻松集成其他通信协议或接口,如SIP、PRI等。 #### 六、系统源代码 - 系统源代码包括所有核心模块的实现,以及与数据库交互的部分。 - 使用C语言编写,利用Asterisk提供的API实现功能。 - 源代码遵循特定的编码规范,便于维护和扩展。 ### 总结 通过以上分析可以看出,asterisk下的自动寻呼系统是一个高度可定制化的通信解决方案。它不仅能够满足基本的呼叫需求,还具备一定的智能管理和扩展能力。通过对话机优先级的控制和灵活的呼叫逻辑设置,系统能够在多种场景下高效运行。此外,系统的模块化设计也为未来的技术升级和功能拓展提供了便利。
- 粉丝: 1
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0