您的位置:首页 > 其它

GPRS模块SIM9001发送短信(发送长短信),包括PDU和text两种模式

2014-09-11 08:46 375 查看
GPRS模块,是具有GPRS数据传输功能的GSM模块。GPRS模块就是一个精简版的手机,集成GSM通信的主要功能于一块电路板上,具有发送短消息、通话、数据传输等功能。GPRS模块相当于手机的核心部分,如果增加键盘和屏幕就是一个完整的手机。普通电脑或者单片机可以通过RS232串口与GPRS模块相连,通过AT指令控制GPRS模块实现各种基于GSM的通信功能。

GPRS模块,是具有GPRS数据传输功能的GSM模块。GPRS模块就是一个精简版的手机,集成GSM通信的主要功能于一块电路板上,具有发送短消息、通话、数据传输等功能。GPRS模块相当于手机的核心部分,如果增加键盘和屏幕就是一个完整的手机。普通电脑或者单片机可以通过RS232串口与GPRS模块相连,通过AT指令控制GPRS模块实现各种基于GSM的通信功能。

在超级终端输入:

At

OK

返回OK则说明你的模块可以正常工作,否则出现故障。

第一、文本模式下发送短信流程

文本模式下发送信息基本分三步骤:

1. 设置发送模式

AT+CMGF=1

CMGF为0是以PDU模式发送,为1则是以文本方式发送。

2.接收方电话号码

AT+CMGS="138XXXXxxxx"

3.输入内容

>hello world !

注意:每敲完一条指令都要按回车,直到返回“>”后开始输入信息,但是在输入完短信内容后不能敲回车而应该按组合键“ctrl+z”作为结束符。回车键在ascii码中的数值是“\r”,“ctrl+z”在ascii码中的数值是“0x1a”,所以在编程时可以直接在信息内容后进行字符串拼接。

示例:

=====================================================

AT

OK

AT+CMGF=1

OK

AT+CMGS="1380189xxxx"

>hello word !

=====================================================

提示:AT指令不区分大小写,所以无论是大写还是小写都可以识别。

返回OK则说明你的模块可以正常工作,否则出现故障。

第二、PDU模式下发送短信流程

Pdu模式发送信息仍然是三步搞定,只不过我们在前期得做一些稍微麻烦的数据转换工作。

我们先来看流程理清脉络:

1.AT+CMGF=0 设置为PDU模式发送中文编码短信

2.AT+CMGS=信息长度

3.发送短信

示例:

======================================================================

AT

OK

AT+CMGF=0

OK

AT+CMGS=25

>0891683108100005F011000D91685110906474F90A534E6E058FDC89C1FF01

======================================================================

前面的我们容易理解:

“AT+CMGF=0”将发送模式置为PDU模式;

“AT+CMGS=25”这句CMGS后面跟的不再是电话号码了,而是“信息长度”,这里我加了双引号表示有独特的含义后面解释。

现在分析最关键的地方:

“0891683108100005F011000D91685110906474F90008000A534E6E058FDC89C1FF01”

我们可以将这段头疼的字符串分为三段:

-----------------------------------------------------------------------------------------

“0891683108100005F0 ” 中心号码段

“11000D91685110906474F9000800” 收信方号码段

“0A534E6E058FDC89C1FF01” 信息段

1. 先来看中心号码段。

关于什么是中心号码我想百度比我解释的更清楚,这里不再赘述了。

我们其实还可以将其再细分:

08 91 683108100005F0

08--短信息中心地址长度:这个长度怎么获得的呢?其实就是91
683108701305F0的字符串长度除以2。不难理解。

91--短信息中心号码类型:91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还有其它数值,但91最常用。但是它是怎么出来的呢?咱们细看一下:

91--1001 0001

91是通过两个二进制码获得的。也就是说这两个二进制码有特殊的含义

解析1001: 第一位的1:具体代表什么意思,我也没搞明白,有高人知道可以指出。

剩下的001:数值类型(Type of Number):000--未知,001--国际,010--国内,111--留作扩展;

解析0001: 号码鉴别(Numbering plan identification):0000--未知,0001--ISDN/电话号码(E.164/E.163),1111--留作扩展

