使用 WebLogic SIP Server 和 WebLogic Workshop 驱动 Cantata 媒体服务器



 Qcu思考者日记网-束洋洋个人博客

摘要

媒体服务器控制对于大多数基于 SIP 的 VOIP 应用程序而言都至关重要。本文介绍一个使用 BEA WebLogic Workshop 构建的示例会议应用程序,该应用程序利用 BEA WebLogic SIP Server 来驱动 Cantata 的支持 MSCML 的媒体服务器。通过这一基本的语音/视频会议应用程序,我们可以展示媒体服务器控制背后的基本原理,同时提供一些示例,演示如何使用 WebLogic Workshop 开发 SIP servlet,如何将这些 SIP servlet 与使用 WebLogic Workshop 创建的 Java 页面流集成,以及如何在 SIP servlet 和 HTTP servlet 之间共享数据。Qcu思考者日记网-束洋洋个人博客

准备工作

在探讨示例应用程序之前,确保您具备以下条件:Qcu思考者日记网-束洋洋个人博客

  • 可从 Cantata 下载的 Snowshore 软件媒体服务器。该媒体服务器负责混合构成会议的多个音频和视频流。在此示例中,我使用 Cantata 提供的软件媒体服务器。该软件媒体服务器的免费版本附带一个两端口的许可证,允许一个 SIP 客户端和一个 WebLogic SIP Server。如果到 Cantata 注册,您可以获得具有 90 天评估期试用许可证的不限端口数的媒体服务器。有关更多信息,请单击此处
  • 多个运行 SIP 客户端的系统。每个 SIP 客户端将充当一个会议参与者。Counterpath 和 Paradial 等公司都可提供免费、便宜的 SIP 客户端,但所有的 SIP 客户端应该能够正常工作。在此示例中,我使用 Counterpath EyeBeam 客户端(可从此处购买)。还有一个免费客户端。
  • WebLogic Workshop 8.1 版
  • WebLogic SIP Server 2.1 版

获得媒体服务器的访问权并确定了充当 SIP 会议参与方的多个系统后,便可着手安装和配置 WebLogic Workshop 和 WebLogic SIP Server。有关安装和配置 WebLogic Workshop 以使用 WebLogic 的文档,请参见此处Qcu思考者日记网-束洋洋个人博客

简介

媒体服务器控制对于任何涉及以点对点方式进行多方通信的基于 SIP 的 VOIP 应用程序都至关重要。虽然 WebLogic SIP Server 可用于对使用 SIP 的应用程序进行呼叫控制和会话管理,但实际的媒体本身仍然需要由媒体服务器来代理。下面是媒体服务器通常执行的任务种类的列表:Qcu思考者日记网-束洋洋个人博客

  • 语音和视频会议,包括混合多个音频流以及在活动视频流之间进行切换
  • 播放和录音
  • DTMF(双音多频)捕获和识别
  • IVR,包括 VoiceXML 解析和浏览

本文展示 BEA 编写的一个会议应用程序,用于演示以下内容:Qcu思考者日记网-束洋洋个人博客

  • 实现与使用 MSCML 的 Cantata(或 Snowshore)媒体服务器的互操作性,以播放通告、执行 DTMF 数字收集、建立会议和控制会议
  • 使用 WebLogic Workshop 构建 WebLogic SIP Server 应用程序
  • HTTP 和 SIP servlet 在同一容器中协同工作,共享业务逻辑

该应用程序提供了允许管理员用户创建会议的 Web 前端。创建会议之后,人们可以使用应用程序生成的 SIP ID 呼入此会议。系统会提示呼叫者输入 PIN,PIN 也是由应用程序生成的,并可选择通过电子邮件发送给用户。使用 DTMF 输入 PIN 之后,媒体服务器对 PIN 进行处理,应用程序对其进行评估,如果正确,则将用户添加到会议中。在会议进行过程中,可通过 Web UI 对与会者执行静音、取消静音和终止等操作。这显示了 WebLogic SIP Server 的主要独特优势 — SIP 和 HTTP 环境之间可以共享信息。Qcu思考者日记网-束洋洋个人博客

由于媒体服务器还支持视频会议,因此会议参与者可以随时切换到视频。Qcu思考者日记网-束洋洋个人博客

完整用例可在附录中找到。Qcu思考者日记网-束洋洋个人博客

应用程序架构

该应用程序由三个主要组件组成:Qcu思考者日记网-束洋洋个人博客

  • Web 应用程序,提供 HTTP 会议接口。位于项目的“WebApp”文件夹中。
  • SIP 应用程序,提供管理会议以及与媒体服务器通信的呼叫流逻辑。位于项目的“conference”文件夹中。
  • Conference Manager,Web 应用程序和 SIP 应用程序共享的通用业务逻辑。
  • SIP 代理/注册器应用程序,处理 SIP REGISTER 方法和代理传入请求。以 jar 文件的形式提供。
  • Cantata 媒体服务器。

