电话拨号程序”概述电话拨号程序允许从个人计算机上进行语音电话、视频电话及会议视频电话。
要打电话,只需有对方的电话号码、IP 地址或域名系统 (DNS) 名称。电话拨号程序使您可以用连接计算机的电话进行呼叫,呼叫可以从调制解调器经过网络,再经过电话交换机连接到局域网 (LAN) 或 Internet 地址。
微软自带一个 H323 TSP,可是不知道这玩意怎么用
(3) Telephony Service Providers Telephony Service Providers(TSPs)负责独立于低层协议的呼叫模型并解释为特定协议的呼叫控制机制。TAPI3.0对TAPI 2.1 TSPs提供可靠的后向兼容性,两个IP TSPs缺省地与微软的TAPI3.0相匹配:一个是H.323 TSPs,另一个是IP广播会议的TSP。
Windows Server 2003包括许多网络功能的加强,适用于新的企业网络应用.本文介绍了网络服务部分新的特性和增强功能.讨论了Windows Server 2003实现的网络服务支持的改进,并简要地介绍了部分新特性的应用场合.
TAPI3.1 和TAPI 服务提供(TSP)
先前的Windows操作系统内置了早版本的电话API,例如Windows 2000内置TAPI3.0.TAPI可以为用户创建各种类型的电话服务应用.TAPI 3.1支持Microsoft COM并为程序员提供了一组COM对象.这使得使用任何COM兼容编程应用和脚本语言都可以写出电话应用.同样包含在Windows Server 2003中的TAPI服务提供基于H.323的IP电话和TCP/IP网络上的IP组播的音频和视频会议.这在早版本的Windows TSPs 提供的功能中是没有的.H.323 TSP和媒体服务提供(MSP)提供对H.323 版本2功能的支持.
TAPI3.1同时提供了:文件终端;可插入终端;USB电话TSP;TAPI服务的自动发现.
此外,对于H.323 还实现了丰富的呼叫控制服务:CALL Hold服务,Call Transfer服务, Call Diversion服务, Call Park 和Pickup服务.
TAPI3.0包含有4个主要的代码单元:TAPI3.0 COM对象、TAPI服务器、电话服务提供单元(TSPs)和媒体服务提供单元(MSPs)。
TAPI3.0的COM对象主要有以下5个:TAPI、地址、终端、电话和电话集线器,
如何使用tapi对象
用tapi能够比较方便地执行一个呼叫和作一个呼叫应答,它对电话的操作方便快捷,给编程者带来了很大的方便。下面是执行一个呼叫和呼叫应答的大体过程。
执行一个呼叫
1. 创建和初始化一个tapi对象
2. 用tapi对象解析在一个计算机上的可用地址
3. 解析每一个地址对象所支持的地址类型
4. 选择一个地址对象
5. 用address对象中的createcall方法创建一个call对象
6. 选择call对象的适当终端
7. 用call对象的connect方法执行一次呼叫
呼叫应答
1. 创建和初始化一个tapi对象
2. 用tapi对象解析在一个计算机上的可用地址
3. 解析每一个地址对象所支持的地址类型
4. 选择一个地址对象
5. 根据不同的媒体类型用适当的address对象来登记
6. 用一个address对象登记呼叫事件句柄
7. tapi通过itcallnotification通知一个呼叫,并创建一个call对象
8. 选择call对象的适当终端
9. 用call对象的connect方法执行呼叫
10. 用call对象的answer方法执行应答
电话服务 API (TAPI) 允许您配置所有电话程序的拨号规则。如果在配置拨号之前运行支持 TAPI 的程序(例如电话拨号程序),程序通常提示要求拨号所需的最简信息。要完整地配置某计算机上的拨号规则,请使用“控制面板”中的“电话和调制解调器选项
概述:TAPI3.0是微软提供的COM组件,集成了传统电话的媒体流控制功能,是电话应用程序设计普遍采用的编程接口.文中介绍了TAPI3.0的基本功能和体系结构,然后从初始化、建立呼叫连接、呼叫应答以及消息响应这几方面详细阐述了通过TAPI3.0实现IP电话连接和控制的原理与方法.利用微软提供的TAPI3.0编程接口,开发了一个实现IP呼叫连接和控制的应用程序,在实际应用中运行稳定,取得了较好的效果.
我用C# 通过TAPI3写了一段拨号程序,可以正常拨号,对方也可以接听,但是却听不到我的声音,我可以听到他的。和用超级终端一样,我觉得不应该是程序的问题,应该是我的硬件设置的问题。请教有过这种应用的朋友,你们是怎么做的。
C#代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using TAPI3Lib;
namespace MyTAPI_CS_1
{
public partial class Form1 : Form
{
public delegate void eventHandler(TAPI3Lib.CALL_STATE cs, string str);
private TAPIClass tapiclass;
private ITAddress[] itaddress=new ITAddress[10];
private IEnumAddress ienumaddress;
private ITBasicCallControl itbasiccallctrl;
private int currentline=0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
uint reg=0;
tapiclass = new TAPIClass();
tapiclass.Initialize();
//添加TAPI事件处理
tapiclass.ITTAPIEventNotification_Event_Event += new ITTAPIEventNotification_EventEventHandler(this.Event);
tapiclass.EventFilter = (int)(TAPI_EVENT.TE_CALLNOTIFICATION |
TAPI_EVENT.TE_DIGITEVENT |
TAPI_EVENT.TE_PHONEEVENT |
TAPI_EVENT.TE_CALLSTATE |
TAPI_EVENT.TE_GENERATEEVENT |
TAPI_EVENT.TE_GATHERDIGITS |
TAPI_EVENT.TE_REQUEST);
groupBox1.Enabled = false;
ienumaddress = tapiclass.EnumerateAddresses();
for (int i = 0; i < 10; i++)
{
ienumaddress.Next(1, out itaddress[i], ref reg);
if (itaddress[i] != null)
{
comboBox1.Items.Add(itaddress[i].AddressName);
}
else
break;
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int reg;
currentline = comboBox1.SelectedIndex;
reg=tapiclass.RegisterCallNotifications(itaddress[currentline], true, true, TapiConstants.TAPIMEDIATYPE_AUDIO, 2);
MessageBox.Show("注册线路的事件处理,返回值:"+reg.ToString());
groupBox1.Enabled = true;
}
//拨号
private void button1_Click(object sender, EventArgs e)
{
itbasiccallctrl = itaddress[currentline].CreateCall(textBox1.Text, TapiConstants.LINEADDRESSTYPE_PHONENUMBER, TapiConstants.TAPIMEDIATYPE_AUDIO);
itbasiccallctrl.Connect(false);
}
//挂机
private void button2_Click(object sender, EventArgs e)
{
itbasiccallctrl.Disconnect(DISCONNECT_CODE.DC_NORMAL);
}
public void eventdispose(TAPI3Lib.CALL_STATE cs, string str)
{
listBox1.Items.Add(str);
}
public void Event(TAPI3Lib.TAPI_EVENT te, object eobj)
{
string str = "";
switch (te)
{
case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE:
TAPI3Lib.ITCallStateEvent itcallstateevent = (TAPI3Lib.ITCallStateEvent)eobj;
TAPI3Lib.ITCallInfo itcallinfo = itcallstateevent.Call;
switch (itcallinfo.CallState)
{
case TAPI3Lib.CALL_STATE.CS_OFFERING:
str = "ring";
Invoke(new eventHandler(eventdispose), TAPI3Lib.TAPI_EVENT.TE_CALLSTATE, str);
break;
}
break;
}
}
}
}