asterisk核心框架

合集下载

《Asterisk 使用资料》

《Asterisk 使用资料》

Asterisk目录及配置文件/etc/asterisk/Asterisk主目录,包含其它关于Asterisk的配置文件;*zaptel.conf这个配置文件放在/etc,因为其它软件也可以使用Zaptel这个硬件及其驱动,所以不是放在/etc/asterisk里./usr/lib/asterisk/modules/这个目录包含所有可以加载Asterisk模块(应用程序\编辑器\格式和有用通道),在Asterisk启运时会加载这些模块(可以编辑modules.conf)./var/lib/asterisk/比较重要的是astdb文件与agi-bin目录;astdb包含Asterisk当地数据库信息.sounds/所有声音提示的文件在里面,包括Asterisk原代码中的sounds.txt文件mohmp3/如果配置了音乐保持,应用程序会在这个目录下查找mp3(用CBR从文件中去除身份标签).keys/使用公钥和私钥系统认证与一个由RSA数字签名形成的一对等连接.公钥和私钥的扩展名分别为.pub和.keyfirmware/这个目录含了很多Asterisk相兼容的设备固件,它只有iax/这个子目录,其中有Digium的IAXy的二进制固件镜像.images/只有在较多的支持并且利用图解式的图像设备被发布,这个目录将会与相应的目录有更大的关联./var/lib/asterisk/agi-bin agi-bin包含所有脚本,可以通过许多已经建立的AGI应用程序与Asterisk连接./var/spool/asteriskoutgoing/gcall/tmp/voicemail/================配置文件================/etc/asterisk/asterisk.conf主要配置文件,/etc/zaptel.conf硬件接口的基本层.修改这个配置文件要用modprobe装载Linux Kernel使用模块./etc/asterisk/zapata.conf为硬件配置Asterisk的接口./etc/asterisk/extensions.conf拨号方案./etc/asterisk/sip.conf SIP协议配置文件/etc/asterisk/iax.conf呼入和呼出IAX通道/etc/asterisk/extensions.conf拨号方案配置文件/etc/asterisk/moduprobe.conf加载模块配置文件Asterisk developer\'s documentation 翻译计划by serva今天,Asterisk已经成为一个VOIP业界使用最广泛的一个集成电信级别P BX的工具,IPPBX如今已经成为VOIP商家争夺的一块重要市场,在我们越来越熟悉使用Asterisk的同时,我们希望能够越来越深入的了解asterisk,特别是对于开发人员,如果有自己特定的需求,在复杂的asterisk文件夹和asteri sk的源代码文件中迷失了方向,不知所措。

SIP服务器调查报告

SIP服务器调查报告

开源SIP服务器调查报告一、引言随着通信IP化的发展,IP传输的高带宽、低成本等优势使得越来越多的企业、电信运营商加快建设基于IP的各种通信应用。

在通信协议IP化发展中,SIP协议毫无争议地成为各大电信运营商构建其未来网络的基础协议,越来越多的SIP软件产品也不断出现在行业应用中。

SIP协议的标准化,同时也造就了一大批优秀的开源软件产品,包括Asterisk、SipXecs、FreeSWITCH、OpenSIPS等SIP服务端软件,也包括X-lite、LinPhone、eyeBeam等SIP客户端软件。

二、调查目的根据目前已经着手开发的系统所采用的服务器Asterisk来看,Asterisk支持视频通话的效果不是很理想,影响通话的质量。

为此,本文对当前所有的SIP开源服务器进行调查分析,对其性能、使用方便程度等多方面进行分析,从而为选取支持视频且视频质量较高的服务器做准备。

三、调查内容目前SIP开源服务器主流的有以下几个:1、OpenSIPSOpenSIPS是一个成熟的开源SIP服务器,除了提供基本的SIP代理及SIP路由功能外,还提供了一些应用级的功能。

OpenSIPS的结构非常灵活,其核心路由功能完全通过脚本来实现,可灵活定制各种路由策略,可灵活应用于语音、视频通信、IM以及Presence等多种应用。

同时OpenSIPS性能上是目前最快的SIP服务器之一,可用于电信级产品构建。

凭借其可扩展、模块化的系统架构,OpenSIPS提供了一个高度灵活的、用户可配置的路由引擎,可以为voice、video、IM和presence等服务提供强大高效的路由、鉴权、NAT、网关协议转化等功能。

由于其稳定高效等特点,OpenSIPS已经被诸多电信运营商应用在自己的网络体系中。

其主要功能如下:⏹SIP注册服务器/代理服务器(lcr、dynamic routing、dialplan)/重定向服务器⏹SIP presence agent⏹SIP B2BUA⏹SIP IM Server⏹SIP to SMS/XMPP网关⏹SIP to XMPP网关⏹SIP 负载均衡⏹SIP NAT traversal源码下载网址:/Downloads/Downloads详细介绍:/wiki/view/OpenSIPS官方网站:/2、KamailioKamailio® (former OpenSER) is an Open Source SIP Server released under GPL, able to handle thousands of call setups per second. Among features: asynchronous TCP, UDP and SCTP,secure communication via TLS for VoIP (voice, video); WebSocket support for WebRTC; IPv4 and IPv6; SIMPLE instant messaging and presence with embedded XCAP server and MSRP relay; IMS extensions; ENUM; DID and least cost routing; load balancing; routing fail-over; accounting, authentication and authorization; support for many backend systems such as MySQL, Postgres, Oracle, Radius, LDAP, Redis, Cassandra; XMLRPC control interface, SNMP monitoring. It can be used to build large VoIP servicing platforms or to scale up SIP-to-PSTN gateways, PBX systems or media servers like Asterisk™, FreeSWITCH™ or SEMS. Kamailio and the SIP Express Router (SER) teamed up for the integration of the two applications and new development.源码下载地址:/w/download/安装指南:/yetyongjin/article/details/8106997/rosekin/article/details/7103183/p/kamailio官方网站:/w/3、sipXecssipXecs is a modular and scalable communications solution for enterprises of all sizes. It provides a highly available SIP routing core integrated with a growing suite of communications services all managed through a unified web based management application. sipXecs provides traditional PBX telephony services integrated with instant messaging, and allows the use of advanced communications tools like video calling.The sipXecs Enterprise Communications Solution is a native SIP based solution that offers all the typical features expected from a PBX, including voicemail, unified messaging, auto-attendant, conferencing, presence and call center capabilities. sipXecs can be deployed on a single server for smaller installations or as a distributed and optionally redundant system for larger deployments. It's Web Services (SOA) based management and configuration system allows centralized management of a distributed system and offers plug & play configuration for all phones and gateways.The sipXecs developer community is strong and growing. sipXecs has built a reputation for being easy to use, scalable and of high quality. In addition, sipXecs is a unified communications solution, not just an IP PBX.The sipXecs project delivers a fully capable open source unified communications solution for the small to mid-enterprise market. This market ranges from a few users to several thousand users, possibly located in different buildings, cities, or countries.源码下载地址:/pub/sipXecs/ISO/参考资料:/p-4455907895111.html4、freeswitchFreeSWITCH 是一个免费、开源的通信软件,可用于创建音、视频以及短消息类产品和应用。