图 1 显示了该应用程序组件的简单图解:Qcu思考者日记网-束洋洋个人博客

图 1 
图 1. 会议参与者通过 SIP 与代理注册器通话,通过 RTP 与媒体服务器通话(单击图像查看全屏截图)Qcu思考者日记网-束洋洋个人博客

请注意,在图 1 中,请求通过代理传递到会议应用程序,会议应用程序与媒体服务器一起管理会话。会议管理员使用 Web 应用程序通过 HTTP 配置会议。Web 应用程序和会议应用程序使用 Conference Manager 共享状态。Qcu思考者日记网-束洋洋个人博客

Web 应用程序

安装说明介绍了如何使用 WebLogic Workshop 模板创建 SIP 域,从而可在 WebLogic Workshop 中开发 SIP servlet。这使您可以使用运行在同一应用程序中的 HTTP Java 页面流 (JPF) 和 SIP servlet 来构建聚合的 HTTP/SIP 应用程序。此应用程序的 HTTP 表示层通过 JPF 实现。SIP 表示层通过 SIP servlet 实现。Qcu思考者日记网-束洋洋个人博客

应用程序中的 Java 页面流和 JSP 定义 Web UI,用于处理用户身份验证、会议创建、监视和管理。每个 UI 功能都有一个相应的 JPF 来管理相关 JSP 之间的控制流。Qcu思考者日记网-束洋洋个人博客

为进行逻辑分离,将 WebLogic Workshop 项目分到两个相关的文件夹中:Web 应用程序文件夹 (WebApp) 和会议文件夹 (confapp)。WebApp 文件夹包含 HTTP 资源、JSP 和 JPF,用于从 Web UI 处理用户身份验证、会议创建、监视和管理。Qcu思考者日记网-束洋洋个人博客

会议应用程序

会议文件夹包含 com.bea.appserver.conference 程序包,这是会议本身的业务逻辑,包括通过 SIP servlet 实现的、用于接受加入会议呼叫的呼叫流逻辑,以及用于管理呼叫流的状态控制类。com.bea.appserver.conferencing.ConferenceManager 类充当 HTTP UI 的接口点。Qcu思考者日记网-束洋洋个人博客

使用事件*********设计模式从 HTTP 端触发 SIP 操作。例如,当用户断开连接时,会发送包含 MSCML 有效负载的 SIP INFO 消息来断开该用户。Qcu思考者日记网-束洋洋个人博客

SIP 对话细节由 DialogHandler 接口处理,并为 SIP 客户端和 SIP 服务器提供两种接口实现。通过将 SIP 对话状态作为有限状态机封装在单独的业务逻辑中,大大简化了 SIP servlet 编程。这让人想起了 Struts 和 JPF 等基于 MVC 的技术出现之前的 HTTP servlet 世界。可以想象在不久的将来,行业领导者将推动 JSP、Struts 和 JPF 的扩展,使之包括基于 SIP 的表示层。在此之前,在 SIP servlet 应用程序中正确地管理此项内容非常重要。Qcu思考者日记网-束洋洋个人博客

图 2 显示了应用程序的 confapp 部分的简单对象图:Qcu思考者日记网-束洋洋个人博客

图 2 
图 2. confapp 应用程序的对象图(单击图像查看全屏截图)Qcu思考者日记网-束洋洋个人博客

请注意,SIP 呼叫流逻辑是从管理会议的业务逻辑中抽象而来的。由 UI 发起的 SIP 对话通过调用 conferee 上的方法表示成信号,此方法调用 DialogHandler 作为其状态更改逻辑的一部分。同样,由对 com.bea.appserver.conferencing.ConferenceServlet 类的传入请求发起的 SIP 对话也经由 DialogHandler 中实现的状态机制。通过维护自身的内部状态,DialogHandler 能够轻松实现 SIP 呼叫流。Qcu思考者日记网-束洋洋个人博客

驱动媒体服务器

Snowshore IP Media Server 的丰富特性(如播放通告和控制会议)是通过 SIP 消息正文中提供的一种基于 XML 的协议 (MSCML) 驱动的。此应用程序形成 MSCML 来播放通告、建立和解散会议。它还从媒体服务器解析 MSCML,以收集用作会议 ID 和 PIN 的 DTMF 数字。此应用程序是特定于 MSCML 的,我还会继续写一些其他文章,介绍如何遵循其他媒体服务器标准,以及如何以更抽象、跨平台的方式与媒体服器进行互操作。Qcu思考者日记网-束洋洋个人博客

