PDA

View Full Version : چگونه متوجه ورود sms جدید شویم؟



reza6384
جمعه 15 شهریور 1387, 14:29 عصر
سلام.
میخواستم بپرسم که چجوری متوجه بشیم که یک sms جدید رسیده؟ باید روی پورت سرکشی کنیم؟ خود موبایل چجوری تشخیص میده وقتی یک sms جدید میرسه؟ آیا Interrupt داره؟

ممنون.

noorsoft
جمعه 15 شهریور 1387, 17:38 عصر
باید خودتون هر چند وقت یک بار چک کنید اس ام اس جدید دریافت شده یا نه
یک نکته را بگم و اون اینه که سیم کارت بیشتر از 15 پیام را ذخیره نمی کنه پس اگه به موقع پیامها را دریافت نکنید و بعد حافظه را آزاد نکنید پیامهای جدید رو از دست میدین

ali_kolahdoozan
جمعه 15 شهریور 1387, 21:03 عصر
يك كلاس تعريف كنيد و روي پورتها event بزاريد . خواندن مرطب از پورت كار درستي نيست . در ضمن مگر ميشه همش يك تايمر كار كنه . اينطوري كه برنامه بعد از چند وقت پشت سر هم روشن بودن ميتركه

reza6384
جمعه 15 شهریور 1387, 22:14 عصر
با تشکر از دوستان.



باید خودتون هر چند وقت یک بار چک کنید اس ام اس جدید دریافت شده یا نه


مثلا یک sms به گوشی خودمون میفرستیم. در شرایط عادی آنتن دهی، یکی دو ثانیه طول می کشه که گوشی ما اعلام کنه یک پیام جدید رسیده. یعنی باید مثلا هر ثانیه پورت رو چک کنیم؟



يك كلاس تعريف كنيد و روي پورتها event بزاريد . خواندن مرطب از پورت كار درستي نيست . در ضمن مگر ميشه همش يك تايمر كار كنه . اينطوري كه برنامه بعد از چند وقت پشت سر هم روشن بودن ميتركه


ببخشید، اصلا احتیاجی به این کار نیست. در Net. 2 اینکار انجام شده، یعنی وقتی که داده روی پورت میاد، یک Event به نام DataReceived فراخوانی میشه و میشه با استفاده از Object.ReadExisting رشته موجود در بافر پورت رو خوند.



Dim Withevents MySerialPort As New System.Io.Ports.SerialPort

در ضمن ، شما گوشی یا مودمتون رو به Hyper Terminal وصل کنید ، یک Sms بهش ارسال کنید. آیا در Hyper Terminal رشته ورودی رو میبینید یا اینکه باید از دستور AT+CMGL استفاده کنید؟ منظورم اینه که وقتی یک SMS جدید میاد رشته ای روی پورت نمیاد.

حالا این سوال رو میپرسم. به نظر شما با این تفاسیر، گوشی میاد هر ثانیه یک بار دستور AT+CMGL=0 رو اجرا می کنه تا بفهمه که SMS جدید اومده؟

با تشکر از دوستان.

ali_kolahdoozan
جمعه 15 شهریور 1387, 22:19 عصر
خوب خودت كه داري ميگي با event كار كن . ديگر مشگلت چيست؟

reza6384
جمعه 15 شهریور 1387, 22:40 عصر
مشکلی ندارم. می خوام بدونم خود گوشی چیکار می کنه؟ در ضمن وقتی ما با AT+CMGL=0 اومدیم و پیام های جدید رو خوندیم، چکار کنیم که دفعه بعدی این پیام ها دوباره توی New Messages نباشند و دوباره به لیست پیام های جدید ما اضافه نشوند؟

ali_kolahdoozan
جمعه 15 شهریور 1387, 22:44 عصر
وقتي event عمل كرد Raise شد . شما بايد بريزيش هر جا لازم داري . حالا sms جديد كه بياد باز event عمل ميكند يعني هميشه شما sms جديد رو بر ميداري ديگر با قبليها كاري نداري

reza6384
جمعه 15 شهریور 1387, 22:52 عصر
علی جان شما متوجه منظور من نشدین.
ببینید، فرض کنید که گوشی به USB وصله و HyperTerminal هم جلوی شما قرار گرفته، وقتی پیام جدید میاد HyperTerminal هیچ چیزی رو نشون نمیده، اگر نشون می داد که خوب بود، هر بار SMS جدید میومد ، یک رشته PDU میومد روی پورت و Event فراخوانی میشد و ما اون رشته رو تفسیر می کردیم. ولی وقتی پیام جدید میاد گوشی خودش یک کاری برای خودش می کنه که می فهمه SMS جدید اومده و چیزی رو روی پورت ارسال نمی کنه که ما بفهمیم. ما باید با AT+CMGL ازش بخواهیم به ما بگه.

