الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

JTAPI, TAPI3.0, VBVoice, Visual Voice Pro..?

مغلق
بدأه n.albishry في 13 ديسمبر 2005 · 4 رد · 1,710 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

في الحقيقة إنني أشيد بهذا الموقع الجميل وبالجهود التي تبذل فيه، وأدهشني وأعجبتني روح التفاعل فيه مما جعلني أقرر التسجيل فيه والمشاركة أسأل الله عز وجل أن ينفع بنا ويسدد خطانا على الحق، وأعد الجميع ببذل كل ما لدي من معلومات وخبرات (متواضعة) لتعم الفائدة.

---------------

كأول مشاركة أو إستفسار لدي فإني عاكف على مشروع وأحد أهم أجزائه هو بإختصار:

إنشاء برنامج للرد الآلي (Answering machine) بحيث يقوم بتسجيل الرسائل الصوتية.

طبعاً سأستخدم لغة #C ، وبحثت في البداية عن مصادر وكتب في إستخدام TAPI3.0 من ويندوز، ومن خلال بحثي في MSDN يبدو لي أن إستخدام هذه المكتبة معقد قليلاً، ووجدت بعض الأدوات الجاهزة مثل VBVoice ولكنها مكلفة جدا ووجدت Visual Voice Pro ولكن لم أجد موقع لبيعها ولست متأكد هل هي متوافقة مع Net. وهذا عقد مسألة إختيار لغة البرمجة المناسبة.

أسئلتي التي أتمنى وبشدة أن أجد إجابة عليها:

1- ما مدى صعوبة إستخدام TAPI3.0 في إنشاء Answering machine خاصة وأنني لم أستخدمها من قبل أبدا؟

2- هل هناك مصادر وكتب تشرح إستخدام TAPI3.0 (بغض النظر عن MSDN) ؟

3- هل هناك ادوات يمكن إستعمالها في بيئة Net. غير التي ذكرت، بحيث تكون سهلة الإستعمال للمبتدئ؟

شاكر لكم تعاونكم سلفاً

أخوكم/

نبيل البشري

#2

استخدام الTAPI 3.0 معقد فعلاً و استخدامها من ال.net أكثر تعقيداً

حاول أن تستخدم مكتبات جاهزة مثل Modem Tools و TeleTools أو TapiEx ابحث عن هذه المكتبات على Google و ستجد الحل ان شاء الله

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#3

شدني عنوان الموضوع لان فيه JTAPI (Java Telephony API)

هل حاولت استخدام JTAPI ؟؟

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#4

شكرا للأخ البشمهندس وجزاك الله خير على الردز

الأخ فيصل : بصراحة أنا عندي خيار إستخدام JTAPI لكن بسبب عدم وجود بئية جيدة قررت إٍستخدام #C بسبب مرونة وقوة Net.، لكن مازلت لم أحدد قرار نهائي بالنسبة للغة المستخدمة. بالنسبة لـ JTAPI فلقد إطلعت على مشروع سابق بالإضافة إلى Documentation التي تقدمها Sun وأعجبتني بشموليتها ولكن لا أدري مدى تعقيد JTAPI. الحمد لله مستواي ممتاز في الجافا، وليست عندي أي مشكلة في إستخدامها.

لا أدري هل لديك خبرة في استخدام JTAPI؟ أتمنى أن لا تبخل بما عندك، فأنا في إنتظار ردك

وجزاكم الله خير الجزاء

والسلام عليكم ورحمة الله وبركاته

#5

بسم الله الرحمن الرحيم

أخي الكريم هذا مثال بسيط مما توصلت إليه عسى أن ينفعك ويكون البداية لجميع تساؤلاتك

قمت بجمع الأكواد من بعض الكتب والمقالت التي تتحدث عن هذا الموضوع ووضعنها في كلاس واحد ليتم التعديل عليه لا حقاً من جميع من يمتلكون الخبره في هذا المجال

using System;
using System.Runtime.InteropServices;

