使用AT命令发送短消息

使用AT命令实现收发短信的功能,主要有两种模式:PDU模式、Text模式。Text模式收发短信代码较为简单,容易实现,但只支持ASCII码,不能发送中文短信。

PDU模式较复杂,支持中英文发送,分为三种编码方式,编码方式不同,支持的内容和字符长度不同。具体如下:短信发送与接收-编程知识网

AT命令发送短信

Text模式(向156####2573的手机发送“Test”)

AT
OK
AT+CMGF=1      //设置为Text模式发送短信;
OK
AT+CMGS=”156####2573”       //输入接收方号码;
》Test       // “》”为返回符号,发送框输入明文短信内容后,点击发送;
□       //将鼠标移至返回的□后,Ctrl+Z
+CMGS: xx       //xx表示短信发送成功的参考数目,与短信内容无关;
OK       //短信发送成功。正常接收。

AT+CSMP=17,167,0,xx(xx=16,7 bit编码;xx=20,8 bit编码;xx=24,UCS2编码)
Text模式输入短信时是明文,但是传输过程中的编码方式可通过上述AT更改。

AT+CNMI=1,1       //自发自收

PDU模式(向156####2573的手机发送“你好”)

AT
OK
AT+CMGF=0       //设置为PDU模式发送短信;
OK
AT+CMGS=xx       //xx表示PDU编码除SCA以外部分的字节数,如下xx=18;
》 0891683110801505F011000B815186062575F30008AA044F60597D       //”》”为返回符号,发送框输入Unicode编码后的短信内容,点击发送;
+CMGS:
xx       //xx表示短信发送成功的参考数目,与短信内容无关;
OK

PDU模式下,均为16进制,一个数字占用半个字节。
AT+CSCA?      //查询短信中心号码

PDU编码短信的主要构成

PDU模式的短信发送时,编码的主要内容有如下几部分。发送和接收短信含有不同的构成,下面会做仔细分析。

元素 名称 字节长度 描述
SCA Service Center Address 1-12 短消息服务中心号码
PDU-Type Protocol Data Unit-Type 1 协议数据单元类型
MR Message Reference 1 短信发送成功参考数目,与短信内容无关
OA Originator Address 2-12 发送方源地址(电话号码)
DA Destination Address 2-12 目的方地址(电话号码)
PID Protocol Identifer 1 消息中心以何种方式处理消息内容
DCS Data Coding Scheme 1 数据编码方案
SCTS Service Center Time Stamp 7 消息中心收到消息时的时间戳
VP Validity Period 0,1,7 消息有效期
UDL User Data Longth 1 用户数据长度
UD User Data 70/140/160 编码方式不同,最大字符数不同

SCA

SCA包括三部分:Length表示type+address的字节长度(均为16进制,此时两个数字占用一个字节,8 bit位);Type指短信中心地址的类型;Address指短信服务中心号码,可根据AT+CSCA?查询。移动:861380xxx0500, xxx为办卡地区号。联通:8613010xxx500,xxx为联通分配的短消息中心序列号。例如联通号码:8613010851500。

Length Type address
Type+address=08 国内:81;国际:91 683110801505F0

注:
Address的编码过程为:将电话号码两位之间对调,最后若剩下奇数个,则末尾补F后,再进行对调。
在发送编码时,SCA的Length部分可以设置为00,如此后面的部分就不用提供了,发送时由终端自行从SIM卡中读取。

PDU-Type:

协议部分,8 bit,每一位都对应一种功能的支持(1)或者不支持(0)。通常发送方设置为11,接收方设置为24,不详述。
发送方的PDU-type里包括VPF相关的参数,可设置VP的格式,通常是VPF置为10.,采用相对有效期。

MR:

短信发送成功参考数目,与短信内容无关。置为00即可,在log中,是由modem给定的一个数字,有一定顺序。

OA/DA:

电话号,按照上述Address相同编码方式进行编码即可

Length Type Address
Address未编码前的长度 国内:81;国际:91 (86+SIM卡号码)编码后

PID:

标准情况下的MS-to-SC(Mobile Station To Switch Center)短消息传送,只需设置PID为00。

DCS:

Bit.NO 7 6 5 4 3 2 1 0 描述
置0/1 0 0 0 0 1 0 0 0 08H,UCS2双字节字符集

Bit No.7与Bit No.6:一般设置为00

Bit No.5:0-文本未压缩 1-文本用GSM标准压缩算法压缩

Bit No.4:0-指示Bit No.1 Bit No.0为保留位,不含信息类型信息 1-指示Bit No.1 Bit No.0含信息类型信息

Bit No.3与Bit No.2:
00-默认的字符集,每字符占7bit,此时最大可发送160字符
01-8bit,此时最大可发送140字符
10-USC2(16bit),发送双字节字符集
11-预留

Bit N0.1与Bit No.0:
00-Class 0,短消息直接显示在屏幕上
01-Class 1,
10-Class 2(SIM卡特定信息),
11-Class 3

SCTS占用7个字节

例如:20年04月21日 16:12:53 GMT+8.00H可以表示为:
时区为格林尼治时间+8H,所以设置为24+8H=32H。

时区
02 40 12 61 21 35 23

VP的设置分为两种情况:

第一种:绝对的。从PDU-type中获得的VPF值为11。采用与时间戳相同的标记方式,记录有效期。占用7个字节。

第二种:相对的。从PDU-type中获得的VPF值为10。占用1字节。给定有效期长度,以消息被SMSC接收到的时间点开始,根据下表进行计算。
短信发送与接收-编程知识网

UD:

7-bit编码:将每一个字母的二进制编码列出,最高位–第七位去掉,然后将后面低位顺次往前移动一位,末尾补0,最后转换为16进制编码。
UCS2编码:高低字节交换。

UDL:

指编码前的用户原始数据字节数。一个英文占用一个字节,一个汉字占用两个字节,一个数字占用半个字节。

举例解释

如下:0891683110801505F011640B815186062575F30008AA044F60597D,这是一个向手机号“156####2573”发送“你好”的短信编码。采用UCS2编码的短信发送内容,可通过AT直接发送给终端。

SCA PDU-Type MR DA PID DCS VP UDL UD
0891683110801505F0 11 00 0B815186062575F3 00 08 AA 04 4F60597D

如下是从OTA过滤过的log中看出的信息:UL_NAS_TRANSPORT

短信发送与接收-编程知识网

信令流程

RRC:随机接入过程。首先,eNode B会通过广播系统信息sib2来通知UE,允许在哪些频域/时域资源上传输preamble消息;随后UE会发送preamble消息,向eNodeB请求随机接入,接入成功,则UE与eNode B之间建立好RRC连接。此时就可以发送短信,主要有如下四个信令流程:
短信发送与接收-编程知识网
“举例解释”中的log截图均来自于信令1中,可看到信令1包含了UE发出的CP-DATA(包括协议头和RP-DATA),其中RP-DATA中又包括RP头文件,源地址,目的地址和TP-DATA用户数据。TP-DATA的用户部分就是实际的短消息内容,TP-DATA的数据头部分就包括一些编码方式等信息。

随后,MSC会将短信数据转发到SMSC,在信令2中可以看到,网络侧会在CP层回复CP-ACK(ACK,Acknowledge character,确认接收端接收到数据的返回信息),再由MSC下发给UE。

信令3中,网络侧RP层也会进行响应,返回RP-ACK。这个RP-ACK是嵌套在CP-DATA的用户数据部分发送给UE的。
短信发送与接收-编程知识网
信令4中,UE端收到了来自网络的两个ACK消息,才能确认短信已正常送达,然后回复CP-ACK,结束发送流程。