ali_kolahdoozan
جمعه 15 شهریور 1387, 23:31 عصر
عزيز دل شما يك طوري در پستهاي بالا به من حمله كردي كه من فكر كردم بلدي ي. ببين توي برنامت اگر event تعريف كني روي پورت يعني وقتي sms مياد يك event عمل ميكنه . و شما مثلا متن و ... رو توي بدنه آن event مثلا ميريزي توي db . مثل clipbord هست كه وقتي مثلا ctrl+c ميزنيم خود windows يك event رو raise ميكنه براي پورت هم ميشه تعريف كرد و بعد توي برنامه استفاده كرد

reza6384
شنبه 16 شهریور 1387, 06:03 صبح
عزيز دل شما يك طوري در پستهاي بالا به من حمله كردي كه من فكر كردم بلدي ي.


اولا که ما مخلص شما هستیم.

ثانیا نمی دونم چرا یا من متوجه منظور شما نمیشم، یا شما متوجه منظور من.
حالا من سوال می پرسم. آیا منظور شما از Event روی پورت اینه که مثلا یک Event به نام NewSmsReceived رو تعریف کنیم، بعد هر وقت که با دستور AT+CMGL=0 متوجه ورود SMS جدید شدید بیایم Event رو Raise کنیم. اینکار رو هم با استفاده از یک Timer هر ثانیه یکبار انجام بدیم. درسته؟

ali_kolahdoozan
شنبه 16 شهریور 1387, 08:55 صبح
ديگر شما با at+cmgl=0 كاري نداريد . خود پورت event داره . و خودش raise ميشه . raise شدن توسط شما لازم نيست

noorsoft
شنبه 16 شهریور 1387, 08:59 صبح
يك كلاس تعريف كنيد و روي پورتها event بزاريد . خواندن مرطب از پورت كار درستي نيست . در ضمن مگر ميشه همش يك تايمر كار كنه . اينطوري كه برنامه بعد از چند وقت پشت سر هم روشن بودن ميتركه


متاسفانه نه مودم و نه جی اس ام مودم هیچ eventی برای پورت ارسال نمی کنند
و دیگه اینکه در در تمام زبانهای برنامه نویسی کامپوننتهای پورتهای سریال در صورتی که برای شما اطلاعاتی ارسال بشه به شما event میدن پس چون اطلاعاتی ارسال نمیشه eventی هم در کار نیست

noorsoft
شنبه 16 شهریور 1387, 09:08 صبح
ديگر شما با at+cmgl=0 كاري نداريد . خود پورت event داره . و خودش raise ميشه . raise شدن توسط شما لازم نيست


میشه یکم بیشتر توضیح بدین
تا اونجایی که من میدونم دستگاههای که مودم جی اس ام هستند یکسری از دستورات باعث میشه به شما رویدادها را گزارش بدند
برای مثال شما این امکان را دارین که به مودم اعلام کنید اگه خطایی رخ داد به من گزارش بده یا نه و یا اگر کسی زنگ زد به ما اعلام بکن یا نه
خوب اگه شما به مودم بگین هر وقت گوشی زنگ میخوره اعلام کن مودم به شما این رویداد را اعلام میکنه و یازی نیست خودتون مرتب این را چک کنید ولی در مورد اس ام اس جدید این طور نیست هیچ رویدادی اعلام نمیشه بلکه این خودتون هستید که باید چک کنید پیامی جدیددی دریافت کرده اید یا نه
حالا اگه رویدادی که شما از اون حرف میزنید غیر از اینیه که من گفتم لطف کنین یکم بیشتر توضیح بدین

موفق و موید باشید

reza6384
شنبه 16 شهریور 1387, 09:08 صبح
همونطور که Noorsoft عزیز گفت، EVENT ای در کار نیست. چون به هنگام رسیدن SMS اطلاعاتی روی پورت فرستاده نمیشه، اگر میشد event هم داشتیم. ولی الان که نمیشه نداریم.

vahid_d_0101
شنبه 16 شهریور 1387, 20:55 عصر
سلام
ببخشید منم فضولی کردم ولی یه برنامه دو سه سال قبل دیدم که برای مدارس هوشمند بود کارش هم این بود که تا اس ام اس براش میومد اون سریعا اس ام اس رو میخوند و یک جواب برای آن طرف میفرستاد
منم خیلی میخوام بدونم چه طوری باید بفهمیم که اس ام اس جدید اومده یا نه
در ضمن من تست کردم موبایل وقتی براش یه اس ام اس میاد هیچ چیزی روی پورت سریال نمیفرسته

soheil_programmer
شنبه 16 شهریور 1387, 22:23 عصر
با سلام

بله یک دستور AT هست بنام:

AT+CNMI=2,1,0,1

