使用 LTSP 和软电话构建呼叫中心

作者:Michael George

一位新客户联系我们,需要为办公室配置设备。客户乐于接受开源软件,并对使用 Linux 感兴趣。作为一个非营利组织,该项目的预算很紧张。

我们为新办公室配置了一台运行 Linux 终端服务器项目 (LTSP) 软件的服务器,以便从一开始就实现经济高效的桌面。然后,我们安装了一台 Asterisk 服务器作为呼叫中心的 PBX。为了方便员工,我们希望在他们的终端上配备可用的软电话和耳机,以实现免提操作。

本文讨论了 LTSP 构建环境的安装和使用,以构建 Qt 和 KPhone,以便员工可以在其终端本地运行 KPhone。本文不讨论 Linux 或 Asterisk 的安装,但我包含了 KPhone 的相关上下文,它位于 Asterisk sip.conf 文件中。我们在这个特定的 LTSP 服务器上使用了 Gentoo,但任何 Linux 发行版都可以胜任这项工作。

所需软件

本项目所需的主要软件包是 LTSP、KPhone 和 LTSP 构建环境 (LBE)。LTSP 可以轻松地为主要服务器提供瘦客户端访问。我们经常推荐 LTSP 作为装备办公室的一种经济方式,因为它将资金资源集中在主服务器上,而不是在各个工作站上。向办公室添加新用户的增量成本相对较小,并且管理得到了简化。

客户的新办公室旨在成为一个小型呼叫中心,因此免提电话操作是一大优势。我们想尝试使用耳机和放大器,它们使用计算机声卡进行连接,而不是硬件电话。这些耳机与每个用户本地工作站上的软件 SIP 电话相结合,使我们能够在无需购买单独的电话设备的情况下满足他们的电话需求。

由于我们已经使用 Asterisk(请参阅在线资源)作为办公室的 PBX,因此使用开源软件电话似乎是合乎逻辑的。我们决定使用 KPhone(请参阅资源)作为软件 SIP 电话,因为它在之前测试过的独立系统上已被证明是可靠的。当时我们调查的每个 SIP 软电话软件包的缺点之一是没有一个支持网络音频协议。因此,它们需要在物理上装有声卡的工作站上本地运行。由于这些工作站是从主服务器启动的瘦客户端,因此 KPhone 需要驻留在每个工作站的文件系统中。当用户从服务器上运行的桌面运行 KPhone 时,KPhone 进程需要在本地终端环境中启动。

KPhone 不是 LTSP 软件包的标准组成部分,因此我们需要在本地工作站的根文件系统中构建它,该文件系统在启动时通过 NFS 从服务器挂载。为终端的根文件系统构建软件需要 LBE(请参阅资源)。在 LBE 中构建软件还要求文件系统中存在所有必要的库。KPhone 的另一个好处是 Qt 库是 LTSP 中已有的库之外唯一需要的库。

LTSP 的安装和配置在 LTSP 文档(请参阅资源)中有详细说明。与 LTSP 标准安装的一个偏差是,DHCP 配置文件必须引用 LBE 构建的根文件系统,而不是随 LTSP 软件包安装的根文件系统(清单 1)。

清单 1. 我们的 dhcpd.conf 的 LTSP 部分

# LTSP Path Options
option root-path
  "192.168.42.254:/usr/local/src/lbe/opt/ltsp/i386";

#LTSP boot image (relative to the TFTP root)
filename
  "/pxe2/pxelinux.0";

从技术上讲,我们不需要 LTSP 软件包,因为 LBE 包含了必要的引导映像和根文件系统。但是,如果您还不熟悉 LTSP,我建议您首先安装该软件包并使其运行。部署 LTSP 涉及配置几乎所有 Linux 发行版都包含的其他标准软件:DHCP 用于分配 IP 地址,工作站的引导映像和根文件系统信息;TFTP 用于客户端工作站检索其引导映像;以及 NFS 用于瘦客户端远程挂载其根文件系统和 /home 文件系统以运行远程应用程序。安装 LTSP 为所有这些软件包提供了演示配置,这使得新手更容易进行设置。

主要的 LTSP 文档很好地描述了在客户端本地运行应用程序的大部分准备工作。它们的安装和配置也在 LTSP 4.1 网页上进行了介绍。除了上述软件之外,您还需要在服务器上配置 SSH 客户端和 NIS。

