[转载]GPRS SIM300发送中文短信

转自:http://www.cnblogs.com/feisky/archive/2010/05/25/1743732.html
通过SIM300发送中文短信息只要三步:

1. at+cscs="GSM" 采用GSM方式
2. at+cmgf=0  设置PDU模式,发送中文短信需要这个
3. at+cmgs=<长度>    发送PDU短信

1)   If   text   mode
(+CMGF=1):
+CMGS=<da>[,<toda>]<CR>
text is entered   <ctrl-Z/ESC>
ESC quits without sending
 
2)  If  PDU  mode
(+CMGF=0):
+CMGS=<length><CR>
PDU     is     given
<ctrl-Z/ESC>

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

在Linux下使用minicom就能测试:

Welcome to minicom 2.1

OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n 
Compiled on Jan  7 2007, 04:48:39.

Press CTRL-A Z for help on special keys
                                                                                           
AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0                                                           
OK                                   

at+cscs="GSM"                                                                              
OK                                                                                         
at+cmgf=0
OK
at+cmgs=25
> 0011000D91683117604419F30008A70A66fe5baa950b60a8597d     (这里按ctrl+z后就可以将短信发送出去)
+CMGS: 27

OK

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

对上面发送的PDU内容简单说明一下:
001100           0D           91      68 3117604419F3          0008      A7          0A          66fe5baa950b60a8597d
   前序  | 目的号码长度 |国际| 目的手机号码(两位一反) | 8bit方式|允许时间|短信长度|短信内容 (Unicode)



在Linux发送中文短信:
目前,在Linux下我们一般使用的编码格式是UTF-8。如果你是使用C/C++来开发发送程序,调用函数mbstowcs()就可以将本地编码格式的中文转换成Unicode,用来发送中文短信

#include <stdlib.h>
size_t mbstowcs(wchar_t *dest,const char* src, size_t n);

注:这个函数测试了许久,也没有将中文转换为Unicode,谁有懂的请在下面回复,谢谢。

