Поддержка символов [ и ] в режиме PDU

Я пишу приложение в nodejs для отправки и получения смс в режиме PDU. Я использую GSM-модем wavecom (7-битное кодирование) для отправки смс. Он также поддерживает 8-битную (AT+CSMP=1,167,0,8) схему кодирования.

Я могу правильно отправить буквенно-цифровой символ. Но я не могу отправить какой-либо символ, например ([,],| и т. д.).

Здесь строка:

AT+CMGS=14    
0001030C911989890878800004015B

Текстовая строка: [

Но я получаю какой-то мусорный характер. Любая идея?

И как отправить составную смс. Я ссылаюсь на это и это, но я не получаю желаемого результата. кто-нибудь может предложить 8-битную (7-битную схему кодирования) схему кодирования текста? Пожалуйста, помогите мне...


person Paresh Thummar    schedule 01.05.2012    source источник
comment
вы уже пробовали сбежать от персонажей?   -  person Gonçalo Vieira    schedule 11.05.2012


Ответы (2)


Согласно этой странице (см. раздел Отправка SMS-сообщения Unicode), 8-битная кодировка на самом деле UCS-2.

Я недостаточно знаю о nodejs, чтобы дать вам полную реализацию, но вот пример .NET:

string EncodeSmsText(string text)
{
    // Convert input string to a sequence of bytes in BigEndian UCS-2 encoding
    //    'Hi' -> [0, 72, 0, 105]
    var bytes = Encoding.BigEndianUnicode.GetBytes(text);

    // Encode bytes to hex representation
    //    [0, 72, 0, 105] -> '00480069'
    return BitConverter.ToString(bytes).Replace("-", "");
}

Обратите внимание, что согласно этому сообщению мой код не будет работать для символов, закодированных как суррогатные пары, потому что Encoding.BigEndianEncoding UTF-16 (не UCS-2).

Изменить

Вот версия NodeJS, которая использует встроенный преобразователь UCS2 в классе Buffer:

function swapBytes(buffer) {
    var l = buffer.length;
    if (l & 0x01) {
        throw new Error('Buffer length must be even');
    }
    for (var i = 0; i < l; i += 2) {
        var a = buffer[i];
        buffer[i] = buffer[i+1];
        buffer[i+1] = a;
    }
    return buffer; 
}

function encodeSmsText(input) {
    var ucs2le = new Buffer(input, 'ucs2');
    var ucs2be = swapBytes(ucs2le);
    return ucs2be.toString('hex');

}

console.log(encodeSmsText('Hi'));

Вдохновленный этими ответами SO:

person Miroslav Bajtoš    schedule 25.05.2012
comment
Спасибо, он отлично работает с SMS-шлюзом Gammy. - person Fulup; 05.02.2015

Спасибо,

Наконец-то я получил ответ :)

Эти символы ([,],|) кодируются как два символа, например

[ кодируется как 1B1E (комбинация escape-символа и знака ‹)

] кодируется как 1B20 (комбинация управляющего символа и знака >)

Поэтому всякий раз, когда мне нравятся такие символы, я заменяю их соответствующим значением, а затем использую 7-битную кодировку. Это Работа хорошая...

Итак, моя строка кодирования для [

> AT+CMGS=15
> 0001000C911989890878800000021B1E

И для "[привет]"

> AT+CMGS=21
> 0001000C911989890878800000091B1EBACC66BF373E

Еще раз спасибо..

person Paresh Thummar    schedule 26.05.2012