683108100005F0是什么意思呢?我们将它奇数位和偶数位反转看看:

“683108100005F0”

“8613800100500F”

熟悉吗?13800100500是中国移动北京地区的中心号码,86是中国地区的前缀这个大家应该清楚。F呢?因为在进行PDU编码的时候规定了如果号码位数是奇数位那么就要在末尾加F进行补齐,由于我们国家的手机号码位数都是11位,因此要在末尾补F。于是中国移动北京地区的中心号码加86补齐F再奇偶位反转最后加91国际化前缀就由原来的:

“13800100500”

变成了:

“91683108100005F0”

接着我们数一下它有多少位,16位,16/2=8,所以我们把整个中心号码组合编码后的长度除以2,最后以十六进制的表示方式加在它的前端就大功告成了。

“0891683108100005F0”

Ok搞定,下一步继续。

2. 收信方号码段。

“11000D91685110906474F9000800”

同样将其细分:

1100 0D91 685110906474F9 000800
11--文件头字节:这个数值的获得也是通过二进制数获得的

11--0001 0001 其实二进制中的每一位都有自己的意义,我们来具体看看(左边为第一位):

第一位:应答路径--TP-RP(TP-Reply-Path):0--不设置;1--设置

第二位:用户数据头标识--TP-UDHI(TP-User-Data-Header-Indicator):0--不含任何头信息;1--含头信息(本短信是没有头信息的,下文中会有包含头信息的短信,到时再具体解析头信息UDH)

第三位:状态报告要求--TP-SPR(TP-Status-Report-Request):0--需要报告;1--不需要报告

第四、五位:有效期格式--TP-VPF(TP-Validity-Period-Format):00--不提供(Not present);10--整型(标准);01--预留;11--提供8位字节的一半(Semi-Octet
Represented)

第六位:拒绝复制--TP-RD(TP-Reject-Duplicates):0--接受复制;1--拒绝复制

第七、八位:信息类型提示--TP-MTI(TP-Message-Type-Indicator):00--接收(Deliver);01--发送(Submit)

00--信息类型(TP-Message-Reference):这个标志基本没啥变化,所以本人也没过多的研究,如果有高人知道,可以指明一下。

0D--被叫号码长度。

91--被叫号码类型

3176378290F9--被叫号码,经过了位移处理,实际号码为“13677328099”
这三个字段通称目的地址(TP-Destination-Address)。

00--协议标识TP-PID(TP-Protocol-Identifier):这段基本也是千年不变的,不过可以列举出各个位的含义:

00--0000 0000

第1、2位:

00--如下面定义的分配,我们可以理解为默认形式。其实就是说后边六位 的定义就是本身的协议规范。

01--参见GSM03.40协议标识完全定义

10--预留

11--为服务中心(SC)特殊用途分配后六位。

第3位:0--不使用远程网络,只是短消息设备之间的协议;1--使用远程网络。

第4-8位:00000--隐含;00001--电传;00010--group 3 telefax;00100--语音;00101--欧洲无线信息系统(ERMES);00110--国内系统;10001--任何基于X.400的公用信息处理
系统;10010--Email。

00--数据编码方案TP-DCS(TP-Data-Coding-Scheme):

00--0000 0000:

第1、2位:一般设置为00

第3位:0--文本未压缩,1--文本用GSM标准压缩算法压缩

第4位:0--表示最后两位不包含信息,1--表示最后两位包含信息类型信息

第5、6位:00--默认的字母表,01--8bit,10--USC2(16bit),11--预留

第7、8位:00--Class 0,01--Class 1,10--Class 2(SIM卡特定信息),11--Class 3。

00--有效期TP-VP(TP-Valid-Period):

VP value: 相应的有效期

00 to 8F : (VP+1)*5 分钟

90 to A7 : 12小时+(VP-143)*30分钟

A8 to C4 : (VP-166)*1天

C5 to FF : (VP-192)*1 周

3. 信息段。

“0A534E6E058FDC89C1FF01”

信息段是最简单的,大家需要了解GPRS以PDU模式发送信息时,其内容是以unicode的方式编码的。