asterisk桥接原理

asterisk桥接原理

asterisk桥接原理Asterisk桥接原理Asterisk是一款开源的通信平台,可以用于创建和管理各种通信应用,如电话系统、呼叫中心和语音转接等。

在Asterisk中,桥接是一项重要的功能,它允许将多个通信通道连接在一起,实现通话的转接和协同。

桥接是Asterisk中的核心概念之一,它可以将两个或多个通信通道连接在一起,使其能够互相通话。

桥接可以在不同的通信协议之间进行,比如SIP、PSTN和VoIP等。

通过桥接功能,用户可以实现电话的转接、电话会议和多方通话等功能。

Asterisk桥接的原理是基于虚拟通道和音频流的传输。

当用户发起通话时,Asterisk会为每个通话创建一个虚拟通道,该通道负责管理通话的状态、音频流的传输和通话的控制。

当需要桥接两个通话时,Asterisk会创建一个新的虚拟通道,将两个通话的音频流连接在一起。

通过这种方式,Asterisk实现了通话的转接和协同。

在Asterisk中,桥接是通过应用程序来实现的。

用户可以使用Asterisk提供的命令和配置文件来创建和管理桥接。

在创建桥接时,用户需要指定要桥接的通话通道和音频流的参数,如通道的类型、通道的标识和音频流的编码格式等。

通过这些参数,Asterisk可以正确地将两个通话桥接在一起,并保证音频流的传输质量。

除了基本的桥接功能,Asterisk还提供了一些高级的桥接功能,如混音、静音检测和音频录制等。

通过这些功能,用户可以实现更复杂的通话应用,如电话会议和多方通话等。

用户可以根据自己的需求,选择合适的桥接功能来实现所需的通话功能。

总结起来,Asterisk桥接原理是基于虚拟通道和音频流的传输。

通过创建虚拟通道和连接音频流,Asterisk可以实现通话的转接和协同。

桥接可以在不同的通信协议之间进行,并支持多种高级功能。

通过灵活使用Asterisk的桥接功能,用户可以创建各种通话应用,满足不同的通信需求。

asterisk入门资料

asterisk入门资料

Asterisk入门资料目录1. 概述 (3)2. 什么是asterisk?开源电话平 (3)3. 为什么使用Asterisk? (3)4. 专利技术有什么错? (3)5. 我们要Asterisk做什么? (4)6. Asterisk支持什么技术? (4)7. 比较好的Asterisk参考书? (4)8. 相关: (4)9. 组件: (4)10. 有用的网页: (5)11. 重要链接: (5)12. 重要信息: (5)13. 外部交换借口/通道接口 (6)14. 拨号计划: (6)14.1. 上下文(context) : (6)14.2. 分机以如下格式定义: (7)14.3. Applications: (7)14.4. 特别分机: (8)14.5. 这个拨号计划会: (8)14.6. 为拨号计划添加逻辑: (8)15. 载入Ubuntu: (9)16. 求助: (9)17. 本章的任务: (10)18. 备注: (20)1.概述subscriber:加入某个group,从而遵从某一个call restricionsubscriber group:可以使用1种call restriction。

call restriction:将numbering plan中各项取出,各自组成成不同的呼叫限制方案numbering plan:通用,是一个整体的计划,里面包括长途,本地,等各种形式的方案————————————————————-以上,用于拨入号码的预处理,实际上是一种过滤,下面才是真正的呼叫处理。

————————————————————–route:一种策略,根据号码匹配的模式,选择走哪个trunk。

trunk:实际上做通一个链路,供route选择。

analog的,一个POTS就是一条analog trunkanalog的数量由设备定,ip trunk没有限制数量,并且一个ip trunk连到对方IPPBX后,对方的subscriber 数量是不确定的,由那个IP PBX决定。

Asterisk权威指南(原书第5版)

Asterisk权威指南(原书第5版)

23.4 Asterisk的
未来
23.5**的未 来
作者介绍
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,暂无该书作者的介绍。
读书笔记
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,可以替换为自己的心得。
精彩摘录
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,可以替换为自己的精彩内容摘录。
5.3配置Asterisk
5.4进行测试以确保 设备已经注册成功
5.5用于设备测试的 基本dialplan
5.6透过现象看本质: 第一次通话
5.7小结
6.1 dialplan语法
6.2一个简单的 dialplan
6.3构建交互式 dialplan
6.4小结
7.1中继基础
7.2用于外线连接的 基本dialplan
15.8 ACD队列的数 据库集成
15.7存储呼叫详情 记录
15.9小结
16.1 IVR的组成
16.2 IVR设计的考 虑因素
16.3 Asterisk的 IVR模块
16.4使用CURL()创 建简单的IVR
16.6语音识别和文 本语音转换
16.5录制提示音的 IVR函数
16.7小结
1
17.1呼叫文件
10.9小结
11.2驻留和寻呼
11.3高级会议 11.4小结
12.1创建一个 1
简单的ACD队 列
2
12.2队列成员
3
12.3高级队列
4 12.4队列统计:
queue_log文 件
5
12.5小结
13.2使用hint指令 的分机状态
13.1设备状态信息

sip多方视频会议应用服务器设计与实现

sip多方视频会议应用服务器设计与实现