namespace TAPISample
{
    public class TAPI
    {
        public static int hCall;
        public static int hTAPI;
        public static int lNumLines;
        public static int hLine;
        public static linedevcaps lpLineDevCaps;
        public static frmTAPI userInterface;
        public const int TAPIVERSION = 0x10004;
        public const short LINECALLPRIVILEGE_OWNER = 0x4;
        public const short LINECALLPRIVILEGE_MONITOR = 0x2;
        public const short LINEMEDIAMODE_AUTOMATEDVOICE = 0x8;
        public const int LINE_LINEDEVSTATE = 8;
        public const int LINE_CALLSTATE = 2;
        public const int LINECALLSTATE_OFFERING = 0x2;
        public const int LINECALLSTATE_ACCEPTED = 0x4;
        public const int LINECALLSTATE_DISCONNECTED = 0x4000;
        public struct linedialparams
        {
            int dwDialPause;
            int dwDialSpeed;
            int dwDigitDuration;
            int dwWaitForDialtone;
        }
        public struct lineextensionid
        {
            int dwExtensionID0;
            int dwExtensionID1;
            int dwExtensionID2;
            int dwExtensionID3;
        }
        public struct linedevcaps
        {
            public int dwTotalSize;
            public int dwNeededSize;
            public int dwUsedSize;
            public int dwProviderInfoSize;
            public int dwProviderInfoOffset;
            public int dwSwitchInfoSize;
            public int dwSwitchInfoOffset;
            public int dwPermanentLineID;
            public int dwLineNameSize;
            public int dwLineNameOffset;
            public int dwStringFormat;
            public int dwAddressModes;
            public int dwNumAddresses;
            public int dwBearerModes;
            public int dwMaxRate;
            public int dwMediaModes;
            public int dwGenerateToneModes;
            public int dwGenerateToneMaxNumFreq;
            public int dwGenerateDigitModes;
            public int dwMonitorToneMaxNumFreq;
            public int dwMonitorToneMaxNumEntries;
            public int dwMonitorDigitModes;
            public int dwGatherDigitsMinTimeout;
            public int dwGatherDigitsMaxTimeout;
            public int dwMedCtlDigitMaxListSize;
            public int dwMedCtlMediaMaxListSize;
            public int dwMedCtlToneMaxListSize;
            public int dwMedCtlCallStateMaxListSize;
            public int dwDevCapFlags;
            public int dwMaxNumActiveCalls;
            public int dwAnswerMode;
            public int dwRingModes;
            public int dwLineStates;
            public int dwUUIAcceptSize;
            public int dwUUIAnswerSize;
            public int dwUUIMakeCallSize;
            public int dwUUIDropSize;
            public int dwUUISendUserUserInfoSize;
            public int dwUUICallInfoSize;
            public linedialparams MinDialParams;
            public linedialparams MaxDialParams;
            public linedialparams DefaultDialParams;
            public int dwNumTerminals;
            public int dwTerminalCapsSize;
            public int dwTerminalCapsOffset;
            public int dwTerminalTextEntrySize;
            public int dwTerminalTextSize;
            public int dwTerminalTextOffset;
            public int dwDevSpecificSize;
            public int dwDevSpecificOffset;
            public int dwLineFeatures; // TAPI v1.4
            public string bBytes;
        }
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineAnswer(int hCall, ref string
        lpsUserUserInfo, int dwSize);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineInitialize(ref int hTAPI, int
        hInst, LineCallBackDelegate fnPtr,
        ref int szAppName, ref int dwNumLines);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineNegotiateAPIVersion(int hTAPI, int dwDeviceID, int dwAPILowVersion, int dwAPIHighVersion, ref int lpdwAPIVersion, ref lineextensionid lpExtensionID);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineOpen(int hLineApp, int
        dwDeviceID, ref int lphLine, int dwAPIVersion,
        int dwExtVersion, ref int dwCallbackInstance,
        int dwPrivileges, int dwMediaModes,
        ref int lpCallParams);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineGetDevCaps(int hLineApp, int
        dwDeviceID, int dwAPIVersion, int dwExtVersion,
        ref linedevcaps lpLineDevCaps);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineSetStatusMessages(int hLine,
        int dwLineStates, int dwAddressStates);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineDrop(int hCall, string
        lpsUserUserInfo, int dwSize);
        [DllImport("Tapi32.dll", SetLastError = true)]
        public static extern int lineShutdown(int hLineApp);



