手机短信的发送接收原理与代码
短信格式(sms)以及编码总结

短信格式(sms)以及编码总结第一篇:短信格式(sms)以及编码总结短信格式(sms)以及编码总结一、短信猫操作分为三种模式: Block、Pdu 和 Text1、Block 模式基本已经被 Pdu 模式取代,没有具体研究。
2、Text 模式比较简单,但是支持的设备不是很全,而且不能实现中文。
AT + CGMF=1 AT +CGMS= “ *** ” ,129 >Hello World!3、Pdu 模式Pdu 编码主要包括两个主要的部分,一是 pdu 串的整体数据格式,分别因为发送信息串和接收信息串而有区别,二是pdu 中文本部分的编码,分别因为字符集而不同。
我们也可以这样来理解这个 pdu 编码的格式,sms 相当于一个协议栈,最简单的协议栈:根据 gsm03.40 规范,sms 协议包括以下几层:1、SM-AL :应用层。
这个部分就是数据部分。
2、SM-TL :传输层。
我们可以清楚的看到这里描述了主要的短信内容,包括发送号码,接收号码,信息类型,编码,数据报长度等等,这也是我们编程主要要面对的问题。
3、SM-RL :中继层。
这个指的是短信在网关之间中继需要的协议。
4、SM-LL:链路层。
从上述描述中我们可以清楚的看到,我们编程主要集中于传输层。
二、短信传送有三种编码: 7 位,8 位,UniCode1、英文 7 位编码这是 gsm 的默认编码方式由于这样的移位,我们可以看到我们能发的最多英文字符等于:140*8/7 = 160。
2、数据 8 位编码8-bit 编码通常用于发送数据消息,比如图片和铃声等;3、中文pdu 编码发送中文时,必须用UCS2(utf-16)进行编码,最多可以发 140/2 = 70 个汉字。
UniCode 编码转换也比较简单,以中文为例,一个中文字符是两个字节,直接对高位字节和低位字节进行十六进制转换就可以了。
如“欢迎”,UniCode 编码是6B22 8FCE,这同时也就是转换的结果,如果发送的串中有英文字符,那么在前面补全 00,以保证一个字符对应两个字节。
短信收发原理

短信收发原理
短信收发原理是指短消息在移动通信网络中的传输过程。
短信一般采用短消息服务(Short Message Service,简称SMS)的
方式进行传输。
以下是短信收发的基本原理:
1. 用户发送短信:用户在手机上输入要发送的短信内容,点击发送按钮后,手机将短信信息发送给移动通信网络的短信中心。
2. 短信中心接收短信:短信中心是移动通信网络的重要组成部分,负责接收和分发短信。
当短信中心接收到用户发送的短信后,会进行一系列的验证和处理。
3. 短信的存储和转发:短信中心会将接收到的短信存储在自己的数据库中,并且根据目的手机号码判断短信的接收方。
如果接收方是本网的用户,短信中心会将短信直接发送到接收方的手机上;如果接收方是其他运营商的用户,短信中心会将短信通过与其他运营商的网关进行转发,再由对方网关将短信发送给接收方。
4. 短信的传输和路由:在短信中心和其他运营商网关之间,短信会通过SMSC(Short Message Service Center)进行传输。
SMSC是短信中心和网关之间的通信协议,负责短信的路由和
传输。
SMSC会根据路由表中的信息,将短信传输到目的地。
5. 接收方接收短信:当短信到达接收方的手机时,手机会进行相应的处理并显示短信内容。
接收方可以通过短信应用程序阅读、回复、转发等操作。
总的来说,短信收发原理涉及用户手机、短信中心、SMSC和其他运营商的网关之间的通信与协作。
通过这样的传输过程,实现了短信的快速、安全、可靠的传输和接收。
SMS短信的C语言代码(转)