科技与创新┃Science and Technology&Innovation ·94·2019年第21期文章编号:2095-6835(2019)21-0094-01SIP多方视频会议应用服务器设计与实现张洪,刘虹(宁波永耀电力投资集团有限公司,浙江宁波315020)摘要:近年来随着信息技术的发展,视频会议作为一种新型媒体也得到了社会高度重视,同时会话初始型以及SIP作为IETF制定的多媒体会话控制系统协议,能够独立于底层协议,具有较强的灵活性、可拓展性。

目前基于SIP协议提出的视频会议系统成为了当前研究的重点。

主要阐述了该会议系统发展现状,并且比较不同互联网环境背景下该应用程序技术实现与缺点,基于XCON框架并结合实际系统需要,设计了SIP多方视频会议应用服务器系统。

关键词:SIP多方视频会议;服务器;通信技术;多媒体流中图分类号:TN948.63文献标识码:A DOI:10.15913/ki.kjycx.2019.21.038在人类通信过程中50%的有效信息需要通过面对面的方式传达,视频会议系统是一种能够在多用户之间为其提供语音、彩色画面的双向实时传送系统。

近年来随着互联网、通信技术等的发展,视频会议应用范围逐渐从大型企业向个人、普通中小型企业拓展,具有广泛的市场发展前景。

多媒体视频会议是相互信息交互的多媒体流,可实现状态共享,从一定程度上来看会议成员可以通过媒体流的方式或者共享某种应用实现信息交互,在多媒体视频会议中各个成员之间的信息是实时的,根据其功能,目前利用该系统能够解决媒体编解码会议控制、媒体传送,其中媒体编解码主要涉及视频以及音频等一些编码器,主要实现媒体信息采集、加工、回放;媒体传送主要涉及协议网络传输有效信息,指令传输以及资源维护;会议控制主要是终止、创建会议管理机制,实现用户管理等。

1多方视频会议服务器应用设计1.1系统需求为能促进SIP会议系统实现广泛开发,在本研究中基于SIP会议需求,对开发标准进行统一定义,结合SIP视频会议系统具体功能要求需要满足下列条件:部分用户和WEB 管理系统能够通过协议进行会议的创建和删除,可进行会议属性配置修改,能够为会议共享资源提供管理机制,该管理机制主要涉及主席、裁决、先来先服务等机制,采用模块化的方案设计以降低不同模块之间的耦合性,应当符合XCON 框架,可与其他会议系统实现交互操作,应当进一步提高系统的安全性能,媒体混合模块应当与会议主服务器实现分离,以及拓展系统功能。

Asterisk核心框架

Asterisk核心框架

Asterisk内核框架Asterisk是一个开源的pbx系统,在公开的资料中,很难找到asterisk内核系统的详细描述。

因此,很有必要写一篇内核框架的描述文档,作为内部培训文档,相互学习提高。

本文主要从三个层面来描述asterisk内核,即asterisk内核模块、内核启动过程、基本呼叫流程。

一、asterisk内核模块Asterisk由内部核心和外围动态可加载模块组成。

内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)和CDR生成模块(CDR Core)。

外围动态可加载模块包括以App_开始的Applications、以Func_开始的Functions、以Res_开始的Resources、以Chan_开始的channels、以Codec_开始的codec编解码模块等。

1.内核模块1) PBX交换核心模块(PBX Switching Core):l pbx.cpbx.c是asterisk的核心模块,每路呼叫都需要经过它调度。

pbx实现了builtin applications,也就是内置的应用,比如最常见的Answer,Hangup, Background,Wait等等。

struct ast_app是一个关键数据结构,它定义了注册builtin applications的结构。

load_pbx函数用来注册builtin applications和一些命令行CLI命令(每个模块都有些CLI 命令)。

该函数在系统启动时被调用。

pbx_exec是Answer/BackGround/Busy/Goto/GotoIf/Hangup/Set等builtin applications的执行入口函数,它被pbx_extension_helper调用。

Asterisk权威指南中文版-第02章Asterisk体系结构

Asterisk权威指南中文版-第02章Asterisk体系结构

第二章 Asterisk体系结构目录2.1 Modules (2)2.1.1 Dialplan Applications (3)2.1.2 Bridging Modules (6)2.1.3 Call Detail Recording Modules (6)2.1.4 Channel event logging modules (7)2.1.5 Channel Drivers (7)2.1.6 Codec Translators (8)2.1.7 Format Interpreters (9)2.1.8 Dialplan Functions (10)2.1.9 PBX Modules (12)2.1.10 Resource Modules (12)2.1.11 Addon Modules (14)2.1.12 Test Modules (15)2.2 文件结构 (15)2.2.1 Configuration files (15)2.2.2 Modules (15)2.2.3 The Resource Library (15)2.2.4 The Spool (16)2.2.5 Logging (16)2.3 The Dialplan (16)2.4 硬件 (16)2.5 Asterisk版本 (17)2.5.1 以前的版本号机制 (17)2.5.2 新的版本机制 (18)2.6 结论 (18)Asterisk完全不同于其他的,更加传统的PXB系统。

在Asterisk中,dialplan基本上采用完全一样的方法处理所有呼入channel。

在传统PBX中,“内线”和“外线”在逻辑上是分开的。

举例来说,你不能把一个外部网关联接到PBX的内线分机端口上,用户也无法在不按下外线数字的情况下拨打外线(例如,很多的IP PBX拨打外线要加拨“0”)。

与此相反,在Asterisk中并没有严格的“内线”和“外线”的概念。

Asterisk 系统及其应用分析

Asterisk 系统及其应用分析