که میشه گفت event مودم را برای دریافت sms جدید فعال میکنه از این دستور به بعد هر گاه اس ام اس جدید بیاد به صورت زیر به نمایش در میاد:


+CMTI: "ME",108
این پاسخ از سمت مودم نمایانگر محل ذخیره سازی اس ام اس جدید می باشد.

ضمناً اینو خودم تست کردم و عملاً نتیجشو دیدم:لبخند:

noorsoft
یک شنبه 17 شهریور 1387, 03:55 صبح
توضیح پارامترهای دستور



+CNMI=<mode>,<mt>,
<mode> buffering mode
<bm>,<ds>,<bfr>
0
Buffer unsolicited result codes in the TA. If TA result
code buffer is full, the oldest indications may be discarded
and replaced with the new received indications.
1 Discard indication and reject new received message
unsolicited result codes when TA-TE link is reserved (e.g. in
on-line data mode). Otherwise forward them directly to the
TE.
2 Buffer unsolicited result codes in the TA when TA-TE link
is reserved (e.g. in on-line data mode) and flush them to the
TE after reservation. Otherwise forward them directly to the
TE.
<mt> rules for storing received SMs
0
No SMS-DELIVER indications are routed to the TE.
1 If SMS-DELIVER is stored into ME/TA, indication of the
memory location is routed to the TE using unsolicited result
code +CMTI: <mem>,<index>
<bm> rules for storing received CBMs
0
No CBM indications are routed to the TE.
<ds> SMS-STATUS-REPORTs routing mode
0
No SMS-STATUS-REPORTs are routed to the TE.
<bfr> TA buffer of unsolicited result codes behaviour
0
TA buffer of unsolicited result codes defined within this
command is flushed to the TE when <mode> 1...3 is entered (OK
response shall be given before flushing the codes).
1 TA buffer of unsolicited result codes defined within this
command is cleared when <mode> 1...3 is entered.
Response
ERROR
+CNMI? +CNMI: <mode>,<mt>,<bm>,<ds>,<bfr>

reza6384
یک شنبه 17 شهریور 1387, 12:11 عصر
با تشکر از Soheil_Programmer و Noorsoft. آقا دمتون گرم جواب داد Ok شد. در ضمن آقای علی کلاهدوزان، متشکرم که در این بحث شرکت کردید ، منظور شما همین بوده احتمالا، گفتین Event داره ، ولی نگفتین چجوری فعال میشه. حالا با این Event و همچنین رویداد DataReceived خود SerialPort میشه ورود SMS جدید رو تشخیص داد.

خیلی خیلی خیلی ممنون.

Michka
یک شنبه 17 آذر 1387, 21:47 عصر
با تشکر از Soheil_Programmer و Noorsoft. آقا دمتون گرم جواب داد Ok شد. در ضمن آقای علی کلاهدوزان، متشکرم که در این بحث شرکت کردید ، منظور شما همین بوده احتمالا، گفتین Event داره ، ولی نگفتین چجوری فعال میشه. حالا با این Event و همچنین رویداد DataReceived خود SerialPort میشه ورود SMS جدید رو تشخیص داد.

خیلی خیلی خیلی ممنون.

اقا رضا من يه كمي تازه واردم ، ميشه يكم بيشتر در مورده استفاده از دستوراتي كه گفتي توضيح بدي .

ممنون
Michak

d68715
جمعه 11 دی 1388, 22:52 عصر
دمت گرم خیلی باحال بود
نتیجه رو گوشی من که سونی هست اومد درست کار کرد تاخیر کمتر از نیم ثانیه در روی پورت اومد
و روی پورت اومد
:CMTI+
me,12312312

sg.programmer
شنبه 12 دی 1388, 13:43 عصر
توضیح پارامترهای دستور



+CNMI=<mode>,<mt>,
<mode> buffering mode
<bm>,<ds>,<bfr>
0
Buffer unsolicited result codes in the TA. If TA result
code buffer is full, the oldest indications may be discarded
and replaced with the new received indications.
1 Discard indication and reject new received message
unsolicited result codes when TA-TE link is reserved (e.g. in
on-line data mode). Otherwise forward them directly to the
TE.
2 Buffer unsolicited result codes in the TA when TA-TE link
is reserved (e.g. in on-line data mode) and flush them to the
TE after reservation. Otherwise forward them directly to the
TE.
<mt> rules for storing received SMs
0
No SMS-DELIVER indications are routed to the TE.
1 If SMS-DELIVER is stored into ME/TA, indication of the
memory location is routed to the TE using unsolicited result
code +CMTI: <mem>,<index>
<bm> rules for storing received CBMs
0
No CBM indications are routed to the TE.
<ds> SMS-STATUS-REPORTs routing mode
0
No SMS-STATUS-REPORTs are routed to the TE.
<bfr> TA buffer of unsolicited result codes behaviour
0
TA buffer of unsolicited result codes defined within this
command is flushed to the TE when <mode> 1...3 is entered (OK
response shall be given before flushing the codes).
1 TA buffer of unsolicited result codes defined within this
command is cleared when <mode> 1...3 is entered.
Response
ERROR
+CNMI? +CNMI: <mode>,<mt>,<bm>,<ds>,<bfr>



