1.1. 基本知识短信开发指通过串口 at 命令驱动短信进行短信发送和接收操作。 在 java 中 主要使用 javax.comm 包进行开发, sun 公司网上地址 : http://java./products/javacomm/ 使用工具 : windows 自带超级终端
短信操作分为三种模式: block,pdu 和 Text 短信传送有三种编码: 7 位, 8 位, UniCode at 命令 ,at 命令是驱动短信设备的标准工业命令,除了业界的标准之外,每个厂商可能会对其进行扩展,不过一般来说,标准命令应该够用,这次用的是西门子 tc35i ,有专门的 at 命令文档。
1.1.1. 相关文档Gsm03.38 规范: Alphabets and language-specific information 着重介绍短信发送中对字符集的控制部分 Gsm03.40 规范: Technical realization of the Short Message Service (SMS) Point-to-Point (PP) 详细介绍各种不同短信的不同实现 Gsm07.05 规范: Use of Data Terminal Equipment - Data Circuit terminating;Equipment (DTE - DCE) interface for Short Message Service (SMS) and Cell Broadcast Service (CBS) ,介绍 at 的一些控制命令。 Gsm07.07 规范:着重介绍 at 的短信相关命令,可以说是 at 的 sms 规范。 1.1.2. Block 模式Block 模式基本已经被 pdu 模式取代,没有具体研究 1.1.3. Text 模式Text 模式比较简单,但是支持的设备不是很全,而且对于中文似乎有些问题,在金笛的网站技术资料中似乎提到了一句不能实现中文。 AT + CGMF=1<CR> AT + CGMS= “ 13605696031 ” ,129<CR> 1.1.4. Pdu 模式pdu 编码主要包括两个主要的部分,一是 pdu 串的整体数据格式,分别因为发送信息串和接收信息串而有区别,二是 pdu 中文本部分的编码,分别因为字符集而不同。 我们也可以这样来理解这个 pdu 编码的格式, sms 相当于一个协议栈,最简单的协议栈: 根据 gsm03.40 规范, sms 协议包括以下几层: 1、 SM-AL :应用层。这个部分就是数据部分。 2、 SM-TL :传输层。我们可以清楚的看到这里描述了主要的短信内容,包括发送号码,接收号码,信息类型,编码,数据报长度等等,这也是我们编程主要要面对的问题。 3、 SM-RL :中继层。这个指的是短信在网关之间中继需要的协议。 4、 SM-LL: 链路层。 从上述描述中我们可以清楚的看到,我们编程主要集中于传输层。
PDU 串的用户信息 (TP-UD) 段最大容量是 140 字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是 160 、 140 和 70 。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。
1.2. SMS 用户数据的编码方法1.2.1. 英文 7 位编码
图片不能正确显示 由于这样的移位,我们可以看到我们能发的最多英文字符等于: 140*8/7 = 160 。 1.2.2. 数据 8 位编码8-bit 编码通常用于发送数据消息,比如图片和铃声等; 1.2.3. 中文 pdu 编码发送中文时,必须用 UCS2 ( utf-16 )进行编码,最多可以发 140/2 = 70 个汉字。 UniCode 编码转换也比较简单,以中文为例,一个中文字符是两个字节,直接对高位字节和低位字节进行十六进制转换就可以了。如“欢迎”, UniCode 编码是 6B22 8FCE ,这同时也就是转换的结果,如果发送的串中有英文字符,那么在前面补全 00 ,以保证一个字符对应两个字节。 1.2.4. Wap-push 中的中文编码做 wap-push 短信的时候有些问题了,开始的时候也按照 Unicode 编码处理,总是失败,后来才发现,有个编码字段设为了 uft-8 ,所以在这种情况下,还是可以出现其他编码方式的。
1.3. 短信报头分析1.3.1. 短信类型详细请参考 gsm 0438 规范和 gsm0440 规范,里面有详细的关于各种短消息类型的描述。 在 sms 中到底支持多少种类型的短信,短信类型由什么进行控制,这是我们在这里需要着重介绍的问题。 在传输层来分,一共有六大短信类型: SMS-DELIVER , SMS-DELIVER-REPORT , SMS-SUBMIT , SMS-SUBMIT-REPORT , SMS-STATUS-REPORT , SMS-COMMAND ,这六种短信类型,由短信中心地址后的第一个字节的最低两位控制。
也就是说,每个短信在短信中心地址之后的第一个字节的最低两位是至关重要的。他决定了如何读这条短信(结合是发送的,还是接收的) 1.3.2. 地址编码短信发送中都会涉及到短信地址的问题,他们的编码规则是一致的 , 简单来说就是 BCD8421码编码。 如: 08 91 683108501505F 0 , 08 :地址长度,(号码类型 + 号码长度) /2 的十六进制表示 91 :号码类型 683108501505F 0 :号码,实际号码应为: 8613805515500 ,号码处理方法为 , 如果为 +86 开始 , 将 + 号去掉 ,然后判断是否为偶数 , 不是在末尾补 F, 然后将奇数位和偶数位互换 1.3.3. TP-DCS( 数据编码格式 )这个字节比较特殊,表明整个短信的字符编码,数据内容等信息。详细说明参考 gsm03.38 规范。 1.3.4. 第一个字节Pdu 编码的第一个字节比较有意思,这个字节会根据六种不同的短信按位有不同的意思,拿句专业一点的话来说,叫bitmask. 用图来大概描述一下,详细参考 gsm0340 的 9.2.3 段。
1.3.5. TP-PID (协议标识)在这个里面还有一个字节比较特殊,就是协议标识。 一般都是 00 ,表示点到点的标准短信。 1.3.6. 超长短信参考 gsm0340 的 9.2.3 .24TP_UD 部分,这个部分中间的一种情况就是描述超长短信的处理。 长短信关键涉及一个数据报头的问题,数据报头由“长度”和多个“数据元素”组成。 1.3.7. Wap-push 短信WAP 的推送协议中定义了服务指示( SI : Service Indication )和服务加载( SL : Service Load )两项服务,以给用户和网络运营者更多的选择。服务指示是将新信息的指示和相关的通用资源标识符( URI )推送给用户,由用户选择是立即处理信息还是以后处理。服务加载是将一项服务的 URI 推送给用户,然后客户端自动地使用 PULL 技术根据该 URI 启动服务。两种服务的区别在于用户是否介入推送信息的处理过程。 SL 对推送信息的处理对用户来说是透明的,而 SI 则在指示用户的同时,请用户对随后的处理做出选择。 Wap-push 短信的核心不同之处就在于: 1、 含有数据报头,也就是 TP_UDHI 位为 1 ,一般来说 pdu 的第一个字节发送时为 51 ,接收时为 44 。 2、 TP_DSC 字节不同,一般为 F5 ,表明字符集为 8 位,短信类型为 Class 1; 详细解释参看 gsm03.38 的第四章。 1.4. 编码示例1.4.1. 发送信息的 PDU 串:用手机写一条短信息,发送手机号码为 13605696031 ,信息内容为“ Hello World! ”。通过执行 AT + CMGL=2 可以读出此条信息。
AT + CMGL=2 { 读未发短信息 }
下面分析这条信息:
1.4.2. 接受信息的 PDU 串读取以上发送出来的 短信猫发WAPpush短信: http://xjbclz./article/xjbclz-9-943385.html点到点短信WAPPUSH研究总结 1、 2、 图一 点击确定,选择连接群发器的串口,如图二所示 点击确定,在弹出的对话框中选择每秒位数9600(这个值因不同的群发器而有所不同,可以在4800,9600,19200这几个值中试试看那个是对的),其他不要动,。如图三 点击确定。在超级终端的窗口中输入at,如果出现OK说明连接成功。 3、 at+cmgf=0回车 at+cmgs=99回车 0051000BA13119907311F000 如图四所示: 图四 这时13910937110的手机就会收到一条短信,标题为“点击进入乐视移动传媒3G门户”,内容是一个链接,连接地址是http://3g./ 4、 at+cmgf=0的意思是设置短信发送格式为pdu格式。 at+cmgs=99的意思是发送一条短信,短信的总的长度(包括头部和内容)是99+1个字节(为什么是99+1个字节,而不是99个字节我也不清楚)。 下面的 0051000BA13119907311F000 就是短信的内容的,他是十六进制的编码,一个字节用两个十六进制字符表示。我们可以把它分成两部分,一部分是短信头部,他们是前面的30个字节,即 0051000BA13119907311F000F5A755 我们把它分成几段来解析 0051000BA1这一段是死的,我们不用管它。 3119907311F0这一段是手机号码,它的编码是这样的,在手机号码后面加一个F,然后两位两位倒过来写,例如3119907311F0表示的手机号码是13910937110 00F5A7这一段是死的,我们不用管它。 55 表示短信内容部分的字节数。用十六进制表示,例如55表示内容部分为85个字节。 至此,短信头部结束,后面是短信的内容部分 0B05040B8423F00003030101 我们也把它分成几段来解析 0B05040B8423F00003030101 33672E6C6574762E636E2F表示的是链接的地址的http://后面的部分,这里实际上是“3g./”他是UTF-8编码。 E782B9E587BBE8BF9BE585A5 000101这一段是死的,我们不用管它 注:获得一个字符串的UTF-8编码的十六进制表示的方法很简单,在记事本里面编辑,保存的时候选择编码方式为utf-8,然后用hexedit打开,去掉前面三个字节,将后面的字节的十六进制拷出来就行了。 5、附录,下面对上面说的那几个死的段落进行一些解析: a、 00 SMSC地址信息的长度,00表示不用设置SMSC地址,即用手机上设置短信中心号码。 51 基本参数(TP-MTI/VFP) 不要求发送回复 00 消息基准值(TP-MR) 0B 对方电话的长度(即11位电话,一般的手机都是11位) A1 目标地址格式 A1表示为国内格式 b、 00 协议标识(TP-PID) 是普通GSM 类型,点到点方式 F5 用户信息编码方式 (TP-DCS) A7 有效期(TP-VP) c、 0B WAP PUSH头部的总长度 05040B8423F0表示接下来是一个WAP PUSH 00 表示是Concatenated Short Messages 03 长度 03 reference number 01 表示分成1个短信发送 01 当前包的序号 29060603AE81EA8DCA WSP 02 标记位 05 -//WAPFORUM//DTD SI 1.0//EN 6A UTF-8 00 标记开始 45 C6 08 0C href="http:// 03 字符串开始 d、内容部分000103这一段的解析 00 URL 字符串结束 01 > 03 标题字符串开始 e、内容部分000101这一段的解析 00 内容描述字符串结束 01 01 6、编码工具的使用 |
|