Asterisk 系统及其应用分析
汤秀娟
北京邮电大学计算机科学与技术学院 北京(100876)
E_mail: tangxiujuan1983@
摘 要:Asterisk是由Digium公司开发的开放源码的软件PBX,它不仅支持传统的电话业务 也支持电话会议,语音信箱,收发传真等新型的业务,并且它的通用性强,可扩展性能好, 硬件成本低,因此吸引了大量的用户和开发者,有广阔的应用前景。本文系统地介绍了 Asterisk的特点,它的内部系统结构,以及系统可动态加载的API模块的功能,并且介绍了拨 号方案的语法,给出了一个拨号方案的简单例子;此外,还对Asterisk系统的初始化流程, 呼叫流程,呼入呼出场景,以及处理呼叫时的控制流程进行了详细的分析;最后,介绍了一 种基于Asterisk的VOIP解决方案。 关键词:Asterisk, VOIP, PBX 中图分类号:TP311.52 TN916.1
Asterisk向外拨号时的场景: ⑴ Dial 创建一个 outbound PBX 通道,并且要求对应的通道驱动创建一个呼叫; ⑵ 当电话被接通,asterisk 桥接媒体流,使得第一个通道的呼叫者能够与第二路通道的
被呼叫者进行通话; 有些情况下,呼入和呼出的通道使用相同的技术方案和兼容的编解码技术,这时候就会
(3) 网络系统配置更为简单,可将现有的资源,如图形用户接口(或 IM 短信)服务于 当前的需求。
(4) 通用性强,维护简单,基于 Asterisk 的软件系统易于管理和维护。 (5) 可扩展性能好,操作十分简单,而且节约时间和费用。当需要在己有的 PBX 上扩 充多个子电话时,传统的 PBX 设备不大支持这种扩充,必须换掉内部模块,这是一笔不小 的开支。但是使用 Asterisk 来充当 PBX 的内部核心软件模块,可随时更新,由软件可替代 整体的硬件更新,既节省经费又节省时间。 (6) 使用 Asterisk 来充当 IP-PBX 还有一个非常吸引人的优点是,它可以利用其 VOIP 功能用市话价格拨打长途电话,极大节省了长途通信的费用。 除了能看到的优点,在深层次的意义上 IP-PBX 系统导致了新的真正集成化的数据、语 音应用的大量出现,甚至是当前的 IPTV,从而引起了人们日常工作模式的进步以及效率的提 高。

struts框架详细介绍

struts框架详细介绍

struts框架详细介绍Struts是一个开源的Java Web应用程序开发框架,可以帮助开发者构建可扩展的、高性能的Web应用程序。

它遵循了Model-View-Controller(MVC)设计模式,通过将业务逻辑、表示逻辑和用户交互进行分离,使得应用程序更易于开发、测试和维护。

下面是关于Struts框架的详细介绍。

1.MVC设计模式:Struts采用了MVC设计模式,将应用程序的不同组成部分进行分离。

- Model层负责处理数据和业务逻辑。

在Struts中,开发者可以使用JavaBean、EJB、Hibernate等技术作为Model层的实现。

- View层负责展示数据和用户界面。

Struts提供了JSP(JavaServer Pages)作为主要的View技术,也可以使用Velocity、Freemarker等模板引擎。

- Controller层负责接收用户请求、处理业务逻辑以及将结果返回给View层。

Struts的Controller层使用ActionServlet来处理请求,它根据配置文件中的映射规则将请求转发给合适的Action类进行处理。

2.核心组件:Struts由以下几个核心组件组成:- ActionServlet:负责接收和处理来自客户端的请求,并根据配置文件中的映射规则将请求转发给合适的Action类进行处理。

- Action类:实现了业务逻辑的处理,接收请求和返回结果。

开发者需要继承Action类,并覆写其中的execute(方法来实现自定义的业务逻辑。

- ActionForm:用于封装请求参数并传递给Action类进行处理。

ActionForm可以与表单元素进行绑定,从而方便地获取和验证用户输入。

- ActionMapping:配置文件中的一项规则,用于将请求URL映射到具体的Action类和方法。

- ActionForward:配置文件中的一项规则,用于指定请求处理完成后需要跳转到的页面。

openbts框架

openbts框架

如框图1 所示,与BTS相关的有三个进程(要与线程区分开来,简单理解就是有三个独立的程序在运行)
1) transceiver 2) OpenBTS 3) asterisk
Asterisk需要另外安装,transceiver OpenBTS都在openbts里面有相应的源码程序以一个上行的数据流为例,
1 USRP首先收到手机发送的上行数据,通过USB数据包交给transceiver去处理
2 transceiver 根据所收数据包所处的时隙,对其类型进行区分,然后按照一定的格式封装
成UDP报文
3 OpenBTS接收到UDP报文,然后经过三层协议处理后, 交给SIPinterface
4 SIPinterface通过UDP报文的方式实现和asterisk通信,asterisk
5 asterisk 根据收到的信息,相应的处理,比如是注册信息,则根据sip.conf里配置好的参
数,注册一个手机对应的SIP用户
补充:OpenBTS的协议栈结构为
第一层:L1物理层,调制,时分复用,纠错码
第二层:L2 数据链路层链路寻址,数据拆分,转发
第三层:L3信号管理,和链接管理(如信道分配等等)。

Asterisk基础知识

Asterisk基础知识
– 对于初学者来说,或者只是简单应用者来说, trixbox已经足够了 – 界面相对友好,配置相对好理解
• 从功能和稳定性上,两者没有区别
asterisk和digium的板卡有何关系 和 的板卡有何关系
• 开源不代表不赚钱,开源的目的就是东方 不亮西方亮,靠硬件赚钱,那就是板卡 • 很多国外的人对digium是崇拜的,所以再贵 他们也要买digium的卡 • aserisk不是必须插板卡的,但是如果有板卡, ippbx的外部接口会更丰富 • 其它一些公司的板卡也能兼容asterisk,比 如eicon,比如yate。
asterisk 能够支持传统的线路
• tdm (time division multiplexing) • t1/ e1 pri/ pra & rbs (robbed bit signal)modes analog phone lines/ phones (pots) • isdn (integrated services digital network) both bri (basic rate)and pri (primary rate) • asterisk需要的带宽,一般为:32kb/ 线路。也 就是说每支持一条线路,只需要增32kb 的带 宽,但是需要网络质量良好
asterisk能做什么 能做什么
• asterisk,英文是“星号”的意思,设计的 初衷是,任何和电话系统有关的东西,它 都能做
– 并不是所有和电话有关的功能靠asterisk实现都 是最好的
• asterisk最擅长的就是做一个ippbx,
– 当然有人用它来做voicemail服务器、ivr服务器、 会议服务器、中继网关、sip server、发卡系统 等等
安装Asterisk-1

