проблемы с GPRS

Тема в разделе "Arduino & Shields", создана пользователем yhl, 8 ноя 2015.

  1. yhl

    yhl Нерд

    Отравляю команду что бы проверить баланс в ответ получаю такое:
    AT+CUSD=1,"#100#"

    OK

    +CUSD: 0,"041204400435043C044F0020043E0436043804340430043D0438044F0020043E0442043204350442043000200438044104420435043A043B043E002E0020041F043E043F0440043E043104430439044204350020043F043E043704360435002E",72 . Что это и как получить нормально данные?
    Оператор мегафон
     
  2. geher

    geher Гуру

    Так бывает, когда СМС передается в UCS2 по причине наличия в ней кириллицы.
    Каждые 4 шестнадцатеричные цифры - кодируют один символ.
    Надо перекодировать данную последовательность из UCS2, представленного в HEX, в нормальные символы.

    UCS2 - по сути подмножество Unicode UTF-16.

    Я использовал такую функцию для преобразования в utf-8 (chartohex - вспомогательный довесок)
    Код (C):

    String decodeUTCString(String &S){
      String result="";
      unsigned char c[4]="";
      for (int i=0;i<S.length()-3;i+=4){
        wchar_t codepoint=(((unsigned int)chartohex(S[i]))<<12)+
                                         (((unsigned int)chartohex(S[i+1]))<<8)+
                                         (((unsigned int)chartohex(S[i+2]))<<4)+
                                         ((unsigned int)chartohex(S[i+3]));
        if (codepoint <= 0x7F) {
          c[0] = (char)codepoint;
          c[1] = 0;
          result+=String((char*)c);
        } else if (codepoint <= 0x7FF) {
          c[0] = (char)(0xC0 | (codepoint >> 6));
          c[1] = (char)(0x80 | (codepoint & 0x3F));
          c[2] = 0;
          result+=String((char*)c);
        } else if (codepoint <= 0xFFFF) {
          c[0] = (char)(0xE0 | (codepoint >> 12));
          result+=String((char*)c);
          c[1] = (char)(0x80 | ((codepoint >> 6) & 0x3F));
          result+=String((char*)c);
          c[2] = (char)(0x80 | (codepoint & 0x3F));
          c[3] = 0;
          result+=String((char*)c);
        }
      }
      return(result);
    }

    unsigned char chartohex(char c){
      if ((c>=0x30)&&(c<=0x39)) return (c-0x30);
      else if ((c>='A')&&(c<='F')) return (c-'A'+10);
      else return(0);
    }
     
    Соответственно, нужна функция, которая будет аналогичным образом переводить из USC2 в требуемую кодировку.

    А мегафон, кстати, отвечает
    "Время ожидания ответа истекло. Попробуйте позже. "
     
    Последнее редактирование: 8 ноя 2015
    deftvk и acos нравится это.