使用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,结束发送流程。