热度 17
2010-12-31 14:29
2709 次阅读|
0 个评论
前言 如 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 是短消息服务中心的号码, 一般而言, 为了不必要每次发送短消息时, 都对SCA进行设定, 我们可以对短消息服务中心, 也就是 CSCA 进行设定. 假设我们不知道当地的短消息服务中心的号码, 我们可以使用下述AT指令进行询问: AT+CSCA? +CSCA: "+8613800755500",145 这里我们得到本地(深圳)的短消息服务中心号码为: +8613800755500 一旦我们使用 CSCA 指令, 主动设定 SCA 的号码, 那么在 PDU 短消息格式中, SCA的值可以固定为: 00, 这样大大降低了每次发送的工作量. 该理论依据来自于: “如果Len被设置为00h,并不提供后面的部分,那么终端设备将读取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 对 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层数据单元就是: . 此外, 结束符 0x1a 的长度也不计算在内. 3. 完善了计算法则后的发送 PDU短消息的步骤: 1 AT+CMGF=0 (设定PDU模式) 2 AT+CSCA="+8613800755500" (设SCA号码) 3 AT+CMGS=15+UDL (要求发送SMS 短信,) 等待 相应后, 即可发送PDU短消息: 00 这里, 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 000801 构建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)