其中:

“534E6E058FDC89C1FF01”

还原成GB汉字编码为:

“华清远见!”

其编码(十六进制)长度是20位,20/2=10,10的十六进制表示方式是0X0A。因此信息段的最终编码为:

“0A534E6E058FDC89C1FF01”

3. 组合。

如果把发短信比喻为一次快递的投递过程,那么过程如下:

首先是中心号码(相当于我们的邮局);

接着是接收方号码段(相当于我们的收信人地址);

最后是信息段(就是你的信件了)。

OK,组合结果就是:

“0891683108100005F011000D91685110906474F90008000A534E6E058FDC89C1FF01”

至此,PDU的编码就正式结束了。

不过我们还有最后一件事,那就是前面提到的那个“信息长度”。

邮局是国家的公有的,我们无权去干涉,但是收信人和信息是我们自己制定的,因此我们要精确掌握自己所属的信息。

于是我们将中心号码段剔除,变为:

“11000D91685110906474F90008000A534E6E058FDC89C1FF01”

计算一下字符串长度,50位。OK,50/2=25。

于是在PDU模式下,我们所谓的“信息长度”:AT+CMGS=25。

回顾一下PDU模式下的发信息流程:

======================================================================

AT

OK

AT+CMGF=0

OK

AT+CMGS=25

>0891683108100005F011000D91685110906474F90A534E6E058FDC89C1FF01

======================================================================

一定要记得最后输完信息编码后要按“ctrl+z”而不是回车。

我做GPRS模块实验,用的是NeoWay“有方”的GPRS模块,M660+。

短信中心号码,需要根据SIM所在地址更换,下面列举中国移动的短信中心号码,备查。

中国移动短消息中心号码大全

省份 城市 短消息中心号码

北京 北京 13800100500

天津 天津 13800220500

河北 石家庄 13800311500

保定 13800312500

衡水 13800318500

邢台 13800319500

邯郸 13800310500

张家口 13800313500

承德 13800314500

唐山 13800315500

廊坊 13800316500

沧州 13800317500

秦皇岛 13800335500

山西 太原 13800351500

大同 13800352500

阳泉 13800353500

朔州 13800349500

吕梁 13800358500

忻州 13800350500

榆次 13800354500

长治 13800355500

晋城 13800356500

临汾 13800357500

运城 13800359500

内蒙古 呼和浩特 13800471500

包头 13800472500

集宁 13800474500

东胜 13800477500

临河 13800478500

锡林浩特 13800479500

海拉尔 13800470500

赤峰 13800476500

乌海 13800473500

阿拉善左旗 13800483500

通辽 13800475500

乌兰浩特 13800482500

辽宁 沈阳 13800240500

大连 13800411500

鞍山 13800412500

抚顺 13800413500

本溪 13800414500

丹东 13800415500

锦州 13800416500

营口 13800417500

阜新 13800418500

辽阳 13800419500

铁岭 13800410500

朝阳 13800421500

盘锦 13800427500

葫芦岛 13800429500

吉林 长春 13800431500

吉林 13800432500

延吉 13800433500

四平 13800434500

通化 13800435500

白城 13800436500

辽源 13800437500

松源 13800438500

白山 13800439500

黑龙江 哈尔滨 13800451500

齐齐哈尔 13800452500

牡丹江 13800453500

佳木斯 13800454500

大庆 13800459500

上海 上海 13800210500

江苏 苏州 13800512500

镇江 13800511500

南通 13800513500

常州 13800519500

无锡 13800510500

南京 13800250500

扬州 13800514500

盐城 13800515500

徐州 13800516500

淮阴 13800517500

连云港 13800518500

泰州 13800523500

宿迁 13800527500

浙江 杭州 13800571500

宁波 13800574500

嘉兴 13800573500

金华 13800579500

温州 13800577500

衢州 13800570500

舟山 13800580500

湖州 13800572500

绍兴 13800575500

台州 13800576500

丽水 13800578500

安徽 滁州 13800550500

合肥 13800551500

蚌埠 13800552500

芜湖 13800553500

淮南 13800554500

