# Native Code > برنامه نویسی موبایل >  چگونه متوجه ورود sms جدید شویم؟

## reza6384

سلام. 
میخواستم بپرسم که چجوری متوجه بشیم که یک sms جدید رسیده؟ باید روی پورت سرکشی کنیم؟ خود موبایل چجوری تشخیص میده وقتی یک sms جدید میرسه؟ آیا Interrupt داره؟

ممنون.

----------


## noorsoft

باید خودتون هر چند وقت یک بار چک کنید اس ام اس جدید دریافت شده یا نه 
یک نکته را بگم و اون اینه که سیم کارت بیشتر از 15 پیام را ذخیره نمی کنه پس اگه به موقع پیامها را دریافت نکنید و بعد حافظه را آزاد نکنید پیامهای جدید رو از دست میدین

----------


## ali_kolahdoozan

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

----------


## reza6384

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




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


مثلا یک 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

خوب خودت كه داري ميگي با event كار كن . ديگر مشگلت چيست؟

----------


## reza6384

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

----------


## ali_kolahdoozan

وقتي event عمل كرد Raise شد . شما بايد بريزيش هر جا لازم داري . حالا sms جديد كه بياد باز event عمل ميكند يعني هميشه شما sms جديد رو بر ميداري ديگر با قبليها كاري نداري

----------


## reza6384

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

----------


## ali_kolahdoozan

عزيز دل شما يك طوري در پستهاي بالا به من حمله كردي كه من فكر كردم بلدي ي. ببين توي برنامت اگر event تعريف كني روي پورت يعني وقتي sms مياد يك event عمل ميكنه . و شما مثلا متن و ... رو توي بدنه آن event مثلا ميريزي توي db . مثل clipbord هست كه وقتي مثلا ctrl+c ميزنيم خود windows يك event رو raise ميكنه براي پورت هم ميشه تعريف كرد و بعد توي برنامه استفاده كرد

----------


## reza6384

> عزيز دل شما يك طوري در پستهاي بالا به من حمله كردي كه من فكر كردم بلدي ي.


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

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

----------


## ali_kolahdoozan

ديگر شما با at+cmgl=0 كاري نداريد . خود پورت event داره . و خودش raise ميشه . raise شدن توسط شما لازم نيست

----------


## noorsoft

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



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

----------


## noorsoft

> ديگر شما با at+cmgl=0 كاري نداريد . خود پورت event داره . و خودش raise ميشه . raise شدن توسط شما لازم نيست



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

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

----------


## reza6384

همونطور که Noorsoft عزیز گفت، EVENT  ای در کار نیست. چون به هنگام رسیدن SMS اطلاعاتی روی پورت فرستاده نمیشه، اگر میشد event هم داشتیم. ولی الان که نمیشه نداریم.

----------


## vahid_d_0101

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

----------


## soheil_programmer

با سلام

بله یک دستور AT هست بنام:
AT+CNMI=2,1,0,1

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

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

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

----------


## noorsoft

توضیح پارامترهای دستور


+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

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

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

----------


## Michka

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


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

ممنون
Michak

----------


## d68715

دمت گرم خیلی باحال بود
نتیجه رو گوشی من که سونی هست اومد درست کار کرد تاخیر کمتر از نیم ثانیه در روی پورت اومد
و روی پورت اومد
:CMTI+
me,12312312

----------


## sg.programmer

> توضیح پارامترهای دستور
> 
> 
> +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 
> ...



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

----------


## tooo3o

اگه دستور  AT+CNMI=2,1,0,1  رو بفرستي, هر بار كه اس ام اس جديد اومد خودش مياد و شماره ايندكس اس ام اس رو بهت ميده.
bye

----------


## sfz1221

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

----------


## pedram123

> باید خودتون هر چند وقت یک بار چک کنید اس ام اس جدید دریافت شده یا نه 
> یک نکته را بگم و اون اینه که سیم کارت بیشتر از 15 پیام را ذخیره نمی کنه پس اگه به موقع پیامها را دریافت نکنید و بعد حافظه را آزاد نکنید پیامهای جدید رو از دست میدین


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

----------


## mahboube

> با سلام
> 
> بله یک دستور 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” 
> ...


http://www.atmel.com/dyn/resources/p...ts/doc8016.pdf

----------


## chitoz2010

واقعا ممنون. اين دستور تا اينجا كه خوب بود. OK داد. ولي هنوز پيامي كه ارسال كردم رو نشون نداده. ولي خودش جاي اميدي هست كه برنامه خطا نگرفته. pdf خوبي بود. باز هم ممنون.

----------


## k1.technology

با سلام دوستان اگه اس ام اس ها از طریق پورت وارد میشن!پس میشه پورتوsniff کرد  و به دادها دسترسی پیدا کرد؟

----------


## soheiladv

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

----------