asterisk源码解读

asterisk源码解读

Asterisk是一个开源的电话系统软件,其源码包含了大量的代码和模块,解读Asterisk源码需要一定的编程和电话系统知识。

以下是一些解读Asterisk源码的建议:了解Asterisk的基本架构和模块:Asterisk是一个模块化的软件,由多个模块组成,包括应用程序、设备驱动、协议模块等。

在解读源码之前,需要了解Asterisk的基本架构和各个模块的功能和作用。

学习C语言和编程知识:Asterisk 的源码是使用C语言编写的,因此需要具备一定的C语言和编程知识,以便更好地理解源码的结构和逻辑。

阅读代码注释和文档:Asterisk的源码中包含了大量的注释和文档,这些注释和文档可以帮助理解代码的作用和实现方式。

逐个模块阅读代码:从Asterisk的入口函数开始,逐个模块阅读代码,了解每个模块的功能和实现方式。

调试和测试:在解读源码的过程中,可以通过调试和测试来验证代码的功能和正确性。

需要注意的是,Asterisk的源码非常庞大和复杂,需要花费大量的时间和精力来解读和理解。

因此,建议在解读源码之前先了解一些基本的电话系统和编程知识,以便更好地理解和掌握Asterisk的源码。

asterisk介绍

asterisk介绍

当Asterisk不是一台sip 代理服务器时,可以配置Asterisk使 用其他的软件作为sip代理服务器,最常用的软件是Sip Express Router,简称SER,SER是一个开源的、可以让 Asterisk大规模部署的sip 代理服务器软件。
Asterisk不能运行在windows上
关于这一点,有一个Asterisk工作在windows上的演示CD, 结果是,Asterisk不能运行在windows平台,Asterisk要求近 乎实时的访问系统资源,也需要连接到某些特定的资源, 由于以上原因,Asterisk只能构建于一个开源的类unix操作 系统——Linux。
Asterisk 可以被配置为一个IP或混合的PBX的核心:交换呼 叫、管理路由、使能特性,以及通过 IP、模拟线路 (POTS)、以及数字(T1/E1)的联系同外部呼叫链接在 一起。
IP PBX与传统PBX相比较的优势
将电话网与计算机网统一成一个整体; 除了能为传统的电话用户提供服务外,还能方便地为Internet用户提供服务; 全新的硬件平台和高度集成的系统功能可大幅度降低成本; 实现增值服务更加方便和容易,比如建立呼叫中心、实施VoIP等; 开放的标准,互通性强; 将专用的通讯平台搬到了大众普遍较熟悉的计算机平台上,它的通用性和实用性更强; 使用、配置和维护更加简单,甚至无需专业人员; 功能更加强大且集成度高,单一系统就可以完成使用传统PBX需外配许多设备才能完成的功 能,比如自动话务台、语音信箱等等; 由于采用了计算机平台,使系统的扩容和升级更加简单和节省投资; 应用开发方便简单。
我们可以查询通话一般有多长,平均有多长,谁打的最多等等, 这种应用还有很多。通过这些信息,我们也可以找到一些不被允 许员工拨打的长途电话,Asterisk提供了这种减少这种浪费的可能, 更重要的是,这些通话记录不会被浪费掉,这些无价值的电话, 我们可以通过建立一个通话列表,当任何人拨打这些电话时,都 要求验证密码并被检查。

asterisk系统学习文档

asterisk系统学习文档

目录ASTERISK系统主要线程 (2)系统主控线程 (2)通道主控线程 (2)维护用户状态线程 (3)交换线程 (3)两个codec之间转换时间表 (6)系统交互命令 (7)呼叫转移 (14)呼叫停泊 (14)语音邮件 (15)语音会议 (17)Asterisk主要程序模块功能简述 (18)ASTERISK系统主要线程Asterisk系统主要是独立线程方式工作的系统,主要的独立线程有:维护注册用户状态的线程-维护各个用户在存在于系统的整个过程中的各个状态 各个通道(SIP、IAX等)主控线程-解析自己通道内的请求和响应系统主控线程-完成系统的初始化启动工作,完成后等待用户的输入和用户进行交互交换线程-由各个通道来调用启动,完成两个通道的桥接和语音交换系统主控线程Asterisk系统除了主控程序外,其它功能模块都编译成共享文件*.so类型,都采用预加载或者实时加载的方式进行协调工作,默认情况下系统启动后加载所有的模块,每个模块都有一个load_module()函数,主控找到每个模块并加载,然后调用模块内部的load_module()函数,这个函数完成模块自己对应的参数配置文件(如果有配置文件)数据的加载,并对模块进行初始化工作,初始化完成后,注册自己模块的应用方法和该模块支持的交互命令(这些是一般模块加载的流程,通道模块加载除外),模块内初始化函数调用完成后,系统继续加载下一个模块,直到所有的模块加载完成,系统主控线程等待用户的输入,完成和用户的交互,系统提供很多可以和用户交互的命令,来管理、配置、查询asterisk系统。

通道主控线程完成以上普通模块加载步骤后,建立一个该通道的主监控线程,该线程在整个系统运行期间一直运行。

每个通道(SIP通道、IAX通道等)都是在系统启动的时候,被加载进系统的,每个通道都是通过独立线程方式工作的,在各自配置的端口上监听等待接收各自通道上的请求和响应,各个通道线程独立运行,每个通道维护一个事件结构,该结构中放的是该通道中需要定时调度的事件(该事件是由该通道在解析数据的过程中,如果遇到需要隔一段时间来运行的程序则写入该结构的,比如,重发事件、销毁事件、期满事件等),每个通道共同调用三个公共的函数,一个是调度等待时间函数,一个是判断IO资源是否有数据发生的函数,一个是调度该通道事件运行的函数,调度等待时间函数每次调用返回的是需要等待调度事件的最短时间,如果没有事件,则返回-1,判断IO资源函数用这个返回时间来挂起资源,判断自己的通道上的数据发生,如果有数据发生就去调用自己注册的数据处理函数去处理请求数据,判断IO资源函数返回后,调用事件运行函数,来判断是否在该时间点有事件需要调度运行,每个通道都是如此往复的调用这三个函数循环运行判断,直到系统运行结束为止。

