`

谈谈Android中文短信的实现

阅读更多

似 乎Google在推出G1时就没有考虑多国问题,Android在发送短信时在编码上处理不是很妥当,在收发一些unicode来实现的国家文字上存在很 大的漏洞,比如中文、日文、俄文等等。对于分析短信发送可以直接dump出PDU Header来解决这个问题。两个G1手机只要在截取短信时,比如获取收到短信时判断PDU的原始内容,比较后就不难得出解决方法。

 我们在构造时直接通过一个二进制的字节数组来发送UCS2即可,而英文使用7位的编码可以减少字节占用,在一条短信中发送更多的字符内容,稍后我们提供Android中文短信发送的所有源代码。

  下面引用过去的分析内容:

  发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信, 也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8- bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。 
A:短信息中心地址长度,2位十六进制数(1字节)。
B:短信息中心号码类型,2位十六进制数。
C:短信息中心号码,B+C的长度将由A中的数据决定。
D:文件头字节,2位十六进制数。 
E:信息类型,2位十六进制数。
F:被叫号码长度,2位十六进制数。
G:被叫号码类型,2位十六进制数,取值同B。
H:被叫号码,长度由F中的数据决定。
I:协议标识,2位十六进制数。
J:数据编码方案,2位十六进制数。
K:有效期,2位十六进制数。
L:用户数据长度,2位十六进制数。
M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。

PDU编码协议简单说明

例1 发送:SMSC号码是+8613800250500,对方号码是13693092030,消息内容是“Hello!”。从手机发出的PDU串可以是
08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 96 03 29 30 F0 00 00 00 06 C8 32 9B FD 0E 01
对照规范,具体分析:
分段 含义 说明
08 SMSC地址信息的长度 共8个八位字节(包括91)
91 SMSC地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,补‘F’凑成偶数个
11 基本参数(TP-MTI/VFP) 发送,TP-VP用相对格式
00 消息基准值(TP-MR) 0
0D 目标地址数字个数 共13个十进制数(不包括91和‘F’)
91 目标地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 96 03 29 30 F0 目标地址(TP-DA) 8613693092030,补‘F’凑成偶数个
00 协议标识(TP-PID) 是普通GSM类型,点到点方式
00 用户信息编码方式(TP-DCS) 7-bit编码
00 有效期(TP-VP) 5分钟
06 用户信息长度(TP-UDL) 实际长度6个字节
C8 32 9B FD 0E 01 用户信息(TP-UD) “Hello!”

例2 接收:SMSC号码是+8613800250500,对方号码是13693092030,消息内容是“你好!”。手机接收到的PDU串可以是
08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 96 03 29 30 F0 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21
对照规范,具体分析:
分段 含义 说明
08 地址信息的长度 个八位字节(包括91)
91 SMSC地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,补‘F’凑成偶数个
84 基本参数(TP-MTI/MMS/RP) 接收,无更多消息,有回复地址
0D 回复地址数字个数 共13个十进制数(不包括91和‘F’)
91 回复地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 96 03 29 30 F0 回复地址(TP-RA) 8613693092030,补‘F’凑成偶数个
00 协议标识(TP-PID) 是普通GSM类型,点到点方式
08 用户信息编码方式(TP-DCS) UCS2编码
30 30 21 80 63 54 80 时间戳(TP-SCTS) 2003-3-12 08:36:45  +8时区
06 用户信息长度(TP-UDL) 实际长度6个字节
4F 60 59 7D 00 21 用户信息(TP-UD) “你好!”


若基本参数的最高位(TP-RP)为0,则没有回复地址的三个段。从Internet上发出的短消息常常是这种情形。
注意号码和时间的表示方法,不是按正常顺序顺着来的,而且要以‘F’将奇数补成偶数。


在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符, 它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可“压缩”成7个;8-bit编码通常用于发送数据消息,比如图片和铃声等; 而UCS2编码用于发送Unicode字符。PDU串的用户信息(TP-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大 字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。


需 要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit编码时,指原始短消息的字符个数,而不是编码后的字节 数。8-bit编码时,就是字节数。UCS2编码时,也是字节数,等于原始短消息的字符数的两倍。如果用户信息(TP-UD)中存在一个头(基本参数的 TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用GSM 03.42所建议的压缩算法(TP-DCS的高3位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。

分享到:
评论

相关推荐

    android 短信电话拦截

    首先,让我们来看看Android如何实现短信电话拦截: 1. **来电拦截**: - **PhoneStateListener**:Android提供了一个PhoneStateListener类,开发者可以注册监听器来获取电话状态的变化,如来电、去电或通话结束。...

    android实现网页链接

    本教程将深入探讨如何使用Button控件美化、RadioButton的运用,以及如何实现在Android应用中展示网页链接并添加下划线效果。 首先,我们来谈谈Button控件的美化。在Android中,Button是用户界面中的一个重要元素,...

    谈谈Android里的Context的使用

    大家好,今天给大家分享一下Android里的Context的一些用法. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml...

    谈谈Android Fragments 详细使用

    Android Fragments 是Android开发中的一个重要概念,自Android 3.0(API级别11)引入,主要用于解决不同屏幕尺寸设备上的UI适配问题。Fragments 提供了一种灵活的方式来构建动态和可重构的用户界面,特别是在平板...

    android透明阴影效果实现

    在Android开发中,实现透明阴影效果是提升应用视觉体验的重要一环。阴影效果可以增加UI元素的层次感,而透明度则能创造出轻盈、悬浮的感觉。本文将深入探讨如何在Android平台上创建这两种效果。 首先,我们要理解...

    android引导页面的实现和SlidingMenu侧滑菜单

    首先,我们来谈谈引导页面的实现。引导页面通常用于应用程序启动时展示,它可以是一系列展示应用特色或功能的精美图片,也可以包含一些加载过程。在Android Studio中,我们可以创建一个单独的Activity作为引导页。这...

    android 实现div隐藏与屏幕动画效果

    要实现`div`效果,我们可以在Android中使用`FrameLayout`、`LinearLayout`或`ConstraintLayout`等布局容器。这些布局允许我们根据需求组合和排列子视图,类似于HTML中的`div`。我们可以调整布局参数,如宽度、高度、...

    Android-android操作录制操作回放

    这个项目可能包含了一个实现操作录制和回放的示例代码,通过阅读源码,你可以了解如何使用Android SDK的工具和API来实现这一功能。 总的来说,Android的操作录制与操作回放是提高开发效率、优化用户体验的重要手段...

    原创谈谈怎么最快学好android(个人看法)

    当基本的UI设计和功能实现已经较为熟练之后,可以进一步深入学习Android的高级特性。例如: - **数据存储**:了解SQLite数据库的使用方法,以及如何进行文件读写操作。 - **网络通信**:掌握HTTP请求的基本原理,...

    Android Framelayout显示静态和动态的扑克牌

    标题"Android Framelayout显示静态和动态的扑克牌"暗示我们将探讨如何在Framelayout中展示静态图像(如扑克牌)以及如何实现这些图像的动态效果,这通常涉及到Android的动画机制。 首先,让我们深入了解`...

    谈谈AndroidApp混合开发

    iOS方面的我不太了解,我就主要谈谈Android开发中的,其中可能会有很多说错的,请大家轻喷想要在一个App中显示一个Html5网页的功能,其实很简单,只要一个WebView就可以了。你可以点击链接来跳转网页。像这样的功能...

    Android图片级别Level的使用,旋转动画Demo

    在这个"Android图片级别Level的使用,旋转动画Demo"中,我们将探讨如何利用Level List和旋转动画来实现动态的视觉效果。 Level List是Android的一种Drawable资源类型,它允许你定义一组Drawable,并为每个Drawable...

    Android OpenGL实现立方体多纹理图片映射

    本教程将深入探讨如何使用OpenGL ES在Android中实现立方体的多纹理映射以及混色光照效果,这对于游戏开发、虚拟现实应用以及其他需要动态图形的场景至关重要。 首先,我们需要了解纹理映射的概念。纹理映射是将2D...

    超爽Android中文教程

    首先,我们来谈谈Android系统的基础。Android是由Google主导开发的开源移动操作系统,广泛应用于智能手机、平板电脑和智能电视等设备。它基于Linux内核,提供了一个完整的软件堆栈,包括操作系统、中间件和关键应用...

    Android桌面特效源码

    首先,我们来谈谈Android系统的桌面。Android桌面,也称为Launcher,是用户与手机交互的主要入口。开发者可以通过编写自定义Launcher应用,实现对桌面布局、图标动画、小部件等的定制。对于"时钟或天气预报阙入"这样...

    Android_模拟器的认识.doc

    Android 模拟器是Android开发过程中不可或缺的一部分,它允许开发者在没有物理设备的情况下测试应用程序和系统功能。模拟器是基于著名的开源虚拟机软件QEMU(Quick Emulator)进行开发的,QEMU能够模拟多种硬件环境...

    Android Databinding 与 RecyclerView 完美结合

    接下来,我们来谈谈**RecyclerView**。RecyclerView是取代ListView的现代组件,具有更好的性能和更多的定制选项。它可以高效地处理大量数据,通过ViewHolder机制减少视图的创建和复用。当数据集改变时,RecyclerView...

    Android实现局部图片滑动指引效果

    接下来,我们谈谈Android按钮的动画切换效果。在Android中,我们可以使用属性动画(Property Animation)来实现这一功能,主要有三种类型:ValueAnimator、ObjectAnimator和AnimatorSet。 1. **ValueAnimator**:是...

Global site tag (gtag.js) - Google Analytics