پاسخ به تماس گرفته شده و تشخیص دکمه های فشرده شده
ما در مقاله قبلی یادگرفتیم که چگونه از طریق برنامه و مودم با تلفنهای مختلف تماس بگیریم و پیغام خودمان را پخش کنیم، ایمیلهای زیادی هم از طرف دوستان دریافت کردم که با مشکلاتی مواجه شدن و حتماً در این رابطه مقاله ای برای رفع این ایرادها خواهم نوشت. امروز می خواهیم عکس حالت بالا را انجام دهیم و این بار می خواهیم یک سیستم پاسخگو پیاده سازی کنیم، بدین شکل که وقتی تماس گیرنده ای به شماره ما زنگ بزند سیستم آنرا تشخیص داده و پاسخ آنرا بدهد. باما باشید:
برای انجام چنین کاری بایستی ابتدا موارد زیر را انجام دهیم:
1- خط تلفن را به مودم کامپیوترمان وصل کنیم
2- خط راتباطی را انتخاب بکنیم و آنرا فعال کنیم
3- در قسمت کنترل وضعیتها کد مناسب برای وضعیت csReferring بنویسیم
لطفاً پروژه جدیدی را شروع کنید و بر روی فرم آن اشیاء زیر را قرار دهید:
اکنون قسمت Var را همانند درس اول ( مقاله آغاز ارتباط و کنترل خط) طراحی کنید همچنین قسمت رویدادOnCreate را به همان صورت و نیز کد مربوط به ComboBox1 را نیز همانند کد درس اول بنویسید و در پایان شئی KDPhone1 را انتخاب و برای رویداد OnCallState آن همان کد درس اول را وارد کنید.... بسیار خُب تا اینجا تمام برنامه ما تکراری بود!! پس چگونه می توان تماس گرفته شده را تشخیص داد؟ برای این کار وضعیت به خصوصی را شئی KDPhone دارا می باشد که نام این وضعیت csReferring است و بایستی آنرا به وضعیتهای onCallState اضافه بکنیم، اگر ما برنامه را اجرا کنیم و خط ارتباطی ( مودم) را فعال کنیم و بعد از آن شخصی با ما تماس بگیرد آنگاه وضعیت csReferring بطور خود کار رخ خواهد داد اما این کافی نیست و هنوز برنامه ما قادر به پاسخ نمی باشد لذا برای اینکه پاسخگویی و ارتباط آغاز گردد بایستی در این وضعیت ما از تابع Answer(0) استفاده می کنیم (مانند این است که گوشی را برداشته باشیم) در زیر کد مربوط به رویداد onCallState مربوط به KDPhone1 را برای شما باز نویسی کرده ام:
case CallState of
csConnected :
begin
Memo1.Lines.add ('تماس برقرار شد' );
Err := KDVoice1.Play( KDPhone1.WavePlayID,'start.wav',0,-1 );
Memo1.Lines.add ('در حال دريافت شماره');
if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err));
end;
csDisconnected : Memo1.Lines.add ('ارتباط قطع شد');
csRing: Memo1.Lines.add ('در حال زنگ خوردن');
csBusy:
begin
Memo1.Lines.add ('خط ارتباطي مشغول مي باشد');
KDPhone1.Hangup;
end;
csError:
begin
Memo1.Lines.add ('خطایی در تماس رخ داده است');
KDPhone1.Hangup;
end;
csOffering:
begin
Memo1.Lines.add ('دریافت تماس جدید');
err := KDPhone1.Answer(0);
if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err));
end;
end; //case
به همین سادگی بود تنها چیزی که اضافه کردیم همان کدی هست که در بالا با رنگ متفاوت نشان داده شده است. لازم به ذکر است بعد از آنکه تابع Answer به تماس پاسخ داد وضعیت csConnect رخ خواهد داد که ما در اینجا از این فرصت اسفاده کردیم و یک فایل صوتی خوش آمد گویی قرار دادیم تا به محض تماس برای طرف مقابل پخش گردد.
خب اما قسمتی که برخی دوستان ایمیل فرستادن و بی صبرانه منتظر آن هستند، چگونه در هنگام برقراری تماس می توانیم بفهمیم که کاربر تماس گیرنده کدام دکمه های گوشی خود را فشار می دهد تا بتوانیم با توجه به آنها برنامه ای خواصی بنویسیم؟ خوشبختانه KD راه حل ساده ای برای این موضوع گذاشته است که من در اینجا فقط به ذکر یک مثال ساده اکتفا می کنم. برای دسترسی به این قابلیت بایستی ابتدا شیئ KDPhone1 را انتخاب کرده و سپس در قسمت Event مقابل رویداد onDigitDetected دوبار کلیک کنید، این همان چیزیست که ما نیازمندیم و KD آنرا موقعی که دکمه ای از سمت تماس گیرنده فشار داده شود فراخوانی می کند به شکل زیر دقت کنید:
procedure TmainForm.KDPhone1DigitDetected(Sender: TObject; Digit: Char; CallHandle: Integer);
begin
if Digit='1' then …………
if Digit='2' then …………
if Digit='*' then …………
end;
در رویداد فوق متغیر Digit از نوع کاراکتر بوده و شماره یا علامت فشرده شده توسط طرف مقابل را به ما می دهد اکنون شما برای تمرین کد زیر را به برنامه خود اضافه کنید:
if Digit='1' then KDVoice1.Play( KDPhone1.WavePlayID,'1.wav',0,-1 );
if Digit='2' then KDVoice1.Play( KDPhone1.WavePlayID,'2.wav',0,-1 );
if Digit='3' then KDVoice1.Play( KDPhone1.WavePlayID,'3.wav',0,-1 );
if Digit='4' then KDVoice1.Play( KDPhone1.WavePlayID,'4.wav',0,-1 );
if Digit='5' then KDVoice1.Play( KDPhone1.WavePlayID,'5.wav',0,-1 );
در مثال فوق با فشرده شدن هر عدد یک فایل صوتی برای تماس گیرنده پخش می شود و اگر علامتی فشرده شود مانند * , # فایل صوتی دیگری پخش می شود. البته شما می توانید یک شماره چند رقمی را دریافت کنید و برای آن برنامه بنویسید برای مثال مشترکی که از طریق تلفن شماره اشتراک خود را وارد می کند تا اطلاعاتی را دریافت کند و .... البته برای این کار بایستی یک قانونی قرار بدهید و آنرا در هنگام آغاز تماس، به تماس گیرنده اطلاع دهید مثل خاتمه ورود شماره با فشردن دکمه * لطفاً مثال زیر را ملاحظه فرمائید:
procedure TmainForm.KDPhone1DigitDetected(Sender: TObject; Digit: Char; CallHandle: Integer);
begin
If Digit='*' then begin
// کد و عملیات مورد نظر
N := '';
End
else
N := N+Digit;
end;
می بینید که مساله بسیار ساده هست کاربر ارقام مربوط به کد خود را یکی یکی وارد می کند و برای پایان از دکمه * استفاده می کند و در بالا متغیر N یک متغیر از نوع رشته ای و بصورت سراسری معرفی شده استکه در آن شماره نهایی ثبت می شود و پس از خاتمه عملیات دوباره این متغیره خالی شده و منتظر شماره بعدی می ماند. ما از این روش در یک برنامه برای انبار شرکت گاز میانکوه خوزستان استفاده کردیم و مدتیست که سیستم پاسخ گوی انبار فعال است البته ما اطلاعات تماس گیرنده شماره درخواست تاریخ و ساعت آن را در برنامه ثبت می کنیم تا برنامه بتواند اطلاعات آماری برای ما نشان دهد.
خب این درس هم به امید خدا تمام شد و امیدوارم که به درد شما دوستان گلم خورده باشد به یاری خدا در روزهای آینده مقالات دیگری در این رابطه قرار خواهم داد ... نظر فراموش نشه.
نکته 1 : گوشی تماس گیرنده بایستی در حالت Tone باشد
نکته 2 : فایلهای صوتی را می توانید پس از دانلود برنامه در مسیر اصلی پیدا کنید.
دانلود برنامه