马鞍山 13800555500

安庆 13800556500

宿州 13800557500

阜阳 13800558500

黄山 13800559500

淮北 13800561500

铜陵 13800562500

宣城 13800563500

六安 13800564500

巢湖 13800565500

贵池 13800566500

福建 福州 13800591500

厦门 13800592500

宁德 13800593500

莆田 13800594500

泉州 13800595500

漳州 13800596500

龙岩 13800597500

三明 13800598500

南平 13800599500

江西 南昌 13800791500

上饶 13800793500

鹰潭 13800701500

抚州 13800794500

九江 13800792500

宜春 13800795500

吉安 13800796500

赣州 13800797500

景德镇 13800798500

萍乡 13800799500

新余 13800790500

山东 青岛 13800532500

济南 13800531500

淄博 13800533500

潍坊 13800536500

烟台 13800535500

威海 13800631500

临沂 13800539500

莱芜 13800634500

聊城 13800635500

日照 13800633500

枣庄 13800632500

德州 13800534500

济宁 13800537500

荷泽 13800530500

泰安 13800538500

东营 13800546500

滨州 13800543500

河南 郑州 13800371500

许昌 13800374500

开封 13800378500

商丘 13800370500

漯河 13800395500

周口 13800394500

平顶山 13800375500

信阳 13800376500

南阳 13800377500

洛阳 13800379500

焦作 13800391500

新乡 13800373500

鹤壁 13800392500

驻马店 13800396500

濮阳 13800393500

安阳 13800372500

三门峡 13800398500

湖北 武汉 13800270500

襄樊 13800710500

孝感 13800712500

咸宁 13800715500

荆州 13800716500

宜昌 13800717500

恩施 13800718500

十堰 13800719500

随州 13800722500

荆门 13800724500

江汉 13800728500

湖南 长沙 13800731500

常德 13800736500

衡阳 13800734500

邵阳 13800739500

岳阳 13800730500

益阳 13800737500

湘潭 13800732500

株州 13800733500

张家界 13800744500

郴州 13800735500

娄底 13800738500

吉首 13800743500

怀化 13800745500

永州 13800746500

广东 广州 13800200500

深圳 13800755500

汕头 13800754500

韶关 13800751500

清远 13800763500

潮州 13800768500

揭阳 13800663500

湛江 13800759500

茂名 13800668500

江门 13800750500

东莞 13800769500

河源 13800762500

梅州 13800753500

汕尾 13800660500

佛山 13800757500

云浮 13800766500

顺德 13800765500

肇庆 13800758500

江门 13800750500

阳江 13800662500

珠海 13800756500

中山 13800760500

惠州 13800752500

广西 南宁 13800771500

柳州 13800772500

桂林 13800773500

梧州 13800774500

玉林 13800775500

百色 13800776500

钦州 13800777500

河池 13800778500

北海 13800779500

防城港 13800770500

海南 海口 13800898500

重庆 重庆 13800230500

四川 成都 13800280500

攀枝花 13800812500

自贡 13800813500

绵阳 13800816500

南充 13800817500

广安 13800826500

宜宾 13800831500

内江 13800832500

乐山 13800833500

西昌 13800834500

雅安 13800835500

康定 13800836500

马尔康 13800837500

德阳 13800838500

广元 13800839500

泸州 13800830500

遂宁 13800825500

巴中 13800827500

达川 13800818500

贵州 贵阳 13800851500

云南 昆明 13800871500

玉溪 13800877500

曲靖 13800874500

保山 13800875500

思茅 13800879500

楚雄 13800878500

文山 13800876500

丽江 13800888500

个旧 13800873500

大理 13800872500

陕西 西安 13800290500

延安 13800911500

榆林 13800912500

渭南 13800913500

商洛 13800914500

安康 13800915500

汉中 13800916500

宝鸡 13800917500

铜川 13800919500

咸阳 13800910500

甘肃 兰州 13800931500

白银 13800943500

临夏 13800930500

甘南 13800941500

张掖 13800936500

金昌 13800935500

酒泉 13800937500

天水 13800938500

定西 13800932500

平凉 13800933500