Asterisk学习笔记

Asterisk学习笔记

Asterisk学习笔记Asterisk学习笔记1.安装Asterisk需要那些安装包。

a)Asterisk(pure voip only need this)b)Zaptel(support 硬件板卡支持)c)Pri(libpri)2.Asterisk的版本a)Asterisk目前有1.4和1.6两个分支,我们的HCC系统采用的是1.4分支上进行扩展开发。

1.6 no longer support zaptel,增加了很多新features,相对与1.4版本变动比价大。

b)Upgrade:ael 取消了Macro() 用Gosub()来代替。

Applications:ChanIsAvail()增加-t选项3.How to install Asterisk on Linux.a)Login as rootb)tar zxvf Asterisk-1.6…解压c)进入sub folderd)#make cleane)#./configuref)#makeg)#make installh)#make samples(安装示例配置)4.How to run/stop Asteriska)进入console,直接运行#asterisk 来运行b)进入asterisk命令提示界面:#asterisk –r 然后CLI>stop nowc)Asterisk可以用safe_asterisk来安全启动,通过safe_asterisk 启动后如果asterisk crash会dump core到/tmp目录,并且给administrator发email告警。

5.Asterisk目录结构a)/usr/lib/asterisk/modules 这个目录下包含所有可加载的asterisk模块b)/var/spool/asterisk 这个目录下包括outgoing gcall tmp voicemail目录asterisk会去monitor这个目录,可以用在做自动外呼等等c)/var/log/asterisk用来store logsd)/var/log/asterisk/cdr-csv用来store cdrs in csv format. CSV=comma-separate-value6.SIP in Asteriska)Asterisk中sip配置文件为/etc/asterisk/sip.confb)Asterisk支持IAX与SIP VOIP协议。

Asterisk 代码架构概述(译)

Asterisk 代码架构概述(译)

Asterisk 代码架构概述(译)注意:这篇文档所描述的内容,可能已经过时。

为了保证您所获取的信息是最新的,请您确保您使用的文档是从Asterisk的trunk上生成的。

运行时,Asterisk加载了许多模块。

Asterisk的模块都有具体的名称,以标识模块所提供的功能,但是,这些名称没有任何技术意义上的特殊。

Asterisk 加载一个模块时,模块向内核注册它所提供的功能。

整个流程看起来是这样的:1.启动Asterisk2.Asterisk加载模块3.模块跟内核说:嗨,Asterisk,我是一个模块,我能提供X、Y、Z三种功能,用得着的时候要记得我哦。

3抽象接口类型Asterisk提供了许多不同类型的接口,具体的模块可以实现这些接口并注册给内核调用。

任何模块,都可以注册任意多种的接口。

通常,一个模块内整合了某些相关的功能。

本节讨论接口的类型,后续将讨论各种场景下不同组件间的协作关系。

3.1 编码解释器CodecInterpreter编码解释器接口的实现,提供了两种编码间的转换能力。

Asterisk当前只有音频编码转换的能力。

这些模块不了解话务相关的任何信息,也不知为什么要调用它们进行音频转换。

它们仅需要知道音频采样率、音频的输入格式、期待的输出格式这些信息。

如果注册了多个编码解释器,那么编码A转换为编码B的过程,就可能有多种不同的转换路径。

在(编码)模块加载之后,Asterisk建立一张转换表,表中包含不同translator的转换开销评估值,因此,Asterisk能够找出A转换B的最佳路径。

在源码树中,编码模块通常在codecs/目录下。

已有编码解释器的实现列表,请参考:Module:Codecs更多编码解释器API的信息,请参考接口定义文件:include/asterisk/translate.h.内核关于编码解释器的相关实现,参考源码:main/translate.c3.2文件格式处理器File Format Handler文件格式处理器接口的实现,为Asterisk提供了读写文件的能力。

基于SIP协议的ASTERISK VOIP服务器研究

基于SIP协议的ASTERISK VOIP服务器研究

这些模块可 以支持基本 的 P B X功能。
2 . 3 系统 保 护
L i n u x发展 而来 的操作 系统 ,本身具有 强大的
经 过 我们 对 系 统 功 能 的 配 置 ,现 在 的 安 全 性 和 稳 定 性 。 目前 来 看 , C e n t OS是 在 I P P B X应该是一个可 以工作 的系统 。我们首先 A s t e r i s k和 F r e e P B X 应用 中比较受 欢迎的操作 对系统做一 些系统保 护 ,文件保存 的工作 。事 系 统。在 安 装 C e n t O S 5 . 2 时 ,需 要安 装 下 实上 ,最 好 的硬 件 系统都有 可 能出现 问题 。 支持包 : 没有 一个正确的系统保护和备份措施 ,系统将
剧 变。V o l P可 以在 l P网络上便宜 的传 送语音 、 传真 、视频 、和 数据 等 业务 ,如 统一 消 息、
。 My S QL Da t a b a s e S e r v e r
。 Se ve r r Co n ig f u r a t i o n To o l s 。 We b S e r v e r
不 断下降,终端设备 的成本也越来越低廉 。 A s t e r i s k 以软件 的方 式实 现了 P B X( P r i v a t e
B r a n c h E x c h a n g e ,用户 电话交换机 )的所有功
能 ,是一个纯软件 的实施方 案 ,一个全面的通 信平 台。它 既支持 传统的模拟 电话设备和数字
软件应用 ・ S o f t wa r e A p p l i c a t i o n
Байду номын сангаас
基于 S I P协 议的 AS T E R I S K V O I P服 务器研 究

Asterisk开源工程分析12

Asterisk开源工程分析12

