在PDU模式下支持字符
我正在写应用程序在nodejs发送和接收短信在PDU模式。我使用波通GSM调制解调器(7位编码)发送短信。 它也支持8位(AT + CSMP = 1,167,0,8)编码scheme。
我可以正确地发送字母数字字符,但是我不能发送像([,],|等)的字符。
这里string:
AT+CMGS=14 0001030C911989890878800004015B
文本string: [
但我收到一些垃圾字符。 任何想法?
以及如何发送多部分短信。 我已经提到这个 ,而这个,但我没有得到所需的输出。 任何人都可以build议8位( 7位编码scheme )文本编码scheme? 请帮帮我…
根据这个页面 (见发送一个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)。
编辑
这里是在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'));
受到这些答案的启发:
- Node.JS Big-Endian UCS-2
- 如何在node.js中执行Base64编码?
谢谢,
最后我得到了答案:)
这个字符([,],|)被编码为两个字符
[
编码为1B1E
(转义字符和<符号的组合)
]
编码为1B20
(escap字符和>符号的组合)
所以每当我喜欢这样的字符,我用相应的值replace它,然后我使用7位编码。 这是工作好…
所以我的编码string是
> AT+CMGS=15 > 0001000C911989890878800000021B1E
而对于“[你好]”
> AT+CMGS=21 > 0001000C911989890878800000091B1EBACC66BF373E
再次感谢..