问题描述:

I am writing application in nodejs for sending and recieving sms in PDU mode.I use wavecom GSM modem(7-bit encoding) to send sms. It also support 8 bit(AT+CSMP=1,167,0,8) encoding scheme.

I can send alpha numeric character properly.But I can't send some character like ([,],| etc).

Here string :

AT+CMGS=14

0001030C911989890878800004015B

Text String : [

But I recieve some junk character. Any Idea?

And how to send multipart sms. I have refer this, and this but I does not get desired output. can anyone suggest 8-bit(7-bit encoding scheme) text encoding scheme?

Please Help me...

网友答案:

According to this page (see section Sending an Unicode SMS message), the 8bit encoding is in fact UCS-2.

I don't know enough about nodejs to give you the full implementation, but here is a .NET sample:

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("-", "");
}

Please note that according to this post my code will not work for characters encoded as surrogate pairs, because Encoding.BigEndianEncoding is UTF-16 (not UCS-2).

Edit

Here is NodeJS version that uses the built-in UCS2 converter in Buffer class:

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'));

Inspired by these SO answers:

  • Node.JS Big-Endian UCS-2
  • How to do Base64 encoding in node.js?
网友答案:

Thanks,

Finally I got the answer :)

This characters([,],|) are encode as two characters like

[ is encode as 1B1E (Combination of escape character and < sign)

] is encode as 1B20 (Combination of escap character and > sign)

So whenever I fond such characters I replaced it with corresponding value then I use 7 bit encoding. It's Work good...

So my encoding string for [ is

> AT+CMGS=15
> 0001000C911989890878800000021B1E

And for "[hello]"

> AT+CMGS=21
> 0001000C911989890878800000091B1EBACC66BF373E

Thanks once again..

相关阅读:
Top