SSH 是我们用于在远程客户端上启动进程的方法。请注意,LTSP 4.1 文档演示了使用 rsh 启动应用程序。虽然这可以工作,但 rsh 所需的守护程序不再是 LTSP 软件包的一部分。SSH 现在是启动本地应用程序的规范。您可以在 LBE 文档的“本地应用程序”部分找到有关准备使用 SSH 启动本地应用程序的信息。

需要 NIS 是因为瘦客户端在启动应用程序时需要通过 SSH 验证用户身份。NIS 配置以 NIS HOWTO 为指导。文档中没有立即显而易见的一项是,NIS 会抱怨 /etc/publickey 不存在。使用以下命令创建该文件touch /etc/publickey解决了这个问题。

一旦所有支持软件就位,配置 LTSP 以运行本地应用程序就很容易:设置LOCAL_APPS = Y在 LTSP 根文件系统中的 /etc/lts.conf 中。这会导致客户端通过 NFS 从服务器挂载 /home 目录。此外,通过在客户端上创建 /var/yp/nicknames、/etc/yp/conf,使用 lts.conf 文件中 NIS_DOMAIN 条目的值运行 domainname,并运行 ypbind,NIS 被激活。sshd 守护程序也在客户端上被激活。

为了使 SSH 操作对用户透明,我们需要创建 SSH 密钥,而无需用户自己执行此操作。为了实现这一点,我们在 Gentoo 中安装了 superadduser,据报道它是来自 Slackware 的 adduser(请参阅资源),并对其进行了修改,以便在创建用户时自动为用户生成 SSH 密钥(清单 2)。

清单 2. /usr/sbin/superadduser 的添加内容

# su to the user and generate their SSH keys
su - "$LOGIN" -c "ssh-keygen -q -t dsa -C '' -N '' -f "$HME"/.ssh/id_dsa"
#
# cp the new public key to the authorized_keys file
cp "$HME"/.ssh/id_dsa.pub "$HME"/.ssh/authorized_keys
chown "$LOGIN":"$( echo $GID | awk '{print $2}')" "$HME"/.ssh/authorized_keys
#
# update the NIS stuff
(cd /var/yp; make > /dev/null)

除了配置本地应用程序在客户端终端上运行之外,我们还需要确保瘦客户端启动时声卡处于活动状态。通常,人们会设置SOUND = Y, SOUND_DAEMON = <nasd 或 esd>, VOLUME = <默认音量级别>以及可能SMODULE_01 = <ISA 配置字符串>。但是,这样做不仅会导致声音驱动程序被加载到内核中,而且还会启动声音守护程序,这不是我们想要的。我们需要声卡在终端上启动 KPhone 时可用。