SMS短信的C语言代码(转)SMS短信的C语言代码(转)1.消息编码与解码用C实现7-bit编码和解码的算法如下:// 7-bit编码// pSrc: 源字符串指针// pDst: 目标编码串指针// nSrcLength: 源字符串长度// 返回: 目标编码串长度int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength){int nSrc; // 源字符串的计数值int nDst; // 目标编码串的计数值int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7unsigned char nLeft; // 上一字节残余的数据// 计数值初始化nSrc = 0;nDst = 0;// 将源串每8个字节分为一组,压缩成7个字节// 循环该处理过程,直至源串被处理完// 如果分组不到8字节,也能正确处理while(nSrc{// 取源字符串的计数值的最低3位nChar = nSrc & 7;// 处理源串的每个字节if(nChar == 0){// 组内第一个字节,只是保存起来,待处理下一个字节时使用nLeft = *pSrc;}else{// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节*pDst = (*pSrc << (8-nChar)) | nLeft;// 将该字节剩下的左边部分,作为残余数据保存起来nLeft = *pSrc >> nChar;// 修改目标串的指针和计数值 pDst++;nDst++;}// 修改源串的指针和计数值pSrc++; nSrc++;}// 返回目标串长度return nDst;}// 7-bit解码// pSrc: 源编码串指针// pDst: 目标字符串指针// nSrcLength: 源编码串长度// 返回: 目标字符串长度int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength){int nSrc; // 源字符串的计数值int nDst; // 目标解码串的计数值int nByte; // 当前正在处理的组内字节的序号,范围是0-6unsigned char nLeft; // 上一字节残余的数据// 计数值初始化nSrc = 0;nDst = 0;// 组内字节序号和残余数据初始化nByte = 0;nLeft = 0;// 将源数据每7个字节分为一组,解压缩成8个字节// 循环该处理过程,直至源数据被处理完// 如果分组不到7字节,也能正确处理while(nSrc{// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;// 将该字节剩下的左边部分,作为残余数据保存起来nLeft = *pSrc >> (7-nByte);// 修改目标串的指针和计数值pDst++;nDst++;// 修改字节计数值nByte++;// 到了一组的最后一个字节if(nByte == 7){// 额外得到一个目标解码字节*pDst = nLeft;// 修改目标串的指针和计数值pDst++;nDst++;// 组内字节序号和残余数据初始化nByte = 0;nLeft = 0;}// 修改源串的指针和计数值pSrc++;nSrc++;}*pDst = 0;// 返回目标串长度return nDst;}需要指出的是,7-bit的字符集与ANSI标准字符集不完全一致,在0x20以下也排布了一些可打印字符,但英文字母、阿拉伯数字和常用符号的位置两者是一样的。
短信编码PDU格式解析

31 基本参数(TP-MTI/VFP) 要求发送回复
00 消息基准值(TP-MR) 0
0D 目标地址数字个数共13 个十进制数
91 目标地址格式(TON/NPI)
A1:国内格式
91:国际格式
成的。
下面举一个发送和接收的例子。
1、 手机发送的一个PDU 串:
0891683108200805F011190D91683188902848F40008FF108FD9662F4E0067616D
FE
对比 3GPP 协议得到:(二进制代码从左到右依次为高位->低位)
短信中心地址字段
④.用户信息(TP-UD)段最大容量是140 字节,所以在UCS2 编码方式下,可发送短消息
的最大字符数是70 个。
(三)UCS2 解码
在接收消息时,可能不仅收到UCS2 格式编码的PDU 串,也可能是7bit 编码格式
(TP-DCS 为00)或8bit 编码格式(TP-DCS 为04)的PDU 串。对这两种情况,笔者也编了相应的解码算法,且它们的算法要相对简单,由于着重介绍UCS2 解码,7bit 与8bit 解码就不再多介绍了。
这里不能设置为 001,而要设置成 000,代表号码前没有“+”,否则无法接收。
Bits 3,2,1:Numbering-plan-identification:一般默认为 0001,表示电话
号码类型的。
683108200805F0 短信中心号码:一个字节内反转,8613800280500,如果长度为
例:08 91 683108100005F0 31 00 0D 91 683119109991F2 00 08 C2 06 60A8597DFF01
手机短信编码与长度限制

