EM310_AT收到的短信分析
2013年4月6日 11:16:53
Brief :
本文简要分析使用EM310模块收到的短信.
- 读取短信模式
- PDU方式
- Text方式
- 附:数字,点,冒号的unicode表
读取短信的模式分为两种:
- PUD方式读取
- 文本方式读取
接收到的短信内容分为两种:
*中文短信(中文,中文+英文,英文+中文标点)
*纯英文(字符,数字,英文标点)
那么对应的有四种读取:
序号 | 方式 |
1 | PUD +中文短信 |
2 | PUD 英文短信 |
3 | 文本 中文短信 |
4 | 文本 英文短信 |
在下面依次介绍前,先给出两种方式读取下的结果:
文本方式:
at+cmgf=1 //文本方式
OK
at+cmgl="ALL"//使用手机15215029639发给15923184063:"你好"
+CMGL: 18,"REC READ","8615215029639","@
uN","13/04/05,23:48:28+32",145,4
4F60597D//使用手机15215029639发给15923184063:"113.10.77.65:8080"
+CMGL: 19,"REC READ","8615215029639","@
uN","13/04/05,23:50:15+32",145,17
113.10.77.65:8080OK
PUD方式:
使用AT+CMGR发返回:
AT+CMGF=0
AT+CMGR=x
+CMGR:
<stat>,[<alpha>],<length>
<CR><LF><pdu> OK
at+cmgf=0//PUD方式
OK
//使用手机15215029639发给15923184063:"你好"
at+cmgr=18
ERROR
+CMGR: 1,"@uN",24
0891683108200305F0040D91685112059236F9000831405032848223044F60597DOK
//使用手机15215029639发给15923184063:"113.10.77.65:8080"
at+cmgr=19ERROR
+CMGR: 1,"@uN",35
0891683108200305F0040D91685112059236F900003140503205512311B1D8CC1583B96E3797ADA6C3C17030OK
附表: 数字,点,冒号的unicode.
二进制 | 十进制 | 八进制 | 十六进制 | 符号 | 说明 | |
Binary | Oct | Dec | Hex | Glyph | unicode | |
---|---|---|---|---|---|---|
010 1110 | 056 | 46 | 2E | . | U+002E | 点/句号 |
011 0000 | 060 | 48 | 30 | 0 | U+0030 | 数字 |
011 0001 | 061 | 49 | 31 | 1 | U+0031 | |
011 0010 | 062 | 50 | 32 | 2 | U+0032 | |
011 0011 | 063 | 51 | 33 | 3 | U+0033 | |
011 0100 | 064 | 52 | 34 | 4 | U+0034 | |
011 0101 | 065 | 53 | 35 | 5 | U+0035 | |
011 0110 | 066 | 54 | 36 | 6 | U+0036 | |
011 0111 | 067 | 55 | 37 | 7 | U+0037 | |
011 1000 | 070 | 56 | 38 | 8 | U+0038 | |
011 1001 | 071 | 57 | 39 | 9 | U+0039 | |
011 1010 | 072 | 58 | 3A | : | U+0039 | 冒号 |
你 | U+4f60 | 汉字"你" | ||||
好 | U+597d | 汉字"好" | ||||
年 | u+5e74 | |||||
月 | u+6708 | |||||
日 | u+65e5 |
下面依次介绍
1.PDU+中文短信
at+cmgf=0//
//使用手机15215029639发给15923184063:"你好"
at+cmgr=18
ERROR //这个输出有时有,有时没有,不知道是怎么回事.
+CMGR: 1,"@uN",24
0891683108200305F0040D91685112059236F9000831405032848223044F60597D
将信息拆分,然后给出每个部分的说明:
0891683108200305F0 ┃040D91 685112059236F9┃ 0008 314050328482 2304┃4F60597D
短信中心┃源号码┃时间┃短信内容
第一部分┃第二部分┃第三部分┃第四部分
第一部分 短信中心 0891683108200305F0
- 08 长度指示 91683108200305F0的长度除2, 16/2=8(10)=0x08(16).
- 91 短信中心号码类型 91=10010001,第1位是1,固定,001表示国际号码,0001表示ISDN/电话号码
- 683108200305F0 短信中心号码,去+号,加86,判断奇偶是否加F,奇偶互换. (如果号码前面有+号,去掉“+”号→如果没有“86”,在号码前加上“86”:
86 13 80 02 30 50 0→看看现在号码的长度是否为偶数,如果不是,在号码后面加上“F”:8613800230500F→将奇数位和偶数位交换,得到结果:683108200305F0)
第二部分 源号码 040D91 685112059236F9
- 04 用户数据长度TP-UDL(TP-User-Data-Length),4F60597D共有8位,8/2=4=0x04.
- 0D 源号码长度,8615215029639的长度,13(10)=0x0D(16)
- 91 号码类型 91=10010001,第1位是1,固定,001表示国际号码,0001表示ISDN/电话号码
- 685112059236F9 源号码(发送短信方的号码),去+号,加86,判断奇偶是否加F,奇偶互换.
【注意到】从第一部分和第二部分的结构来看,很相似,
- 号码长度指示(包括了号码类型的长度)
- 号码类型
- 具体号码
只是第二部分多了一个发送内容的长度指示。
第三部分 时间 0008 314050328482 2304
- 00 协议标识 TP—PID
- 08 数据编码方案,08:中文编码,00为英文或数字,
- 314050328482 日期时间,奇偶互换,13年04月05日 23 点48分 28秒
- 23 时区
- 04 用户数据长度TP-UDL(TP-User-Data-Length),4F60597D共有8位,8/2=4=0x04. 【注意】第三部分的数据编码方案,时间,用户数据长度都是几个重要的参数。
第四部分 短信内容 4F60597D
4F60597D 是中文字符“你好”的unicode编码。
你 –> 4F60.
好-->597D.
【练习】标注下面的短信的关键点:
+CMTI: "SM",1
at+cmgr=1
+CMGR: 0,,57
0891683108200315F02410A121251095328104360008314060419030232400320030003100335E7400346708003665E5002000310034003A00300039003A00310037
OK
拆分如下:
0891683108200315F0|2410A12125109532810436|00083140604190302324|00320030003100335E7400346708003665E5002000310034003A00300039003A00310037
1.短信中心 08 91 683108200315F0 -->8613800230510F—>8613800230510
//上面的使用飞信发送的,短信中心号码为 8613800230510
//使用本地移动(重庆)主城区手机发送短信号码中心为8613800230500
2.源号码 2125109532810436—>1252015923184063.
//注意,这里的号码类型为A1=1010 0001,不再是91=1001 0001,
//从 001—国际 变化 为 010—国内
08 --->表示数据使用PDU格式发送,那么使用的是Unicode编码.
3.发送时间 314060419030—>130406140903--->13年04月06日14时09分03秒
4.短信内容
00320030003100335E7400346708003665E5002000310034003A00300039003A00310037
unicode对应的字符为:
2013年4月6日 14:09:17
二进制 | 十进制 | 八进制 | 十六进制 | 符号 | 说明 | |
Binary | Oct | Dec | Hex | Glyph | unicode | |
---|---|---|---|---|---|---|
U+0020 | 空格 | |||||
011 0000 | 060 | 48 | 30 | 0 | U+0030 | 数字 |
011 0001 | 061 | 49 | 31 | 1 | U+0031 | |
011 0010 | 062 | 50 | 32 | 2 | U+0032 | |
011 0011 | 063 | 51 | 33 | 3 | U+0033 | |
011 0100 | 064 | 52 | 34 | 4 | U+0034 | |
011 0110 | 066 | 54 | 36 | 6 | U+0036 | |
011 0111 | 067 | 55 | 37 | 7 | U+0037 | |
011 1001 | 071 | 57 | 39 | 9 | U+0039 | |
年 | u+5e74 | |||||
月 | u+6708 | |||||
日 | u+65e5 | |||||
: | U+003A | 冒号 | ||||
. | U+002E | 点 |
2.PDU+英文短信
//使用手机15215029639发给15923184063:"113.10.77.65:8080"
at+cmgr=19ERROR
+CMGR: 1,"@uN",35
0891683108200305F0040D91685112059236F900003140503205512311B1D8CC1583B96E3797ADA6C3C17030OK
使用PDU方法(所有字符使用Unicode编码)读取英文短信的时候,英文也使用Unicode编码,所以下面只是分析下收到的短信内容.
0891683108200305F0|040D91685112059236F9|00003140503205512311|B1D8CC1583B96E3797ADA6C3C17030
0891683108200305F0短信中心
040D91685112059236F9源号码
00003140503205512311时间
B1D8CC1583B96E3797ADA6C3C17030数据部分
B1 D8 CC 15 83 B9 6E 37 97 AD A6 C3 C1 70 30
113.10.77.65:8080
这里该怎么去解释呢?
3.
4.使用文本方式
//使用手机15215029639发给15923184063:"你好"
+CMGL: 18,"REC READ","8615215029639","@
uN","13/04/05,23:48:28+32",145,4
4F60597D//使用手机15215029639发给15923184063:"113.10.77.65:8080"
+CMGL: 19,"REC READ","8615215029639","@
uN","13/04/05,23:50:15+32",145,17
113.10.77.65:8080
使用文本方式的时候
读取中文时候: 显示的是Unicode编码.
读取英文时候,显示的是可读的字符.
2013年4月6日 15:42:52
未解决的问题:
- 使用PDU方式读取英文时候,最后的用户数据怎么知道呢?