下面是PDU格式说明(转于http://blog.csdn.net/zixu/archive/2007/03/12/1527208.aspx), 不过好像与上面用与SIM300有一点出入,有空的时间在慢慢研究以下这部分的东西

第一部分PDU 格式
0891683108200105F011000B813119169083F80000A806C9363C3CA603
以上是一个SUBMIT-PDU 发出例子分析内容如下
08
91
68 31 08
20 01 05
F0
11
00
0B
81
31 19 16
90 83 F8
00
00
A8
06
C9363C3CA603
Length
Tosca
Address
FO(PDU第一个字节)
MR(消息参考号码)
Length
Toda
address
PID
DSC
VP
UDL
UD
SCA(服务中心号码)
DA(目标地址)
协议标示
数据编码标准
允许时间
用户数据长度
用户数据
1-12个字节
1字节
1字节
2-12个字节
1字节
1字节
1字节
1字节
0-140字节
 
收到的DELIVER-PDU
SCA
FO
OA
PID
DCS
SCTS
UDL
UD
服务中心号码
第一字节
原地址
协议表示
编码标准
服务中心时间戳
用户数据长度
用户数据
 
一、SCA服务中心号码
08
91
68 31 08 20 01 05 F0
Length(长度)
Tosca(服务中心号码类型)
Address(地址)
SCA服务中心号码
 
长度08即SCA区去除08外后面的字节数单位是字节如上91683108200105F0共8字节但是当长度值为00时后面SCA区将只有00后面的号码类型和地址都不存在发送短消息时从SIM卡读出SCA号码此号码要用at+csca=xxxxx设定
Tosca服务中心号发类型91为国际型81为未知类型号码A1为国内型一般为国际型
Address地址每个字节先用低位4bit后用4-7bit如果号码个数为奇数个最后一个字节的4-7bit全部设置为1即FxH如号码1234567,变化好以后就是21 43 65 F7”;
 
二、FO信息第一字节
收到的PDU,典型为04H
BIT
7
6
5
4
3
2
1
0
参数
RP
UDHI
SRI
MMS
MTI
MTI
 
发送的PDU,典型为11H
BIT
7
6
5
4
3
2
1
0
参数
RP
UDHI
SRR
VPF
VPF
RD
MTI
MTI
 
MTI 2bit消息类型00收01发其余值参考SMS with the M20文档P.22
MMS 1bit短消息服务中心是否有更多短消息等待移动台1有0无默认为1
SRI 1bit状态报告标示0不需要状态返回到移动设备1需要默认为0
UDHI 1bit用户数据头标示0用户数据没有头信息1有一般为0
RP 1bit是否有回复路径的标示1有0没有一般为0
VPF 2bit有效期限格式00 VP不存在10 VP区存在用一个字节表示是相对值01 保留11 存在半个字节表示绝对值
RD 1bit重复信元丢弃0通知服务中心碰到同源同目的地同样的MR短消息序号的短消息接受1抛弃此时将在短消息提交报告中返回一个适当的FCS值
SRR 1bit状态报告要求.
三、MR短消息参考
1个字节表示移动台向短消息服务中心提交的短消息序号从0到255一般移动模块会自动改动所以默认为00
四、OA短消息原发手机地址
OB
81
31 19 16 90 83 F8
Length(长度)
Toda(地址类型)
Address(地址)
DA(目标地址)
2-12字节
Length为地址的数字个数
Toda地址类型91为国际型81为国内型
Address地址编码方法与SCA同一个字节先用低4bit奇数个号码最后一位高四位设为F.
五、DA目的手机地址
短消息目的地址参考OA
六、PID协议标志
是短消息传输层作为高层协议参考或者是远程设备协同工作的标示需要服务商支持但是00H是所有服务商都支持的建议采用00H即可
七、DCS数据编码方法
表示数据编码方法和消息类别一般为00H默认7位编码等级号0。04为8位编码。
UCS2编码0等级为08H可以传输中文。
 
7
6
5
4
3
2
1
0
编码组
保留
X
X
X
具体如下:
编码组bit7-4
Bit3-0
OOXX
BIT5:0文本未压缩1用GSM标准压缩
Bit4:0表示bit1,0是保留没有消息类别1表示有
Bit1  Bit0   消息类别
0      0      Class0
0      1      Class1
1      0      Class2
1      1      Class3
Bit3   Bit2   字母表
0      0      默认字母表
0      1      8bit数据
1      0      UCS2编码
1      1      保留
其余情况暂不讨论
Class0短消息直接显示到用户终端
Class1短消息存储在SIM卡上
Class2短消息必须存储在SIM卡上禁止直接传输到中断
Class3短消息存贮在用户设备上
八、SCTS服务中心时间戳
告诉目标用户短消息到达时间为7个字节表示
Year
Month
Day
Hour
Minute
Second
Time Zone
10
40
32
21
94
83
00
表示01年4月23号12点49分38秒时区表示本地时间和格林尼治标准时间差
九、VP 合法时间
标示短消息服务中心在接到短消息后在没有发到目标机前可以保证短消息存在的时间其格式在FO中的VPF中设定一般是相对值10B这时时间如下:
VP值,16进制
相对合法时间
00-8F
(VP+1)*5分
90-A7
12小时+(VP-143)*30分钟
A8-C4
(VP-166)*1天
C5-FF
(VP-192)*1周
如果是绝对时间即VPF=11B则VP区和SCTS同.
 
十、UDL用户数据长度
1 如果用户用默认7位编码
1>没有用户数据头此数字标示7bit的字符个数
2>有用户数据头此数字表示包括用户数据头包含补丁在内在内的7bit个数
2 如果用户用8位编码
表示用户数据区的字节数有数据头信息包括在内
3 如果为UCS2编码则是用户数据区的字节数
十一、UD用户数据
1 如果是7bit编码则从前向后每个字节从低到高位使用最后不足的一个字节的各位全部用0补全最多可以有160个字符例子如下
设一个字母为x,它的编码的17bit分别为x1x7,如8个字母分别为ABCDEFGH,则编码如下
B1
A7
A6
A5
A4
A3
A2
A1
C2
C1
B7
B6
B5
B4
B3
B2
D3
D2
D1
C7
C6
C5
C4
C3
E4
E3
E2
E1
D7
D6
D5
D4
F5
F4
F3
F2
F1
E7
E6
E5
G6
G5
G4
G3
G2
G1
F7
F6
H7
H6
H5
H4
H3
H2
H1
G7
 
2 如果是8bit编码很简单最多140个字符
3 如果是UCS2编码则最多是70个字符也比较简单
至于有用户数据头
posted @ 2011-05-30 17:56  hnrainll  阅读(1162)  评论(0编辑  收藏  举报