手机短信编码与长度限制手机短信收发有三种方式:Block方式、Text方式和PDU方式,前两种在国内很少使用,PDU格式则普遍支持。
内容总长度140个字节(1120位),支持采用三种编码方式:7-bit、8-bit和UCS2编码,7-bit编码——用于发送普通的ASCII字符,ASCII码表最大到0x7X,最高位为0,总7-bit,实际编码时则可把8-bit的最高位比特使用起来,所以可支持1120/7=160个字符;8-bit编码——用于发送数据消息,比如图片和铃声、二进制数据等,此类数据无法使用7-bit编码,因为那样会丢掉一位,也不能用下面UCS2编码,因为不符合UNICODE编码检查(范围)。
8-bit编码最多支持140个字节数据。
UCS2编码——用于发送Unicode字符,每个中文(韩文、日文),占用2字节,只要短信里包含这些多字节编码文字,那么即使还有英文,英文也需要安装UCS2编码,也占用2字节,所以,最多支持70个中文字(或中英混合短信)总之,只要含有中文(日文、韩文等),就需要使用多字节编码方式,若编码采用UCS2格式,1中文字占2字节,则可容纳70个中文字,如果是纯英文,将默认使用7bit编码方式(注意是7bit编码),则可容纳(140*8)/7=160个字符。
超过此长度的短信,目前的智能机平台都可以本地实现自动切分成多个短信后再逐一进行发送,长短信因为要涉及到协议头。
如果想通过短信发送非文本信息的数据,建议通过数据端口方式,而不是文本,否则文本短信的默认处理规则(7bit格式)可能会导致数据不完整或丢失。
PDU编码由以下部分组成(顺序连接):1.短信息中心地址长度——1字节。
2.短信息中心号码类型——1字节。
3.短信息中心号码——A设置的长度-B的长度。
4.文件头字节——1字节。
5.信息类型——1字节。
6.被叫号码长度——1字节。
7.被叫号码类型——1字节,取值同B。
8.被叫号码——长度由F中的数据决定。
短信工作原理

短信工作原理
短信工作原理是指通过移动通信网络将文本消息从一个移动设备发送到另一个移动设备的过程。
下面是短信工作原理的简要解释:
1. 用户输入消息:用户使用手机或其他移动设备的键盘输入要发送的文本消息。
2. 消息被拆分:为了方便传输,长消息会被拆分成多个较小的消息段。
每个消息段有一个最大限制长度。
如果消息超过这个限制,它将被分割成多个消息段。
3. 消息发送:手机或移动设备将消息段发送到移动运营商的短信中心(SMSC)。
4. SMSC路由:SMSC首先确定接收方所在的网络,然后将消息段路由到该网络上的SMSC。
5. 消息传递:接收方的SMSC将消息段传递给接收方的手机或移动设备。
6. 消息重新组装:接收方的手机或移动设备接收到消息段后,将它们重新组装成完整的消息,并在屏幕上显示给用户。
7. 状态报告:发送方的设备可以通过查询SMSC获得消息的状态报告。
状态报告包括消息的送达情况、读取情况等。
8. 消息存储:如果接收方设备当前不可用(例如关机或无网络信号),SMSC会将消息存储在其服务器上,并在设备重新可用时尝试再次发送。
总的来说,短信工作原理涉及用户输入消息、消息的拆分和发送、SMSC的路由和传递以及接收方设备的消息重新组装和状态报告等步骤。
通过这些步骤,短信可以在移动设备之间进行快速且可靠的传递。
手机短信编码