如果您时间有限,那么最简单、最粗放的方法是在 Java String 对象中为应用程序执行的每个独立的媒体服务器操作提供模板 XML。在运行时,应用程序只需执行关键字替换来动态地配置操作:Qcu思考者日记网-束洋洋个人博客

折叠复制内容到剪贴板
  1. public void announceConferee(Conferee user) {  
  2.  // Here we will not change the state of the conference  
  3.  // We will simply instruct the conference server to play the prompt  
  4.  String command = "<mediaservercontrol version="1.0">";  
  5.  command += "<request>";  
  6.  command += "<play>";  
  7.  command += "<prompt>";  
  8.  command += "<audio url="" + Conferee.baseDir + user.getRecordedName() 
  9. + "">";  
  10.  command += "<audio url="" + Conferee.JOIN_PROMPT + "">";  
  11.  command += "</audio>";  
  12.  command += "</audio>";  
  13.  command += "</prompt>";  
  14.  command += "</play>";  
  15.  command += "</request></mediaservercontrol>";  
  16.  SipServletRequest req = dialogHandler.session.createRequest("INFO");  
  17.  try {  
  18.  req.setContent(command.getBytes(), "application/mediaservercontrol+xml");  
  19.  req.send();  
  20.  } catch (Exception e) {  
  21.  e.printStackTrace();  
  22.  }  
  23. }  

随着媒体操作越来越复杂,而且要求从媒体服务器解析 MSCML 消息,扩展我们的工具集以及为媒体服务器控制提供抽象层已经成为必要。使用 XML 绑定框架(如 XMLBeans),利用公共的可用 XML 模式文件获得所需的媒体服务器控制语言是一个不错的开始。在此示例中,使用了 MSCML,并且提供了 XML 模式。一旦将 XML 控制语言包含在 XMLBeans 中,就可以管理解析附加有 XML 有效负载的 SIP INFO 消息之类的更复杂的任务了。以下代码使用 XMLBeans 生成的类来解析从媒体服务器返回到应用服务器的 DTMF 数字:Qcu思考者日记网-束洋洋个人博客

