2012-05-01 3 views
7

Sto scrivendo l'applicazione in nodejs per l'invio e la ricezione di sms in modalità PDU. Uso il modem GSM wavecom (codifica a 7 bit) per inviare sms. Supporta inoltre lo schema di codifica a 8 bit (AT + CSMP = 1,167,0,8).Supporto [e] caratteri in modalità PDU

Posso inviare correttamente caratteri alfanumerici. Ma non posso inviare caratteri come ([,], | ecc.).

Qui string: String

AT+CMGS=14  
0001030C911989890878800004015B 

Testo: [

Ma ricevo qualche personaggio spazzatura. Qualche idea?

E come inviare sms multipart. Mi riferisco allo this e allo this ma non ottengo l'output desiderato. qualcuno può suggerire uno schema di codifica del testo a 8 bit (7-bit encoding scheme)? Please Help me ...

+0

Hai provato la fuga ancora i personaggi? –

risposta

2

Grazie,

Finalmente ho avuto la risposta :)

Questa caratteri ([,], |) sono codificare come due personaggi come

[ è codificare come 1B1E (combinazione di fuga carattere e <)

] codifica come 1B20 (combinazione di caratteri di escape e segno>

Quindi ogni volta che amo questi caratteri l'ho sostituito con il valore corrispondente, quindi uso la codifica a 7 bit. È un buon lavoro ...

Così la mia stringa di codifica per [è

> AT+CMGS=15 
> 0001000C911989890878800000021B1E 

E per "[ciao]"

> AT+CMGS=21 
> 0001000C911989890878800000091B1EBACC66BF373E 

Grazie ancora una volta ..

3

Secondo this page (vedere la sezione Invio di un messaggio SMS Unicode), la codifica a 8 bit è in realtà UCS-2.

Non so abbastanza di nodejs per darvi la piena attuazione, ma qui è un esempio .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("-", ""); 
} 

prega di notare che in base alla this post il mio codice non funziona per i caratteri codificati come surrogato coppie, perché Encoding.BigEndianEncoding è UTF-16 (non UCS-2).

Modifica

Ecco la versione NodeJS che utilizza il convertitore incorporato UCS2 in classe 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')); 

Ispirato da questi SO risposte:

+0

Grazie, funziona perfettamente con il gateway Gammy SMS. – Fulup