[转载]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 格式
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个字符也比较简单
至于有用户数据头
欢迎访问:wenhao.ink