SIM900发送长中文短信和英文短信
这是一篇介绍SIM900发送长中文短信和英文短信的文章。由于gsm03.40中的术语很难懂,还不如用实例来解释其用法更有利于理解。
Short Messaging Service 简称SMS,短信是最早的短消息业务,也是普及率最高的一种短消息业务,最长可以发送160个字符。也就是说,用户每次能发送或接收短信的字符数为160个英文或数字字符,或者是70个中文字符。对于长文本的发送,有些短信业务平台支持发送长短信,用户侧最终会收到一条长短信,但业务统计和计费会按照长短信拆分后的短信条数进行。
一、发送英文短信
AT //发送AT,返回OK表示单片机可以和模块执行AT命令操作
OK
AT+CMGF=1 //设置为Text模式
AT+CMGS=\"1366265ABCD\" //发送接收短信的手机号码,然后等待出现“>”
> TEST\x1A //\x表示后面的1A需要转为转意字符“Ctrl+z”
注意:所有短息的内容,均以“Ctrl+z”结束。
顺便讲一下转义字符:
二、发送中文短信
AT //发送AT,返回OK表示单片机可以和模块执行AT命令操作
OK
AT+CMGF=0 //设置为PDU模式,可以发送中文短信
AT+CMGS=017 //发送“PDU编码的长度”,三位十进制字符串表示
>0891683108501505F011000D91688152963059F8000800020033
+CMGS: 55
OK
PDU编码的内容:
“11000D91688152963059F8000800020033”的长度为34,34/2=17,用三位十进制字符串表示就是“017”,这就是“PDU编码的长度”;
三、编辑普通中文短信
通过对编辑好的中文短信进行分析,我们可以解如何编辑中文短信。已知单一中文短信的内容如下:
0891683108501505F011000D9168316662A5CBFD000801020033
编辑后的短信是由“SCA部分 + PDU编码的内容”组成。
1、SCA部分:“0891683108501505F0”
1)、字符长度
在“0891683108501505F0”中,去掉第1个“08”外,还有16个字符,这个“08”就是由16/2=8得到的,用两个字符表示就是“08”,表示后面的字符长度。
2) 国际号码91
字符长度“08”后面紧跟着的是“91”,表示发送设备为“手机”;
3)、服务中心号码
在“0891”后面,就是服务中心号码“8613800551500”;
“8613800551500”是怎么来的?我们将“683108501505F0”相邻两个字符交换得到“8613800551500F”,去掉“F”后就是“8613800551500”,这个“F”是用来凑数,让它们构成偶数个,这就是“8613800551500”尾部出现一个“F”字符的原因。
服务中心号码是怎么来的?要到电信部门去查吗?显然不需要。因为手机在上电初始化成功后,基站会告诉手机当前的手机号码所需要的“服务中心号码”。
短信中心号码可以使用AT+CSCA?获取。
在获取之前,最好将设置使用GSM字符:
AT+CSCS="GSM"
OK
AT+CSCA?
+CSCA: "+8613800551500",145
OK
这样一来,我就得到短信中心号码“+8613800551500”。去掉“+”后为“8613800551500”。以前的老手机,需要设置“服务中心号码”。有经验的人,一看“0551”就是知道合肥的,同理“0755”是深圳的。
4)、“+861380”
中国移动信息中心号码是以短消息中心号码以+861380开头,紧接的4位数号码是所在的地区码。
2、PDU编码的内容:“11000D9168316662A5CBFD000801020033”
1)、“1100”的意思
“11”表示正常发送短信,“00”表示点到点的标准短信;
若是“5100”表示发送“带有报头的短信”;
2)、“0D9168316662A5CBFD”的意思
①、字符长度
这里接收短信的手机号码为“+861366265ABCD”。 去掉“+”后为“861366265ABCD”,记住手机长度为13,不算“+”号,用两位16进制字符串表示就是“0D”,若“861366265ABCD”的数据长度为奇数,则在末尾添加“F”。由于接收短信的手机号码“861366265ABCD”的数据长度是13,为了使字符数量变成偶数,所以要添加字符“F”,就变为“861366265ABCDF”,相邻两位交换后就是“68316662A5CBFD”。反推,就是“861366265ABCDF”。
②、国际号码91
字符长度“0D”后面紧跟着的是“91”,这里表示接收设备为“手机”;若是小灵通手机,则用“81”表示。
③、TP-PID信息码:“000801”
00普通GSM类型,点到点方式,TP-DCS
08是UCS2编码
01是时间戳,从00开始,00表示第1条短信,01表示第2条短信,等等;
④、分析“020033”
02 是(TP-UDL)用户信息长度,是后面所有数据的总和除以2得到的,
4 / 2 = 2 = 0x02,用两位16进制字符串表示就是“02”
“0033”是中文短信内容“1”;
⑤、计算“PDU编码的长度”
PDU编码的内容为“11000D91688152963059F8000801020033”,长度为34,所以34/2=17,用三位十进制字符串表示就是“017”,这就是“PDU编码的长度”,我们在执行“AT+CMGS”时要用到。
四、编辑长中文短信
所谓超长短信,就是将多个“数据报文”进行拼接。我们先了解2个“数据报文”是如何拼接成长短信的。
下面的短信分为两个包发送,如下:
AT+CMGS=023
>0891683108501505F051000D91688152963059F800080108050003FC02010031
+CMGS: 59
OK
AT+CMGS=023
>0891683108501505F051000D91688152963059F800080108050003FC02020032
+CMGS: 60
OK
虽然每条短信的内容很短,但要按照两条短信收费,第1条短信内容是"1",第2条短信内容是"2",手机会收到后,会自动进行拼接成一条短信,其内容为:"12"。
“0891683108501505F0”和“0D91688152963059F8”是什么意思,在编辑单一PDU短信中,已经做了介绍。
这里用到了“5100”表示发送“带有报头的短信”;
其次是“000801”,00普通GSM类型,点到点方式,TP-DCS,08是UCS2编码,01是时间戳,从00开始,00表示第1条短信,01表示第2条短信;
在“000801”后面跟的是(TP-UDL)用户信息“08050003FC02010031”和“08050003FC02020032”,这个和单一PDU短信不太一样。
那么用户信息“08050003FC02010031”和“08050003FC02020032”是什么意思呢?
08:它是(TP-UDL)用户信息长度,是后面所有数据的总和除以2得到的,16/2=8=0x08,用两位16进制字符串表示就是“08”;
05:协议头的长度
00:标志这是个分拆短信
03:分拆数据元素的长度
FC:用于把两条短信合并,可以23或FC
0201:一共有两条“数据报文”,这是第1条;
0202:一共有两条“数据报文”,这是第2条;
“0031”和“0032”:这才是真正的短信内容;
通过分析,和单一短信有点相似,但是解析协议不同。
五、长短信举例
下面是编辑好的长短信,内容如下:
长短信的第一条:
0891683108100005F051000D91683118216553F60008018C0500032302014E8C96F64E005B9A4F1A597D597D597D768465F665F665F695F44E0D597D597D597D768460254F1A4E8654754F604E5F4E0D898157284E006B21751F76EE8FDB665A70B954275417662F4E004E2A4E1C5F20897F62114E0D662F62117231597D4E86541754758BBE7F6E597D597D554A51765B83662F554A5475547554754F607684547562A4
分析“0891683108100005F0”是SMSC地址,
91683108100005F0的长度为16/2=0x08;
683108100005F0的意思是服务中心号码8613800100005;
91是指国际的号码
51是有报头短信,04表示正常收到,11表示正常发送,别人放的是51
00表示点到点的标准短信
0D91683118216553F6是回复地址, 683118216553F6去掉F后的长度为13=0x0D,其中683118216553F6的意思是是电话号码8613811256356, 91是指国际的号码
0008分析:TP-PID,00普通GSM类型,点到点方式,TP-DCS,08是UCS2编码
01时间戳,别人放的是01
8C 是(TP-UDL)用户信息长度,是后面所有数据的总和除以2得到的(12+268)/2=140=0x8C
05 协议头的长度
00 标志这是个分拆短信
03 分拆数据元素的长度
23 唯一标志(用于把两条短信合并),或FC
02 一共两条
01指示本条短信是第一条
4E8C96F64E005B9A4F1A597D597D597D768465F665F665F695F44E0D597D597D597D768460254F1A4E8654754F604E5F4E0D898157284E006B21751F76EE8FDB665A70B954275417662F4E004E2A4E1C5F20897F62114E0D662F62117231597D4E86541754758BBE7F6E597D597D554A51765B83662F554A5475547554754F607684547562A4这是数据内容,其长度是268
长短信的第二条:
0891683108100005F051000D91683118216553F60008012605000323020281EA4ECE524D5C3177617740542754755475007A007A006C0076006C006F007A
0891683108100005F0是SMSC地址,91683108100005F0的长度为16/2=0x08,其中683108100005F0的意思是是服务中心号码8613800100005的意思,91是指国际的号码
51是有报头短信,04表示正常收到,11表示正常发送
00表示点到点的标准短信
0D91683118216553F6是回复地址, 683118216553F6去掉F后的长度为13=0x0D,其中683118216553F6的意思是是电话号码8613811256356, 91是指国际的号码
0008分析:TP-PID,00普通GSM类型,点到点方式,TP-DCS,08是UCS2编码
01时间戳,别人放的是01
26 是(TP-UDL)用户信息长度,是后面所有数据的总和除以2得到的(12+64)/2=38=0x26
05 协议头的长度
00 标志这是个分拆短信
03 分拆数据元素的长度
23唯一标志(用于把两条短信合并),或FC
02 一共两条
02 这是第二条
81EA4ECE524D5C3177617740542754755475007A007A006C0076006C006F007A这是数据内容,其长度是64
如何确定AT+CMGS=长度?
51000D91683118216553F60008012605000323020281EA4ECE524D5C3177617740542754755475007A007A006C0076006C006F007A的长度是106/2=53
AT+CMGS=长度,这个长度不包括SCA部分,就是53
六、中文短信发送综合举例:
1、不超过一包的中文短信发送如下:
AT+CMGS=017
>0891683108501505F011000D91688152963059F8000800020033
+CMGS: 55
OK
2、下面的短信分为两个包发送,如下:
AT+CMGS=023
>0891683108501505F051000D91688152963059F800080108050003FC02010031
+CMGS: 59
OK
AT+CMGS=023
>0891683108501505F051000D91688152963059F800080108050003FC02020032
+CMGS: 60
OK
按照两条短信收费,第1条短信内容是"1",第2条短信内容是"2",手机会收到一条合并后的短信,其内容为:"12"
AT+CMGS=023
>0891683108501505F051000D91688152963059F8000801080500032302010031
+CMGS: 61
OK
AT+CMGS=023
>0891683108501505F051000D91688152963059F8000801080500032302020032
+CMGS: 62
OK
七、接收到的中文短信
在中文模式下接收到的中文如下:
接收到短信提示:\r\n +CMTI:"SM",2\r\n
AT+CMGR=2\r
\r\n +CMGR: 0,"",52\r\n0891683108707515F0240D91688186418379F20008416042712393232000280047003100320033003400350036003700380039003B003000314F600029\r\n
91683108707515F0的长度是16/2=0x08
688186418379F2去掉F的长度是13=0x0D
000841604271239323是固定长度18/2=9
240D91688186418379F20008416042712393232000280047003100320033003400350036003700380039003B003000314F600029的长度是104/2=0x52
41604271239323表示时间14/06/24,17:32:39+32
00280047003100320033003400350036003700380039003B003000314F600029的长度为64,64/2=0x20,内容为(G123456789;01你)
240D91688186418379F2表示发送短信的手机号码为:8618681438972, 688186418379F2的长度是13=0x0D;
0891683108707515F0表示短信息中心号码为:8613800757510,其中08是长度,91为类型,91683108707515F0的长度是16,16/2=0x08;
八、应用
在没有服务器的情况下,使用短信通讯,可以降低服务器的租赁费用。在一些防盗系统,液位控制系统,和台风预警系统中,短信报警,还是比较实惠的。
下图是我以前设计的一款产品,显示已经不合时宜了。但每每回想过去,激情总会涌上心头。年过五十不年轻,独来独往不合群。吾非生来性孤僻,厌倦江湖套路深。创业太难了!
至此,中文短信和英文短信编辑和发送介绍完了。