TAPI چيست
؟
TAPI يا Telephony API يک کتابخانه استاندارد برای
کار با مودم و نوشتن برنامه های تلفنی می باشد . برای نمونه می توان از
برنامه های Phone Dialer ( شماره گير تلفن ) ، برنامه شبکه سازی تلفنی
( Dialup Networking ) ، برنامه تشخيص پالس مودم برای ضبط اطلاعات وارد
شده از طرف کاربران و کاربردهای ديگر در اين زمينه نام برد . اين
کتابخانه به شما کمک کمک می کند تا بدون درگير شدن با برنامه نويسی سخت
افزار مودم و درايور آن بطور مستقيم بتوانيد برنامه های کاربردیي در
اين زمينه بنويسيد .
مروری بر
Microsoft Telephony :
Telephony امکان مجتمع سازی
کامپيوترها با دستگاههای ارتباطی و شبکه ها را فراهم نموده است .
معمولاً دستگاه ارتباطی يک مودم و خط ارتباطی نيز شبکه PSTN ( شبکه
عمومی تلفن سوئيچينگ ) می باشد . برخی از کاربردهای Telephony عبارتند
از :
۱ - کنفرانسهای مالتی مديا بصورت Multicast
۲ - VoIP
۳ - مرکز پاسخ گويي اتوماتيک
۴ - تماس تلفنی از طريق کامپيوتر
روی شبکه PSTN
دياگرام زير معماری Microsoft Telephony را نشان
می دهد :
برنامه های TAPI
:
برای نوشتن برنامه های کاربردی با استفاده از TAPI
بايستی ابتدا در مورد سطح سرويسی که می خواهيم ارائه دهيم تصميم گيری
کنيم . برای مثال برای نوشتن يک برنامه شماره گير تلفن نياز به استفاده
کامل از TAPI نيست و می توان از قابليتهای خود ويندوز در اين زمينه
استفاده کرد ( Assisted Telephony ) . در بخشهای بعدی در مورد سطوح
مختلف سرويس در TAPI بيشتر صحبت خواهم کرد .
دومين مطلبی که بايد
مورد توجه قرار داد اينست که می خواهيم از TAPI 2.x استفاده کنيم يا از
TAPI 3.x . تفاوت ايندو آنست که TAPI ورژن ۲ يک API برمبنای C است در
حاليکه ورژن ۳ آن بر مبنای تکنولوژی COM می باشد . در بخشهای بعدی
مطالب بيشتری در مورد تفاوتهای اين دو نسخه بيان خواهم کرد .
بخشهای
اصلی يک برنامه کامل TAPI عبارتند از :
۱ - TAPI Initialization
: شامل load کردن TAPI dll ، اتصال به TAPI Server ، مذاکره در مورد
ورژن TAPI و برپاسازی سيستم اطلاع رسانی event می باشد .
۲ -
Session Control : مقداردهی اوليه ، دريافت و کنترل تماسها
۳ -
Device Control : دريافت و تنظيم اطلاعات دستگاه
۴ - Media
Control : تشخيص و يا توليد تونها و ارقام ، کنترل stream
۵ -
TAPI Shutdown : آزاد سازی منابع
مقداردهی اوليه TAPI :
عملکرد درست
اجزای TAPI نياز به برپاسازی محيط ارتباطی روی کامپيوتر مورد نظر دارد
. مراحل اين امر عبارتند از :
۱ - نصب TAPI : زمانيکه سخت افزار
و يا نرم افزار برای اولين بار به کامپيوتر اضافه می شود انجام می گيرد
. جزئيات کار به سيستم عامل و نرم افزار بستگی دارد .
۲ -
مقداردهی ابتدائی : ساخت اشيا و مسيرهای ارتباطی
۳ - مذاکره در
مورد ورژن TAPI : برای اطمينان از اينکه اجزای TAPI قادر به تبادل داده
ها باشند .
۴ - استخراج اطلاعات منابع : بدست آوردن اطلاعاتی در
مورد دستگاهی که می توان از آن در برنامه TAPI مورد نظرمان استفاده
نمود .
۵ - Event notification : برپاسازی سيستم اطلاع رسانی
event
مقداردهی اوليه TAPI در ويژوال
بيسيک :
از منوی Project گزينه References را انتخاب
کرده و از ليست مربوطه مورد Microsoft TAPI 3.0 Type Library را انتخاب
کنيد .
حال وارد بخش کد نويسی فرمتان شويد و متغير objTAPI را بصورت
زير تعريف کنيد :
Dim objTapi As
TAPI
سپس در بخش مربوط به Form Load شی
objTAPI را بصورت زير ايجاد می کنيم :
Set objTapi = New
TAPI
همانطور که در بخشهای قبلی گفته شد ،
قبل از فراخوانی هر تابع TAPI ابتدا بايستی آنرا مقداردهی اوليه کنيم .
برای مقداردهی اوليه کردن شی TAPI عبارت زير را بنويسيد :
Call
objTapi.Initialize
انتخاب يک آدرس
:
کد زير نشان می دهد که چگونه می توان با استفاده از شی
TAPI در ويژوال بيسيک منابع تلفنی در دسترس را برای يک آدرس که بتواند
يک مجموعه مشخص از نيازها را مديريت کند ، بررسی کرد .
توجه داشته
باشيد که قبل از انجام اين کار بايستی عمل مقداردهی اوليه TAPI را که
در بخش قبل ررسی شد ، انجام دهيد .
نکته : در کد زير عمل error
checking انجام نگرفته است و برای استفاده از کد زير در برنامه های
واقعی بايستی بخش بررسی خطا را به آن اضافه کنيد .
۱ - تعريف يک شی
آدرس و يک شی مجموعه آدرس :
Dim gobjAddress As
ITAddress
Dim objCollAddresses As
ITCollection
۲ - تنظيم شی objCollAddress
بعنوان يک مجموعه آدرس از شی objTapi :
Set objCollAddresses =
objTapi.Addresses
۳ - پيدا کردن آدرسی که
بتواند از واسط مورد نظر ما پشتيبانی کند :
bFound = False
For
indexAddr = 1 To objCollAddresses.Count
Set objCrtAddress =
objCollAddresses.Item(indexAddr)x
Set objMediaSupport =
objCrtAddress
Set objAddressCapabilities =
objCrtAddress
If objMediaSupport.QueryMediaType(
nSelectedType ) x
bFound = True
End If
Set
objAddressCapabilities = Nothing
Set objMediaSupport =
Nothing
Set objCrtAddress = Nothing
If bFound = True Then
Exit For
Next indexAddr
در صورتيکه
آدرس مورد نظزر پيدا شود برنامه از حلقه خارج شده و gobjAddress يک
آدرس قابل استفاده خواهد بود :
Set gobjAddress =
objcollAddresses.Item(indexAddr)x
انجام Event Handling در TAPI :
کد زير
شامل يک event handler ساده برای TAPI ، رجيستر کردن واسط event ،
تنظيم فيلتر event و رجيستر کردن تمام فراخوانيهای دادن اخطار است .
هدف اصلی از اين کد اينست که مطمئن شويم بخشی از TAPI که event ها را
دريافت می کند پردازشی را قبل از انتقال به بخشهای ديگر انجام دهد
.
تعاريفها :
Dim WithEvents
gobjTapiWithEvents As TAPI
Attribute
gobjTapiWithEvents.VB_VarHelpID = -1
Dim glRegistrationToken As
Long
Const TAPI3_CALL_EVENTS
=TE_CALLMEDIA Or
TE_CALLNOTIFICATION Or
TE_CALLSTATE
تنظيم eventfilter
بصورتيکه تمام event های تعريف شده برای TAPI را بپذيرد :
objTapi.EventFilter =
TAPI3_CALL_EVENTS
رجيستر کردن event ها
:
Set gobjTapiWithEvents =
objTapi
Dim fOwner As Boolean, fMonitor As Boolean
Dim
lMediaTypes As Long, lCallbackInstance As Long
fOwner = True
fOwner = True
fMonitor = False
lMediaTypes =
TAPIMEDIATYPE_AUDIO
lCallbackInstance =
1
glRegistrationToken =
gobjTapi.RegisterCallNotifications(gobjAddress,fMonitor,
fOwner,lMediaTypes,lCallbackInstance)x
انتخاب يک ترمينال :
+ قبل از اينکه يک
ترمينال را برای برقراری ارتباط انتخاب کنيد بايستی TAPI
Initialization و عمل انتخاب آدرس را انجام داده باشيد .
ابتدا
يک متغير از نوع ITBasicCallControl ( واسط کنترل تماس ) تعريف می کنيم
:
Dim objCallControl As
ITBasicCallControl
Set objCallControl =
gobjReceivedCallInfo
سپس يک متغير از نوع
ITTerminalSupport ( کوئری از شی آدرس ) تعريف می کنيم :
Dim objTerminalSupport As
ITTerminalSupport
Set objTerminalSupport =
gobjAddress
سپس متغير ترمينال را تعريف
کرده و توسط شی objTerminalSupport يک ترمينال را برای آن استخراج می
کنيم :
Dim objTerminal As
ITTerminal
Set objTerminal =
objTerminalSupport.GetDefaultStaticTerminal(lMediaType,
dir)x
در اينجا ديگر نيازی به شی
objTerminalSupport نيست بنابراين آنرا آزاد می کنيم :
Set objTerminalSupport =
Nothing
سپس نياز به تعريف شی
objStreamControl برای کنترل ترمينال است :
Dim objStreamControl As
ITStreamControl
Set objStreamControl =
objCallControl
در صورتيکه اين شی ايجاد
شود ، به ازای استريم های موجود در ITCollection امکان ايجاد ترمينال
در يک حلقه for بررسی می شود و ترمينال مناسب انتخاب می گردد
:
If Not (objStreamControl Is
Nothing) Then
Dim objITCollStreams As ITCollection
Set
objITCollStreams = objStreamControl.Streams
Dim nIndex As
Long, objCrtStream As ITStream
For nIndex = 1 To
objITCollStreams.Count
Set objCrtStream =
objITCollStreams.Item(nIndex)x
If objCrtStream.MediaType =
lMediaType Then
If objCrtStream.Direction = dir Then
Call
objCrtStream.SelectTerminal(objTerminal)x
End If
End If
Set
objCrtStream = Nothing
Next nIndex
Set objITCollStreams =
Nothing
Set objStreamControl = Nothing
End
If
ايجاد يک تماس ( Make a Call )
:
+ قبل از اين بخش بايستی مراحل TAPI Initialization و عمل
انتخاب آدرس انجام شده باشد .
اين بخش برای ايجاد يک شی تماس ،
بررسی و مشخص کردن استريمی که با اين تماس در ارتباط است ، انتخاب و
ايجاد ترمينالهای مناسب و کامل کردن ارتباط استفاده می شود .
قبل
TAPI Initialization و عمل انتخاب آدرس و انتخاب ترمينال انجام شده
باشد .
در ابتدا با استفاده از متد CreateCall يک شی تماس ساخته می
شود :
Set gobjCall =
gobjOrigAddress.CreateCall(strDestAddress,
nSelectedType,lMediaTypes)x
سپس در اينجا
بايستی کدی که در بخش اول اين درس برای انتخاب ترمينال نوشته شد آورده
شود :
}
Select Terminal
Code
{
سپس بايستی دستور Connect اجرا
شود :
gobjCall.Connect
(False)x
False بدين معناست که ارتباط
بصورت آسنکرون برقرار می شود .
دريافت
يک تماس :
کد زير برای يافتن و يا ايجاد يک ترمينال
مناسب برای دريافت يک تماس بکار می رود . بايستی توجه داشته باشيد که
قبل از اجرای کد زير بايستی مراحل مقداردهی اوليه ، انتخاب يک آدرس و
رجيسر کردن event ها را انجام دهيد . همچنين در کد زير بايستی مرحله
انتخاب ترمينال را نيز انجام دهيد . توجه داشته باشيد که در کد زير
متغير pEvent يک اشاره گر برای واسط ITCallNotificationEvent است که
توسط TAPI به event Handler داده می شود :
If TapiEvent =
TE_CALLNOTIFICATION Then
Dim objCallNotificationEvent As
ITCallNotificationEvent
Set objCallNotificationEvent =
pEvent
Dim gobjReceivedCallInfo As ITCallInfo
Set
gobjReceivedCallInfo = objCallNotificationEvent.Call
Dim
objCallControl As ITBasicCallControl
Set objCallControl =
gobjReceivedCallInfo
objCallControl.Answer
End
If