        public delegate int LineCallBackDelegate(int dwDevice, int dwMessage, int dwInstance, int dwParam1, int dwParam2, int dwParam3);
        public static int LineCallBack(int dwDevice, int dwMessage, int dwInstance, int dwParam1, int dwParam2, int dwParam3)
        {
            string msgEvent = "";
            msgEvent = Convert.ToString(dwMessage);
            switch (dwMessage)
            {
                case LINE_CALLSTATE:
                    switch (dwParam1)
                    {
                        case LINECALLSTATE_OFFERING:
                            msgEvent = "Incomming call";
                            hCall = dwDevice;
                            break;
                        case LINECALLSTATE_ACCEPTED:
                            msgEvent = "Call accepted";
                            break;
                        case LINECALLSTATE_DISCONNECTED:
                            msgEvent = "Call disconnected";
                            break;
                    }
                    break;
                case LINE_LINEDEVSTATE:
                    msgEvent = "Ringing";
                    break;
            }
            userInterface.showMessage("Event: " + msgEvent + " Data:" + dwParam1 + "\r\n");
            return 1;
        }
    }
}

طريقة إستخدام الكلاس السابق

        public void StartModem()
        {
            int nError = 0;
            TAPI.lineextensionid lpExtensionID = new
            TAPI.lineextensionid();
            int lUnused = 0;
            int lLineID = 0;
            int lNegVer = 0;
            long lPrivilege = 0;
            long lMediaMode = 0;

            IntPtr HInstance = IntPtr.Zero;
            lPrivilege = TAPI.LINECALLPRIVILEGE_OWNER + TAPI.LINECALLPRIVILEGE_MONITOR;
            lMediaMode = 4;
            Module thisModule = Assembly.GetExecutingAssembly().GetModules()[0];
            HInstance = Marshal.GetHINSTANCE(thisModule);
            TAPI.LineCallBackDelegate callback = new TAPI.LineCallBackDelegate(TAPI.LineCallBack);
            int Unused = 0;
            HInstance = System.Diagnostics.Process.GetCurrentProcess().Modules[0].BaseAddress;
            nError = TAPI.lineInitialize(ref TAPI.hTAPI, HInstance.ToInt32(), callback, ref Unused, ref TAPI.lNumLines);

            for (lLineID = 0; lLineID < TAPI.lNumLines; lLineID++)
            {
                nError = TAPI.lineNegotiateAPIVersion(TAPI.hTAPI, lLineID, TAPI.TAPIVERSION, TAPI.TAPIVERSION, ref lNegVer, ref lpExtensionID);

                do
                {
                    nError = TAPI.lineOpen(TAPI.hTAPI, lLineID, ref TAPI.hLine, lNegVer, lUnused, ref lUnused, (int)lPrivilege, (int)lMediaMode, ref lUnused);
                    lMediaMode++;
                } while (nError < 0 && lMediaMode < 100);

                if (nError == 0) break;
            }

            TAPI.lpLineDevCaps.dwTotalSize = Marshal.SizeOf(TAPI.lpLineDevCaps);
            TAPI.lpLineDevCaps.bBytes = new StringBuilder().Append(' ', 2000).ToString();
            TAPI.lineGetDevCaps(TAPI.hTAPI, lLineID, lNegVer, lUnused, ref TAPI.lpLineDevCaps);
            TAPI.lineSetStatusMessages(TAPI.hLine, TAPI.lpLineDevCaps.dwLineStates, 0);
        }

        public void AcceptCall()
        {
            int nError;
            string szUnused = "";
            nError = TAPI.lineAnswer(TAPI.hCall, ref szUnused, 0);
        }

        public void StopModem()
        {
            int nError;
            nError = TAPI.lineShutdown(TAPI.hTAPI);
        }

قم بوضع ثلاثة أزرار على النافذة وأكتب في حدث النقر لكل منهم:

أسماء الأزرار: StartModemButton StopModemButton AcceptCallButton

        private void StartModemButton_Click(object sender, EventArgs e)
        {
            StartModem();
        }

        private void StopModemButton_Click(object sender, EventArgs e)
        {
            StopModem();
        }

        private void AcceptCallButton_Click(object sender, EventArgs e)
        {
            AcceptCall();
        }

وأمتب هذا في حدث التحميل التابع للفورم

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            TAPI.userInterface = this;
        }

أتمنى من الله أن أكون قد ساعدتك ولو بقسم بسيط

للإستزادة في الموضوع أضغط على الرابط

Telephony Application Programming Interfaces (TAPI, TSPI, MSPI)

أتمنى لك التوفيق

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

هذا الموضوع مغلق.

مواضيع مشابهة