با سلام خدمت دوستان یکی از مشکلات کار با این ماژول گرفتن مانده اعتبار همراه اول هستش که با ussd باید این کار انجام بشه چون در اینترنت هیچ جا منبعی پیدا نمی کنید که به روشنی روند کار رو توضیح بده و حتی افرادی هم که موفق شده اند از دادن اطلاعات طفره می روند تصمیم گرفتم تجربیات خودم رو به اشتراک بگذارم تا درگیر این موضوع نشوید و مانند من وقتتون رو زیاد تلف نکنین. باشد که از خارجی ها مفهوم اپن سورس را یاد بگیریم و اطلاعات رو راحت تر اشتراک بگذاریم. نمی دونم سخنانی همچون «زکات علم نشر آنست» از بزرگان ماست اما کسان دیگری به آن عمل می کنند همچنین برخی فروشگاه ها از فرصت استفاده نکنند و بخاطر اقبال مشتری ها به یک ماژول مانند a6 قیمت رو یکمرتبه چند برابر نکنند!!!؟؟؟؟؟؟
مراحل انجام کار به این صورته که ابتدا دستورات زیر رو به مودم میفرستین
AT+CSMP=17,167,0,0
AT+CSCS="GSM"
AT+CUSD=1,"*140*11#",15
دستورات اول مودم رو در حالت 7 بیتی قرار می ده و دستور دوم کرکتر ست مودم رو در حالت gsm قرار می ده و دستور سوم اجرای دستور مانده اعتبار همراه اول هستش.
پاسخ مودم آخرین دستور به شکل زیر می باشد.
+CUSD........................
!کاراکترهی پاسخ رو نتونستم ارسال کنم چون ظاهرا علت عدم نمایش متن پست به خاطر همین کارکتر های به هم ریخته هستش.!!!!!!!!!!!!!!!!!!!!!
که ظاهرا نا مفهوم هستش ولی بین علامت " " همان چیزی است که ما بدنبال آن هستیم پاسخ همراه اول! اما بصورت 7 بیتی نه 8 بیتی که بایستی تبدیل به 8 بیتی شود
فقط کافیه عبارت فوق رو به صورت هگز نمایش داده و کد های بین دو کد 0x22 رو به برنامه زیر وارد کنید اما بدون فاصله..
اینم برنامه ای که این کار رو انجام می ده موفق باشید
لایک یادتون نره دوستون دارم محققین ایرانی
کد:
void setup() {
Serial.begin(56700);
Serial.print( decode7to8bit("D9775D0E1287D961F7B80C4ACF41B19C2C870349D36136C8957DD7E5A0F078FCAEBBE9A07B9ACD0695F1F0B4BC0C0A9BE9653948068BE55E30DB2B16732986E8B0FC5C0689F320556C043281AE69374806B301"));
}
void loop() {}
String decode7to8bit(String str) {
byte data8bit[160];
byte data7bit[140];
byte len = str.length();
int lsb, msb;
for ( int i = 0, j = 0; i < len; i += 2, j++) {
msb = tolower(str[i]);
lsb = tolower(str [i + 1]);
msb -= isdigit(msb) ? 0x30 : 0x57;
lsb -= isdigit(lsb) ? 0x30 : 0x57;
data7bit[j] = (char)(lsb | (msb << 4));
}
str = "";
for (byte i = 0, counter = 0, j = 0; i < len / 2; i++, counter++, j++) {
byte current = data7bit[i];
byte previous = i == 0 ? 0 : data7bit[i - 1];
if (counter == 7) counter = 0;
int shiftedCurrent = (current << counter) & 0x7F;
int shiftedPrevious = (previous & 0xFF) >> (8 - counter);
data8bit[j] = (shiftedCurrent | shiftedPrevious);
str += char(data8bit[j]);
if (counter == 6) {
j++;
data8bit[j] = ((current & 0xFF) >> 1);
str += char(data8bit[j]);
}
}
return str;
}
}