توضیح پارامترهای دستور را کسی میتونه به فارسی بگه چی می شه

tooo3o
جمعه 06 فروردین 1389, 11:05 صبح
اگه دستور AT+CNMI=2,1,0,1 رو بفرستي, هر بار كه اس ام اس جديد اومد خودش مياد و شماره ايندكس اس ام اس رو بهت ميده.
bye

sfz1221
شنبه 26 تیر 1389, 19:42 عصر
سلام دوستان
فقط خواستم بگم تو بعضی موبایلها و gsm mpdem ها با دستور زیر خود پیام با CMT+ ظاهر میشه.
AT+CNMI=2,,2,0,1,0
البته اگه AT+CNMI رو سرچ کنید مطالب بسیار مفیدی گیرتون میاد

pedram123
سه شنبه 12 مرداد 1389, 02:45 صبح
باید خودتون هر چند وقت یک بار چک کنید اس ام اس جدید دریافت شده یا نه
یک نکته را بگم و اون اینه که سیم کارت بیشتر از 15 پیام را ذخیره نمی کنه پس اگه به موقع پیامها را دریافت نکنید و بعد حافظه را آزاد نکنید پیامهای جدید رو از دست میدین

دوست من از کی تا حالا بافر شبکه برای هر سیم کارت 15 اس ام اس شده؟
فقط یک اس ام اس
شما باید یک listener روی پورتی که می خوای بنویسی و از پوش ریجستر برای آگاهی از ورود اس ام اس جدید استفاده کنی:قهقهه:

mahboube
یک شنبه 22 خرداد 1390, 09:34 صبح
با سلام

بله یک دستور AT هست بنام:

AT+CNMI=2,1,0,1

که میشه گفت event مودم را برای دریافت sms جدید فعال میکنه از این دستور به بعد هر گاه اس ام اس جدید بیاد به صورت زیر به نمایش در میاد:


+CMTI: "ME",108
این پاسخ از سمت مودم نمایانگر محل ذخیره سازی اس ام اس جدید می باشد.

ضمناً اینو خودم تست کردم و عملاً نتیجشو دیدم:لبخند:

البته اين دستور بااين value ها براي من error مي داد.و اينطوري حل شد:
at+cnmi=2,1,0,0,0
كه من اينا رو ديدم راجبش،ان شا... مفيد باشه:


2.1.3 New Message Indication (AT+CNMI) “AT+CNMI” configures how the modem signals arrival of new messages to the connected terminal device and how they are stored in the modem. This feature is useful when it comes to reading new messages. Instead of polling the modem periodically for arrival of new messages, “AT+CNMI” can tell when a new message has arrived. The AVR will catch such indication, and set a flag. This ensures that the modem only takes up CPU resources when necessary.
Table 2-4. AT+CNMI command and possible responses

Command
Response
Comment
“AT+CNMI=[mode]1,[mt]2,[bm]3,[ds]4,[bfr]5”
”OK”
Mode set
”ERROR”
Error, could not set such mode.
Notes:
 
1. [mode] integer type: how messages are buffered.
2. [mt] integer type: indication of new SMS, set to 1.
3. [bm] integer type: Not in use.
4. [ds] integer type: Not in use.
5. [bfr] integer type: Not in use.


http://www.atmel.com/dyn/resources/prod_documents/doc8016.pdf

chitoz2010
پنج شنبه 12 آبان 1390, 09:27 صبح
واقعا ممنون. اين دستور تا اينجا كه خوب بود. OK داد. ولي هنوز پيامي كه ارسال كردم رو نشون نداده. ولي خودش جاي اميدي هست كه برنامه خطا نگرفته. pdf خوبي بود. باز هم ممنون.

k1.technology
شنبه 23 اردیبهشت 1391, 08:38 صبح
با سلام دوستان اگه اس ام اس ها از طریق پورت وارد میشن!پس میشه پورتوsniff کرد و به دادها دسترسی پیدا کرد؟

soheiladv
یک شنبه 07 مهر 1392, 13:05 عصر
سلام دوستان نمیدونم این سوال به دستت شما عزیزان میرسه یا نه
دوستان من دنبال ارسال دستور به دستگاه سانترال پاناسونیک هستم اگه کسی میدونه چطوری خوشحال میشم
ترجیحا به ایمیلم بزنید
soheiladv@gmail.com