2015-05-02 9 views
0

Я работаю над своим GSM-модемом (Huawei E171), чтобы отправить команды USSD. сделать это я использовать эти команды на первом:Как найти декодированный способ декодирования результата команды USSD в C#?

AT+CMGF=1 
AT+CSCS=? ----> result is "IRA" this is my modem default 

после этого я послал эти команды и я получил эти результаты, и все работает отлично.

// * 141 * 1 # -----> чтобы проверить мой баланс

+CUSD: 
    0,"457A591C96EB40B41A8D0692A6C36C17688A2E9FCB667AD87D4EEB4130103D 
     0C8281E4753D0B1926E7CB2018881E06C140F2BADE5583819A4250D24D2FC 
     BDD653A485AD787DD65504C068381A8EF76D80D2287E53A55AD5653D554 
     31956D04",15 

// * 100 # ----> эта команда дает мне несколько вариантов, чтобы зарядить мобильный

+CUSD: 
    1,"06280627062C06470020062706CC06310627064606330644000A0030002E062E0 
     63106CC062F00200634062706310698000A0031002E067E062706330627063106A 
     F0627062F000A0032002E0622067E000A0033002E06450644062A000A003 
     4002E06330627064506270646000A0035002E067E0627063106330 
     6CC06270646000A002300200028006E0065007800740029000A",72 

я нашел некоторые коды, чтобы декодировать этот результат:

для декодирования проверки баланса результата я использовал:

 string result141="457A591C96EB40B41A8D0692A6C36C17688A......." 
     byte[] packedBytes = ConvertHexToBytes(result141); 
     byte[] unpackedBytes = UnpackBytes(packedBytes); 

     //gahi in kar mikone gahi balkaee nafahmidam chera 
     string o = Encoding.Default.GetString(unpackedBytes); 

кода моей функции является:

public static byte[] ConvertHexToBytes(string hexString) 
    { 
      if (hexString.Length % 2 != 0) 
       return null; 

      int len = hexString.Length/2; 
      byte[] array = new byte[len]; 

     for (int i = 0; i < array.Length; i++) 
     { 
      string tmp = hexString.Substring(i * 2, 2); 
      array[i] = 
      byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber); 
     } 

     return array; 
    } 


    public static byte[] UnpackBytes(byte[] packedBytes) 
    { 
     byte[] shiftedBytes = new byte[(packedBytes.Length * 8)/7]; 

     int shiftOffset = 0; 
     int shiftIndex = 0; 

     // Shift the packed bytes to the left according 
     //to the offset (position of the byte) 
     foreach (byte b in packedBytes) 
     { 
      if (shiftOffset == 7) 
      { 
       shiftedBytes[shiftIndex] = 0; 
       shiftOffset = 0; 
       shiftIndex++; 
      } 

      shiftedBytes[shiftIndex] = (byte)((b << shiftOffset) & 127); 

      shiftOffset++; 
      shiftIndex++; 
     } 

     int moveOffset = 0; 
     int moveIndex = 0; 
     int unpackIndex = 1; 
     byte[] unpackedBytes = new byte[shiftedBytes.Length]; 

     // 
     if (shiftedBytes.Length > 0) 
     { 
      unpackedBytes[unpackIndex - 1] = 
      shiftedBytes[unpackIndex - 1]; 
     } 

     // Move the bits to the appropriate byte (unpack the bits) 
     foreach (byte b in packedBytes) 
     { 
      if (unpackIndex != shiftedBytes.Length) 
      { 
       if (moveOffset == 7) 
       { 
        moveOffset = 0; 
        unpackIndex++; 
        unpackedBytes[unpackIndex - 1] = 
        shiftedBytes[unpackIndex - 1]; 
       } 

       if (unpackIndex != shiftedBytes.Length) 
       { 
        // Extract the bits to be moved 
        int extractedBitsByte = (packedBytes[moveIndex] & 
              _decodeMask[moveOffset]); 
        // Shift the extracted bits to the proper offset 
        extractedBitsByte = 
           (extractedBitsByte >> (7 - moveOffset)); 
        // Move the bits to the appropriate byte 
        //(unpack the bits) 
        int movedBitsByte = 
         (extractedBitsByte | shiftedBytes[unpackIndex]); 

        unpackedBytes[unpackIndex] = (byte)movedBitsByte; 

        moveOffset++; 
        unpackIndex++; 
        moveIndex++; 
       } 
      } 
     } 

     // Remove the padding if exists 
     if (unpackedBytes[unpackedBytes.Length - 1] == 0) 
     { 
      byte[] finalResultBytes = new byte[unpackedBytes.Length - 1]; 
      Array.Copy(unpackedBytes, 0, 
         finalResultBytes, 0, finalResultBytes.Length); 
      return finalResultBytes; 
     } 
     return unpackedBytes; 
     } 

но декодировать второй результат я использовал:

string strHex= "06280627062C06470020062706CC06310......"; 

    strHex = strHex.Replace(" ", ""); 
      int nNumberChars = strHex.Length/2; 
      byte[] aBytes = new byte[nNumberChars]; 
      using (var sr = new StringReader(strHex)) 
      { 
      for (int i = 0; i < nNumberChars; i++) 
       aBytes[i] = Convert.ToByte(
          new String(new char[2] { 
          (char)sr.Read(), (char)sr.Read() }), 16); 
     } 
    string decodedmessage= Encoding.BigEndianUnicode. 
         GetString(aBytes, 0, aBytes.Length); 

обе темы работу тока, но почему я должен другой способ декодирования для декодирования этих результатов?

откуда я могу найти, я должен использовать какой из этих двух типов декодирования?

ответ

1

команды USSD ответы + CUSD непредусмотренные ответы отформатированы следующим образом:

+CUSD: <m>[<str_urc>[<dcs>]] 

Где «м» тип действия требуется, «str_urc» является строкой ответа, и «РС» является строкой ответа кодирование.

Эта цитата из инструкции Siemens Cinterion MC55i, но применимо к другим производителям модемов:

Если РСУ показывает, что GSM алфавит 03,38 по умолчанию используется TA преобразует GSM алфавита в текущий символ TE набор в соответствии с правилами GSM 07.05 Приложение A. В противном случае в случае недопустимого или пропущенного преобразования dcs значение str_urc невозможно.

USSD могут быть отправлены в 7-разрядным закодированном формате или UC2, следовательно, при взгляде на ваши два примера ответов вы можете увидеть либо DCS 15 или 72.

GSM 03,38 Cell Broadcast Data Coding Scheme в целочисленном формате (по умолчанию 15). В случае недопустимого или опущенного dcs со стороны сети (MT) не будет выдаваться.

Так что, если вы получаете DCS 15, то это 7-битный кодированный. И если это 72, то это будет UC2. Таким образом, вы можете легко выбрать либо свою первую процедуру декодирования, либо вторую.

+0

спасибо за ваш хороший ответ, но можете ли вы мне связаться, пожалуйста, какова связь между 15 и 7-битным кодированием или 75 и UC2, я имею в виду, что формула или что-то для вычисления 75 или 15? Или эти числа предопределены? – motevalizadeh

+0

Да, есть схема кодирования для схемы кодирования :) Лучшая ставка - это прочитать спецификацию 3GPP 03.38. Поиск схемы кодирования данных сотовой радиосвязи. Это относительно просто, что биты 3 и 2 определяют используемый алфавит. Для 7-бит его бит3 = 0 бит2 = 0 и для UC2 его бит3 = 1 бит2 = 0. Есть некоторые нюансы по сравнению с SMS-кодированием. Детали, которые я не могу вспомнить на 100%. – aldridmc

Смежные вопросы