Asterisk开源工程分析(1.2)曾盛金2008-4-18Asterisk开源工程分析(1.2) (1)1、序言: (3)2、asterisk的架构 (3)3、启动 (5)3、1 Ulaw初始化 (5)3、2 alaw初始化 (5)3、3 Callerid初始化 (5)3.4 、64参数表初始化 (5)3.5 、Tdd初始化 (5)3.6 处理根配置文件 (6)3.7、term的初始化 (6)3.8、配置CLI命令解释器 (6)3.9、建立管理用的socket (6)3.10、载入模块 (6)3.11、通道初始化 (6)3.12、管理器初始化 (6)3.13、cdr_engine初始化 (7)3.14、device_state初始化 (7)3.15 、rtp初始化 (7)3.16、图像管理初始化 (7)3.17、pbx初始化 (7)3.18、modules的再次初始化 (7)3.19、其他初始化 (7)4、通话流程(以sip为例) (7)4.1、通话的处理流程 (8)4.2、通话中可以使用的控制台处理函数 (9)5、asterisk的核心 (9)5.1、pbx交换模块 (9)5.1、Pbx的桥接 (11)5.2、pbx桥接的数据转换问题 (11)6、Asterisk的通道管理(channel.c) (11)6、1、通道模块有:(channels目录下) (11)6、2、通道接口应该实现的接口 (12)6、2、1通道启动 (12)6、2、2开始一个电话呼叫 (13)7、拨号方案管理 (13)8、io管理(io.c) (15)9、呼叫记录管理(cdr.c) (15)10、通信用户管理(db.c) (15)11、iax管理 (15)12、日志管理 (16)13、应用管理 (16)14、媒体流管理 (16)15、媒体文件 (17)16、软件解码文件 (17)17、asterisk的下载和安装 (17)1、序言:Asterisk是开源的IP PBX,其支持模式有:ip电话与传统电话之间的数据交换、ip电话与ip电话之间的数据交换,传统电话与传统电话之间的数据交换。

基于Asterisk的VoIP开发指南—Asterisk模块编写指南

基于Asterisk的VoIP开发指南—Asterisk模块编写指南

基于Asterisk的VoIP开发指南—Asterisk模块编写指南1.开源项目概述Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上。

Asterisk可以用三种协议来实现VoIP,同时可以与目前电话使用的标准硬件进行交互通信,Asterisk在实现VoIP时,不需要任何附加硬件,本文所采用的也是这种使用方式。

但是,如果企业没有与VoIP 语音网关运营商建立合作关系,想要自己构建这样的一个平台,那么要和数字电话设备与模拟电话设备进行交互通信,Asterisk需要一个PCI硬件的支持,这个硬件生产商中最著名的是Digium平台提供的。

Asterisk 的结构基本上是十分简单,但是它不同于大多数的电话产品。

基本上,Asterisk担任的是一个中间件的功能,它连接了底层的电话技术和上层的电话应用。

所以,Asterisk 具有很大的柔韧性,特殊的API接口都围绕着PBX核心系统。

这个核心处理着PBX内部之间的相互联系。

每一部分都是清晰来自于协议、编码或内部电话使用的硬件接口的抽象。

这些抽象的接口使Asterisk可以与任何的硬件和技术以及将来的硬件和软件技术完美的结合。

从图2.5可以看出,Asterisk由内部核心和外围动态可加载模块组成。

内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)和CDR生成模块(CDR Core) 。

图1 Asterisk结构图2.Asterisk二次开发概述Asterisk是一个开源的PBX架构;但它并不是一个成品。

通常情况下,由于企业应用的多样性,很难有一个成型的PBX产品可以满足企业的各种需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Asterisk是一个开源的pbx系统,在公开的资料中,很难找到asterisk内核系统的详细描述。

因此,很有必要写一篇内核框架的描述文档,作为内部培训文档,相互学习提高。

本文主要从三个层面来描述asterisk内核,即asterisk内核模块、内核启动过程、基本呼叫流程。

一、asterisk内核模块Asterisk由内部核心和外围动态可加载模块组成。

内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)和CDR生成模块(CDR Core)。

外围动态可加载模块包括以App_开始的Applications、以Func_开始的Functions、以Res_开始的Resources、以Chan_开始的channels、以Codec_开始的codec编解码模块等。

1.内核模块1) PBX交换核心模块(PBX Switching Core):l pbx.cpbx.c是asterisk的核心模块,每路呼叫都需要经过它调度。

pbx实现了builtin applications,也就是内置的应用,比如最常见的Answer,Hangup, Background,Wait等等。

struct ast_app是一个关键数据结构,它定义了注册builtin applications的结构。

load_pbx函数用来注册builtin applications和一些命令行CLI命令(每个模块都有些CLI命令)。

该函数在系统启动时被调用。

pbx_exec是Answer/BackGround/Busy/Goto/GotoIf/Hangup/Set等builtin applications的执行入口函数,它被pbx_extension_helper调用。

ast_pbx_start函数是每路呼叫的起点。

2) 调度和I/O管理模块(Scheduler and I/O Manager):l Channel.c:Channel.c/channel.h定义了channel操作的结构体和接口函数。

struct ast_channel_tech结构体是所有channel都要用到的关键结构体,它定义channel操作的一系列回调函数指针,如call、hangup、answer等。

每个channel模块都会定义ast_channel_tech的实体,并将各自的回调函数赋值给它。

例如chan_sip.c中定义如下:/*! \brief Definition of this channel for PBX channel registration */static const struct ast_channel_tech sip_tech = {.type = "SIP",.description = "Session Initiation Protocol (SIP)",.capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1),.properties = AST_CHAN_TP_WANTSJITTER |AST_CHAN_TP_CREATESJITTER,.requester = sip_request_call,.devicestate = sip_devicestate,.call = sip_call,.hangup = sip_hangup,.answer = sip_answer,.read = sip_read,.write = sip_write,.write_video = sip_write,.indicate = sip_indicate,.transfer = sip_transfer,.fixup = sip_fixup,.send_digit_begin = sip_senddigit_begin,.send_digit_end = sip_senddigit_end,.bridge = ast_rtp_bridge,.send_text = sip_sendtext,.func_channel_read = acf_channel_read,};ast_call、ast_hangup、ast_answer等函数分别实现ast_channel_tech中的call、hangup、answer等回调函数的调用。

struct ast_channel结构体定义了channel的上下文参数,它是每个参与呼叫的channel必不可少的,都会调用ast_channel_alloc来申请ast_channel。

l io.cio.c实现了asterisk跟外部交互时的I/O管理,如chan_sip为了从外部接收SIP信令,调用ast_io_add添加IO接口,并调用ast_io_wait实现外部消息接收。

3)应用调用模块(Application Launcher):在pbx.c中定义了一系列的应用调用接口。

