Linux 上的 Voice-Over IP
我们都有遍布世界各地的朋友、家人和 Linux 合作者,我们都喜欢交谈。我们喜欢拿起电话闲聊——但长途电话费用很高,国际长途费用更糟。我们想要联系的许多人(如果不是全部)都可以访问互联网。现在我们可以使用普通的电话通过互联网使用 Linux 拨打电话。
IP 语音是答案,但这项技术迁移到 Linux 的速度一直很慢。诚然,已经有一些应用程序可以使用声卡来做到这一点,但坦率地说,耳机和声卡解决方案是一种笨拙的方案。当有来电时,耳机不会响铃,而且大多数声卡都采用半双工语音,充其量是令人讨厌的,而且声卡无法连接到您的个人或企业电话系统。其他技术已在 Win32 平台上可用,但不适用于 Linux。这种情况正在迅速改变,特别是随着 Quicknet Technologies, Inc. 最近预先发布了用于 Internet PhoneJACK 和 Internet LineJACK 语音接口卡的新 Linux 驱动程序的 alpha 版本。
Quicknet 的 Internet PhoneJACK 卡提供了一个低成本、全双工的音频接口和一个到普通电话线的电话线接口。该卡具有 POTS(普通老式电话服务)接口 (RJ-11),您可以在其中插入普通模拟电话并通过它使用互联网拨打电话。当有来电时,电话会响铃。当您想要拨打外拨电话时,您可以从电话或软件控制拨号。在所有方面,它都是一部电话——它只是通过网络工作。如果您呼叫的对方也拥有 Internet PhoneJACK/LineJACK 或兼容软件,那么您的通话是免费的!如果您想给他们的普通电话线(而不是通过他们的计算机)打电话,您也可以通过像 Net2Phone 这样的 PC 到电话服务来做到这一点。在这种情况下,您已经(通过浏览器)与提供商设置了一个帐户,您的呼叫将通过网络传输给他们,然后他们将通过他们的系统将呼叫转接到您的对方,并向您收取较低的服务费。显然,最好的情况是双方都拥有 Quicknet 卡,因为这样您就可以避免 PC 到电话服务提供商的费用,并获得最高的质量。另一种免费的方式是使用 Quicknet Internet LineJACK 卡。
Internet PhoneJACK/LineJACK 卡的一个巨大优势是内置于卡中的音频压缩功能(编解码器)。这些包括 G.711 (64Kbps)、G.723.1 (6.3Kbps 和 5.3Kbps) 和 TrueSpeech (8.5/4.8/4.1Kbps) 硬件音频压缩。这些压缩技术可以免费使用,无需任何版税或费用——许可成本是硬件成本的一部分。这意义重大,因为它允许小型开发人员构建压缩语音应用程序,而无需花费数千美元来许可编解码器。换句话说,它使小开发者可以免费使用与大公司相同的技术优势。
Internet LineJACK 卡增加了一个额外的功能:它具有 PSTN(公共交换电话网络)接口。PSTN 插头 (RJ-11) 连接到您的普通电话线,允许您使用该卡拨打和接听普通电话。所有 DTMF 和音频生成功能都内置在 Internet LineJACK 中。它还设计为通过软件控制与世界各地不同的电话网络兼容。(不同的国家/地区具有不同的电气和音频信号,Internet LineJACK 能够通过选择适当的参数集与之接口。)借助适当的软件,您可以使用 Internet LineJACK 在互联网和普通电话系统之间创建一个单线网关。为了解决在没有适用的服务提供商的情况下无法进行 PC 到电话呼叫的问题,您只需在您想要呼叫的区域的系统上设置一个 Internet LineJACK 卡即可。您的语音呼叫在您的计算机上“跳上”互联网,然后在远程 Internet LineJACK 处“跳下”,并进入该社区的本地 PSTN 以完成呼叫——全部免费。
重要的是要意识到,一个 G.723.1 压缩音频“呼叫”仅使用 6.4Kbps。即使在普通的 33.6Kbps 调制解调器呼叫中,也有足够的带宽用于通过单个链路进行多次并发呼叫。
直到最近,这些卡的驱动程序才仅适用于 Windows 95/98/NT。然而,Quicknet 最近发布了他们 Linux 驱动程序的一些早期预 alpha 版本,以及一个示例应用程序,以提供其工作原理的示例。
您可以在 www.quicknet.net/develop.htm 获取 Linux 驱动程序。请注意:这些仍然是早期的预 alpha 版本,不适合胆小的人。在这个早期阶段,这些仅推荐给希望尝试新技术并且不怕摆弄其系统的人。当然,大多数 Linux 用户都是如此,但我们必须警告您。该驱动程序以压缩的 tar 文件分发,其中包括示例应用程序源代码和一个简单的 HOWTO。
许多 Linux 用户可能会批评 Quicknet,因为他们的设备驱动程序不是开源的。Quicknet 经过仔细的理性商业决策,决定保持其设备驱动程序仅为二进制文件,并且不透露源代码。将发布完整的 API 以详细说明如何使用设备驱动程序,但源代码将是封闭的。值得赞扬的是,Quicknet 意识到了 Linux 的巨大机遇,并进行了必要的投资来编写 Linux 驱动程序。Quicknet 还通过雇用 Linux 开发人员在内部工作,继续在该领域进行投资。
但是,设备驱动程序随附的示例代码是根据 Lesser GNU Public License (LGPL) 发布的。虽然可能有人要求驱动程序开源发布,但 Quicknet 坚信,拥有稳定、可靠的仅二进制驱动程序对于大多数用户来说已经足够了,并且 Quicknet 致力于支持这样的驱动程序。
这些卡的设备驱动程序需要 2.2 系列内核,因为一些底层功能利用了新内核中的更改。最新的模块使用 MODVERSIONS 支持编译,因此假设您的内核是,如果模块和内核之间的符号表兼容,则内核将加载该模块。在撰写本文时,我们正在使用 2.2.10 内核进行开发。
我们的模块有一个专用的“主设备号”,因此它们可以与 insmod 和 modprobe 等普通模块工具一起使用。您只需在您的 conf.modules 文件中添加几行,普通模块工具即可与我们的设备驱动程序一起使用。有关如何执行初始配置的更多信息,请参见下文。
您需要在连接的每一端至少安装一个 Internet PhoneJACK/LineJACK 卡。请注意,Linux 驱动程序的初始版本仅支持 Internet PhoneJACK 卡,尽管当您阅读本文时,Internet LineJACK 也将受到支持。这些卡是 ISA 总线设备,使用即插即用进行配置,并且不使用 IRQ。该驱动程序将在任何一个系统中最多支持 16 个卡,可以是两种类型的任意组合。
由于 Quicknet 卡是即插即用设备,您将需要 isapnp 工具包来配置这些卡。此软件包可能随您的 Linux 发行版一起提供。文档可在网上 metalab.unc.edu/LDP/HOWTO/Plug-and-Play-HOWTO.html 获得。
Internet PhoneJACK 只有一个配置寄存器,需要 16 个 I/O 端口。Internet LineJACK 卡有两个配置寄存器。Isapnp 报告 I/O 0 需要 16 个 I/O 端口,而 I/O 1 需要 8 个。Quicknet 驱动程序假定这些寄存器配置为连续的,即,如果 I/O 0 设置为 0x340,则 I/O 1 应设置为 0x350。
如果您是 isapnp 工具的新手,可以通过执行以下操作快速入门
运行 pnpdump 以获取空白的 isapnp.conf 文件
pnpdump > /etc/isapnp.conf
编辑 /etc/isapnp.conf 文件以设置寄存器 I/O 地址。
如果您有多个 Quicknet 卡,请确保您没有任何重叠。如果您在同一系统中混合使用 Internet PhoneJACK 和 Internet LineJACK 卡,请格外小心。
要安装和加载驱动程序,请执行以下操作
使用 tar 解压缩分发文件。
运行包含的 ixj_dev_create 脚本以在 /dev 目录中创建设备文件。此脚本将创建 /dev/ixj0 到 ixj16。
运行 isapnp 配置实用程序以正确配置卡。
编辑 /etc/conf.modules 文件以添加一行,该行指定您刚刚使用 isapnp 配置的卡的 I/O(输入/输出)端口,以及一行将设备号映射到我们设备的名称。您将需要添加以下两行
options ixj io=0x300 ixjdebug=a0 alias char-major-159 ixj
此示例假定您在 I/O 地址 0x300 处有一张卡;如果将卡分配给不同的端口,您将需要修改该值。
使用 insmod 或 modprobe 加载模块,就像加载任何其他模块一样。
通过运行 lsmod 验证模块是否已加载。
执行使用该模块的应用程序 (tpjack 或 tpjackd)。
驱动程序附带了示例应用程序,以演示其用法。以下是一些可以直接使用的示例
intercom.c:演示了驱动程序在多个卡之间传递音频的能力,而无需通过用户空间传递音频数据。应用程序只需要指示哪些卡将相互通话——其余的由驱动程序完成。
inter2.c:与 intercom.c 相同的概念,只是它通过用户空间传递数据。在此示例中,应用程序必须处理读取和写入设备文件以在卡之间传递数据。
tpjackd.c:这是非常基本的 IP 电话应用程序的服务器端。它只是在 TCP 端口上等待传入连接。收到连接后,电话会响铃。当拿起电话时,它开始将带有音频数据的 UDP 数据包传递到 tpjack.c 程序。
tpjack.c:这是客户端,对应于 tpjackd.c。
tpjackd 是守护程序应用程序,它侦听传入呼叫。要使用它,请输入
tpjackd dev port
dev 是设备的名称,通常是 /dev/ixj0,但如果系统中有多个卡,则可能是 /dev/ixj1 等。port 是守护程序将侦听传入振铃的端口的名称。
守护程序应用程序现在作为真正的守护程序运行。它在启动时断开与控制终端的连接,并且仅在后台运行,将消息记录到 syslog。开发期间的典型用法是在 xterm 窗口中使用以下命令观看日志记录
tail -f /var/log/messages
tpjack 是呼叫应用程序,通过键入以下内容来使用
tpjack dev host port
dev 是设备的名称,通常是 /dev/ixj0,但如果系统中有多个卡,则可能是 /dev/ixj1 等。host 是运行守护程序的主机的名称(名称,而不是 IP 地址)。请注意,两个主机的名称都需要可解析,可以通过 DNS 或本地主机文件。port 是守护程序将侦听传入振铃的端口。这些示例程序提供了一个关于如何使用驱动程序的示例,并且具有在互联网上实际运行良好的额外优势。作者已使用它在加利福尼亚州旧金山和(大致)德克萨斯州达拉斯之间进行对话。语音质量不如使用实时协议 (RTP) 时预期的那么好,但绝对足以进行清晰的对话。
驱动程序的工作正在快速进行中,因此请经常查看网站以获取新版本。当您阅读本文时,我们应该正在进行 beta 测试,并完全支持该卡的所有功能。
示例代码很粗糙,不遵循任何 IP 语音标准(H.323、SIP 等)。对这些协议的支持将在稍后推出,但可能不会以源代码形式提供,因为存在其他许可限制。初始示例代码的目的是提供一种简单的方法来测试驱动程序并进行简单的语音通话。
目前,没有适用于 Linux 的软件支持使用任何 PC 到电话网关服务提供商(例如 Net2Phone)。当然,这种情况也很快会改变。
这些卡的功能是无限的。随着 Linux 驱动程序的可用性,我们可以制作各种服务器来执行电话功能——通过互联网以及有或没有普通电话网络。我们可能很快会看到的一些东西包括 VoIP PBX、语音邮件服务以及 PC 到 PC 和 PC 到电话网关。然而,这项技术最令人兴奋的应用可能尚未被想象出来。这是一个广阔的领域,正在恳请 Linux 社区开始推出很酷的新应用程序。Quicknet Technologies 希望将设备驱动程序以及一些简单的库放在适当的位置,以促进这种创新。
更多信息可在 Quicknet 网站 http://www.quicknet.net/ 上获得。已启动一个新的邮件列表,为开发人员提供一个论坛,以讨论设备驱动程序的开发和使用。要订阅,请发送电子邮件至 majordomo@linux.quicknet.net;在邮件正文中,键入
subscribe linux -sdk your_email_address
验证您的订阅后,您可以发送邮件至 linux-sdk@linux.quicknet.net。如果您有任何问题,请发送电子邮件至 linux@quicknet.net,我们将尽力为您提供帮助。
Internet PhoneJACK 和 Internet LineJACK 是 Quicknet Technologies, Inc. 的注册商标。

