在 PDU 模式下支持 [ 和 ] 字符

Support [ and ] characters in PDU mode

本文关键字:字符 支持 PDU 模式      更新时间:2023-09-26

我正在用nodejs编写应用程序,用于在PDU模式下发送和接收短信。我使用wavecom GSM调制解调器(7位编码)发送短信。它还支持 8 位 (AT+CSMP=1,167,0,8) 编码方案。

我可以正确发送字母数字字符。但是我不能发送一些字符,例如([,],| 等)。

这里字符串:

AT+CMGS=14    
0001030C911989890878800004015B

文本字符串:[

但我收到了一些垃圾字符。知道吗?

以及如何发送多部分短信。我已经参考了这个,这个,但我没有得到想要的输出。任何人都可以建议8位(7位编码方案)文本编码方案吗?请帮帮我...

根据此页面(请参阅发送 Unicode SMS 消息部分),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)。

编辑

以下是在缓冲区类中使用内置UCS2转换器的NodeJS版本:

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 答案的启发:

  • 节点.JS大端 UCS-2
  • 如何在节点.js中进行 Base64 编码?

谢谢,

终于我得到了答案:)

此字符 ([,],|) 编码为两个字符,如下所示

[编码为 1B1E(转义字符和<符号的组合)>

]编码为 1B20(转义字符和>符号的组合)

因此,每当我喜欢这样的字符时,我都会将其替换为相应的值,然后我使用7位编码。这是工作好...

所以我的编码字符串 [ 是

> AT+CMGS=15
> 0001000C911989890878800000021B1E

而对于"[你好]"

> AT+CMGS=21
> 0001000C911989890878800000091B1EBACC66BF373E

再次感谢..