applications模块定义了application回调函数并注册后,在pbx.c中通过应用调用接口回调执行。

应用调用接口的关键函数是pbx_extension_helper,它执行dialplan,在cli上打印“Executing ……”,并抛出ami event事件,同时调用pbx_exec执行application回调函数。

4) 编解码转换模块(Codec Translator):Translate.c:struct ast_translator:编码转换描述结构体,它定义了编码转换的名称、回调函数、运行时选项。

struct ast_trans_pvt:编码转换上下文描述结构体。

ast_register_translator:编码转换注册接口函数,供各编码模块调用,注册structast_translator类型的结构体变量。

ast_unregister_translator:编码转换注销函数ast_translate:编码转换的执行函数。

codec_gsm.c/codec_...:对应各种编码的编解码执行模块,如g.711alaw/g.711ulaw/gsm 等。

5)动态模块加载器模块(Dynamic Module Loader):该模块主要是Module.h。

Module.h中定义了struct ast_module_info结构,用来保存各模块的注册、注销回调函数,以及模块描述信息。

load_module、unload_module,每个应用模块的注册、注销函数,由各个模块自行定义为static函数。

AST_MODULE_INFO_STANDARD:注册接口、注销接口、模块描述信息等模块信息的登记接口。

它是一个宏定义,动态模块调用它时,首先定义类型为ast_module_info的__mod_info静态结构变量,保存模块信息,并定义__attribute__ ((constructor))__reg_module和__attribute__ ((destructor)) __unreg_module,在程序启动和退出时调用。

6)CDR生成模块(CDR Core):Cdr.c:ast_cdr_register:cdr driver注册,供cdr_mysql等调用,注册话单保存的回调函数。

ast_cdr_engine_init:CDR模块初始化,注册cdr status、加载cdr.conf、启动CDR线程。

ast_cdr_detach:产生话单的接口函数,呼叫结束时被调用。

2.外围可加载模块:1)Applications以app_开始的模块,如app_dial.c、app_db.c、app_queue.c、app_record.c、app_meetme.c 等,代码保存在apps目录中。

每个application模块都定义了load_module函数和unload_module函数,分别用来注册和注销application。

load_module函数调用ast_register_application函数,注册application命令,例如app_dial 模块注册Dial:res = ast_register_application(app, dial_exec, synopsis, descrip)。

unload_module函数调用ast_unregister_application函数,注销application命令。

每个application模块都会使用AST_MODULE_INFO_STANDARD宏来登记模块信息__mod_info。

AST_MODULE_INFO_STANDARD将load_module和unload_module注册为回调函数,供module load/unload/reload调用。

2)Channel以chan_开始的模块,如chan_sip.c、chan_h323.c、chan_mgcp.c 、chan_iax2.c、chan_zap.c等,对应代码保存在channels目录中。

channel注册、注销过程和application基本类似。

由于每个channel需要和外部交互,都会在load_module中启用do_monitor线程来侦听外部tcp/udp端口,接收外部消息。

每个channel也定义了各自的cli命令和Function命令,例如chan_sip定义了sipdebug/history/no/notify/prune/ reload/set/show等cli命令和SIP_HEADER、CHECKSIPDOMAIN、SIPPEER、SIPCHANINFO等Function命令。

3)Functions以Fun_开始的模块,例如Fun_db.c、func_moh.c、func_cdr.c等,对应代码保存在funcs 目录中。

Function注册、注销过程也和application类似。

每个Function模块也定义了各自的Function命令,例如Fun_db.c就定义了DB、DB_EXISTS、DB_DELETE等Function命令。

二、asterisk启动过程主要就main函数讲解asterisk的启动过程:1int main(int argc, char *argv[])23{45int c;67char filename[80] = "";89char hostname[MAXHOSTNAMELEN] = "";1011char tmp[80];1213char * xarg = NULL;1415int x;1617FILE *f;1819sigset_t sigs;2021int num;2223int isroot = 1;2425char *buf;2627char *runuser = NULL, *rungroup = NULL;2829/*保存命令行参数(argv[]->_argv[]),以便程序重启时使用*/3031/* Remember original args for restart */3233if (argc > sizeof(_argv) / sizeof(_argv[0]) - 1) {3435fprintf(stderr, "Truncating argument size to %d\n", (int)(sizeof(_argv) / sizeof(_argv[0])) - 1);3637argc = sizeof(_argv) / sizeof(_argv[0]) - 1;3839}4041for (x=0; x<argc; x++)4243_argv[x] = argv[x];4445_argv[x] = NULL;4647if (geteuid() != 0)4849isroot = 0;5051/*命令如果是rasterisk,设置AST_OPT_FLAG_NO_FORK和AST_OPT_FLAG_REMOTE标志位*/5253/* if the progname is rasterisk consider it a remote console */5455if (argv[0] && (strstr(argv[0], "rasterisk")) != NULL) {5657ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK |AST_OPT_FLAG_REMOTE);5859}6061/*得到当前主机名,在启动时打印出来*/6263if (gethostname(hostname, sizeof(hostname)-1))6465ast_copy_string(hostname, "<Unknown>", sizeof(hostname));6667/*获取当前的进程标识*/6869ast_mainpid = getpid();7071/*建立mu-law和a-law转换表*/7273ast_ulaw_init();7475ast_alaw_init();7677/*为FFT逆变换(傅立叶逆变换)做一些初始化,用于在zaptel里进行callerid的DTMF 检测*/7879callerid_init();8081/*初始化内置命令的_full_cmd字符串,并注册常用命令,ast_builtins_init() ->ast_cli_register_multiple() -> ast_cli_register() -> __ast_cli_register() */8283ast_builtins_init();8485/*初始化base64转换*/8687ast_utils_init();8889/* tty/tdd初始化*/9091tdd_init();9293/*设置用户历史命令的保存路径*/9495if (getenv("HOME"))9697snprintf(filename, sizeof(filename), "%s/.asterisk_history",getenv("HOME"));9899/* Check for options */100101/*检查命令行的输入参数,匹配参数范围是“mtThfFdvVqprRgciInx:U:G:C:L:M:”,不同的参数输入走到不同的case分支处理。

相关文档
最新文档