原创 构建PDU格式的中文SMS(I)

2010-12-31 14:29 2702 17 17 分类: 消费电子

<前言>
如 topic 所言, 这是一个非常之传统的技术话题. 之所以再次录入 blog 的原因, 我们归纳为下面的几点:
1. 详细的设计思路与完成步骤.
2. 工程中对 gb/ascII 字串, 进行了 unicode 的转换.
3. 完整的代码例子.
4. 提供PDU格式的生成小工具.
5. 进行了GB码, 以及GB/ASCII 码的SMS的分别的发送测试.

<题外>
Allen 以本 topic, 献给涉及此工程议题的同行们. 在本blog中, 祝愿全体同仁在新的一年中, 取得进步. 希望我们能以更加体贴的本土化服务大陆客户, 以更加开放的国际化服务海外客户, 不断提升民族科技实力, 不断提升自我专业技术能力.

<工作步骤>
1. 一般发送 PDU短消息的步骤:
 <1> AT+CMGF=0 (设定PDU模式)
 <2> AT+CMGS=xxx (要求发送SMS 短信, xxx 为即将发送的短消息长度)
     等待 > 相应后, 即可发送PDU短消息:
  [SCA][TYPE][MR][DA][PID][DCS][VP][UDL][UD][0x1a]

SCA 是短消息服务中心的号码, 一般而言, 为了不必要每次发送短消息时, 都对SCA进行设定, 我们可以对短消息服务中心, 也就是 CSCA 进行设定. 假设我们不知道当地的短消息服务中心的号码, 我们可以使用下述AT指令进行询问:
AT+CSCA?
+CSCA: "+8613800755500",145
这里我们得到本地(深圳)的短消息服务中心号码为: +8613800755500
一旦我们使用 CSCA 指令, 主动设定 SCA 的号码, 那么在 PDU 短消息格式中, SCA的值可以固定为: 00, 这样大大降低了每次发送的工作量. 该理论依据来自于: “如果Len被设置为00&h,并不提供后面的部分,那么终端设备将读取SIM中设置的SCA填充到SMS-PUD中,通过“AT+CSCA=xxxxx”指令可以设置SIM卡中存储的SCA值。” (From: http://blog.chinaunix.net/u3/93893/showart_1877903.html)

2. 简洁发送 PDU短消息的步骤:
<1> AT+CMGF=0 (设定PDU模式)
<2> AT+CSCA="+8613800755500" (设SCA号码)
<3> AT+CMGS=xxx (要求发送SMS 短信, xxx 为即将发送的短消息长度)
     等待 > 相应后, 即可发送PDU短消息:
  00[TYPE][MR][DA][PID][DCS][VP][UDL][UD][0x1a]

对 CMGS 长度xxx 的计算法则: xxx = 15 + 文本信息长度(UDL).
固定长度: 15 = 1(TYPE_LEN) + 1(MR_LEN) + 10(DA_LEN) + 1(PID_LEN) + 1(DCS_LEN) + 1(UDL_LEN)
而 SCA 的长度(无论是00 还是短消息中心SCA字串全长), 不被xxx 计算在内.
该理论依据来自于: “给定的TP层数据单元的八位位组代码数目(不包含服务中心地址的八位位组数目)”. (From: http://blog.chinaunix.net/u3/93893/showart_1877903.html) 需要指出的是, TP层数据单元就是: [TYPE][MR][DA][PID][DCS][VP][UDL][UD]. 此外, 结束符 0x1a[ctrl-z] 的长度也不计算在内.

3. 完善了计算法则后的发送 PDU短消息的步骤:
<1> AT+CMGF=0 (设定PDU模式)
<2> AT+CSCA="+8613800755500" (设SCA号码)
 <3> AT+CMGS=15+UDL (要求发送SMS 短信,)
     等待 > 相应后, 即可发送PDU短消息:
  00[TYPE][MR][DA][PID][DCS][VP][UDL][UD][0x1a]

这里, PDU 短消息格式:
紧张的工程节点的压力下, 我们这里被迫使用大无畏的"不求甚解"精神, 对PDU格式下 Unicode 字串发送采用默认格式如下:
TYPE: 11, MR: 00, PID: 00, DCS: 08, VP:01

4. 整理后的发送 PDU短消息的步骤:
<1> AT+CMGF=0 (设定PDU模式)
<2> AT+CSCA="+8613800755500" (设SCA号码)
<3> AT+CMGS=15+UDL (要求发送SMS 短信,)
     等待 > 相应后, 即可发送PDU短消息:
  001100[DA]000801[UDL][UD][0x1a]

<构建PDU格式>
根据以上分析, 使用测试代码完成 PDU 格式的内容包括的3变量:
这里的pdu 格式的 sms 发送, 需要知道的3个变量分别是: 目的手机号码DA, 短消息文本长度UDL, 短消息文本内容UD.
1. DA 设定:
0D 固定的目的手机长度 = 中国手机号码长度11+电话号码国别码"86"(长度2) = 13
91 固定的类型值
11位手机号, 前面加国家码86, 末尾补F 凑成偶数, 并每2个字符位置两两颠倒(说起来, Allen奇怪DA的协议弄得这么麻烦不知道为什么```)
举例: 目地手机号码: 13812345678, 则 DA 为:
0D91683118325476F8

2. UDL:
短消息文本UD的长度, 使用 Unicode 编码, 如”测试测试测试”的长度为12. 则UDL为0C.

3. UD:
以 Unicode 为编码格式短消息文本. 在很多mcu系统中, 我们常常使用 gb与 ascII 的混合编码的字符串, 使用gb2unicode 转换表, 我们能够将 gb字串, 转换为对应的 Unicode 字串的格式, 这个 item, 我们也曾在blog中记录专题进行讨论, 读者可自行在blog中进行检索.

构建PDU格式的中文SMS(I)

构建PDU格式的中文SMS(II)

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条