یکی از قابلیتهای خوب ماژولهای gsm ارسال و دریافت پیامک هست که به کمک اون میتونیم از راه دور دستگاه خودمون رو کنترل کنیم، ارسال و دریافت پیامک بهصورت انگلیسی بهراحتی قابل انجام هست اما بهصورت فارسی دردسرهای خودش رو داره، توی این آموزش میخوایم علت این دردسر و همچنین نحوه ارسال پیامک فارسی با ماژول MC60 رو بررسی کنیم، پس با سیسوگ همراه باشید…
چرا زبان فارسی همیشه مشکل ساز هست؟!!
خب فقط ما اینطور نیستیم! هر زبانی غیر از انگلیسی همین مشکلات رو داره درواقع این مربوط به بحث encoding هست. بزارید اینطور بررسی کنیم: شما یه کامپیوتر دارید که غیر از اعداد و ارقام هیچی سرش نمیشه (هرچند که اونم سرش نمیشه و فقط 0 و 1 میفهمه?♂️ اما نمیخوایم از این پیچیدهترش کنیم!) حالا ما میخوایم یکسری حروف رو بهش بشناسونیم، کاری که میتونیم بکنیم و همینطور هم هست اینه که بیایم و به هر حرف یک عدد اختصاص بدیم و بهصورت قراردادی همیشه از اون استفاده کنیم، نمونش استاندارد UTF-8 هست. هر کاراکتر توی این استاندارد میتونه از 1 تا 4 بایت رو اشغال کنه. بهطور مثال اگر حرف ما “a” باشه 1 بایت اشغال میکنه و اگر “ش” باشه، 2 بایت اشغال میکنه (توی این لینک میتونید لیست کاراکترها رو ببینید به همراه کد اونها). حالا توی اکثر پروتکلهای ارتباطی سطح پایین که معمولاً الکترونیکیها باهاش سروکار دارند پکت های دیتا 8 بیتی (1 بایتی) هست و به همین خاطر کاراکترهایی که میتونیم ارسال کنیم محدود هست. در اصل همون جدول ASCII خودمون رو فقط میتونیم ارسال کنیم با چندتا کاراکتر بیشتر (که کاربرد چندانی ندارند) (خود ASCII هفت بیتی هست).
برای اینکه حجت بر شما تمام بشه میتونید یه تست جالب انجام بدید، اگر که بخواید با گوشی خودتون یه پیامک تمام انگلیسی بفرستید پیامک اول 160 کاراکتری هست و اگر از 160 تا بیشتر بشه دوتا پیامک حساب میشه، اما اگر که بخواید پیامک فارسی بفرستید بعد از 70 تا کاراکتر پیامک دوم حساب میشه و دلیلش هم همینه که کاراکترهای فارسی دو برابر فضا اشغال میکنند توی پشتصحنه (اون 10 تای دیگه رو نمیدونم کجا میره?)
ارسال پیامک فارسی با ماژول MC60
حالا بریم سراغ ماژول mc60، اگر که داکیومنت های ماژول mc60 رو بررسی کنیم (داکیومنت Quectel_GSM_SMS_Application_Note_V1.1) برای ارسال پیامک از این character set ها پشتیبانی میکنه:
GSM, HEX, IRA, PCCP437, UCS2, 8859-1
بهصورت پیشفرض ما از همون GSM استفاده میکنیم که 7 بیتی هست و فقط میتونیم کاراکترهایی که توی جدول ASCII هستند رو داخلش وارد کنیم. با بقیه character set ها کاری نداریم، میریم سراغ UCS2، این نوع 16 بیتی یا 2 بایتی هست و مناسب ارسال کاراکترهای فارسی هست (اینجا میتونید کاراکتر هاش رو بررسی کنید).
برای ارسال پیامک لازمه که اول دستور AT+CMFG رو بزنیم و پیامکمون رو در text mode ارسال کنیم
AT+CMFG=1
توسط دستور AT+CSMP پارامترهای پیامک رو مشخص میکنیم که این یکم جای توضیح داره پارامترهاش ولی میتونید صرفا دستور زیر رو بزنید:
AT+CSMP=17,167,0,8
- پارامتر اول که fo هست (first octet) دو تا مقدار 17 و 49 رو میتونه داشته باشه، درصورتیکه گزارش تحویل برای پیامک رو بخوایم 49 و اگر نخوایم 17 میگذاریم.
- پارامتر دوم vp هست (validity period) درصورتیکه پیامک ما به هر دلیلی نتونه توسط گیرنده دریافت به شه، توی سرورهای اپراتور میمونه و توی بازه زمانی مشخصی دوباره تلاش برای ارسالش میشه.
- پارامتر سوم هم فقط در حالت 0 کاربرد داره.
- پارامتر چهارم dcs هست (data coding scheme)، این پارامتر برای کاربرد الان ما باید مقدارش 8 باشه، اما مقدار 24 رو هم تست کنید و با اون پیامک ارسال کنید ، نتیجه جالبی داره!
با دستور AT+CSCS کدینگنمون رو هم مشخص میکنیم:
AT+CSCS="UCS2"
با دستور AT+CMGS باید شمارهای که میخوایم به اون پیامک ارسال کنیم رو مشخص کنیم، اما باید با فرمت UCS2 مقدار اون رو مشخص کنیم.
AT+CMGS="00300039003100300030003000300030003000300030"
برای تولید خروجی مشابه بالا میتونید از این سایت کمک بگیرید (کاراکتر های utf16 هم میتونه اینجا برای ما استفاده بشه چون اونها هم 2 بایتی هستند): UTF16 Encode Decode
دقت کنید که اون تیک “Remove notation” رو حتما بزنید!
بعد از ارسال دستور بالا هر متنی که بنویسید داخل sms قرار میگیره، ما این متن رو مینویسیم (باید به همون فرمت UCS2 باشه):
062706cc0646002006cc06a90020067e06cc0627064506a90020064106270631063306cc0020062706320020064506270698064806440020006d0063003600300020064506cc062806270634062f
بعد از اتمام متن باید کاراکتر ctrl+z رو ارسال کنیم معادل هگز اون برابر “1A
” هست.
به طور خلاصه مراحلی که طی کردیم این شد:
این هم از نتیجه :
لینک های دانلود:
دانلود فایل Quectel_GSM_SMS_Application_Note_V1.1
منبع: سیسوگ