长短信 PDU编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了长短信 PDU编码相关的知识,希望对你有一定的参考价值。

长短信 PDU编码格式,最好能提供标准文档

参考技术A PDU编码有Unicode编码和7bit与8bit编码,具体根据得到数据的格式来解码,unicode编码稍微简单,7bit编码复杂些 参考技术B PDU编码格式标准文档PDU编码有Unicode编码和7bit与8bit编码本回答被提问者采纳

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

【中文标题】支持PDU模式下的[和]字符【英文标题】:Support [ and ] characters in PDU mode 【发布时间】:2012-05-11 00:46:11 【问题描述】:

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

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

这里是字符串:

AT+CMGS=14    
0001030C911989890878800004015B

文本字符串:[

但我收到了一些垃圾字符。任何想法?

以及如何发送多部分短信。我参考了this 和this,但我没有得到想要的输出。谁能建议 8 位(7-bit encoding scheme)文本编码方案? 请帮帮我...

【问题讨论】:

你试过转义字符了吗? 【参考方案1】:

根据this page(参见发送 Unicode SMS 消息一节),8bit 编码实际上是 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("-", "");

请注意,根据this post,我的代码不适用于编码为代理对的字符,因为Encoding.BigEndianEncoding 是UTF-16(不是UCS-2)。

编辑

这里是使用 Buffer 类中内置 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 答案的启发:

Node.JS Big-Endian UCS-2 How to do Base64 encoding in node.js?

【讨论】:

谢谢,它与 Gammy SMS 网关完美配合。【参考方案2】:

谢谢,

我终于得到了答案:)

这个字符([,],|)被编码为两个字符

[ 编码为1B1E(转义字符和

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

所以每当我喜欢这样的字符时,我都会用相应的值替换它,然后我会使用 7 位编码。效果不错……

所以我的 [ 编码字符串是

> AT+CMGS=15
> 0001000C911989890878800000021B1E

对于“[hello]”

> AT+CMGS=21
> 0001000C911989890878800000091B1EBACC66BF373E

再次感谢..

【讨论】:

以上是关于长短信 PDU编码的主要内容,如果未能解决你的问题,请参考以下文章

SMS短信PDU编码

使用python实现短信PDU编码

如何构建串联的短信 pdu?获取垃圾字符

在线PDU格式编码/解码

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

谁有TC35i与PC收发短信的代码 包括打开串口 启动模块 接收短信发送短信 PDU解码