分类: 系统运维
2010-08-13 17:50:25
最近, 发现很多Asterisk友关注传真的问题而不得要领, 根据我的了解, 自己整理了一些材料; 希望能对大家有点帮助. 高手们随时可以拍砖 !
关于Asterisk的传真以及FoIP的概念
(1)关于传真 :
传真实际上是从一台传真机发送图文信息到另一台传真机的过程; 传真机通常采用PSTN网络作为传输媒介,我们现在常用的传真机是第三代传真机(符合ITU-T T.30规范); 前三代传真机都采用模拟语音信号作为调制的基带信号.这就意味者传真机给PSTN网络输入/输出的是调制在语音频带内的模拟信号.而第四代传真开始在ISDN网络上使用数字信号进行传输. 与ISDN网络一样,G4传真并没有真正在我们国家推行开来.因此,除非特别用途,我国目前在用的传真机都是G3传真.
像我们的拨号Modem那样, 传真实际上是利用PSTN的语音承载网络端到端进行调制/解调而工作的, 这就意味者传真的媒体数据在网络中不能被当作普通的话音而做二次处理. 传统的PSTN在端到端传输过程中都不会干扰所传输的媒体数据,因此,g3传真在传统PSTN上工作良好. 在VoIP网络中, 事实上,我们在网络传输的某个阶段,根据某种算法,对语音数据进行了变换(codec)和重新封装,并在这个传输阶段采用包传输网络传递媒体信息, 这种处理模式是专门针对话音而设计的, 一些特定的算法,比如:静音检测(VAD)\回声消除\舒适噪音生成等等对VoIP的QoS都起到了很好的作用. 但这些做法却严重影响到了传真的端到端工作的能力.
从以上分析可以看出,为了在数据网络上传送传真信息, 就不能简单地采用VoIP的方法. 所以业界就讨论了FoIP的思路.
(2)FoIP的概念和实现
FoIP,顾名思义,就是通过IP网络传送传真, 就象VoIP那样,FoIP只是考虑的传输问题,而不关心终端问题. 但为什么在VoIP上,会有很多软终端呢? 这是因为, 多媒体电脑可以完全实现传统电话机的能力,且可以直接利用IP网的VoIP能力. 但传真本身要传送纸质介质上的东西, 多媒体电脑没有这个I/O, 当然,理论上也可以采用扫描仪来作为I/O, 这样也可以实现软的传真机终端. 但一个是这种使用方式太过麻烦且使用场景很少, 二是既然都扫描了电子化了, 又有IP网络,为什么不用e-mail. 即使要解决对端的问题,也可以让传真服务器/传真网关来解决啊. 因此, 截止现在,还没有人来考虑软的传真机终端.
好了,既然FoIP的主要目的是实现传输的目的, 而不是去解决端到端的问题. 因此,我们来看一下, 解决在IP网络上传输传真有几中模式. 首先,我们考虑: 传真是否要实时, 也就是源端和目的端是否要实时完成传送. 以前工作在PSTN网络上的传真都是实时的, 这是因为PSTN网的媒体是实时的,且PSTN不会对媒体进行二次处理. 但在FoIP时,情况就不同了. IP网上有大量的计算和存储资源, 在IP网上,非实时业务是主流. 因此,非实时的传真应该被考虑. 常用的非实时传真是存储转发传真, 也就是先有一个服务器将传真接收并存储下来,合适的时候再传递给被叫端. 严格的来说,这种模式不是端到端(主叫到被叫)模式,而可以看作是由传真服务器参与的两个端到端过程. 因此,在下文中,我们不再考虑这些非严格意义上的端到端模式。
下面我们来看FoIP的几种方式 :
(a)中继方式(Relay) : 这种方式实际上是存储转发的变形. 这种方式的原理是这样的: 在进入IP网的源端侧,由FoIP的网关将源端传真信号终结, 直接解调传真信号; 还原为数字信号, 将数字信号封装为IP包在IP网上传输, 在IP网络的目的侧, 接收FoIP网关解包, 再与被叫传真机实现端到端会话. 中继方式实际上是让FoIP的网关在两侧分别充当虚拟的传真机 , 而在IP网上,不再传递任何模拟的传真信号. 充分利用IP网的数据传输能力. 这种方式又分为实时和非实时, 即源端是接收完传真后再relay,还是边接收, 边relay. 网关间的协议分别对应为T.38和T.37. 也就是说T.38和T.37是FoIP的主要协议.
(b)透传方式(pass-through) : 这种方式将从PSTN来的调制的传真信号直接按照VoIP的模式,封装为RTP包传递到对端, 对面网关再传递到被叫传真机. 两个网关都不关心包的具体内容. 但正如我们前面所述, 如果网关(源端或目的端)对这些媒体包进行了任何处理, 都会直接导致传真信号被破坏,端到端过程不成功,因此,为了使这个过程尽可能透明; 可以采用以下两种方法: 方法一:网关之间需要使用与PSTN一样的编解码 :比如 G.711 A率或者U率. (32K的ADPCM有时也可以承载低速传真). 且不能启动诸如静音检测(VAD)\回声消除\舒适噪音生成等过程.在这种情况下,如果网络条件良好,没有丢包\抖动等情况, 端到端传真也会很好的工作. 方法二: 由网关动态检测传真信号,一旦发现传真,立即变换编码方式为G.711 编码, 且停止进行静音检测(VAD)\回声消除\舒适噪音生成等过程.
实际上, FoIP就象VoIP中DTMF的处理一样, 也是两类处理模式, 一类是带内, 即仍然在语音包中传送, 这种方式简单, 但不可靠; 一类是Relay,即由网关终结/变换成另一种方式在IP网上传送, 比如RFC2833或者SIP INFO.这种方式需要两端的网关均支持,还需要设置一致.
(3)Asterisk的传真 :
Asterisk是一个开源的PBX, 由于Asterisk是一个IP PBX,既可以工作在传统PSTN网络上,也可以工作在IP网络上, 因此,在Asterisk上实现传真,有两个方面的意思 :
(a)将Asterisk 作为传真机端到端的一个端, 即一个虚拟的传真机; 让这个传真机直接与PSTN内的其他传真机进行跨PSTN的端到端通信. 实现传真的接收和发送, 这种模式与FoIP无关, 并没有在包网络上传递Fax媒体信息.这种模式也就是CTI领域的传真服务器. 估计也是大家使用最多的模式.
为实现传真服务器, Asterisk 可以集成Spandsp 来实现, 即在系统中安装spandsp软件--传真dsp软件.处理传真的dsp信号(调制/解调),另外,在Asterisk中集成app_rxfax和app_txfax两个应用. 这样就可以在asterisk的dialplan 中直接使用这两个app了. 这两个app是依赖于spandsp来工作的.在TrixBox中已经集成了相关的应用,大家直接使用即可.asterisk 中安装spandsp 我已经验证. 有什么问题,欢迎探讨.
(b)实现FoIP, 即实现传真网关. 由Asterisk实现FoIP的网关功能. 这个大家看一下上文就明白了. 目前, Asterisk已经支持T.38协议. 但我现在好没有实验过asterisk的FoIP的能力; 有实验过的大侠们再补充.
(4)Asterisk传真的使用场景
根据上面的介绍, 实际上,我认为, 大家对传真使用场景最多的应该还是传统的传真服务器; 除非我们的系统需要跟第三方的系统互联,还必须要实现实时传真能力; 否则我们没必要实现FoIP. 对需要这种应用时,我们可以存储转发, 让我们分布在两个地方的Asterisk分别承担传真服务器的功能. 只是可能需要告诉用户 FoIP的使用方式和传统传真有一定差别.