Я пытаюсь прочитать SMS с D-link DWM-157 HSPA + USB-адаптер. Я могу читать SMS с помощью AT-команд. Код работает нормально, когда SMS-сообщения содержат символы меньше 160. Если SMS-сообщение содержит multipart, оно преобразуется в 7-битный формат, который я каким-то образом теперь могу декодировать с помощью этой библиотеки. метод Decode7bit () работает нормально, но когда длина строки (параметр этого метода) равна 268, а когда длина меньше 268, в результате выдается значение мусора. Код
public static byte[] GetInvertBytes(string source)
{
byte[] bytes = GetBytes(source);
Array.Reverse(bytes);
return bytes;
}
public static byte[] GetBytes(string source, int fromBase)
{
List<byte> bytes = new List<byte>();
for (int i = 0; i < source.Length / 2; i++)
bytes.Add(Convert.ToByte(source.Substring(i * 2, 2), fromBase));
return bytes.ToArray();
}
public static byte[] GetBytes(string source)
{
return GetBytes(source, 16);
}
public static string Decode7bit(string source, int length)
{
byte[] bytes = GetInvertBytes(source);
string binary = string.Empty;
foreach (byte b in bytes)
binary += Convert.ToString(b, 2).PadLeft(8, '0');
binary = binary.PadRight(length * 7, '0');
string result = string.Empty;
for (int i = 1; i <= length; i++)
result += (char)Convert.ToByte(binary.Substring(binary.Length - i * 7, 7), 2);
//return result.Replace('\x0', '\x40');
return result.Replace("\0", "");
}
и код, по которому я получаю SMS от GSM-модуля:
public string Read()
{
//Console.WriteLine("Reading..");
gsmPort.WriteLine("AT+CMGF=1"); // Set mode to Text(1) or PDU(0)
Thread.Sleep(1000); // Give a second to write
//gsmPort.WriteLine("AT+CPMS=\"SM\""); // Set storage to SIM(SM)
gsmPort.WriteLine("AT+CPMS=\"ME\",\"SM\",\"MT\""); // Set storage to SIM(SM)
Thread.Sleep(1000);
// gsmPort.WriteLine("AT+CMGL=\"REC UNREAD\""); // What category to read ALL, REC READ, or REC UNREAD
gsmPort.WriteLine("AT+CMGL=\"ALL\""); // What category to read ALL, REC READ, or REC UNREAD
Thread.Sleep(1000);
gsmPort.Write("\r");
Thread.Sleep(1000);
string response = gsmPort.ReadExisting();
if (response.EndsWith("\r\nOK\r\n\r") || response.EndsWith("\r\nOK\r\n"))
{ //there is no error
//Console.WriteLine(response);
return response;
// add more code here to manipulate reponse string.
}
else
{
return "ERROR";
// add more code here to handle error.
//Console.WriteLine(response);
}
}
Я искал 7-битные декодеры, но не могу получить подходящий результат. Может кто-нибудь сказать мне, как преобразовать 7-битную строку в обычный текст, или любой другой метод для чтения многочастных SMS без 7-битной кодировки или каких-либо AT-команд, которые делают сказанное.