یکی از قابلیتهای خوب ماژولهای 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 ارسال کنیم
1 | AT+CMFG=1 |
توسط دستور AT+CSMP پارامترهای پیامک رو مشخص میکنیم که این یکم جای توضیح داره پارامترهاش ولی میتونید صرفا دستور زیر رو بزنید:
1 | 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 کدینگنمون رو هم مشخص میکنیم:
1 | AT+CSCS="UCS2" |
با دستور AT+CMGS باید شمارهای که میخوایم به اون پیامک ارسال کنیم رو مشخص کنیم، اما باید با فرمت UCS2 مقدار اون رو مشخص کنیم.
1 | AT+CMGS="00300039003100300030003000300030003000300030" |
برای تولید خروجی مشابه بالا میتونید از این سایت کمک بگیرید (کاراکتر های utf16 هم میتونه اینجا برای ما استفاده بشه چون اونها هم 2 بایتی هستند): UTF16 Encode Decode
دقت کنید که اون تیک “Remove notation” رو حتما بزنید!
بعد از ارسال دستور بالا هر متنی که بنویسید داخل sms قرار میگیره، ما این متن رو مینویسیم (باید به همون فرمت UCS2 باشه):
1 | 062706cc0646002006cc06a90020067e06cc0627064506a90020064106270631063306cc0020062706320020064506270698064806440020006d0063003600300020064506cc062806270634062f |
بعد از اتمام متن باید کاراکتر ctrl+z رو ارسال کنیم معادل هگز اون برابر “1A
” هست.
به طور خلاصه مراحلی که طی کردیم این شد:
1 2 3 4 5 6 7 | AT+CMGF=1 AT+CSMP=17,167,0,8 AT+CSCS="UCS2" AT+CMGS="00300039003100300030003000300030003000300030" > 062706cc0646002006cc06a90020067e06cc0627064506a90020064106270631063306cc0020062706320020064506270698064806440020006d0063003600300020064506cc062806270634062f ctrl+z |
این هم از نتیجه :
سلام و وقت بخیر
لطف میکنین بگین چطوری توی OpenCpu پیام فارسی ارسال و یا دریافت کنیم؟
البته موضوع من بیشتر ارسال پیام فارسی است.
سلام دوست عزیز
برای پیام فارسی شما نیاز نیست کار خاصی انجام بدید فکر میکنم تابعی داره که با استفاده از utf16 پیام رو ارسال میکنه
با استفاده از اون تابع شما قادر هستید به هر زیانی پیامک بزنید.
سلام وقت بخیر
بنده با ماژول Quectel M08R کار می کنم.
مشکلی که دارم اینه که بعد از هر بار راه اندازی ماژول می تونم فقط 4 پیامک ارسال کنم و اگر پیامک 5 م رو ارسال کنم ارور CMS ERROR: 3780 رو دریافت می کنم، هر چی سرچ کردم اصلا همچین اروری وجود نداشت.
هر بار که دستگاه رو خاموش روشن می کنم میتونم دوباره 4 پیام ارسال کنم و برای ارسال پیامک بیشتر دوباره باید ماژول خاموش روشن کنم.
بین ارسال پیامک ها تاخیر یک ثانیه ای هم گذاشتم ولی مشکل حل نشد.
سلام دوست عزیز
این مورد شما خیلی جالبه تا الان که انواع ماژول ها کار کردم این مشکل رو ندیدم ،شما پیامک رو فارسی یا انگلیسی دارید ارسال میکنید و برای ارسال پیامک از چه روشی استفاده میکنید
در ضمن اگر میخواید زودتر به جواب برسید میتونید سوالتون رو در انجمن سیسوگ مطرح کنید
https://ask.sisoog.com
🙂
سلام،این ماژول mc60 ایپرام هم داره؟برای ذخیره اطلاعات کم چه راهکاری رو پیشنهاد میکنید،با تشکر
سلام
بله این ماژول دارای یک حافظه داخلی برای ذخیره اطلاعات هست که به اون UFS گفته میشه.
توی example_file.c باهاش کار کرده میتونید این example رو بررسی کنید
سلام.
برای UFS در مثال ها فقط از سیستم فایل مثال زده. میشود مستقیم از آن استفاده کرد ؟. بدون استفاده از سیستم فایل
تشکر
سپاست ده که م
خواهش میکنم?
با این متد زیر میتونید توی پایتون این تبدیل رو انجام بدید 🙂
def ucs2_encode(self, text: str) -> str:
encoded = text.encode(‘utf-16-be’)
hexlify = binascii.hexlify(encoded)
return hexlify.decode().upper()
اگر دوست داشتید میتونم آموزش اتصال و مدیریت GSM با پایتون رو رکورد کنم و در اختیار بچه های سیسوگی قرار بدم
ممنون از شما?
چرا که نه !
اگر می تونید یه مطلب بنویسید براش تا به اسم خودتون منتشر بشه?