折叠复制内容到剪贴板
  1. // Now get the content  
  2. try {  
  3.  String content = new String((byte[]) req.getContent());  
  4.  // First parse the MSCML response  
  5.  MediaServerControlDocument doc =  
  6.  MediaServerControlDocument.Factory.parse(content);  
  7.  MediaServerControl control = doc.getMediaServerControl();  
  8.  ResponseType resp = control.getResponse();  
  9.  String digits = resp.getDigits();  
  10.  myState = new Connected();  
  11.  notifyListeners(DialogHandler.AUTHORIZATION_EVENT, digits);  
  12.  return myState;  
  13. catch (Exception e) {  
  14.  e.printStackTrace();  
  15. }  

现在已概要介绍了 XML 层,您可以创建控制 API 来进行一般的媒体服务器控制。请留意将来有关此主题的文章。Qcu思考者日记网-束洋洋个人博客

SIP Servlet 最佳实践

应特别注意此应用程序中使用的最佳实践。由于时间关系,并考虑到简单性,在此没有实现所有的最佳实践。此外,SIP servlet 规范非常新,一些最佳实践仍在开发中。但是,应关注以下关键实践的细节:Qcu思考者日记网-束洋洋个人博客

  1. 根据 Web 应用程序开发的最佳实践,表示逻辑和业务逻辑要进行分离。会议逻辑在 com.bea.appserver.conferencing 程序包的ConferenceManager 类中提供。这使得 SIP servlet 和 HTTP servlet 可引用相同的对象,从而建立 SIP/HTTP 聚合。
  2. 在 SIP servlet 之外的业务逻辑中管理会议状态。由于 SIP servlet 是新技术,并且会议本身通过 VOIP 会话表示,因此人们往往会忘记分离表示逻辑和业务逻辑。但是,关键是要认识到 SIP servlet 是表示层的一部分。这允许在 SIP 和 HTTP 之间共享相关信息,例如会议 PIN 和与会者状态。这还允许使用新的 Web UI 或 SIP 呼叫流扩展应用程序。
  3. 此应用程序考虑了更大规模的 SIP 网络。请注意,部署描述文件 sip.xml 明确拒绝路由 SIP REGISTER 请求,因此等于肯定了 SIP servlet 可以与现有注册器一起部署。事实上,注册器和代理功能是独立提供的。这意味着 SIP servlet 应是粒度化、模块化和逻辑独立的,以确保在服务创建和部署时获得最佳灵活性。

下载

本文中讨论的以下各项可供下载:Qcu思考者日记网-束洋洋个人博客

总结

本文展示了一个示例应用程序,演示了如何使用 WebLogic SIP Server 和 WebLogic Workshop 开发聚合的 HTTP/SIP 应用程序,并介绍了媒体服务器与 WebLogic SIP Server 的互操作性,以及在多种表示媒体和不同媒体标准下构建基于 SIP 的应用程序的最佳实践。希望您能够喜欢这个示例,并欢迎您提出宝贵意见。Qcu思考者日记网-束洋洋个人博客

参考资料

  • 下载 Cantata IP Media Server
  • Counterpath EyeBeam SIP Soft phone
  • Paradial SIP 客户端
  • 有关 XMLBeans 的更多信息,XMLBeans 已经打包在 WebLogic Server 中

附录:应用程序用例

以下用例由此应用程序实现。我还提供了到显示相关 SIP 呼叫流的图的链接。Qcu思考者日记网-束洋洋个人博客

创建新会议:

  • 系统用户使用 Web UI 登录应用程序。
  • 系统用户选择创建新会议,方法是指定主机 URI 和电子邮件地址。
  • 应用程序创建新会议,并将以下会议信息通过电子邮件发送到主机:会议 SIP URI + PIN。

删除会议:

  • 系统用户使用 Web UI 登录应用程序。
  • 系统用户选择删除现有会议。
  • 从系统中删除会议。

与会者加入会议:

  • 与会者通过 SIP 客户端(支持的 SIP 客户端包括 Eyebeam 和 Paradial 的 Real SIP Client)使用提供的会议 SIP URI 拨号进入会议。
  • 会议应用程序检查此会议是否存在。
  • 如果此会议不存在,则拒绝 INVITE。
  • 如果此会议存在,并且这是第一位加入会议的与会者,则在应用服务器上保留相应的会议资源(呼叫流 1呼叫流 2)。
  • 随后将此与会者的媒体流连接到 Cantata Media Server。
  • 应用程序提示与会者,要求输入 4 位会议 PIN 号(呼叫流 3)。
  • 应用程序验证输入的 PIN(呼叫流 4)。
  • 如果 PIN 无效,则应用程序播放一条错误消息,并提示与会者重试。如果连续三次 PIN 输入错误,则应用程序将断开此用户。
  • 输入正确的会议 PIN 号之后,应用程序将播放一条消息,提示用户记录姓名。
  • 随后用户被置于会议中,同时向其他与会者通告其姓名(呼叫流 5)。

删除与会者:

  • 用户登录到应用程序的 Web UI。
  • 用户选择监视所有现有会议。
  • 用户选择一个会议,然后可以看到当前所有与会者。
  • 现在用户可以单击任何一个与会者,将其从会议中断开。

使与会者静音:

  • 用户登录到应用程序的 Web UI。
  • 用户选择监视所有现有会议。
  • 用户选择一个会议,然后可以看到当前所有与会者。
  • 现在用户可以单击任何一个与会者,使其静音(呼叫流 6)。

音频和视频会议支持:

  • 任何与会者均可仅以音频方式加入会议,或者以音频和视频方式加入会议。
  • Cantata(或 Snowshore)媒体服务器将实现激活语音的视频混合,可向其他与会者显示当前发言者。

与会者离开会议:

  • 任何与会者都可以随时决定离开会议,只需执行标准的 SIP 过程。
  • 如果会议主持人离开会议,则整个会议将终止。(注意:目前并不要求在会议开始之前等待会议主持人。)

Jeff Bean 是 BEA Global Alliances Group 的技术经理。他拥有 9 年的 IT 经验,担任过软件开发人员、专业服务顾问和系统工程师。Qcu思考者日记网-束洋洋个人博客

Sudhrity Mondal 是 BEA Global Alliances Group 的高级首席架构师。他拥有 14 年的行业经验,专门从事企业集成解决方案方面的工作。Qcu思考者日记网-束洋洋个人博客

Marcelo Oliveira 是一名软件工程师,目前就职于 Cisco Systems 的新兴市场业务部门。Qcu思考者日记网-束洋洋个人博客

 

(转载本站文章请注明作者和出处 思考者日记网|束洋洋个人博客 ,请勿用于任何商业用途)

『访问 思考者日记网404页面 寻找遗失儿童』

告知
  •     本站90%以上文章均属原创,部分转载已加上原作者出处。 如需转载本站文章请您务必保留本站出处!
  •     打广告评论者请自重,请为广大网友提供一个健康干净的网络空间。
  • 感谢主机屋提供网站空间;
  • 感谢万网阿里云提供域名解析;
  • 感谢EmpireCMS提供CMS系统;
  • 感谢bootstrap展示本站前端页面;
  • 感谢Glyphicons Halflings提供字体;
  • 感谢大家一直以来对本站的喜爱,感谢大家!
近期文章 建议与反馈