PDA

View Full Version : حرفه ای: کامپوننت GsmComm نمیتونه برای من sms ها رو بخونه!



Rejnev
شنبه 20 آذر 1389, 11:56 صبح
با سلام
من کامپوننت gsmComm (http://barnamenevis.org/www.scampers.org/steve/sms/libraries.htm) رو دانلود کردم و حتی کدهاش رو هم با reflector بررسی کردم. مشکلی نداشت بجز یک مورد.
وقتی با متد ReadMessasge میاد و AT+CMGL رو اجرا میکنه و میخواد خروجی دستور رو تجزیه کنه، عبارت منظمی که نوشته هیچوقت با خروجی مودم مچ نمیشه.
عبارتش چیزی توی این مایه هاست:


Regex r=new Regex("\+CMFL (\d+),(\d+),(\w*),(\d+)\n\r(\w+)");
Match m=r.Match("123,456,\"this line is my modem output\",789,this is pdu...");
if(m.Success)
{
//...
}
else
{
throw;//this code will be run for me...
}


خروجی مودم من شبیه اینه:



+CMGL 1,15,"",3 <cr><lf>
pdu text...


که هیچوقت با عبارت منظم مچ نمیشه. برای اینکه success بشه باید دابل کوتیشن های خروجی(بعد از کامای دوم) رو حذف کنیم که این کامپوننت این کار رو نمیکنه.
من به سازنده این کامپوننت هم ایمیلی فرستادم و مطلب رو رسوندم اما بعید میدونم جواب بده...
حالا از دوستان اگه کسی با این کامپوننت کار کرده و یا راه حل جایگزینی داره لطفا ارائه بده. یکم فوریه...
با تشکر

mahmoodramzani
شنبه 20 آذر 1389, 12:53 عصر
سلام.
من با این کامپوننت کار نکردم اما اون چیزی که تو کد دارم میبینم اینه که نباید هم regex با مقدار برگشتی از مودم match بشه چون تو regex نوشته شده که خط اول باید CMFL باشه که خط اول جواب شما CMGL هست.
در ضمن یادم نمیاد که فرمان CMFL داشته باشیم.
عبارت CMFL رو با CMGL جایگزین کنید.

Rejnev
شنبه 20 آذر 1389, 13:18 عصر
با تشکر
اشتباه تایپی من بود. من همه اینا رو حفظی نوشتم. CMGL درسته.
gsmComm یک کتابخونه جامع و کامله و حیف ازش استفاده نکنم. ولی با این مشکلی که پیش اومده فکر کنم باید خودم یک کتابخونه بنویسم. فعلا چند تا کلاس تبدیل pdu برای شروع پیدا کردم. میمونه پورت نویسیاش.

اگه یک برنامه باشه که بشه dll های دات نت رو decompile کرد و خروجی پروژه بده هم میشه کد هاش رو دستی آپدیت کرد.

mahmoodramzani
شنبه 20 آذر 1389, 14:46 عصر
یک نمونه جواب معتبر CGML :

+CMGL: 1,0,,62
07915892000000F0040B915892214365F70000704021325224 2331493A283D0795C3F33C88FE06C9CB6132885EC6D341EDF2 7C1E3E97E7207B3A0C0A5241E377BB1D7693E72E

جواب برگشتی از مودم رو با کدی که بالا گذشتم مقایسه کنید.

mahmoodramzani
شنبه 20 آذر 1389, 14:47 عصر
توضیح:

+CMGL: index,message_status,[address_text],TPDU_length<CR><LF>SMSC_number_and_TPDU[<CR><LF>+CMGL: ...]

Rejnev
شنبه 20 آذر 1389, 15:14 عصر
دقیقا...
مرسی
مودم شما
+CMGL: 1,0,,62
رو بر میگردونه حال آنکه مودم من (Edge u621)
+CMGL: 1,0,"",62
دابل کوتیشن کار رو خراب کرده. اون کامپوننت هم نمیتونه با دابل کوتیشن رشته رو تجزیه کنه و اس ام اس رو بسازه

Rejnev
شنبه 20 آذر 1389, 15:27 عصر
این یک نمونه از خروجی Hyper terminal به ازای اجرای دستور AT+CMGL=4 :

at+cmgl=4

+CMGL: 1,2,"",46
079189390500410011000B819051152252F10008A720063306 44062706450020062706CC06460020062A0633062A00200627 0633062A

OK

Rejnev
شنبه 20 آذر 1389, 16:05 عصر
دوستان حل شد.:لبخند:
با دست پر توان خودم درستش کردم....
در پست 3 گفتم که اگه یک برنامه باشه که بشه کد رو برگردوند و ویرایشش کرد درست میشه...
با reflector که نمیشه. اتفاقی یک افزونه پیدا کردم که به reflector میچسبید و خروجی پروژه میداد. پس بعد از Deassemble کردن dll مربوطه، RegEx رو درست کردم و جواب هم میده.
با تشکر.
(اینو برای آیندگان مینویسم:)
اگه کسی با همچین مشکلی برخورد همینجا بگه یا ایمیل بزنه.

Rejnev
شنبه 20 آذر 1389, 22:38 عصر
اینو زدم که از stefan mayr تشکر کنم(سازنده یک کتابخانه جامع ارسال و دریافت اس ام اس مخصوص دات نت با نشانی این سایت (http://barnamenevis.org/www.scampers.org)).
بنده خدا جواب ایمیلی رو که در پست یک گفتم فکر نمیکنم جواب بده رو داد و گفت میدونه که همچین مشکلی هست (double Quotes in Alpha) و قرار شده در نسخه بعدی درستش کنن.
باز بگید اینا دین و ایمون سرشون نمیشه!... البته منم ازش حلالیت طلبیدم و گفتم dll تو دستکاری کردم، راضی باش!
حالا قراره جواب بده که ازین کارم ناراحت شده یا نه.
فعلا...
خودمونیم ها... خودم سوال می پرسم و خودم جواب میدم! جوینده یابنده است دیگه

HAMRAHSOFT.IR
شنبه 20 آذر 1389, 22:59 عصر
دوست خوب لينكه دانلود كامپونت و نمونه خوشو بزار ببينم از Kylix بهتر يا نه چون من چند سال با Kylix دارم كار ميكنم خوب بوده اگه بشه اينم ببنيم چطور

Rejnev
یک شنبه 21 آذر 1389, 00:08 صبح
این کتابخونه مخصوص دات نته. گفتم باشم. باز فحشم ندی...
در ضمن کاملا رایگانه (توی خود سایتش نوشته) و هیچ قفل و کرکی نداره
البته من کایلیکسو ندیدم ولی فک کنم لایسنسیه.
این لینک نسخه دات نت 2 کتابخونست
http://www.scampers.org/steve/sms/GSMComm_v1.11_net2.0_x86.msi
وقتی نصبش کنی یک سمپل و داکیومنت هم بهت میده که با دیدن سمپل خواهی دید چه امکاناتی داره.
اینم آدرس نصبی لینک بالا (http://www.scampers.org/steve/sms/libraries.htm)
صفحه sample هاش هم همون بالای سایتش هست.
کلاسهای کتابخونه در نسخه جدید که لینکش رو گذاشتم به سبک msdn مستند سازی شدن(document هم همینطور) که خیلی به برنامه نویس کمک میکنه (در نسخ قبلی نبود).
این لینک (http://www.codeproject.com/KB/cs/SMS.aspx) codeproject هم از همون کتابخونه برای ارسال و دریافت استفاده کرده و یک برنامه جالب نوشته...
بعد از نصب dll های GsmCommunication.dll و GsmShared و PduConverter و یکی دو تا دیگه میده که خیلی راحت میتونی به پروژه add Reference کنی و ازش استفاده کنی.
اگه توی خوندن sms ها هم مشکلی که من داشتم رو داشتید با پیام خصوصی و یا ارسال ایمیل به mohammad_bagherani at yahoo در میون بذارید تا نسخه اصلاح شده توسط حقیر رو تقدیم کنم.

aliramazani
جمعه 15 مهر 1390, 11:35 صبح
دوست عزیز کامپوننت اصلاح شده را در همین جا اتچ کنید لطفا.

راستی با این کامپوننت میشه سیگنال و کارخانه سازنده و imie و ... را بدست اورد؟

Rejnev
یک شنبه 15 شهریور 1394, 23:01 عصر
سلام.
سیگنال رو میشه بدست آورد. اون 2 مورد دیگه رو نمیدونم.
ارسال و دریافت sms با این کتابخانه امکان پذیره.
متاسفانه سورسش رو دیگه ندارم و فقط 2 dll از اون دارم که اصلاحی که گفتم رو فکر نمیکنم داشته باشه. بهر حال میتونید خودتون با رفلکتور بازش کنید و یک قسمت از کد رو که مربوط به alpha هست (خخخیلی کم از کد یادمه) رو بصورت "" (رشته خالی) تغییر بدین (یا اگه خالی بود یک مقدار دیگه باید داده بشه. به دستورات at command مراجعه شود. ضمنا این قسمت در مودمهای مختلف متفاوته و بعضی مودمها نیازی به تغییر این بخش ندارند)
این هم سایت سازنده ست که توش نسخه بهمراه داکیومنت کار با کتابخونه وجود داره:
http://www.scampers.org/steve/sms/libraries.htm

MAN_UNITED
دوشنبه 16 شهریور 1394, 19:24 عصر
سلام.
سیگنال رو میشه بدست آورد. اون 2 مورد دیگه رو نمیدونم.
ارسال و دریافت sms با این کتابخانه امکان پذیره.
متاسفانه سورسش رو دیگه ندارم و فقط 2 dll از اون دارم که اصلاحی که گفتم رو فکر نمیکنم داشته باشه. بهر حال میتونید خودتون با رفلکتور بازش کنید و یک قسمت از کد رو که مربوط به alpha هست (خخخیلی کم از کد یادمه) رو بصورت "" (رشته خالی) تغییر بدین (یا اگه خالی بود یک مقدار دیگه باید داده بشه. به دستورات at command مراجعه شود. ضمنا این قسمت در مودمهای مختلف متفاوته و بعضی مودمها نیازی به تغییر این بخش ندارند)
این هم سایت سازنده ست که توش نسخه بهمراه داکیومنت کار با کتابخونه وجود داره:
http://www.scampers.org/steve/sms/libraries.htm

ممنون بابت جواب :لبخندساده:
میشه بیشتر توضیح بدین که توی کدوم DLL باید تغییر بدم
و آیا DLL بهتری وجود نداره که مثل این رایگان باشه؟
مرسی:لبخندساده:

Rejnev
دوشنبه 16 شهریور 1394, 21:40 عصر
متن ایمیل مکاتبات من در سال 2010 با سازنده این کتابخونه
(زبانم داغون بود)


hi
I have a problem using ReadMessage(index,storage) method in GsmComMain.
I examine your code with reflector and i think my problem is that no matches found in regular expression
(Unexpected response received from phone error...)
Match m;
Regex r = new Regex(@"(\d+),(\w*),(\d+)");
String input="123, \"hello\" ,456";
m = r.Match(input.Replace( "\"" , "" ));
if (m.Success)
{
MessageBox.Show("yes"); //with removing ( " ) from input, this code will be run
}
else
{
MessageBox.Show("no"); //ur code says no! (it didn't matches) because of ( "" ) in output string CMGR command
}
my gsm modem output is like this:
at+cmgr=1
+CMGR: 2,"",15
079189390500410011000B929051152252F10000AA0173
i am waiting...
thank you






thank u master mayr.
if u didn't upset... i say u that i decompile ur code using reflector and convert to code...
then i act my own changes to ur dll (i edited the Regex). it works fine for me...




From: Stefan Mayr <s_mayr@gmx.net>
To: mohammad <mohammad_...i@yahoo.com>
Sent: Sat, December 11, 2010 7:43:32 PM
Subject: Re: plz examine this bug in your GsmPhone class


Hello,

it is a known bug that the message parser doesn't accept "alpha" parameter values with quotation marks.

There will be a fix in the next GSMComm version,.


Regards

Stefan







Hello,

In this case it's more important that the changes work for you, so you can keep what you have.

Since you already created a new Regex, compare this Regex, which GSMComm will be using in the future, to your own:

const string readPattern = @"\+CMGR: (\d+),(?:""(\w*)"")?,(\d+)\r\n(\w+)";

And for CMGL:

const string readPattern = @"\+CMGL: (\d+),(\d+),(?:""(\w*)"")?,(\d+)








و خبر خوش این که سورس ها رو از توی ایمیلهای 2010 پیدا کردم...
Good luck

MAN_UNITED
دوشنبه 16 شهریور 1394, 23:09 عصر
واقعا ممنون :لبخندساده::لبخندساده::لبخن ساده:
اما با DLL که تغییر دادین هم بازم ارور میده:ناراحت::ناراحت:
سورسی که گذاشتین رو امتحان کردن
توی همون Regex ارور میده
کد اصلی اینه

\+CPMS: (\d+),(\d+),(\d+),(\d+)(?:,(\d+),(\d+))?

مقداری که میاد
+CPMS: 0, 50, 12, 100, 12, 100
تغییرش دادم این باهاش مچ میشه
\+CPMS: (\d+), (\d+), (\d+), (\d+), (\d+), (\d+)?

الان ارور نمیده ولی هیچ مسیجی نمیاره :افسرده::افسرده::افسرده::افس ده: