تو این تاپیک توضیحات کامل کد کردن و خواندن PDU را توضیح میدم
امیدوارم دوستان هم همکاری کنند تا یک منبع کامل تو این زمینه آماده کنیم.
تو این تاپیک توضیحات کامل کد کردن و خواندن PDU را توضیح میدم
امیدوارم دوستان هم همکاری کنند تا یک منبع کامل تو این زمینه آماده کنیم.
آخرین ویرایش به وسیله noorsoft : چهارشنبه 15 خرداد 1387 در 16:15 عصر
Farshad Nooranian
سلام .
تاپیک خیلی مفیدی هست . فقط اگر امکان داره از مباحث پایه شروع کنید . یعنی از صفر !
مرسی ...
قسمت اول:Encode شماره مرکز پیام
همانطور که میدونید برای ارسال پیام کوتاه به فرمت PDU نیاز به قسمتهای تفکیک شده اطلاعات هست.
قسمت اول همانطور که در عکس هم وجود داره از سمت چپ تصویر شروع میشه تعداد جفت کاراکتری است که این رقم بر مبنای تعداد کاراکتر های بعدی تعیین میشه پس توضیح و مثال اونو میزاریم در انتها.
قسمت دوم نوع شماره هست که آیا این شماره از نوع بین الملل هست ("یعنی با + شروع شده یا خیر")
اگر شماره با + شروع شده باشه عدد 91 و در غیر این صورت عدد 81 جایگزین میشه و این جفت کاراکتری 1 واحد به تعداد شماره اضافه میکنه.
قسمت سوم اصل شماره است که میبایست 2 تا،2تا جدا و معکوس بشه و هر جفت 1 واحد به تعداد خانه اول اضافه میکنه و همینطور اگر تعداد اعداد فرد باشه باید عدد آخر با مقدار F0 جمع بشه.
مثال:
1) برای یک شماره بین المللی که با + شروع شده.
+98-912-1234567
ما میام این شماره رو بر حسب نیاز خودمون تفکیک میکنیم تا مفهوم بهتر درک بشه.
+98-91-21-23-45-67
چون با + شروع شده پس عددی که باید در خانه دوم قرار بگیره 91 هست.
حالا همانطور که شماره رو به صورت جفتهای 2 تایی مشخص کردیم ای جفت هارو معکوس میکنیم و کار رو ادامه میدیم یعنی :
+89-19-12-32-54-76
تکلیف + با جایگزاری عدد 91 در خانه دوم مشخص شده پس حذف میشه.نتیجه:
89-19-12-32-54-76
پس کدی که تا اینجا تولید شده بدون در نظر گرفته خانه اول که تعداد هست شده:
91-89-19-12-32-54-76
با شمارش جفت دوتایی به عدد 7 میرسی پس این عدد را باید به عنوان شمارش گر در مبنای HEX در خانه اول جایگزاری نماییم و این نکته هم در یاد داشته باشید که چون عدد ما یک رقمی است و در اینجا با جفت کاراکتری اعداد سروکار داریم مقدار بی ارزش 0 سمت چپ عدد را جایگزاری میکنیم یعنی 07.
پس کدی که در انتها داریم :
07-91-89-19-12-32-54-76
و کدی که با ید ارسال بشه:
0791891912325476
این شده شماره مرکز پیام به صورت PDU در قالب یه شماره بین الملل.
2) برای یک شماره معمولی.
0098-912-1234567
ما میام این شماره رو بر حسب نیاز خودمون تفکیک میکنیم تا مفهوم بهتر درک بشه.
00-98-91-21-23-45-67
چون با + شروع نشده پس عددی که باید در خانه دوم قرار بگیره 81 هست.
در این نوع خواندن شماره همیشه اولین رقم از سمت چپ حذف میشه یعنی وقی شماره با 0098 وارد میشه سمت چپ ترین عدد حذف شده و عدد 098 برای ما باقی میمونه.پس تا اینجا نتیجه شده:
0-09-89-12-12-34-56-7
که صفر سمت چپ حذف میشه پس داریم:
09-89-12-12-34-56-7
حالا همانطور که شماره رو به صورت جفتهای 2 تایی مشخص کردیم ای جفت هارو معکوس میکنیم و کار رو ادامه میدیم یعنی :
90-98-21-21-43-65-7
و چون تعداد ارقام ما فرد هست پس سمت راست ترین عدد با F0 جمع میشه پس داریم:
90-98-21-21-43-65-F7
پس کدی که تا اینجا تولید شده بدون در نظر گرفته خانه اول که تعداد هست شده:
81-90-98-21-21-43-65-F7
با شمارش جفت دوتایی به عدد 8 میرسی پس این عدد را باید به عنوان شمارش گر در مبنای HEX در خانه اول جایگزاری نماییم و این نکته هم در یاد داشته باشید که چون عدد ما یک رقمی است و در اینجا با جفت کاراکتری اعداد سروکار داریم مقدار بی ارزش 0 سمت چپ عدد را جایگزاری میکنیم یعنی 08.
پس کدی که در انتها داریم :
08-81-90-98-21-21-43-65-F7
و کدی که با ید ارسال بشه:
0881909821214365F7
این شده شماره مرکز پیام به صورت PDU در قالب یه شماره معمولی.
تصویر بالا هم تو ضمیمه اضافه کردم تا اگر احیانا تصویر رو از هاست برداشتم ضمیمه این پست باشه.
موفق باشید
آخرین ویرایش به وسیله raravaice : پنج شنبه 16 خرداد 1387 در 09:49 صبح دلیل: Change "PUD" To "PDU"
قسمت دوم :Status Report یا درخواست گزارش از مرکز پیام
بعد از تولید رشته بالا شما باید به اطلاع مرکز پیا برسونید که آیا گزارش دریافت این پیام رو نیاز دارید یا نه.
اگر نیاز دارید عدد :31
اگر نیاز ندارید عدد:11
با ید به رشته بالا و دقیقا بعد از شماره مرکز پیام اضافه بشه.
موفق باشید
آخرین ویرایش به وسیله raravaice : پنج شنبه 16 خرداد 1387 در 17:18 عصر دلیل: جای 31 و 11 اشتباه بود
قسمت سوم : Message Refrence
وقتی شما با دستوری مثل AT+CMGW پیامی رو داخل سیم کارت ذخیره میکنی اون پیام یه شماره Index داره که در پاسخ دستور به شما بر میگرده، این شماره همون شمارست که در اصل شما میگی اونو بفرسته.
که اصطلاحا بهش میگن SMS SUBMIT
ما اینجا 00 رو برای این مورد در نظر میگیریم بدین معنا که پیام در این کد ارسال میشه و هیچ رفرنسی نداره.
موفق باشید
آخرین ویرایش به وسیله raravaice : جمعه 17 خرداد 1387 در 02:38 صبح دلیل: توضیح تکمیلی
قسمت چهارم : شماره مقصد
همانطور که در عکس مشاهده میکنید این قسمت تفاوتهای کمی با تعیین شماره مرکز پیام تو قسمت اول داره که شامل:
1.کد بین المللی بودن شماره در شمارش لحاظ نمیشود.
2.شماره به صورت جفت شمارش نمیشود و هر عدد نماینده 1 واحد در شما رش میباشد البته اگر تعداد اعداد فرد باشد باز هم همانند شماره مرکز پیام با F0 جمع میشود ولی مقدار F در تعداد شمارش محاسبه نمیشود.
3.مقدار سمت چپ ترین عدد حفظ میشود.
مثال برای نوع بین المللی:
شماره مقصد :
+989121234567
پس داریم:
تعداد ارقام بدون احتساب + برابر با 12 که چون با مبنای 16 سروکار داریم معادل آن یعنی C را جایگزین میکنیم.یعنی خانه اول شمارش کارکتر میشود :
0C
این شماره با + نماینده یک شماره بین الملل شروع شده پس در خانه دوم عدد 91 جایگزین میشود پس تا اینجا داریم:
0C-91
شماره همانند شماره مرکز پیام به جفت دوتایی تفکیک و معکوس میشه یعنی:
شماره اصلی شامل:
98-91-21-23-45-67
شماره بعد از معکوس شدن و حذف + :
89-19-12-32-54-76
ادغام نهایی:
0C-91-89-19-12-32-54-76
0C91891912325476
مثال برای نوع معمولی:
شماره مقصد :
09121234567
پس داریم:
تعداد ارقام برابر با 11 که چون با مبنای 16 سروکار داریم معادل آن یعنی B را جایگزین میکنیم.یعنی خانه اول شمارش کارکتر میشود :
0B
این شماره یک شماره معمولی است پس در خانه دوم عدد 91 جایگزین میشود پس تا اینجا داریم:
0B-81
شماره همانند شماره مرکز پیام به جفت دوتایی تفکیک و معکوس میشه یعنی:
شماره اصلی شامل:
09-12-12-34-56-7
شماره بعد از معکوس شدن :
90-21-21-43-65-F7
ادغام نهایی:
0B-81-90-21-21-43-65-F7
0B819021214365F7
موفق باشید
این قسمت از کد ما یه یه حالت رزرو شده داره مخصوص پروتکل های پیام هست که دارای یه مبحث جدا و چه بسا طولانی هست که برای اجتناب و جلوگیری از هر گونه سر در گمی از کد 00 استفاده میکنیم.
پس قسمت پنجم کد خودمون رو با :00
پر میکنیم
موفق باشید
قسمت ششم: نوع کاراکترها
منظور اینه که شما به BTS میگی متنی که داری میفرستی یه متن معمولی هست یه از کاراکتر های 2 بایتی توش استفاده شده که در این حالت :
متن معمولی = DefaultAlphabet = شامل 160 کاراکتر برای هر پارت = برابر با کد 00
کاراکترهای 2 بایتی = UCS2 = شامل 70 کاراکتر برای هر پارت = برابر با کد 08
موفق باشید
قسمت هفتم : طول عمر پیام
این قسمت از کد ما شامل طول عمر و مدت زمانی که یک پیام میتونه تو شبکه سردر گم بمونه تا به مقصد برسه هست.
که برابر است با:
1 ساعت = 0B
3 ساعت = 1D
6 ساعت = 47
12 ساعت = 8F
1 روز = A7
1 هفته = C4
حداکثر = FF
موفق باشید
قسمت هشتم : ارسال یک پیام بدون محتوا
تا اینجا به آزمایش دستاورد آموزشی میرسیم که یه پیام خالی رو به شماره ای ارسال کنیم.
مثال 1:
مشخصات:
شماره مرکز پیام = 989350001400+
گزارش=بدون گزارش
شماره Index=متن فعلی
شماره مقصد = 09351234567
پروتکل=00
نوع محتوا = DefaultAlphabet
مدت زمان نگهداری = حداکثر
متن = خالی
079189390500410011000B819053214365F70000FF
موفق باشید
توي اين پست تصميم دارم يكي از كامل ترين و منعطف ترين نمونه هايي رو كه توي نت ديدم رو بزارم .. اين نمونه به زبان VB.NET پياده سازي شده و واقعا در اين زمينه محشر هست ..
اينم يك رفرنس جامع براي كار با SMS در C#
يك نمونه براي vb كارها در زمينه ي كار با SMS
اينم يكي ديگه براي كار با SMS در VB
اينم براي دريافت SMS در VB
اينم يك نمونه براي ارسال SMS در VB
يك نمونه براي C# كارها ...
خوب فعلا كافيه .. چيز بهتري در اين زمينه ندارم ديگه .. منتظر ياري گرم مدير اين بخش كه قرار بود با هم همكاري كنيم تا يك كتابخانه كامل در اين زمينه بسازيم هستم ...
با تشكر از زحمات raravaice عزيز ... خيلي ممنون ...
يا حق ...
آخرین ویرایش به وسیله noorsoft : چهارشنبه 15 خرداد 1387 در 10:59 صبح دلیل: دسترسی آسان
قسمت نهم : تهیه محتوای پیام برای 1 پارت پیام در مود DefaultAlphabet
با در نظر گرفتن مقدار اسکی هر کاراکتر و حذف سمت چپ ترین بیت از 8 بیت میتونیم به علامت 7 بیتی اون کاراکتر برسیم:
مثلا برای کاراکتر a داریم
HEX=61
Binary 8 bit= 01100001
Binary 7 bit = 1100001
و همینطور برای کاراکتر ® داریم
HEX=AE
Binary 8 bit = 10101110
Binary 7 bit = 0101110
یک استثناء
نکته مهم برای کاراکتر @ داریم :
HEX=64
Binary 8 bit = 01000000
Binary 7 bit = 1000000
ولی به دلیل اینکه از تداخل این کاراکتر با À پرهیز کنیم چون برای À داریم:
HEX=C0
Binary 8 bit = 11000000
Binary 7 bit = 1000000
به جای علامت 7 بیتی @ که در اینجا مشابه هست مقدار 0 رو در نظر میگیریم و چو ما به هفت بیت نیاز داریم معادل 0000000 رو به کد خودمون پیوست میدیم.
------------------------------------------------------------
در مطالب بالا ماتونستیم هر کاراکتر رو به مقدار 7 بیتی خودش تبدیل کنیم.
حالا باید این مقادیر باینری رو به صورت پشت سر هم به معادل HEX در مبنی 8 بیتی تبدیل کنیم که با ذکر یک مثال مسئله رو براتون روشن میکنم.
مثلا برای کلمه @©Book داریم.
B
HEX=42
Binary 8 bit = 01000010
Binary 7 bit = 1000010
o
HEX=6F
Binary 8 bit = 01101111
Binary 7 bit = 1101111
o
HEX=6F
Binary 8 bit = 01101111
Binary 7 bit = 1101111
k
HEX=6B
Binary 8 bit = 01101011
Binary 7 bit = 1101011
©
HEX=A9
Binary 8 bit = 10101001
Binary 7 bit = 0101001
@
Binary 7 bit = 0000000
پس تا اینجا داریم :
حالا باید همه نتیجه رو بر عکس کنیم یعنی :
1000010-1101111-1101111-1101011-0101001-0000000
اگر دقت کنید در کد بالا ما 42 بیت داریم که بر 8 تقسیم نمیشه پس تا جایی که کد باینری ما بر 8 بخش پذیر باشه از سمت چپ به اون 0 اضافه میکنیم یعنی:
0000000-0101001-1101011-1101111-1101111-1000010
حالا 8 بیت 8 بیت جدا سازی میکنیم تا کد ما بیاد رو مد 8 بیتی یعنی :
000000-0000000-0101001-1101011-1101111-1101111-1000010
حالا این کد رو به معادل HEX اون بر میگردونیم یعنی :
00000000-00000010-10011101-01111011-11110111-11000010
اگر یادتون باشه یه بار باینری هارو برعکس کردیم حالا دوباره این کارو روی HEX انجام میدیم یعنی:
00-02-9D-7B-F7-C2
کلمه ما آماده ارسال هست ولی هنوز تعداد اون معلوم نیست.
C2-F7-7B-9D-02-00
این عدد تعداد کاراکتر های وارد شده ما در مبنای 16 هست که در اینجا 6 کاراکتر داریم.دقت کنید چون داریم 1 بیت از هر کاراکتر کم میکنیم امکان داره تعداد جفت کد هگز ما این عدد نشه پس باید محاسبه این عدد رو از روی مجموع کل کاراکتر های وارد شده انجام بدیم.
پس کد نهایی ما میشه:
وچیزی که باید ارسال بشه
06-C2-F7-7B-9D-02-00
مبارکه;)
06C2F77B9D0200
موفق باشید
آخرین ویرایش به وسیله raravaice : سه شنبه 14 خرداد 1387 در 18:57 عصر
قسمت دهم : تهیه محتوای پیام برای 1 پارت پیام در مود UCS2 ("کلمات فارسی و UTF-8")
خوشبختانه کار ما برای این مورد خیلی راحت تره!
اما چرا؟! :)
توی این مد بر خلاف DefaultAlphabet (که برای هر کاراکتر با 1 بایت سرو کار داریم) با 2 بایت سرو کار داریم.
یعنی توی DefaultAlphabet برای کاراکتر a معادل هگز داشتیم برابر با 61 ولی اینجا معادل هگز اون میشه 0061
علت اونم که خودتون بهتر از من میدونید چون کاراکتر ها در مد UTF-8 در 2 بایت ذخیره میشن.
ومیتونم بهتون اینو بگم که هیچکدوم از مراحل پیچیده حالت DefaultAlphabet در اینجا انجام نمیشه.
و فقط کافیه که معادل اسکی 2 بایتی هر کاراکتر رو پشت سر هم ردیف کنیم.
فقط به یه نکته باید توجه کنید که هم تو این مد و هم تو مد DefaultAlphabet باید رعایت بشه اونم اینکه توی مد DefaultAlphabet صفر بی ارزش یعنی 0 در سمت چپ عدد درسته که از لحاظ ریاضی بی ارزش هست ولی اینجا ما لازمش داریم.
مثلا معادل اسکی در پایه HEX برای حرف م عدد 645 هست ولی چون برای هر کاراکتر در این مد 4 تا صفر رزرو شده حتما باید صفر سمت چپ گذاشته بشه یعنی برای حرف م داریم 0645
با یه مثال مسئله رو روشن میکنم:
پیام رو با جمله زیر کد میکنیم.
داش مهران شیطونی نکن.
د = 06F2
ا = 0627
ش = 0634
Space = 0020
م = 0645
ه = 0647
ر = 0631
ا = 0627
ن = 0646
Space = 0020
ش = 0634
ی = 06CC
ط = 0637
و = 0648
ن = 0646
ی = 06CC
Space = 0020
ن = 0646
ک = 06A9
ن = 0646
. = 002E
پس کدی که باید ارسال بشه :
تعداد کاراکتر های ما در این مثال 21 عدد است که چون داره توی 2 بایت ذخیره میشه پس در اصل داره 42 بایت ارسال میشه که عدد 42 در مبنای 16 برابر میشه با 2A که باید قبل از متن قرار بگیره یعنی:
062F062706340020064506470631062706460020063406CC06 370648064606CC0020064606A90646002E
خیلی راحت بود مگه نه.;)
2A062F062706340020064506470631062706460020063406CC06 370648064606CC0020064606A90646002E
مخلص داش مهران و بقیه دوستان هم هستیم.;)
موفق باشید
raravaice عزير من اسم كوچيكتون رو نميدونم پس تا موقع اي كه اسمت رو نگي به نام كاربريت صدات ميزنم ..
اقا زحمت كشيدي اين رفرنس رو ارائه دادي .. اگه كاملش كني عالي ميشه .. همون طور كه ديدي من نمونه هايي رو گذاشتم كه هر كدوم براي خودشون يك سري مشكلاتي رو داشتن ...
ايا شما نمونه ي خوبي براي اين كار سراغ دارين كه از انعطاف بالايي برخوردار باشه ؟؟
دارم روي اين موضوع كار ميكنم و دارم تركيبي از بهترين نمونه ها رو بازنويسي ميكنم .. اگه شما هم چيز خوبي دارين در اختيار بزارين ... اگه كارم با موفقيت رو به رو شد همين جا ميزارمش ..
به خدا توکل کن و مابقی بحث رو که درباره ارسال در 2 یا چند پارت پیام دنبال هم هست رو گوش کن.;)
من کلا یه دوره زیاد سر به سر موبایل و سیم کارت و BTS هاش میزاشتم هر چی هست اطلاعات اون دورست.
کامل و بدون نقص و همینطور تست شدست حالا از روی مطالب شما به هر زبانی که دوست داشتی بشین سورس بنویس.
موفق باشید
مشتاقانه منتظر اس ام اس پارتي هستم من توي زبان برنامه نويسي محدوديتي ندارم ... بعد از تكميل شدن رفرنست رندوم ميزنم به يه زبان ترجمش ميكنم
بعد از اين بحث ميپريم روي AT ها كه بايد سه نفري روش بحث كنيم ... من و تو و noorsoft .. نميدونم چرا اصلا پيداش نيست !!! ؟ به اميد خداوند تبارك يك چيز توپ سه تايي جمع و جور ميكنيم ...
راستي اسم شريف رو نگفتي ... !!
يا حق ...
همانطور که در قسمت های قبل به صورت بخش به بخش گفتم برای تهیه یک کد PDU قابل ارسال ما به چند قسمت تفکیک شده نیاز داریم که به ترتیب شامل :
1.تعداد ارقام شماره مرکز پیام
2.نوع شماره مرکز پیام "81,91"
3.خود شماره مرکز پیام به صورت برعکس دوتایی
4.کد درخواست گزارش از مرکز پیام"31،11"
5.Message Refrence
6.تعداد ارقام شماره مقصد
7.نوع شماره مقصد"91,81"
8.خود شماره مقصد به صورت برعکس دوتایی
9.نوع پروتکل که شما برای SMS همیشه 00 رو جایگزین کنید.
10.نوع فرمت که :08 برای UTF و 00 برای معمولی که در حالت 08 هر پارت شامل حداکثر 70 کاراکتر و در حالت 00 هر پارت شامل حداکثر 160 کاراکتر میباشد.
11.طول عمر پیام
12.تعداد بایتهای محتوای پیام
13.محتوای پیام
حالا برای ایجاد پارت های بعدی همه اون کارها باید انجام بشه فقط یه چیزایی این وسط اضافه میشه یا تغییر میکنه.
1.وقتی پیام شما بیشتر از 1 پارت هست("حالا بر حسب نوع میشه یک پارت رو به 160 یا 70 کاراکتر تقسیم کرد اشاره من به صورت کلی مسئله هست") کد درخواست در هر حالتی که هست با 40H جمع میشه.
یعنی برای عدم ارسال گزارش داریم51H و برای ارسال گزارش داریم 71H
2.عدد ثابت 060804 دقیقا بعد از مرحله 12 و قبل از مرحله 13 جاگزاری میشه که کارش اینه که به مرکز پیام میگه این پیام ادامه دارد.
3.بعد از این عدد ثابت 32 بیت رزرو شده داریم که حاوی یه عدد تصادفی برای شماره گزاری پیامهای ماست یعنی چی؟
پیامی که ما در چند پارت میفرستیم بعد از این که مرکز پیام با کد 060804 متوجه شد ادامه داره و بتونه با دقت رد یابی کنه به یه کد احتیاج داره که در این قسمت قرار میگیره و میتونه یه عدد تصادفی بین 0000 و FFFF باشه و این عدد در سرآیند همه قسمتهای این پیام قرار میگیره.
4.بعد از این عدد تصادفی که در اصل کد پیام ما هست باید به مرکز پیام بفهمونیم که منتظر چند قسمت باید باشه پس 16 بیت بعد از اون رو به این کار اختصاص دادن یعنی از 02 تا FF که میشه : 02 پیام من 2 قسمت داره و FF پیام من 255 قسمت داره.
5.بعد از اینکه تعداد کل رو فرستادیم حالا باید ترتیب رو مشخص کنیم و به مرکز پیام بگیم این پیامی که الان رسیده دستت قسمت شماره چندم پیام هست که از 01 شروع میشه و با تعداد کل تموم میشه و بدین صورت ترتیب پشت سر هم قرار گرفتن هم لحاظ کردیم.
6.محتوای پیام رو بدون هیچ تغییری وارد میکنیم.
یه نکته که باید بهش خوب دقت کنید اینه که:
060804-0000-02-01
خودش شامل 7 بایت هست که دقیقا بعد از طول بایتهای محتوی قرار گرفته پس این 7 بایت هم سرباریه برای محتوای پیام و در نتیجه در حالتی که پیام ما از 1 پارت بیشتر هست باید 7 بایت رو از محتوی اول کم کنیم و اینارو جا بدیم و اون 7 بایتی رو که کم کردیم بعلاوه 1 بایت ناقص ما که توی پاورقی بهش اشاره شده به اول پیام بعد اضافه کنیم.
مسئله یه کم پیچیده است ولی خیلی مهم و جالبه.
یه مثال میزنم که موضوع مشخص بشه:
شماره مرکز پیام = 989350001400+
شماره مقصد = 09351234567
فرمت و محتوی پیام = فارسی شامل 200 کاراکتر "م"
تمایل به دریافت گزارش دارم=71 چو در چند پارت داره ارسال میشه
طول عمر پیا حداکثر باشه=FF
خوب ، یه حساب کتاب میکنیم ببینیم متن ما قرار هست توی چند پارت ارسال بشه.
از اونجایی که فرمت ما UTF هست پس در هر پارت حداکثر باید 70 کاراکتر جا بگیره یعنی :
همانطور که گفتم ما 7 بایت سر بار اضافه داریم پس باید بشه.
200 / 66 = 3.03
یعنی 3 قسمت کامل و یه جزء کوچک که توی قسمت 4 قرار میگیره.
پس پیام ما در حقیقت 4 پارت داره.
پس کدی که باید برای قسمت اول تولید بشه به ترتیب میشه :
1.تعداد بایتهای شماره مرکز پیام + کد نوع شماره = 07
2.نوع شماره مرکز پیام که اینجا با "+" شروع شده= 91
3.شماره مرکز پیام به صورت معکوس شده= 893905004100
4.درخواست گزارش = 71
5. رفرنس پیام = 00
6.تعداد ارقام شماره مقصد = 0B
7.نوع شماره مقصد چون معمولی هست = 81
8. بر عکس شده شماره مقصد = 9053214365F7 "چون تعداد 11 فرد هست رقم آخر با F0 جمع شده"
9.نوع پروتکل = 00
10.نوع فرمت چون UTF هست پس = 08
11.مدت زمان انتظار در شبکه حداکثر = FF
12. تعداد بایتهای پیام اول = 8B ("توضیح در پاورقی ")
13.عدد ثابت = 060804
14.کد تصادفی پیام = 661D
15.تعداد کل قسمتها = 04
16.شماره ردیف پارت قسمت اول = 01
17.محتوی پیام شامل = [66 بار تکرار (0645) که معادل کد اسکی حرف "م" هست و با یه ضرب ساده در 2 بایت میشه همون 132 بایتی که نیاز داشتیم]
همونطور که حساب کردیم ما اینجا 3 تا پارت کامل داری و یه پارت نصفه پس پارت دوم و سوم فقط در شماره ردیف پیام تغییر میکنن یعنی:
پارت دوم:
تمامیه مراحل در پارت اول مشترک است غیر از مرحله :
16.شماره ردیف پارت قسمت دوم = 02
پارت سوم:
تمامیه مراحل در پارت اول مشترک است غیر از مرحله :
16.شماره ردیف پارت قسمت سوم = 03
در پارت چهارم
تمامیه مراحل در پارت اول مشترک است غیر از مرحله :
12. تعداد بایتهای پیام چهارم =0B "ا 3 بایت عدد ثابت + 2 بایت عدد تصادفی + 1 بایت تعداد کل قسمتها + 1 بایت شماره ردیف پیام + 4 بایت محتوای پیام که شامل 2 تا "م" باقیمانده هست"
16.شماره ردیف پارت قسمت چهارم = 04
17.محتوی پیام = 2 بار تکرار (0645)
در نتیجه محتوای پارت اول چیزی شبیه به کد زیر میشه :
پارت دوم
079189390500410071000B819053214365F70008FF8B060804661D040106450645064506450645064506450645064506450645064506 45064506450645064506450645064506450645064506450645 06450645064506450645064506450645064506450645064506 45064506450645064506450645064506450645064506450645 06450645064506450645064506450645064506450645064506 45064506450645
پارت سوم
079189390500410071000B819053214365F70008FF8B060804661D040206450645064506450645064506450645064506450645064506 45064506450645064506450645064506450645064506450645 06450645064506450645064506450645064506450645064506 45064506450645064506450645064506450645064506450645 06450645064506450645064506450645064506450645064506 45064506450645
پارت چهارم
079189390500410071000B819053214365F70008FF8B060804661D040306450645064506450645064506450645064506450645064506 45064506450645064506450645064506450645064506450645 06450645064506450645064506450645064506450645064506 45064506450645064506450645064506450645064506450645 06450645064506450645064506450645064506450645064506 45064506450645
یه نکته برای دوستانی که از AT Command استفاده میکنن اینکه لازم نیست این کدها حتما در یک بار ارسال و یا پشت سر هم ارسال بشه.
079189390500410071000B819053214365F70008FF0B060804661D040406450645
شما میتونید این کد ها رو در فواصل زما حتی 1 دقیقه و به صورت کاملا نا مرتب هم بفرستید یعنی اول پارت 2 بعد 3 بعد 1 و بعد 4 رو بفرستید البته مدت زمان وقفه به BTS شما بستگی داره که معمولا روی BTS های ایران تا 30 ثانیه به من جواب داده.
پس عجله نکنید;)
مهم
پ.و: همانطور که تا الان باید متوجه شده باشید ما بدون احتساب شماره مرکز،شماره گیرنده و بقیه علائم برای متن و محتوای 1 پارت پیام حداکثر 140 بایت جا داریم که شمارش اون دقیقا از بعد از بایت شمارشگر محتوی شروع میشه.
یعنی اگر بر مبنای 8 بیت حساب کنیم 140 کاراکتر داریم و چون در مد DefaultAlphabet برای هر کاراکتر 7 بیت داریم پس کلا میتونیم 160 کاراکتر ارسال داشته باشیم و همچنین به دلیل اینکه در مد UCS2 برای هر کاراکتر 16 بیت داریم یعنی هر کاراکتر 2 بایت پس کلا میتونیم 70 کاراکتر رو ارسال کنیم.
حالا توی مد UCS2 وقتی پیام از 1 پارت بیشتر میشه ما مجبور 7 بایت هدر شامل :(3 بایت کد ثابت، 2 بایت شماره تصادفی ،1 بایت تعداد کل پیامها ،1 بایت شماره پیام فعلی) رو در محتوی پیام بگنجونیم
پس در نتیجه 140 بایت منهای 7 بایت برابر میشه با 133 بایت.
یعنی ما میتونیم 133 بایت از محتوی متن پیام شماره 1 رو اینجا بزاریم اما تو مد UCS2 یه ولی داریم:
توی حالت UCS2 همانطور که گفتم هر کاراکتر 2 بایت داره پس با احتساب 133 بایت فضای خالی که موجود داریم میتونیم 66 کاراکتر و 1 بایت بفرستیم و چون این بایت باقیمانده نیاز به بایت مکمل داره تا تفهیم باشه و اون بایت مکمل بلاجبار توی پارت بعدی قرار گرفته این بایت هم از اینجا حذف میکنیم و به پارت بعدی اضافه میکنیم یعنی ما توی هر پارت پیام UCS2 به صورت مولتی پارت 132 بایت رو جا میدیم که میشه 66 کاراکتر و بیشتر از این امکان نداره.
----------------------------------------
موفق باشید
آخرین ویرایش به وسیله raravaice : پنج شنبه 16 خرداد 1387 در 22:51 عصر دلیل: چند تا مورد که توی پست 50 بهش اشاره شده بود
قسمت دوازدهم : نکته آخر برای ارسال پیام کوتاه طول دستور AT شما
اگر شما قصد داشته باشید با AT به مودم پیام ارسال کنید اول از همه باید طول دستور رو بهش بگید و بعد از زدن کلید Enter محتوی دستور رو وارد کنید.
این عدد برابر میشه با : تعداد کل بایتهای ایجاد برای هر پارت - بایت شمارش شماره مرکز منهی بایت نوع منهی تعداد بایتهایی که شماره مرکز پیام رو تشکیل میده.
مثلا برای مثالی که تو قسمت بالا گفتم طول پارت 1 و 2 و 3 برابر میشه با 153 و طول پارت 4 برابر میشه با 25
موفق باشید
اگر خدا قبول کنه فردا به نحوه Decode کردن پیامهای رسیده به صورت PDU میپردازیم.
موفق باشید
اين قسمت اخرش بود ... يا بازم ادامه داره ؟؟؟
خوب پس منتظر ديكدش هستيم ...
تمومه دیگه ! دیگه چجوری میخوای SMS بفرستی که من نگفتم؟اين قسمت اخرش بود ... يا بازم ادامه داره ؟؟؟
فقط دریافت و Decode میمونه که اونم باشه برای فردا یا چند روز دیگه.
تا اینجاش ظریف کاری زیاد داره شایدم یه جاهایی سوتی داده باشم همه رو چک کن ببین چیزی از قلم نیافتاده و کار میکنه.
تا بعد;)
موفق باشید
raravaice جان در رابطه با اين قسمت يكم مفصل تر توضيح بده ( مثل قسمتهاي قبلي ) اگه يك مثال عملي هم ازش بزاري كه محشر ميشه ..این عدد برابر میشه با : تعداد کل بایتهای ایجاد برای هر پارت - بایت شمارش شماره مرکز منهی بایت نوع منهی تعداد بایتهایی که شماره مرکز پیام رو تشکیل میده.
مثلا برای مثالی که تو قسمت بالا گفتم طول پارت 1 و 2 و 3 برابر میشه با 153 و طول پارت 4 برابر میشه با 25
شما بیا تعداد کل کاراکتر های ایجاد شده برای هر پارت پیام رو بشمار بعد تقسیم بر 2 کن که تعداد بایتهای بسته پیامت مشخص بشه ("هر جفت دوتایی ما یک بایت بود دیگه") حالا از اول پیام رو تا اونجایی که شماره مرکز پیام تموم میشه بشمار و تعداد بایتها رو از این کم کن.در رابطه با اين قسمت يكم مفصل تر توضيح بده ( مثل قسمتهاي قبلي ) اگه يك مثال عملي هم ازش بزاري كه محشر ميشه .
کد زیر قسمت چهارم بخش قبل هست که اینجا مثال میزنم.
079189390500410071000B819053214365F70008FF0B0608048F1C040406450645
اینجا تعداد کل کاراکتر هامون شده 66 که تقسیم بر 2 یعنی 33 بایت داریم اگر دقت کنی 8 بایت رو شماره مرکز پیام به خودش تخصیص داده "دقت کن بایت" پس 33 منهی 8 برابر میشه با 25 که این 25 همون طول دستور AT ما هست.
موفق باشید
دوستان از زحمات همه ممنون من یکسری برنامه مفید آماده کردم در حال ترجمه یک منبع بسیار کامل و جامع PDf هستم که تو این تاپیک بزارم
همینطور که همه دوستان میدونن شما در PDU میتونین خیلی از قسمتها را وارد نکنین پس شناسایی و از کد درآوردن اینگونه پیامها بسیار مشکه برای همین داشتن یک منبع همراه با سورس کد های اون قسمت با زبانهای VB6 .nte C# فکر کنم مفید باشد
برای توضیح بشتر این را بگم که ممکنه شما شماره مرکز فرسنتده یا زمان طول عمر پیام و ... دیگه را در PDU نداشته باشین
باز هم از همکاری دوستان سپاسکزارم
آخرین ویرایش به وسیله noorsoft : چهارشنبه 15 خرداد 1387 در 10:57 صبح
Farshad Nooranian
بچه ها یه چیزی بگم ؟!!
من 40% مطالب رو بیشتر نگرفتم ...
چرا از پایه توضیح نمیدین ؟!!! هنوز هیچی نشده مبحث پرید روی Codeing و Decoding !
پایه یعنی از کجا!؟بچه ها یه چیزی بگم ؟!!
من 40% مطالب رو بیشتر نگرفتم ...
چرا از پایه توضیح نمیدین ؟!!! هنوز هیچی نشده مبحث پرید روی Codeing و Decoding !
من سورس این کار رو با vb.net دارم و توی 2 یا 3 تا از تاپیک های همین سایت هم گزاشتم ، من برای این قسمت به قسمتش کردم که فکر کردم منظور noorsoft عزیز همینه ولی ظاهرا منظور ایشون سورس بوده که اگر تمایل داشته باشید اونو میزارم و دیگه مبحث Decode کردن رو بازش نمیکنم.
موفق باشید
آخرین ویرایش به وسیله noorsoft : جمعه 17 خرداد 1387 در 07:09 صبح
سلام .
ببخشید مثل طلبکار ها حرف زدم
دستتون درد نکنه واقعاً کارتون حرف نداشت . وای که چقدر این مبحث جالبه .
من یک برداشت کلی از ارسال sms از طریق کامپیوتر داشتم :
ممنون میشم صحیح بودن برداشت من رو اعلام کنین .
این عملیات از دو بخش اصلی تشکیل میشه :
اون قسمت اول رو به خوبی متوجه شدم (Coding و Decoding) .
- تبدیل اطلاعات به دستورات قابل فهم برای گوشی ...
- ارسال اطلاعات تبدیل شده از طریق پورت COM به گوشی تلفن همراه (در VB از طریق کنترل MsCom )
منتها هنوز نحوه ارسال اطلاعات کد شده به گوشی رو نمی دونم ... (در VB) .
ممنون میشم یه توضیح مفصل در این مورد بدید .
باز هم ممنونم .
ببخشید سوالی که برای من پیش اومده اینه که چرا شماره تلفن مرکز پیام باید نوشته بشه ؟!!
مگه دستورات به گوشی ارسال نمیشن ؟! پس چه نیازی به این کار هست ؟
نه بابا ... سورس به چه دردي ميخوره ... من خودم اون رو گذاشتم ... صفحه ي قبل رو نگاه كن من هزار تا سورس گذاشتم ... ولي ادم خودش بفهمه و خودش از روي اصول بنويسه بدون شك بهتره .... noorsoft عزيزهمه ي اونا رو جمع كرده توي يك پست كه توي صفحه ي قبل هست ... اوني كه با VB.NET هست رو هم گذاشتم ...
raravaice جان لطفا بحث ديكدينگ هم بگو كه يك مرجع كامل باشه ... در كنار اون سورسها رو هم رد و بدل ميكنيم ... بي صبرانه منتظرم ...
.M8SPY. جان از اين پايه تر نميشه ... شما هرچقدر هم با پورت كار كني توي اين قسمتش كه اصل موضوع هست گير ميكني ... پس دندون روي جيگر بزار و اين قسمت رو خوب گوش كن بعدا به پورت هم ميرسيم و از raravaice عزيز ممنون ميشي كه اين مبحث رو جلوتر گفت ....
يا حق ...
ما از گوشي به عنوان GSM استفاده ميكنيم و داريم مستقيما با GSM اون كار ميكنيم .. پس ربطي به گوشي نداره و ما بايد همه ي ريزه كاري ها رو در PDU بيان كنيم ...ببخشید سوالی که برای من پیش اومده اینه که چرا شماره تلفن مرکز پیام باید نوشته بشه ؟!!
مگه دستورات به گوشی ارسال نمیشن ؟! پس چه نیازی به این کار هست ؟
Decoding رو كه هنوز نگفته و منتظريم ... چه جوري متوجه شدي ؟؟؟؟اون قسمت اول رو به خوبی متوجه شدم (Coding و Decoding)
خوب اگه 00 قرار بديم چي ميشه ؟؟؟ خودش جايگزين ميكنه ؟؟
اقا مهران سورسهایی که من دارم ازش حرف میزنم با سورسهایی که شما از Codeproject دانلود کردی فرق داره
لازمه یکبار دیگه از raravaice تشکر کنتم ولی باز هم این مطالب کامل و جامع نیست خیلی از چیزهایی که در کدینگ داریم با ریزه کاریاش بیان نشده البته این را هم بگم شاید ایشون لازم ندونستند مطلب را زیاد بازکنند ولی من دارم یک رفرنس بسیار کامل آماده میکنم
چند مثال : ما در GSM 9 کارکتر داریم که کدهاشون با کد اصلیشون فرق میکنه
یا توضیحاتی در مورد User Data Header (UDH) و..... بیان نشده
در ضمن هدف اصلی من گذاشتن سورس نیست در واقع قسمتهایی را که توضیح دادم برنامه نویسی شو هم گفتم
آخرین ویرایش به وسیله noorsoft : جمعه 17 خرداد 1387 در 07:12 صبح دلیل: حذف حرفهای حاشیه ای
Farshad Nooranian
noorsoft جون ازون حرفا زدي ها ... مشكل اينه كه هيچ كدوم كامل نبودن .. من يك چيزي كامل ميخواستم كه ظاهرا هر چي گشتم وجود نداشت .. البته خدوم چند تا از بهترين هاش رو انتخاب كردم و دارم سه تا رو يكي ميكنم و ضعفهاشون رو ميگيرم تا هيچ مشكلي نداشته باشه ... اين كه خودم ننوشتم اين بود كه اطلاعات كامل نداشتم وگرنه در زبان برنامه نويسي مشكلي ندارم و حتي اگه با اسمبلي هم باشه براي من فرقي نداره ....اقا مهران سورسهایی که من دارم ازش حرف میزنم با سورسهایی که شما از Codeproject دانلود کردی فرق داره
منتظر گفته هاي شما هم هستيم .. انشاالله كه اين رفرنست واقعا به مرحله ي اجرا برسه و ما ببينيمش ... تا كي اماده ميشه به نظرت ؟؟؟
آخرین ویرایش به وسیله noorsoft : جمعه 17 خرداد 1387 در 07:12 صبح دلیل: حذف حرفهای حاشیه ای
يك سورس كد مربوط به ويندوز موبايل رو با هزار تا زور و زحمت گير اوردم ... قابليت ارسال پيام فارسي رو به گوشي هايي كه فارسي قبول نميكردند اظافه ميكرد .... خوب مطالعه كردمش ... noorsoft راست ميگفت اصلا اونجا كد اسكي نيست كه ... اصلا بعضي كاراكرتها كدهاي عجيب غريبي دارن .. يك قسمت از اون سورس فقط قسمت ثابتهاي كاراكترهاش بود .... يك قسمت براي خوندن زمان ارسال بود ... خيلي پيچيده تر از اوني بود كه به نظر ميرسيد ... دارم به C++ ترجمش ميكنم ... بلاخره يك چيز كامل پيدا كردم خيالم راحت شد ... بعد به صورت DLL درش ميارم و ازش توي كارم استفاده ميكنم ... جالبرتين قسمتش اينجاست كه پيامهاي چند پارتي هم توليد ميكنه ... همين الان باهاش يك پيام 4 پارتي توليد كردم و فرستادم ... درست كار ميكرد ....
آقا مهران من قصد جسارت نداشتم من کوچک همتون هستن منظورم این بود که چند تا کد ناقص که با روشهای مختلف نوشته شده نمی شه سرهم کرد و کامل کرد امید وارم از من ناراحت نشده باشی شما پیشرفت خوبی تو این زمینه داشتی با لین پشت کار زود به نتیجه دلخواهت میرسی
من دارم رفرنسهای اصلی Gsm را آخرین ورژنش را ترجمه میکنم البته کامپیوتر من چند روزه مشکل پیدا کرده و نمی تونم چیزی آپلود کنم ولی منتظر باشید
آخرین ویرایش به وسیله noorsoft : جمعه 17 خرداد 1387 در 07:14 صبح دلیل: حذف حرفهای حاشیه ای
Farshad Nooranian
دقیقا یکی از ظرافتهای PDU تو همینه که اگر قرار باشه شما با دستورات AT شماره مرکز را بدست بیاری و بعد دوباره در PDU وارد کنی میتونی 00 را وارد کنی که بصورت خودکار کامل میشه
این روش چند حسن داره اولیش اینکه کد کردن سریع تر و راحتتره دوم اگه شما سیم کارت را عوض کنید دیگه مهم نیست از چه اپراتوری استفاده کنید (همراه اول - ایرانسل - تالیا و ...)
Farshad Nooranian
بچه ها من كار گرد اوريم تموم شد و از تركيب بهترين نمونه ها بهترين چيز رو براي خودم نوشتم ...
فقط به چند تا نكته برخورد كردم كه لازم دونستم ذكر كنم ... اون چيزهايي كه دوست خوبمون اقاي raravaice ذكر كردن براي Encode كردن كافي بوده .. و تقريبا كامل بود ... يعني همين مطالب براي ارسال كفايت ميكنه ولي بر Decode كردن ماجرا فرق داره و يك قسمت هم براي زمان دريافت وجود داره كه بايد ذكر بشه .. همچنين چند تكنيك هم وجود داره كه بايد ذكر بشه ...
از raravaice عزيز ميخوام كه حرفاي گفته شده رو به دل نگيره و به چشم برادري ببينه ...
همچنين از raravaice جان ميخوام به بحث ادامه بده و Decode رو هم ذكر كنه تا يك لطفي به دوستاني كرده باشه كه در اينده نياز به يك منبع دارن ... بدون يقين گفته هاي ايشون بعد ها بدرد افرادي ميخورن ...
برای انکدینگ ابتدا شما باید نوع پیام را تشخیص بدین که میتونه یکی از انواع زیر باشه
SMS RECEIVED
SMS STATUS_REPORT
SMS SUBMIT
EMS RECEIVED
EMS SUBMIT
بعد از تشخیص شروع به خواندن پیام با پارامترهای موجود در نوع پیام میکنیم
برای تشخیص نوع پیام FirstOctet پیام را که در واقع همون دو بایت بعد از شماره مرکز تلفن هستند را بخونید
دو بیت آخر برای ما مهمه که در واقع همهون عدد 3 میشه 00000011
به اضافه بیت 7 تم که 64 میشه 01000000
اگه بیت اول و دوم و هفتم 1 باشن 010000011 نوع پیام ما EMS SUBMIT میشه در غیر این صورت شما
عدد دو بیت آول و بیت هفتم را با هم جمع کنید تا نوع پیام مشخص بشه
که با این حساب
SMS RECEIVED = 0
SMS STATUS REPORT = 2
SMS SUBMIT = 1
EMS RECEIVED = 64
EMS SUBMIT = 65
بدست میاد
آخرین ویرایش به وسیله noorsoft : پنج شنبه 16 خرداد 1387 در 18:25 عصر