ارسال و دریافت sms در مد pdu با sim800
به طور کلی دو فرمت برای ارسال و دریافت sms در gsm مودمها وجود دارد . فرمت ها عبارت است از text mode و pdu mode که توسط فرمان AT+CMGF در GSM تعیین می گردد . توسط فرمان AT+CMGF=1 مد text فعال و توسط فرمان AT_CMGF=0 مد pdu فعال می شود . اکثر gsm ها از جمله ماژول sim800 از هر دو فرمت pdu , text پشتیبانی می کنند . در برخی از gsm ها و موبایل های قدیمی فقط از فرمت pdu پشتیبانی می شود .
در فرمت text برای ارسال و دریافت sms از کاراکترهای نوشتاری استاندارد استفاده می شود . همچنین شما می توانید آموزش ارسال SMS فارسی در MODE TEXT را از همین سایت مطالعه کنید .
اما در فرمت pdu اطلاعات ارسال و دریافت باید به صورت قالب خاصی فشرده سازی و رمز نگاری شوند ، که در هنگام دریافت باید این اطلاعات رمزگشایی شوند تا برای ما قابل فهم شوند .
در ادامه به مزیت استفاده از mode pdu خواهیم پرداخت ، همانطور که می دانید تعداد کاراکترهایی که می توانیم در قالب یک sms ارسال کنیم برابر با 140 کاراکتر می باشد . این کاراکترها که شامل همه حروف بزرگ و کوچک و اعداد و علامت ها هستند را کاراکترهای اسکی می نامیم . هر کاراکتر اسکی مقدار 7 بیت از یک کاراکتر(8 بیت) را اشغال می کند . بنابراین زمانی که ما sms را ارسال می کنیم در هر بایت یک بیت بلااستفاده نیز ارسال می شود . در mode pdu ما طی عملیاتی از تمامی ظرفیت بیت ها استفاده می کنیم و تعداد کاراکتری را که می توانیم در قالب یک sms ارسال کنیم برابر با (140*8)/7=160 می باشد .
موضوعاتی که در این مقاله به آنها پرداخته خواهد شد :
ارسال sms در mode pdu :
در ادامه با ذکر یک مثال به صورت عملی با نحوه فشرده سازی و ارسال یک پیامک در مد pdu آشنا می شویم . در این مثال ما می خواهیم کلمه hello را توسط سیمکارت رایتل به شماره مقصد 09120197955 ارسال کنیم .
mode pdu از سه نوع داده خاص استفاده می کند :
- octet : گروهی از داده های 8 بیتی به صورت هگزا دسیمال می باشد .
- semi-octet : گروهی از داده های 8 بیتی به صورت دسیمال می باشد .
- septet : گروهی از داده های 7 بیتی به صورت عدد صحیح می باشد .
کلمه hello شامل 5 کاراکتر است که septet نامیده می شود . هر کدام از septet ها کاراکترهای 7 بیتی را تشکیل می دهند . برای ارسال باید septet ها به octet تبدیل شوند . اولین septet کاراکتر (h(1101000 می باشد که با افزودن کم ارزشترین بیت از septet دوم به انتهای h به octet تبدیل می شود (1101000+1=11101000) . کاراکتر دوم 2 بیت از septet سوم دریافت می کند و این عملیات تا septet آخر ادامه می یابد .
بعد از اینکه متن sms به داده های octet تبدیل شد ، برای ارسال باید یک سری فیلد که توسط انستیتو استاندارد اروپا (ETSI) مشخص شده ، به قالب sms اضافه شود . کد زیر یک نمونه sms در فرمت pdu است که به بررسی تمام فیلدهای آن می پردازیم .
AT+CMGF=0 OK AT+CMGS=19 > 079189290000900231000B819021107959F50000FF05E8329BFD06 <control+z> +CMGS: 6 OK
1 . طول شماره مرکز پیام را در مبنای هگز نشان می دهد . در قسمت 3 توضیح داده خواهد شد .
2 . نوع شماره مرکز پیام می باشد ، اگر شماره با + شروع شود از نوع بین الملل است و به جای آن عدد 91 قرار می گیرد در غیر اینصورت عدد 81 قرار می گیرد .
3 . شماره مرکز پیام از نوع semi-octet می باشد ، در این مثال سیم کارت اپراتور رایتل است و شماره مرکز پیام 989200000920+ می باشد . شماره ها باید دو رقم به دو رقم جدا و برعکس شود . اگر تعداد ارقام شماره فرد باشد باید مقدار F به آخر آن اضافه شود . در نهایت طول شماره مرکز پیام 7 می باشد که در قسمت 1 قرار داده شده است .
02 90 00 00 29 89 91
توسط فرمان زیر شماره مرکز پیام سیم کارت را بدست می آوریم :
AT+CSCA? +CSCA: "+989200000920",145 OK
4 . گزارش تحویل یا delivery را فعال می کند ، عدد 31 فعال و عدد 11 غیر فعال می باشد . شما می توانید آموزش فعال سازی delivery در ماژول های GSM را در همین سایت مطالعه نمایید .
5 . شماره Index پیام را مشخص می کند ، اگر مقدار 00 باشد متن پیام فعلی و غیر صفر مقدار Index پیام ذخیره شده در حافظه را نشان می دهد .
6 . طول شماره مقصد از نوع semi-octet می باشد .
7 . نوع شماره مقصد را مشخص می کند ، اگر با + آغاز شود از نوع بین الملل است و به جای آن عدد 91 قرار می گیرد در غیر اینصورت عدد 81 قرار می گیرد .
8 . شماره مقصد 09120197955 می باشد ، این شماره باید دو رقم دو رقم جدا و برعکس شود . اگر تعداد ارقام شماره فرد باشد باید مقدار F به آخر آن اضافه شود .
09 12 01 97 95 5F
81 90 21 10 79 59 F5
9 . پروتکل پیام از نوع sms یا mms و … را مشخص می کند . بنابراین برای sms مقدار 00 قرار می گیرد .
10 . نوع کدگذاری محتوی پیام می باشد ، mode pdu دارای دو نوع فرمت Defult Alphabet و Unicode می باشد .
مقدار 00 فرمت Defult Alphabet را فعال می کند که همان استاندارد اسکی می باشد و برای ارسال پیام های انگلیسی استفاده می شود . هر کاراکتر در مد Defult Alphabet برابر یک بایت می باشد .
مقدار 08 فرمت Unicode را فعال می کند . هر کاراکتر در مد Unicode برابر دو بایت می باشد که برای ارسال پیام های فارسی می توانیم از این استاندارد استفاده کنیم . در ادامه با ذکر مثال به آن خواهیم پرداخت .
11 . مدت زمانی است که یک sms می تواند در شبکه معلق بماند تا به مقصد تحویل داده شود ، مدت زمان طبق جدول زیر مشخص می شود .
12 . طول septet های متن پیام را مشخص می کند ، کلمه hello از 5 septet تشکیل شده است .
13 . متن تبدیل شده به octet پیام که شامل E8329BFD06 می باشد .
نکته : متن پیام انگلیسی در محدوده کاراکترهای اسکی می باشد که هر کاراکتر معادل یک بایت می باشد . اما اگر متن پیام حروف فارسی یا فارسی و انگلیسی باشد ، باید از استاندارد Unicode استفاده شود . در مد Unicode دیگر فشرده سازی انجام نمی شود و هر حرف در استاندارد Unicode برابر دو بایت در مبنای HEX ارسال می شود . بنابراین تعداد کاراکترهای فارسی که در قالب یک sms می توان ارسال کرد 140/2=70 کاراکتر می باشد . جدول زیر کاراکترهای یونیکد فارسی و انگلیسی می باشد .
ارسال sms فارسی در مد pdu با sim800 :
برای مثال معادل کلمه فارسی “سلام” را از جدول استخراج می کنیم (0633064406270645) و در فیلد سیزدهم قرار می دهیم و طبق آموزش داده شده فیلد دهم را برای مد Unicode برابر 08 قرار می دهیم . طول کاراکترهای پیام نیز 08 است که در فیلد دوازدهم قرار می دهیم .
AT+CMGF=0 OK AT+CMGS=22 > 079189290000900231000B819021107959F50008FF080633064406270645 <control+z> +CMGS: 7 OK
دریافت sms در مد pdu با sim800 :
برای خواندن پیام دریافتی از فرمان AT+CMGR استفاده می کنیم . در مثال زیر پیام حاوی متن “hello” می باشد که به شرح آن می پردازیم :
AT+CMGR=2 +CMGR: 1,"",24 06918919015000240C9189190291975500008121320242714105E8329BFD06 OK
1 . طول شماره مرکز پیام را در مبنای هگز نشان می دهد .
2 . نوع شماره مرکز پیام می باشد اگر شماره با + شروع شده باشد از نوع بین الملل است و به جای آن عدد 91 قرار می گیرد در غیر اینصورت عدد 81 قرار می گیرد .
3 . شماره مرکز پیام از نوع semi-octet می باشد ، شماره ها باید دو رقم به دو رقم جدا و برعکس شود .
91 89 19 01 50 00
+9891100500
4 . مربوط به گزارش دریافت یا delivery می باشد ، اگر شخص ارسال کننده sms درخواست delivery نداده باشد مقدار 04 و اگر درخواست delivery داده باشد مقدار 24 می باشد .
5 . طول شماره مقصد از نوع semi-octet می باشد .
6 . نوع شماره مقصد را مشخص می کند . اگر با + آغاز شود از نوع بین الملل است و به جای آن عدد 91 است در غیر اینصورت عدد 81 می باشد .
7 . شماره فرستنده پیام است ، این شماره باید دو رقم دو رقم جدا و برعکس شود .
91 89 19 02 91 97 55
+989120197955
8 . این بخش مربوط به ارسال sms یا mms است که برای sms مقدار 00 خواهد بود .
9 . این بخش تعیین کننده کاراکترهاي تک بایتی یا دو بایتی است. براي کاراکترهاي تک بایتی 00 و براي کاراکترهاي دو بایتی 08 خواهد بود . که کاراکترهاي دو بایتی براي ارسال کلمات فارسی به کار می رود.
10 . این بخش مربوط به تاریخ و زمان ارسال شدن پیام است که به صورت Semi-Octet می باشد . باید دو رقم دو رقم جدا و برعکس شود . دو رقم اول مربوط به سال است که باید عدد 20 به ابتدای آن اضافه شود . به ترتیب ماه ، روز ، ساعت ، دقیقه ، ثانیه و time zoon است که نماینده موقعیت جغرافیایی بر اساس GMT است و قانون آن تقسیم بر 4 است . که 14/4=3.5 ساعت اختلاف زمانی ایران با گرینویچ می باشد .
81 21 32 02 52 95 41
18 12 23 20 25 59 14
2018/12/23 20:25:59 +14″
11 . این بخش تعداد septet های متن فشرده شده به فرمت pdu می باشد .
12 . این بخش متن اصلی پیام است که به فرمت pdu فشرده شده است و معادل کلمه hello می باشد . در حالت عادی غیر قابل فهم است و نیاز به رمز گشایی دارد .
رمز گشایی sms در مد pdu :
براي تبدیل شدن به Septet ، اولین Octet با ارزش ترین بیت خود را به Octet دوم می دهد . Octet دوم با تحویل دو بیت با ارزش خود به Octet سوم و دریافت با ارزش ترین بیت از Octet اول به Septet تبدیل می شود . و به همین ترتیب آخرین Octet پنج بیت با ارزش خود را از دست می دهد و چهار بیت دریافتی از octet چهارم در جلوي آن قرار می گیرد .
برای تشخیص اینکه sms دریافتی انگلیسی هست یا فارسی باید فیلد نهم بررسی شود اگر 00 باشد متن انگلیسی و نیاز به رمزگشایی دارد و اگر مقدار 08 باشد متن پیام فارسی می باشد که نیاز به رمزگشایی ندارد و از جدول مقادیر یونیکد پیام را استخراج می کنیم . مثال زیر نمونه پیام فارسی با متن “سلام” می باشد .
AT+CMGR=3 +CMGR: 1,"",27 06918919015000240C91891902919755000881213202529541080633064406270645 OK
نکته آخر طول قالب یک پیام است ، که به صورت یک عدد دسیمال مقابل فرمان AT+CMGS ارسال می شود . تعداد کاراکترهای بعد از شماره مرکز پیام تقسیم بر دو ، زیرا جفت کاراکتر شمارش می شود .