我们改为设置SOUND = N以防止激活正常的声音系统,并设置MODULE_01 = <PCI 声卡的内核模块>,因为 LTSP 不支持 isapnp,所以音频需要 PCI 音频设备。我们还设置RCFILE_10 = "kphone"以运行初始配置脚本,通过使用音频设备为 KPhone 准备系统。然后,在客户端根文件系统的 /etc/rc.d 中,我们放置了 KPhone 脚本(清单 3),以启用对 /dev/sound/* 文件的访问。-rwrwrw 访问不是最安全的,但由于一次只有一个用户在终端上运行进程,因此它可以正常工作。最后,我们打开麦克风并调整增益和音量级别。

清单 3. <LTSP 根目录>/etc/rc.d/kphone

#!/bin/bash
echo Setting up the system for using kphone locally

echo change the permissions on the audio files...
/bin/chmod 666 /dev/sound/*

echo Turn on the microphone, adjust gain and volume
/bin/aumix-minimal -m R

echo Turn gain and volumes up to maximum
/bin/aumix-minimal -m 85
/bin/aumix-minimal -p 100
/bin/aumix-minimal -v 100
构建 Qt 和 KPhone

现在您已经配置并运行了 LTSP 环境,您可以构建 LBE。从 CVS 获取 LBE 非常简单,只需

cvs -d :pserver:anonymous@cvs.ltsp.org:/usr/local/cvsroot checkout -s

然后您需要su成为 root 用户——使用sudo使用 LBE 并不总是可靠的——并运行./build_all。您可以在这里休息一下,因为在 LBE 中构建 LTSP 需要一些时间才能完成。

一旦您为终端构建了新的根文件系统,请更改您的 DHCP 配置以引用该引导映像和根文件系统,并重新启动您的 DHCP 服务器。您可能需要将 /etc/lts.conf 从旧的 LTSP 根文件系统移动到新的根文件系统。您还应该将系统范围的 SSH known-host 密钥(您根据 LBE 文档的“本地应用程序”部分创建的密钥)移动到新的文件系统。

现在我们需要在客户端的根文件系统内构建 Qt 库,然后再构建 KPhone。LTSP 构建环境 (LBE) 使这变得更加易于管理。在环境中添加要构建的软件包相当于在以软件包命名的目录中创建一个 package.def 文件。package.def 文件描述了如何获取、验证下载、解包、配置、构建和安装软件包软件。ltsp-src 目录中的构建脚本然后执行 chroot 并执行构建过程。

通过反复试验以及在 LTSP IRC 频道(请参阅资源)上的讨论,我们能够构建所需的 package.def 文件(有关这些文件,请参阅资源)。在 LBE 根目录下的 ltsp-src/qt 中,构建 Qt 的 package.def 文件是一个简单的过程。每个构建都将相同的变量导出到构建环境。另请注意,在 CONFIGURE 阶段显式启用了线程。如果 Qt 启用了线程,则 KPhone 构建起来容易得多,但默认情况下 Qt 中未启用。

构建 KPhone 稍微复杂一些。package.def 文件(请参阅资源)运行良好,但 x-includes 配置选项似乎没有更改生成的 Makefiles。这会在构建 trayicon.cpp 时导致编译错误。手动添加-I/usr/X11R6/include到配置阶段之后的 kphone/kphone/kphone/Makefile(清单 4)中的 CFLAGS 似乎解决了这个问题。然后在 LBE 中构建 KPhone 的步骤是

ltsp-src# ./build --configure --only=kphone
ltsp-src# vi kphone/kphone/kphone/Makefile
   (Add "-I/usr/X11R6/include" to CFLAGS)
ltsp-src# ./build --only=kphone

我们还注意到,起初 KPhone 无法正确找到图标。从 LBE 根目录(客户端根目录中的 /usr/share)链接到 opt/ltsp/i386/usr/share 中的 ../../share/kphone,使 KPhone 能够正确找到图标。

清单 4. kphone/kphone/kphone/Makefile 中修改后的 CFLAGS

CFLAGS=-I/usr/X11R6/include -I/usr/qt/3/include \
  -Wall -O3 -I. -I../gsm -I../ilbc -I../dissipate2 \
  -D_REENTRANT=1 -DQT_THREAD_SUPPORT=1 \
  -DHAVE_LIBX11=1 -DHAVE_LIBXEXT=1 -DHAVE_LIBXT=1 \
  -DHAVE_LIBICE=1 -DHAVE_LIBSM=1 -DHAVE_LIBPNG=1 \
  -DSTDC_HEADERS=1 -DHAVE_FCNTL_H=1 \
  -DHAVE_SYS_IOCTL_H=1 -DHAVE_UNISTD_H=1 \
  -DHAVE_SELECT=1 -DINCLUDE_STDLIB_H=1 $(MOREDEFS)

为了运行 KPhone,我们在终端服务器上的 /usr/bin 中放置了一个名为 kphone 的脚本(清单 5)。此脚本只是打开对 xserver 的访问,确定用户所在的终端,并在该终端上启动 KPhone 进程。

清单 5. 服务器上的 KPhone 脚本

#!/bin/bash
xhost + > /dev/null
HOST=`echo $DISPLAY | awk -F: '{ print $1 }'`
export HOST
ssh ${HOST} env DISPLAY=:0.0 /bin/kphone

为了方便用户,我们在 KMenu 中为 KPhone 创建了一个条目,用户可以选择该条目或将其移动到他们的 Dock 上(如果他们愿意)。此条目是通过将文件 kphone.desktop(清单 6)添加到终端服务器上的 /usr/kde/3.3/share/applications/kde 来创建的。

清单 6. kphone.desktop

[Desktop Entry]
Comment=
Exec=kphone
GenericName=Office Telephone
Icon=/usr/kde/3.3/share/icons/Locolor/32x32/apps/kab.png
Name=kphone
Path=
StartupNotify=true
Terminal=0
TerminalOptions=
Type=Application
Categories=Qt;KDE;Office
X-KDE-SubstituteUID=false
X-KDE-Username=

然后,用户可以选择 KPhone 菜单项并启动 KPhone(图 1)。首次运行该应用程序时,用户必须选择“文件”→“身份”以打开“身份”对话框(图 2)并输入连接信息。此处输入的数据必须与 VoIP 服务器(在本例中为 Asterisk)上的 SIP 帐户的信息匹配。由于 KPhone 将其配置存储在用户的 home 目录中,因此只需在用户首次启动 KPhone 时进行配置。由于 /home 是从服务器通过 NFS 挂载的,因此用户登录的工作站就是他们的电话,因此如果用户更换工作站,电话实际上会跟随他们。用户在服务器上注册后,他们可以从呼叫对话框和 DTMF 面板(图 3)拨打电话。

Building a Call Center with LTSP and Soft Phones

图 1. 用户的桌面环境在 LTSP 服务器上运行,但 KPhone 在本地运行。

Building a Call Center with LTSP and Soft Phones

图 2. 首次为新用户运行 KPhone 时,输入 Asterisk 服务器的信息。

Building a Call Center with LTSP and Soft Phones

图 3. KPhone 呼叫对话框的工作方式类似于硬件电话。

最初我们让 KPhone 运行起来了,但是任何操作的响应时间都很糟糕。每当用户执行导致发送 SIP 消息的操作时——拨打电话号码、按下活动通话中的电话按钮、接听或挂断电话——操作都需要将近一分钟才能发生。

我们确定这个问题是由于 DNS 名称解析问题导致的,该问题正在等待超时。解决方案是将条目放入 /etc/hosts 中,用于每个将运行 KPhone 的工作站,在终端服务器上安装 dnsmasq,并使终端引用终端服务器作为其 DNS 服务器,这在 dhcp.conf 中配置。还有其他可能更好的方法来解决这个问题,但这个解决方案花费最少的时间进行配置和运行,并且它有效。找到问题的根源才是最难的部分。

注意事项

这个系统有一些缺点。有时 KPhone 会无缘无故地关闭,这可能会非常烦人。我们尚未确定此问题的原因,并且我们希望将 KPhone 升级到 4.1 可能会有所帮助。

KPhone package.def 文件包含构建 KPhone 4.1.1 所需的行。上面提到的针对 4.0.5 的 Makefile 更改仍然适用于 4.1.1。但是,我们的初步测试表明,4.1.1 存在相同的无故突然关闭问题。我们已向 KPhone 的维护者询问他们是否可以提供帮助,但到目前为止,我们尚不清楚问题的原因。

另一个缺点是,当电话响铃时,它会通过耳机响铃并在屏幕上发出视觉警报。如果用户没有戴着耳机坐在终端前,他们将不知道他们的电话正在响铃。一旦呼叫中心全面投入运营,操作员可能会将大部分时间花在终端上,因此这可能不是问题。

结论

我们现在已经安装了 KPhone,并且可以从连接到 LTSP 服务器的任何终端运行它。添加另一个用户就像在服务器上为他们创建一个帐户,在电话系统上为他们添加一个 SIP 电话条目,并让他们配置 KPhone 一样简单。终端服务器是每个人桌面的单一维护点。即使 KPhone 在每个终端上本地运行,LTSP 构建环境也是所有终端的单一维护点。

系统的成本集中在终端服务器和电话系统上。每个新用户的增量成本是低端终端和声卡耳机的成本。与在每个桌面放置一个完整的工作站以及一个支持耳机的硬电话相比,此费用更具成本效益。

致谢

感谢 Linux 终端服务器项目的 James McQuillan 提供的出色文档(LTSP 和 LBS)以及 LTSP IRC 频道上帮助我使 KPhone 在本地运行的所有人。还要感谢 Thorsten Kukuk 撰写了“The Linux NIS(YP)/NYS/NIS+ HOWTO”。感谢 Mark Spencer、Digium 以及参与 Asterisk 项目的所有人,他们使开源电话成为现实,还要感谢 KPhone 的作者。感谢 Qt 应用程序框架的创建者 Trolltech。

本文资源: /article/8460

Michael 在密歇根理工大学和普渡大学获得了计算机科学学位,时间比他愿意承认的要早得多。他现在与妻子和五个孩子住在密歇根州的农村地区。他自 1994 年以来一直在使用 Linux,现在在 Ideal Solution 工作,寻找新的和创造性的方法来将包括 LTSP 和 Asterisk 在内的开源软件应用于客户的工作中。可以通过 george@idealso.com 联系他。

加载 Disqus 评论