UCS2 编码是将每个字符(1-2 个字节)按照 ISO/IEC10646 的规定,转变为 16 位的 Unicode 字符。在 Windows 系统中,可以简单地调用 API 函数实现编码和解码。如果没有 系统的支持,比如用单片机控制手机模块收发短消息,只好用查表法解决了。
a)号码类型( TON)
1-号码前没有其他信息,如同正常拨号的号码。
2-使用国际号码格式,如+8613800546500。
3-普通格式,如 13800546500。 b)编码标识( NPI,当 TON= 000, 001, 010)
一般情况下,地址类型设置为十六进制的“91 。 如果地址长度设置为 0,则 SMSC 地址使用+CSCA 设置。这种情况下,SMSC 的地址类型字 节就不应再出现在 PDU 中,也就是说,TPDU 紧随地址长度字节。 例子中“0891683108506405F0 表示的就是 SMSC。“08 表示地址类型和地址值共占 8
//将字符串转换为字符数组
for(int i=0;i<cs.length;i++){ tmp = cs[i] >> 8; //先编码高 8 位
sb.append(String.format("%02x", tmp));
tmp = cs[i] & 0xff;
//再编码低 8 位
sb.append(String.format("%02x", tmp));
return sb.toString().toUpperCase(); }
实现 UCS2 编码的 Java 代码如下:
public String encode(String src){ StringBuilder sb = new StringBuilder(); char[] cs = src.toCharArray(); int tmp = 0; //存放目标串
发送短信原理

发送短信原理
发送短信的原理是通过无线通信网络将文字、图片等信息从发送方传输到接收方的手机或设备上。
以下是详细的发送短信原理描述:
1. 发送方输入短信内容:发送方在手机或其他设备上输入要发送的短信内容,包括文字、表情符号、图片等。
2. 数据编码:发送方输入的内容经过编码,将文字和图片等信息转换成计算机能够识别和传输的数据格式,如UTF-8编码。
3. 选择接收方:发送方选择要发送短信的接收方手机号码。
4. 寻找最佳路由:发送方的设备会向电信运营商的短信中心发送请求,寻找最佳的通信路径和短信中心。
5. 发送短信到短信中心:发送方的设备将编码后的短信数据通过无线通信网络发送到所选定的短信中心。
6. 短信中心路由与存储:短信中心接收到发送方的短信后,会根据接收方的手机号码进行路由,找到接收方所属的电信运营商和相应的短信中心。
同时,短信中心会将短信数据保存在其服务器或存储设备中,直到短信成功送达或超时。
7. 短信中转与传输:短信中心将短信根据接收方所属的电信运营商,通过国内或国际的信令和传输网络进行中转和传输。
8. 接收方接收短信:接收方的手机或设备在无线通信网络中接收到短信数据后,会进行解码,将数据转换成可读的文字和图片等形式。
9. 显示短信内容:接收方的手机或设备会将解码后的短信内容显示在屏幕上,供接收方阅读和回复。
以上是发送短信的基本原理。
整个过程涉及到发送方设备、无线通信网络、电信运营商的短信中心、接收方设备等多个环节的协同配合,从而实现了短信的传输和接收。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手机短信的发送接收原理与代码
中文转换成Unicode码函数
因为手机短消息的发送是以PDU串的形式发送出去的,中文字符以Unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为Unicode码,下面的函数将实现这个功能。
这个函数主要应用到VB自带的一个格式转换函数:ChrW()将中文转换为Unicode码。
Public Function chg(rmsg As String) As String
Dim tep As String
Dim tem p As String
Dim i As Integer
Dim b As Integer
tep = rm sg
i = Len(tep)
b = i / 4
If i = b * 4 Then
b = b – 1
tep = Left(tep, b * 4)
Else
tep = Left(tep, b * 4)
End If
chg = ""
For i = 1 To b
tem p = "&H" & Mid(tep, (i - 1) * 4 + 1, 4)
chg = chg & ChrW(CInt(Val(tem p)))
Next I
End Function
²短信中心手机号码的PDU串转换函数
同上,为了发送以PDU模式发送短消息,必须将手机号码和对方手机号码也转换为PDU格式,下面的函数就是为了实现这种转换:
Public Function telc(num As String) As String
Dim tl As Integer
Dim ltem, rtem, ttem As String
Dim ti As Integer
ttem = ""
tl = Len(num)
If tl <> 11 And tl <> 13 Then
MsgBox "wrong number." & tl
Exit Function
End If
If tl = 11 Then
tl = tl + 2
num = "86" & num
End If
For ti = 1 To tl Step 2
ltem = Mid(num, ti, 1)
rtem = Mid(num, ti + 1, 1)
If ti = tl Then rtem = "F"
ttem = ttem & rtem & ltem
Next ti
telc = ttem
End Function
手机号码有两种表示方法:11位和13位(带国家码86),一般手机发送时都是以13位形式表示的,所以以上的函数还有一个功能是自动将11位格式手机号码转换为13位形式,然后再转换为PDU串。
²手机短信的发送
手机短信的发送主要借助于VB的Mscomm控件实现,关于Mscomm控件,前面的技术介绍部分有详细介绍。
短信的发送是由AT+CMGS指令完成的,采用PDU模式发送,函数代码如下:
Const prex = "0891"
Const m idx = "11000D91"
Const sufx = "000800"
Public Function Sendsms(csca As String, num As String, m sg As String) As _Boolean Dim pdu, psmsc, pnum, pmsg As String
Dim leng As String
Dim length As Integer
length = Len(msg)
length = 2 * length
leng = Hex(length)
If length < 16 Then leng = "0" & leng
psm sc = Trim(telc(csca))
pnum = Trim(telc(num))
pm sg = Trim(ascg(m sg))
pdu = prex & psmsc & m idx & pnum & sufx & leng & pmsg
sleep(1)
m obcomm.Output = "AT+CMGF=0" + vbCr
m obcomm.Output = "AT+CMGS=" & Str(15 + length) + vbCr
mobcomm.Output = pdu & Chr$(26)
sleep(1)
Sendsm s = True
End Function
因为手机同一时间只能处理一件事情,因此这个函数只负责发送短信,关于短信发送成功与否以及阅读短信的部分集中在一起处理。
判断手机短信发送成功与否主要由AT+CMGS命令执行以后的返回码来决定(可参见前文的AT指令介绍部分)。
为了防止手机因过于繁忙而出错,这里采取了一定的方法让手机有充分的时间处理发送和接收及删除等操作。
Sleep()函数正是为此而设计的,在发送及删除操作后都会让程序暂停一秒,这样就不至于使得手机过于繁忙。
手机短信的接收
Unicode码解码函数
相比于手机短信的发送而言,手机短信的接收主要的工作正好与之相反。
手机短信的发送需要将
待发送的短信内容转换为Unicode码,而短信的接收则需要将接收到的Unicode码转换成中文字符。
下面的函数将实现解码功能。
同手机短信发送的编码函数一样,这里也应用了一个VB内置的函数AscW()函数来将Unicode码转换为中文:
Public Function ascg(sm sg As String) As String
Dim si, sb As Integer
Dim st m p As Integer
Dim stem p As String
sb = Len(smsg)
ascg = ""
For si = 1 To sb
stm p = AscW(Mid(smsg, si, 1))
If Abs(st m p) < 127 Then
stem p = "00" & Hex(st m p)
Else
stem p = Hex(st m p)
End
If
ascg = ascg & stem p
Next si
ascg = Trim(ascg)
End Function
²手机短信接收函数
相对于短信的发送函数而言,短信的接收相当简单,只需要以下的三行代码就完成了。
但是它使用的技术却决不比短信的发送少,这里主要用到了Mscomm控件的Output属性和AT+CMGR 指令。
Public Sub readsms(rnum As String)
mobcomm.Output = "AT+CMGF=1" + vbCr
mobcomm.Output = "AT+CMGR=" & rnum + vbCr
End Sub。