热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android短信88591,白话短信协议

白话短信协议我们都知道短信其实也是通过网络传输的,不过走的是核心网,那既然同样走的是网络,那这些数据不外乎01010,

白话短信协议

我们都知道短信其实也是通过网络传输的,不过走的是核心网,那既然同样走的是网络,那这些数据不外乎01010...,那手机是怎么把这串01010...翻译成我们看到的文字短信的呢?

其实短信协议(gsm)和我们HTTP很相似,是基于TCP/IP的协议,短信协议也包含信息头和信息体,其每个部分都有规定的含义

接下来通过白话的方式向你解释这个协议,在这之前,有两个概念先介绍一下

PDU(Protocol Data Unit): 代表我们一条短信的整个数据,也叫一个包

UDH(User Data Header): 数据头

UD(User Data): 数据体

一个PDU包含一个UDH以及一个UD,那一个PDU就是这个样子:

bVbzlR5?w=924&h=286

那接下来我们用个最常见的例子,也就是我们平时看到最多的普通文本短信为例子,挨个解释一下每个部分具体包含了哪些内容

UDH(User Data Header)

这儿也先介绍两个概念

IE(Information Element): 表示一个UDH单元

IED(IE Data): 包含一个IE的内容

IEL(Length of IE): 表示一个IED所占用的字节长度

IEI(IE Identifier): 表示一个IE具体代表的是什么含义

UDHL(Length 0f UDH): 表示整个UDH所占用的字节长度

一个IE包含一个IEI以及一个IED数据,那一个IE就是这个样子:

bVbzlR6?w=816&h=306

IEI上面解释了,表示这个IE代表的是什么,IEI有许多,我们这里就不展开说了,一个IEI占用一个字节,普通短信的IEI=0x00是最最常用的,表示是一条拼接短信(CONCATENATED),后面我们再解释什么是拼接短信

那IED里面有些什么东西呢,当IEI=0x00时,IED包含3个字节,分别是refNr,totalNumberOfSms,seqNr各一个字节,这里先不用管具体的值是多少,我们只关心它们共占用了3个字节

最后我们来看IEDL的值,IEDL同样占用一个字节,我们之所以需要IEDL的值,是因为不同的IE,IED是不一样的,所以需要指定IED的长度才能正确的读出数据,那当IEI=0x00时,我们知道IED占用了3个字节,所以IEDL=3

如果我们假设refNr,totalNumberOfSms,seqNr为0x01 0x01 0x01,最后我们得到的一个IE的值就为:0x00 0x03 0x01 0x01 0x01

同IEDL一样,也需要UDHL的是来指定整个UDH的长度,UDHL占用1个字节,所以UDH就是这个样子:

bVbzlSf?w=938&h=288

那假如我们只有一个IE,那么我们的的UDH值就为:0x05 0x00 0x03 0x01 0x01 0x01

UD(User Data)

这儿也先介绍个概念

UDL(Length of UD): 表示一个PDU数据的所占用的字节长度

那一个完整的PDU就是这个样子:

bVbzlSn?w=1444&h=346

UD其实就是我们的短信内容了,也就是多个字节,这里同样先不用管内容具体是什么,同样如果我们假设短信内容为4个字节0xfe 0xff 0x00 0x61,那我们加上上面的UDH,其一共所占字节长度为6,UDL占用1个字节,所以UDL=10

最后得到的PDU值就为:0x10 0x05 0x00 0x03 0x01 0x01 0x01 0xfe 0xff 0x00 0x61

上面简单通俗的介绍了一下整个短信数据是怎么组成的,以及每个部分代表的含义,以及以普通文本短信为例子,大概说明了一下每个部分所包含的内容,那接下来我们继续介绍一下UD的内容是如何与文本相互转化的

在这之前,老规矩,我们再介绍一个概念

DCS(Data Coding Scheme): 表示应该以什么方式处理UD的数据

关于DCS,上面说了,表示怎么处理UD的数据,也就是包含了UD怎么转化成文本的信息,其占用一个字节,可以说其中每一位(bit)不同,都有着不同的处理方式,虽然没有2^8这么多,但也不少

一个DCS主要包含2个信息,UD编码方式(Character Set),以及短信类别(Message Class)

编码方式有4种(GSM 7 bit,ISO 8859-1,UCS2,reserved)

短信类别有4种(Class 0,Class 1,Class 2,Class 3)

以我们国内运营商为例,我们普通短信所使用的编码方式为UCS2,短信类别为Class 1,那dcs的值为0x19,当然关于这个值肯定不是仅仅靠编码方式和短信类别得来的,我们前面说到,DCS每一位的值都会影响到UD的处理,编码方式和短信类别只占用了其中4位,还有剩余的4位有其它含义,这里就不展开说了

有了DCS,即有了编码方式,我们就能够将UD的字节和文本进行相互转化了,其实上面例子中UD的值就是英文字母a经过UCS2编码得到的字节

CONCATENATED

接下来我们说一说长文本的问题,我们都知道一条短信长度是有限制的,一般来说是140个字节,因为汉字一般使用UCS2编码,UCS2一个字符占用2个字节,所以一条短信用UCS2编码的短信,如果超过70个字符,是需要拆分成多条短信的,但我们手机上却能显示超长的短信,那我们的手机又是如何处理的呢?

还记得我们前面介绍UDH的时候举的例子吗,当UDH中IEI=0x00,表示是一条拼接短信(CONCATENATED),这个IED有3个值分别是refNr,totalNumberOfSms,seqNr,长文本就是通过这个IE来识别多个短信是否是同一个短信的

解释一下这三个值的含义

refNr: 如果值相同的,则标识为同一条短信

totalNumberOfSms: 由多少条短信拼接

seqNr: 拼接短信的顺序

所以上面例子中,这三个值都为1,就表示的是该条短信是由1条短信构成

这篇我们以白话的方式介绍了短信协议中的一些基本概念,短信协议的组成,以及一些常用的值,我们国内运营商所使用的协议也是基于上面所介绍的协议加入了一些各自特有的内容而形成

SMSJ

smsj是个短彩信协议项目、有完整丰富的doc,smsj能方便的生成短彩信协议内容,具体使用方式可以查看项目地址



推荐阅读
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
author-avatar
用户gokk5efqd3
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有