سلام به همه مایکروالکامی ها. در مطلب قبلی راه اندازی SIM800 به نحوه تنظیم ساعت ماژول SIM800 پرداخته شد. در این قسمت به بررسی کد دستوری USSD و نحوه استفاده از آنها و شماره گیری آن با ماژول SIM800 بررسی میشود. نهایتا با استفاده از USSD میزان شارژ ریالی سیم کارت ماژول و استعلام شارژ آن را بررسی خواهیم کرد. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطلب من رو از این قسمت مطالعه کنید.
کد USSD چیست
USSD در حقیقت مخفف Unstructured Supplementary Service Data میباشد. USSD به معنی ارسال پیام از طریق کد دستوری میباشد. این کد ها برای حفظ امنیت از استاندارد های GSM/UMTS استفاده میکند.
از این کد های در خیلی از کاربرد ها نظیر شارژ سیم کارت، استعلام شارژ و… استفاده میشه. مدت زمان برای دریافت پاسخ در روش USSD خیلی کمتر از پیامک و تماس صوتی هست. در استفاده از پیامک یا SMS نوع ارتباط ذخیره و فرستادن مجدد هست. یعنی پیامک در سرور ذخیره میشه و برای مشترک مورد نظر ارسال خواهد شد.
در کد های USSD ارتباط نشست گرا هست. یعنی دیتا یا درخواست ارسالی به سرور بدون ذخیره، پاسخ داده خواهد شد. پس برای همین زمان پاسخ گویی کمتر از پیامک و تماس هستش.
یک تفاوت اصلی بین USSD و SMS وجود دارد. USSD جهت ارتباط بین موبایل و شبکه یا برعکس هست. به این معنی که دو تا موبایل نمیتونند از این طریق تبادل دیتا کنند. اما با استفاده از SMS میشه اینکارو کرد و برای ارتباط بین موبایل ها هست.
یکی دیگر از تفاوت های USSD با SMS این است که در USSD تعداد کاراکتر های ارسالی تا 182 بوده ولی در SMS تا 70 کاراکتر میباشد.
قطعات مورد نیاز
- برد راه انداز ماژول SIM800L
- LM2596 Buck DC-DC Convertor
- آداپتور 12V
- آنتن GSM با سوکت IPEX
- مبدل سریال
فعال کردن USSD در ماژول SIM800
در اولین مرحله استفاده از کد های USSD نیاز هست که آن را در ماژول فعال کنیم. با استفاده از دستور زیر اون رو فعال میکنیم.
AT+CUSD=1 OK
در صورتی که ماژول در پاسخ OK رو بده یعنی USSD فعال شده و دیگه میتونیم ازش استفاده کنیم.
شماره گیری کد USSD در ماژول SIM800
برای شماره گیری کد USSD مورد نظر طبق فرمت دستور زیر استفاده شود. بین دابل کوتیشن ها در دستور زیر، کد USSD مورد نظر را باید وارد کنیم.
AT+CUSD=1,”ZZZ”
در نهایت بعد از وارد کردن دستور بالا و زدن اینتر اگر کد درست باشه در پاسخ OK دریافت خواهد شد.
غیر فعال کردن USSD در ماژول SIM800
با استفاده از دستور زیر میتونید حالت شماره گیری USSD ماژول رو غیر فعال کنید.
AT+CUSD=0 OK
تغییر زبان سیم کارت ماژول SIM800
اگر زبان سیم کارتی که به ماژول SIM800 متصل شده فارسی باشه در پاسخ دریافتی بعد از شماره گیری USSD مربوط یسری عدد میبینیم. برای همین زبان سیم کارت رو تغییر میدیم و انگلیسی اش میکنیم. با این کار منو و توضیحات اون کد دستوری بصورت انگلیسی نمایش داده میشه و قابل فهم تر هست.
برای اینکار باید کد های USSD مخصوص اینکار برای اپراتور مورد نظر خود استفاده کنید.
- کد دستوری منوی تغییر زبان ایرانسل: #3*4*555* و برای تغییر زبان به انگلیسی کد ” #2*3*4*555* ” را میتوان شماره گیری نمود.
- کد دستوری تغییر زبان رایتل به انگلیسی: #3*1*7*720*
- کد دستوری تغییر زبان همراه اول به انگلیسی: #2*198*
سیم کارت مورد تست همراه اول هست و نتیجه حاصل به شرح زیر میباشد.
AT+CUSD=1,"*198*2#" OK +CUSD: 0, "Your Language is modified to English.", 15
خب همینطور که مشاهده کردید زبان سیم کارت با موفقیت تغییر کرد.
بدست آوردن شارژ سیم کارت ماژول SIM800
برای اینکه از میزان شارژ سیم کارت ماژول مطلع بشیم باید از کد های دستوری مربوط به سیم کارت خودتون استفاده کنید. این نکته را یادآور بشم حتما در ابتدا طبق توضیحات بالا USSD ماژول را فعال کنید. در مرحله بعد برای راحت شدن از نتیجه و قابل فهم بودن پاسخ دریافتی، زبان سیم کارت رو به انگلیسی تغییر دهید.
کد دستوری برای درخواست میزان شارژ
- ایرانسل: #2*1*555*
- همراه اول: #11*140*
- رایتل: #140*
استعلام میزان شارژ سیم کارت همراه اول در ماژول SIM800
با استفاده از شماره گیری USSD مربوط به سیم کارت طبق دستور زیر میتوان میزان شارژ سیم کارت مطلع شد.
AT+CUSD=1,"*140*11#" OK +CUSD: 0, "Your balance is 26697 Rial . Discounted Voice&Data *121#"", 15
همینطور که مشاهده میکنید میزان شارژ سیم کارت من 26697 ریال میباشد.
در تصویر زیر خلاصه دستورات بالا را مشاهده میکنید.
نتیجه گیری
کد دستوری USSD برخلاف پیامک و تماس رایگان میباشد. برای شماره گیری این کد های دستوری باید #…* را شماره گیری نمایید. از نظر امنیت این کد ها دارای امنیت بالا و قابل قبولی میباشند. در حقیقت USSD روش ارتباط لحظه ای است و مانند SMS دارای تاخیر نمیباشد. در این مطلب به نحوه استفاده از کد های دستوری USSD، استعلام شارژ سیم کارت و تغییر زبان سیم کارت پرداخته شد.
امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.
باسلام
ممکنه بفرمایید اگر دستور AT+CUSD=1,”*140*11#” را ارسال کنیم، از کدام قسمت پاسخ متوجه می شویم که سیم کارت اصلا اعتباری نیست ! چون ظاهرا اگر سیم کارت دائمی باشد مقدار موجودی را صفر می دهد!
اگر کامند دیگری برای تشخیص دائمی یا اعتباری بودن سیم کارت وجود دارد، لطفا بفرمایید.
با تشکر
باید بررسی کنید که اپراتور کد ussd خاصی را برای این منظور تعبیه کرده یا خیر. روی سیم کارت دائمی با موبایل این کد رو تست کردم خطا MMI میده و ظاهرا برای دائمی ها جواب گو نیست. از همین مورد میتونید برای هدف مد نظرتون استفاده کنید.
سلام مهندس وقت بخیر
من برای خواندن شارژ سیم کارت همراه اول به مشکل بر خوردم
وقتی کد AT+CUSD=1,”*۱۴۰*۱۱#”,۱۵ رو میزنم جوابی که بمن میده اینه
+CUSD: 2, “” ,۷۲ ، بنظرتوم مشکل کجاس
با ایرانسل مشکلی ندارم
سلام، انتهای دستور AT+CUSD عدد ۱۵ رو وارد کردید؟؟
بله
دلیل اینکه عدد ۱۵ را آخر دستور وارد میکنید چیه؟
وقتی دستور AT+CUSD=1 را ارسال میکنید پاسخ “OK” دریافت میکنید؟
از نحوه صحیح ارسال دستور مطمئن هستید؟
پیشنهاد میکنم یک بار از طریق سریال مانیتور ارسال کنید و نتیجه رو ببینید و بعد توسط میکروکنترلر.
بله
سلام مهندس وقت بخیر
من برای خواندن شارژ سیم کارت همراه اول به مشکل بر خوردم
وقتی کد AT+CUSD=1,”*۱۴۰*۱۱#”,۱۵ رو میزنم جوابی که بمن میده اینه
+CUSD: 2, “” ,۷۲ ، بنظرتوم مشکل کجاس
با ایرانسل مشکلی ندارم
سلام
بعضی وقتها ماژول این پیام را دریافت میکنه :
+CMT: “2B393839313636313531343831″,””,”22/08/12,18:46:41+18″
52314F4E20
بعد از آن اگر sms بیاد همین پیام را نشان میده و پیام اصلی نشان داده نمیشه.
باید یکبار ماژول ریست بشه تا درست کار کنه
لطفا راهنمایی کنید
تشکر
سلام، بنظر مشکل از تنظیمات ماژول هست در دریافت پیامک! یک بار تنظیمات را ریست بزنید و مجددا طبق آموزش زیر اقدام کنید.
https://blog.microele.com/sim800l-gsm-module-tutorial-part-2-sms/
سلام ، خسته نباشین ، من یه برنامه ای دارم با سیم ۸۰۰ ، و یه قسمتی از برنامه شارژ سیمکارت رو بررسی میکنه ، مشکل اینجاست که بار اول یه برسی میکنه ، شارژ اوکیه ، بار دوم اگه استعلام مجدد با دیلی کمتر از حدود ۵ ثانیه باشه ، پاسخ برگردونده شده از طرف اپراتور اینه که لطفا درست اطلاعات رو وارد کنید ، دیدین وقتی مثلا میخای بسته بخری ، یه منو میاد که باید عدد بزنی ، یا کنسل ، اگه اشتباه بزنی یه چیزی مینویسه ،اینم همونو مینویسه ، ولی اگه چند ثانیه صبر کنم تا تایم ussd قبلی تموم شه ، و بعدش دوباره استعلام بگیرم باز برنامه اوکی هست ، میخاستم بپرسم چطور میتونم اون گزینه ی کنسل رو تو سیم ۸۰۰ بزنم که بعد از شماره گیری کد یو اس اس دی مد نظر ، بتونم فورا کنسلش کنم و یه کد دیگه بگیرم
امیدوارم منظورم رو رسونده باشم
سلام، اگر خود اون منو Cancel رو نداشته باشه که نمیشه زد. ولی طبیعی هستش اینی که فرمودید و باید مدت زمان دستور یا کار قبلی سپری بشه تا بعدی بتونه انجام بشه
خیلی ممنون از پاسخ بسیار سریع تون ، رو گوشی کنسل و تایید داره ، ولی جزع منو ها نیست که با عدد انتخابش کنم ، مثلا وقتی من ستاره ۷۸۹ مربع رو میگیرم ، کنسل و ارسال رو روی گوشی میتونم بزنم ، ولی تو سیم ۸۰۰ اگه این کد رو بگیرم دیگه نمیدونم چطور باید کنسلش کنم ، چون کنسل تو منو نیست ، به نظرتون اگه بعد از اجرای کد ، بیام و ussd سیم ۸۰۰ رو خاموشو روشن کنم ، اون ussd قبلی کنسل میشه ؟
خواهش میکنم. احتمال خیلی زیاد بله. الان من دسترسی به ماژول ندارم اگر نه تست میزدم خودم و نتیجه رو میگفتم بهتون. اگر تست کردی شما ممنون میشم نتیجه رو هم با من و بقیه به اشتراک بگذارید.
ولی فکر میکنم بالاخره همون کنسل زدنه یه کدی میفرسته ولی چه کدی رو نمیدونم. اگر تونستی بجای اینکه عدد وارد کنی در پاسخ مثلا عدد ۱ یا … یک بار بیا خود CANCEL رو تایپ کن بفرست ببین میشه یا خیر
ممنون از راهنمایی و مطالب خوبی که بارگزاری می نمایید :
استعلام شارژ سیم کارت همراه اول را با ussd گرفتیم و به شکل زیر دریافت شده
+CUSD: 0, “06270639062A062806270631063406450627002000320034000072”, 72
حالا می خوایم این را برای یک سیم کارت دیگه ارسال کنیم
اگه ابتدا و انتهای اون را قطع کنیم و ارسال کنیم روی سیم کارت جدید که روی تلفن همراه هست فقط اعدادی به شکل زیر ۰۶۲۷۰۶۳۹۰۶۲A062806270631063406450627002000320034000072
ظاهری میشه
اپراتور همراه اول فعلا امکان ارائه سرویس ussd با زبان انگلیس را نداره چو سامانشون خراب هست
میشه راهنمایی بفرمایید چکار کنیم چطور کد بالا را تفسیر کنیم که بصورت sms روی موبایل قابل فهم باشه
سلام الان تست کردم روی گوشی هم فارسی هست زبانش و ظاهرا نمیشه انگلیسی کرد زبان سیم کارت را!
پاسخی که شما دریافت کردید نوع UTF-16 هست که باید به یونیکد تغییرش بدید و مستلزم برنامه نویسی برای این کار است. پیشنهاد میکنم سرچ کنید و اصلا تفاوت و معادل هر دو رو بررسی کنید که کار آسون تر بشه.
اگر به نتیجه ای رسید و متوجه تبدیل اش شدید یا برنامه نوشتید یا کتابخونه ای در این زمینه پیدا کردید و کار کردید با من و سایر دوستان اگر به اشتراک بزارید ممنون میشم.
با سلام مجدد و خسته نباشید
یه تابع do
while تعریف شده و دوبل کوتیشن اول را جدا می کنم ولی دوبل کوتیشن دوم را حذف نمیکنه
do{
i5++;
i6++;
str[i6]=ms[i5];
} while( (i5《max sms) || (str[i6]='”‘)
با این دستور کلا دریافت پیام از ماژول دچار اختلال می شود
از کد ها درست متوجه نشدم من و گنگ بودن!
در چه کامپایلری برنامه نویسی میکنید؟
با سلام
برای ارسال حاصل دستور کنترل شارژ به یک سیم کارت دیگر باید عبارت
Your balance is 26697 Rial .
Discounted Voice&Data *121#
را بدون ” ارسال نماییم چور این کار انجام دهیم با تشکر
سلام،
اینجور که برداشت کردم منظورت این هست که چجوری پاسخ دریافتی در کد USSD که مثلا عبارتی هستش که شما گفتی را برای یک کاربر بفرستیم.
برای اینکار پاسخ دریافتی را توی یک رشته ذخیره کن، بعد از توابع رشته بیا دبل کوتیشن های اول و اخر را جدا کن و متن باقی مونده را به شماره ای که میخوای بفرست.
نحوه ارسال پیامک هم در این مطلب کامل گفته شده:
https://blog.microele.com/sim800l-gsm-module-tutorial-part-2-sms/
سوالی بود حتما بپرس، خوشحال میشم کمکی کنم.
سلام میشه یه نمونه کد بفرستی که همین جوابی که از سریال مانیتور میاد رو چجوری داخل رشته بریزیم و ازش استفاده کنیم
AT+CUSD=1,”*140*11#”
if(Serial.available() > 0)
{
if(Serial.readString() == “OK”)
{
String str = Serial.readString();
// مابقی کاری که مورد نیازتون هستش
}
}
عالیهههههه
خوشحالم از این بابت که مورد رضایت و کاربرد شما قرار گرفته این مطلب.