1. 程式人生 > >dialer internet 電話 TAPI 3.0

dialer internet 電話 TAPI 3.0

 

電話撥號程式概述電話撥號程式允許從個人計算機上進行語音電話、視訊電話及會議視訊電話。

要打電話,只需有對方的電話號碼、IP 地址或域名系統 (DNS) 名稱。電話撥號程式使您可以用連線計算機的電話進行呼叫,呼叫可以從調變解調器經過網路,再經過電話交換機連線到區域網 (LAN) Internet 地址。

微軟自帶一個 H323 TSP,可是不知道這玩意怎麼用

3 Telephony Service Providers Telephony Service Providers(TSPs)負責獨立於低層協議的呼叫模型並解釋為特定協議的呼叫控制機制。TAPI3.0TAPI 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.323IP電話和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.0COM物件主要有以下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;
            }
        }
    }
}