庆阳 13800934500

陇南 13800939500

青海 西宁 13800971500

宁夏 银川 13800951500

新疆 乌鲁木齐 13800991500

克拉玛依 13800990500

石河子 13800992500

奎屯 13800993500

昌吉 13800994500

吐鲁番 13800995500

库尔勒 13800996500

阿克苏 13800997500

喀什 13800998500

伊宁 13800999500

塔城 13800901500

哈密 13800902500

和田 13800903500

阿勒泰 13800906500

阿图什 13800908500

博州 13800909500

长短信的发送:

上述就是一条普通短信的PDU形式,下面说说关于有UDH的PDU短信是什么样子:
还是以刚才那个短信为基础,自己改改就能明白了:

08 91 683108701305F0 51 00
0D 91 3176378290F9 00 00 00 09 06050442664266 C834

有变化的地方已经用蓝色标明了,其他无变化。所以直接解析蓝色字段即可:

51--文件头字节0101
0001:看了二进制形式,再结合上面讲的,就明白了这里加了一个UDHI标示,也就是说这条短信有用户头信息(UDH-User Data Header),那么真正的UDH在哪呢?其实就是在用户数据(TP-UD)中,也就是06050442664266。

09--用户数据长度TP-UDL(TP-User-Data-Length):这个长度就是UDH+UD的长度除2。很明了了。

06050442664266--用户数据头UDH:这个地方还是要细说一下的:

06--用户数据头长度:不包含自己的。

05--我没找到具体的中文解释,但以我个人理解就是UDH的意义(在GSM03.40规范中有明确的说明各个值的含义,列举一下,可以看看自己感兴趣的):

00
Concatenated short messages, 8-bit reference number(长短信拆分使用)

01 Special SMS Message Indication

02 Reserved

03 Value not used to avoid misinterpretation as 【LF】 character

04 Application port addressing scheme, 8 bit address

05
Application port addressing scheme, 16 bit address(这是我们关心的)

06 SMSC Control Parameters

07 UDH Source Indicator

08 Concatenated short message, 16-bit reference number

09 Wireless Control Message Protocol

0A-6F Reserved for future use

70-7F SIM Toolkit Security Headers

80 - 9F SME to SME specific use

A0 - BF Reserved for future use

C0 - DF SC specific use

E0 - FF Reserved for future use

04--端口长度:不解释了,自己看一下吧。

4266--目标端口号:不解释了,自己看一下吧。

4266--源端口号:不解释了,自己看一下吧。

上边这段主要是为了告诉大家如何增加一个UDH,以及UDH应该增加到什么位置上,还有就是增加了UDH,对其他标识位的影响。

========================

顺便再提一提长短信。为什么突然转到长短信?很简单,长短信在拆分时会用到UDH。所以一块说了。

依然以最开的短信为例,改装一下大家就明白长短信的拆分规则了:

08 91 683108701305F0 51 00
0D 91 3176378290F9 00 00 00 08 050003000201 C834

08 91 683108701305F0 51 00
0D 91 3176378290F9 00 00 00 08 050003000202 C834

这两条短信大家可以理解为一个长短信被拆分成两条短信(不要深究短信内容啊)。下面说明一下有变更的地方:

08--用户数据长度TP-UDL(TP-User-Data-Length):不解释了。

050003000201--UDH内容:

05--UDHL用户数据头长度

00--UDH的意义,可以看刚才列举出的各个值的意义。

03--剩下短信标识的长度,即后面的000201

00--拆分短信的唯一标识,也就是说,以后组合短信时,要靠这个值识别本条拆分短信是属于哪个长短信。取值范围0~255。

02--表示长短信被拆成多少份

01--表示这是第一个拆分短信,也就是拆分短信的序号。

参考文章:http://www.cnblogs.com/skynice/archive/2008/11/26/LongSMSPDU.html
http://blog.sina.com.cn/s/blog_524846000101cwtr.html http://mobiletidings.com/2009/02/18/combining-sms-messages/ http://www.amobbs.com/thread-5527253-1-1.html
我按着这个步骤走的长短信没法送成功,有发送成功的给我发份参考代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: