View Full Version : تشخیص شماره گرفته شده kdtel
مهدی هادیان
دوشنبه 04 آذر 1387, 21:28 عصر
سلام
با کدام ویژگی kdphone می توان شماره تلفن شخصی که زنگ زده را تشخیص داد.
tefos666
سه شنبه 05 آذر 1387, 10:01 صبح
سلام
با کدام ویژگی kdphone می توان شماره تلفن شخصی که زنگ زده را تشخیص داد.
دوست عزیز من برنامش رو براتون با کامپوننت KDTele نوشتم - در مورد این کامپوننت هم که یکی از دوستان اینجا مفصل مقاله ای نوشته تو مقالات سرچ کن
فقط باید کامپوننت رو نصب کنی - آدرس دانلود رو تو همین سایت جستجو کنی گیر میاری
تازه امکانش رو گذاشتم که طرف مقابل اگه کلیدی رو فشرد شما مشاهده کنید - این به درد تلفن های هوشمند میخوره منشی خودکار و .....
کمک خواستی در خدمتیم :لبخند:
فایل های ضمیمه
http://barnamenevis.org/forum/images/attach/rar.gifPhone Dialer.r (http://barnamenevis.org/forum/attachment.php?attachmentid=25170&d=1225736550)ar
ضمنا جهت توضیح میتونی از این قسمت هم استفاده کنی :
نکته : برای ایجاد ارتباط بایستی حتما یک دستگاه مودم بر روی کامپیوتر شما نصب باشد و خط تلفن به آن متصل باشد.
جهت ایجاد ارتباط بایستی سه عمل اولیه انجام دهید:
1- ابتدا بایستی خط ارتباطی را برای برنامه مشخص کنید. منظور اینست که شما از طریق کدام پورت یا کدام مودم می خواهید تماس را برقرار کنید و آن خط را بایستی فعال کنید.
2- بایستی شماره گیری را آغاز کنید. پس از اجرای درست و موفقیت آمیز مرحله بالا خط تلفن آماده خواهد بود که شماره تلفن مورد نظر را بصورت رشته ای وارد کنید و شماره گیری را آغاز کنید.
3- بایستی وضعیت ارتباطی را بررسی کنید. پس از شماره گیری بایستی بررسی کنید که آیا ارتباط برقرار شد، خط مشغول است و...
برای درک بیشتر و بهتر مثالی در زیر آماده کرده ام که با همدیگر آن را مورد مطالعه قرار می دهیم:
ابتدا وارد دلفی شده و یک پروژه جدیدی شروع کنید و اجزاء زیر را بر روی فرم مانند شکل را قرار دهید:
http://i7.tinypic.com/3165f05.png
در مثالهای زیر توابع، متدها و خصوصیهای مربوط به کامپوننتهای تلفن را با رنگ نارنجی جهت راحتی کار نشان داده ایم و در مورد آنها توضیحاتی را نوشته ایم، البته لازم بذکر است که کلیه توابع در صورت موفقیت مقدار صفر را بر می گردانند و در صورت عدم موفقیت کد مربوط به خطا را بصورت عدد بر می گردانند که ما در برنامه زير از متغیر err برای ذخیره کد خطا و سپس نمایش خطای مربوط به آن استفاده کردیم.
1- ابتدا در قسمت Var اصلی برنامه سه متغیر با نامهای زیر تعریف کنید:
var
Form1: TForm1;
I : Word;
S : WideString;
err : Word;
implementation
2- بر روی فرم دوبار کلیک کرده تا رویداد OnCreate فرا خوانی شود و سپس کد زیر را وارد کنید:
procedure TForm1.FormCreate(Sender: TObject);
begin
for I := 0 to KDPhone1.NumberOfLines-1 do
begin
KDPhone1.GetLineName( i,s );
ComboBox1.Items.Add(S)
end;
end;
در کد فوق همانگونه که مشاهده می کنید از یک حلقه شمارشی برای بدست آوردن خطوط ارتباطی موجود در کامپیوترمان استفاده کرده ایم. در این حلقه از خصوصیت NumberOfLines برای بدست آوردن تعداد خطوط استفاده کردیم سپس با استفاده از تابع GetLineName( i,s ) برای بدست آوردن نام خط ارتباطی و ذخیره آن در متغیر S استفاده کردیم و در انتها مقدار S را درون ComboBox1 اضافه کردیم تا برنامه موقع اجراء لیستی از خطوط ارتباطی را جته انتخاب به ما نشان دهد.
3- اکنون بر روی ComboBox1 دابل کلیک کنید و کد زیر را وارد کنید:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
err := KDPhone1.LineActive(ComboBox1.ItemIndex,True);
if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err))
else Memo1.Lines.add('خط ارتباطی آماده می باشد');
end;
در فوق ما کدی نوشتیم که کاربر با انتخاب هر کدام از خطوط موجود در ComboBox1 بتواند آن خط را بعنوان خطوط فعال توسط تابع LineActive( LineNumber , True )معرفی و فعال کند. چنانچه فعال سازی خط با مشکل مواجه شود آنگاه با استفاده از تابع GetErrorMsg(err) پیغام مربوط به آن خطا را بدست آورده و نمایش می دهیم. شما می توانید درون اسامی مربوط به خطوط و دستگاههاي ارتباطي نام مودم خود را یافته و آنرا انتخاب کنید.
4- اکنون بر روی دکمه Dial دابل کلیک کنید و کد زیر را بنویسید:
procedure TForm1.Button1Click(Sender: TObject);
begin
err := KDPhone1.DialNumber( Edit1.Text,0 );
if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err));
end;
توسط تابع DialNumber( Edit1.Text,0 ); شماره تایپ شده توسط کاربر در Edit1.Text شروع به شماره گیری می گردد. شما می توانید شماره ثابتی را درون این تابع بصورت رشته ای بنویسید.
5- در این قسمت ما با کنترل وضعیتهای مختلف تلفن آشنا می شویم که می توان توسط آن سیستمی بسیار قوی و با دقت طراحی کرد. وضعیتهای مختلف هنگام فعالیتKDPhone در جدول زیر آمده اند اما ما در این تمرین فقط با چندتا از آنها که اهمیت ویژه ای دارند آشنا می شویم:
csError
csRemotePartyDisconnected
csDisconnected
csOfferedCallDropped
csBusy
csConnected
csWaitingDisconnection
csOffering
csProceeding
csNoDialTone
csRing
csDialing
csWaitingForFaxCommand
csRemovedFromConference
csInConference
csOnHold
csRingBack
csDialTone
csUnhold
اکنون شئی KDPhone1 را انتخاب کرده و سپس از پنجره Object Inspector به تب Events رفته و در مقابل OnCallState دابل کلیک کنید و سپس کد زیر را بنویسید:
procedure TForm1.KDPhone1CallState(Sender: TObject; CallState: TCallState;
Param1, Param2, CallHandle: Integer);
begin
case CallState of
csDialing : Memo1.Lines.Add( 'در حال تماس گرفتن');
csConnected :
begin
Memo1.Lines.Add( 'تماس برقرار شد' );
Err := KDVoice1.Play( KDPhone1.WavePlayID,'C:\Wellcome.Wav',0,-1 );
if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err))
else Memo1.Lines.Add('در حال پخش پیغام');
end;
csDisconnected : Memo1.Lines.Add( 'ارتباط قطع شد' );
csBusy:
begin
Memo1.Lines.Add( 'خط تلفن مشترک مشغول می باشد' );
KDPhone1.Hangup;
end;
csError:
begin
Memo1.Lines.Add( 'خطایی در تماس رخ داده است' );
KDPhone1.Hangup;
end;
end; //of case
end;
به نظر می رسد کمی گیج کننده باشه ولی کامل منطقی و جالب می شه گفت با کد نویسی درست وضعیتها می شه کنترل بیشتری بر روی سیستم داشته باشیم اما شرح کدها:
وضعيت csDialing موقعي اتفاق مي افتد كه تلفن طرف مقابل در حال زنگ خوردن باشد.
وضعیت csConnected موقعی اتفاق می افتد که خط ارتباطی و شماره طرف مقابل با موفقيت وصل شود که در اینصورت ما بعد از نمایش پیغامی مناسب توسط شئی KDVoice1 و با استفاده از تابع Play فایل صوتی Wellcome.Wav واقع در درایو C: را پخش کردیم که در این هنگام طرف مقابل آن صدا را خواهد شنید لازم بذکر است که فایل صوتی حتما باید از نوع Wav باشد.
وضعیتcsDisconnectedموقعی رخ دهد که به هر طریق ارتباط قطع گردد.
وضعیت csBusy موقعی رخ می دهد که تلفن مقابل زنگ مشغولی بخورد که ما در این هنگام پس از نمایش پیغام مناسب سعی بر قطع ارتباط با استفاده از متد Hangup کردیم این متد هر کجا بکار رود موجب قطع ارتباط شده و وضعیت csDisconnected را بوجود می آورد.
وضعیت csError موقعی بکار می رود که در هر صورتی خطای در ارتباط رخ دهد. که در این هنگام ما سعی بر قطع ارتباط می کنیم.
توضیح در مورد تابع Play : این تابع برای پخش صدا بکار می رود که پارامتر اول آن نشان دهنده محل پخش فایل صوتی است اگر مقدار آن 1- باشد یعنی صدا از طریق کارت صدای کامپیوتر جاری پخش شود و اگر از تابع WavePlayID مربوط به شیئ KDPhone استفاده کنیم آنگاه خط تلفن را برای پخش بکار می گیرد، در پارامتر دوم بایستی مسیر و نام فایل صوتی را مشخص کنیم، پارامتر سوم محل آغاز پخش فایل را مشخص می کند که عدد صفر نشانه شروع از ابتدا می باشد و آخرین پارامتر محل پایان فایل صوتی را نشان می دهد که مقدار 1- نشان دهنده پایان فایل است.
6- اکنون شئی KDVoice1 را انتخاب کرده و سپس از پنجره Object Inspector به تب Events رفته و در مقابل OnSoundState دابل کلیک کنید و سپس کد زیر را بنویسید:
procedure TForm1.KDVoice1SoundState(Sender: TObject; State: TSoundState; BytePosition, ErrorNumber: Integer);
begin
Case State of
ssPlayDone:
begin
Memo1.Lines.Add( 'پخش فایل صوتی با موفقیت به پایان رسید' );
KDPhone1.Hangup;
end;
ssError:
begin
KDPhone1.Hangup;
Memo1.Lines.Add( 'خطایی در پخش صدا رخ داده است' );
end;
end; // of case
end;
شئی KDVoice داری 11 وضعیت مختلف و کاربردی می باشد که در اینجا فقط به 2 از آنها اشاره کردیم (در مقالات بعدی این شئ بیشتر مورد بررسی قرار خواهد گرفت) . در وضعیت اول که در هنگام پایان پخش فایل صوتی اتفاق می افتد ما پیغامی را نمایش دادیم و سپس ارتباط را قطع کردیم.
اين هم تصويري از برنامه اجرا شده:
http://i15.tinypic.com/47i30id.jpg
تشخیص کلیدهای فشرده شده
این بار می خواهیم یک سیستم پاسخگو پیاده سازی کنیم، بدین شکل که وقتی تماس گیرنده ای به شماره ما زنگ بزند سیستم آنرا تشخیص داده و پاسخ آنرا بدهد. باما باشید:
برای انجام چنین کاری بایستی ابتدا موارد زیر را انجام دهیم:
1- خط تلفن را به مودم کامپیوترمان وصل کنیم
2- خط راتباطی را انتخاب بکنیم و آنرا فعال کنیم
3- در قسمت کنترل وضعیتها کد مناسب برای وضعیت csReferring بنویسیم
لطفاً پروژه جدیدی را شروع کنید و بر روی فرم آن اشیاء زیر را قرار دهید:
http://www.sharemation.com/ams/Delphi/telres.jpg?uniq=medlne
اکنون قسمت 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 یک متغیر از نوع رشته ای و بصورت سراسری معرفی شده استکه در آن شماره نهایی ثبت می شود و پس از خاتمه عملیات دوباره این متغیره خالی شده و منتظر شماره بعدی می ماند. ما از این روش در یک برنامه برای انبار شرکت گاز میانکوه خوزستان استفاده کردیم و مدتیست که سیستم پاسخ گوی انبار فعال است البته ما اطلاعات تماس گیرنده شماره درخواست تاریخ و ساعت آن را در برنامه ثبت می کنیم تا برنامه بتواند اطلاعات آماری برای ما نشان دهد.
نقل قول از سایت دلفی برای عموم (http://www.delphigroup.blogfa.com)
مهدی هادیان
سه شنبه 05 آذر 1387, 16:23 عصر
با تشکر فراوان از شما
برنامه ای که من نوشتم بسیار به برنامه شما شبیه است. ولی من نمی دانم از چه رویداد یا ویژگی ای باید استفاده کرد که به من شماره ی طرف مقابل که زنگ زده است را بدهد؟
یک سوالی هم از حضورتان داشتم و آن این است که من یک mainform و چند فرم دارم. و برنامه تلفن در یکی از فرم های فرعی است، می خواهم هنگامی که فردی تماس می گیرد فرم تلفن به طور خودکار باز شود تا بتوانم رویدادهایی که در حال رخ دادن است را مشاهده کنم.
AliReza Vafakhah
چهارشنبه 06 آذر 1387, 01:14 صبح
برنامه ای که من نوشتم بسیار به برنامه شما شبیه است. ولی من نمی دانم از چه رویداد یا ویژگی ای باید استفاده کرد که به من شماره ی طرف مقابل که زنگ زده است را بدهد؟
دوست عزیز باید مودم سیستم شما این قابلیت را پشتیبانی کند.
CJMOHSEN
چهارشنبه 06 آذر 1387, 07:43 صبح
مودم من زولتریکس است و در ویندوز به صورت generic شناخته می شه، به خاطر همین، کامپوننت kdtele با مدوم مشکل داره، می خواستم بدونم چه مودمی را برای این کار پیشنهاد می دهید. (ترجیحا مودم اینترنال)
مهدی هادیان
چهارشنبه 06 آذر 1387, 08:21 صبح
دوست عزیز باید مودم سیستم شما این قابلیت را پشتیبانی کند.
مودم من این قابلیت را پشتیبانی می کند. تنها در قسمتی از برنامه که قرار است شماره فرد تماس گیرنده را نشان دهد مشکل دارم.
در ضمن در جواب دوست عزیزی که معرفی مودم خواسته بودند باید بگویم تقریبا تمامی مودم های External ویژگی Caller ID را پشتیبانی می کنند و از مودم های Internal مودم SMART Spirit دارای این ویژگی می باشد.:لبخندساده:
AliReza Vafakhah
چهارشنبه 06 آذر 1387, 15:22 عصر
مودم من این قابلیت را پشتیبانی می کند. تنها در قسمتی از برنامه که قرار است شماره فرد تماس گیرنده را نشان دهد مشکل دارم.
در ضمن در جواب دوست عزیزی که معرفی مودم خواسته بودند باید بگویم تقریبا تمامی مودم های External ویژگی Caller ID را پشتیبانی می کنند و از مودم های Internal مودم SMART Spirit دارای این ویژگی می باشد.:لبخندساده:
بهتر به این تاپیک یه نگاهی بندازی تا به حرف من برسی
http://barnamenevis.org/forum/showthread.php?t=49022
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.