AT指令收發短信主要有兩種模式:Text模式和PDU(Protocol Data Unit,協定資料單元)模式。使用Text模式收發短信代碼簡單,很容易實作,最大缺點不支援中文短信。PDU模式不僅能發送中文短信,也能發送英文短信。PDU收發短信有三種編碼可用:7-bit、8-bit和UCS2編碼。7-bit編碼用于發送普通的ASCII字元,即英文短信,最多可發送160字元。8- bit編碼通常用于發送資料消息。UCS2編碼用于發送Unicode字元,可發送中文字元,最多發送70字元。
短信發送執行個體:
Text模式(向号碼為15050850677的手機發送“TEST”):
1: AT //發送AT 傳回OK 連接配接成功
2:
3: OK
4:
5: AT+CMGF=1 //設定為Text模式
6:
7: AT+CMGS="15050850677" //發送指令,雙引号内改為對用手機号碼
8:
9: > TEST(+^z,十六進制的1A)//傳回字元串中有OK 發送成功 >号為裝置傳回字元
PDU模式(向号碼為15050850677的手機發送“你好”):
1: AT //發送AT 傳回OK 連接配接成功
2:
3: OK
4:
5: AT+CMGF=0 //設定為PDU模式
6:
7: AT+CMGS=19 //發送指令,更改為對應PDU編碼的長度計算方法在後面
8:
9: > 0011000D91685150800576F70008C4044F60597D(+^z,十六進制的1A)//傳回字元串中有OK 發送成功
有的“貓”用“序列槽調試器”發送總是失敗:Text模式接收到的是亂碼,PDU模式發送不出去。我用的這個就是這個樣子,給我郁悶了很多天,後來發現在序列槽調試器中我們摁下的“回車”被解析為”\r\n”,而我用的這個modem隻有在隻發送AT指令+”\r”時才能正确的發送短信。發現後發送短信都能成功,高興了好一會兒。不說廢話了,開始PDU短信編碼的解析。這是我的了解,更多詳細資料參考下列标準:
GSM 03.04 着重介紹短信發送中對字元集的控制部分
GSM 03.08
GSM 03.41
GSM 07.05 介紹 at 的一些控制指令
GSM 07.07 着重介紹 at 的短信相關指令,可以說是at的sms 規範
元素 | 名稱 | 長度 | 描述 |
SCA | Service Center Address | 1-12 | 短消息服務中心号碼 |
PDU-Type | Protocol Data Unit | 1 | 協定資料單元類型 |
MR | Message Reference | 1 | 所有成功的短信發送參考數目(0..255) |
OA | Originator Address | 2-12 | 發送方位址(手機号碼) |
DA | Destination Address | 2-12 | 接收方位址(手機号碼) |
PID | Protocol Identifer | 1 | 參數顯示消息中心以何種方式處理消息内容(比如FAX,Voice) |
DCS | Data Coding Scheme | 1 | 參數顯示使用者資料編碼方案 |
SCTS | Service Center Time Stamp | 7 | 消息中心收到消息時的時間戳 |
VP | Validity Period | 0,1,7 | 參數顯示消息有效期 |
UDL | User Data Lenghth | 1 | 使用者資料長度 |
UD | User Data | 0-140 | 使用者資料 |
發送方PDU格式:
SCA | PDU-Type | MR | DA | PID | DCS | VP | UDL | UD |
1-12 | 1 | 1 | 2-12 | 1 | 1 | 0,1,7 | 1 | 0-140 |
示例:
向15050850677發送一條短信,内容“Test”
0011000D91685150800576F70000C404D4F29C0E
向15050850677發送一條短信,内容“你好”
0011000B815150800576F70008C4044F60597D
SCA | PDU-Type | MR | DA | PID | DCS | VP | UDL | UD |
1-12 | 1 | 1 | 2-12 | 1 | 1 | 0,1,7 | 1 | 0-140 |
00 | 11 | 00 | 0D91685150800576F7 | 00 | 00 | C4 | 04 | D4F29C0E |
00 | 11 | 00 | 0B815150800576F7 | 00 | 08 | C4 | 04 | 4F60597D |
接收方PDU格式:
SCA | PDU-Type | OA | PID | DCS | SCTS | UDL | UD |
1-12 | 1 | 2-12 | 1 | 1 | 7 | 1 | 0-140 |
示例:
從15050850677接收一條短信,内容“Test”
0891683110402505F0240BA15150800576F700000111208160302304D4F2
9C0E
從15050850677接收一條短信,内容“你好”
0891683110402505F0240BA15150800576F7000801112081600423044F60
597D
SCA | PDUType | OA | PID | DCS | SCTS | UDL | UD |
1-12 | 1 | 2-12 | 1 | 1 | 7 | 1 | 0-140 |
0891683110402505F0 | 24 | 0BA15150800576F7 | 00 | 00 | 01112081603023 | 04 | D4F29C0E |
0891683110402505F0 | 24 | 0BA15150800576F7 | 00 | 08 | 01112081600423 | 04 | 4F60597D |
SCA:短消息服務中心位址格式
服務中心位址包含三個部分:1-12個8位位組 第一個位組訓示服務中心位址長度,第二個位組訓示服務中心類型,第三個位組為服務中心位址。
示例:0891683110402505F0
Lenghth | Type | Address |
08 | 91 | 683110402505F0 |
Lenghth:服務中心位址長度 訓示Type+Address部分位組長度(例中:91683110402505F0中位組8個:08)
如果Lenghth部分為“00”則不提供後面部分,發送時終端将自動從SIM卡中讀取并填充SCA
Type:短信中心位址的類型(81:指國内的号碼 91:指國際的号碼 91最常用(資料裡都說是這樣,但根據後面的表格:國内應該是A1,81是未知!!))91H=10010001B 具體意義如下表:
BIT No. 7 6 5 4 3 2 1 1 類型 類型 類型 号碼鑒别 同3 同3 同3 類型:000-未知 001-國際 010-國内 111-留作擴充
号碼鑒别:0000-未知 0001-ISDN/電話号碼(E.164/E.163) 1111-留作擴充
SCA示例:
短信中心 | PDU編碼 |
+8613010452500 | 0891683110402505F0 |
13010452500 | 07813110402505F0 |
123456 | 0481214365 |
注:AT指令中 AT+CMGS=<Len> Len不包含此段位組的長度
PDU Type:是發送和接受短信的PDU中的第一個8位位組
發送方:例 11h=00010001b
Bit No. | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
RP | UDHI | SRR | VPF | VPF | RD | MTI | MTI |
1 | 1 |
接收方:例 24h=00100100b
Bit No. | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
RP | UDHI | SRI | MMS | MTI | MTI | ||
1 | 1 |
RP:應答路徑,
0-未設定
1-設定
UDHI:使用者資料頭辨別(User Data Header Indicator),
0-使用者資料(UD)部分不包含頭資訊
1-使用者資料(UD)開始部分包含使用者頭資訊
SRR:請求狀态報告(Status Report Request),
0-不需要報告
1-需要報告
SRI:狀态報告訓示(Status Report Indication),此值僅被短消息服務中心設定,
0-狀态報告将不會傳回給短消息實體(SME)
1-狀态報告将傳回給短消息實體(SME)
VPF:有效期格式(Validity Period Format),
00-VP段沒有提供(長度為0)
01-保留
10-VP段以整型形式提供(相對的)
11-VP段以8位位組的一半形式提供(絕對的)
RD:拒絕複本(Reject Duplicate)
0-通知短消息服務中心(SMSC)接受一個消息(SMS-SUBMIT),即該消息是先前已送出過的,并還存在與SMSC中未發送出去。MS重複的條件是:消息參考(MR)、接收方位址(DA)及發送方位址(OA)相同
1-通知SMSC拒絕一個重複的SMS
MMS:有更多的消息需要發送(More Message to Send),此值僅被SMSC設定
0-在SMSC中有更多的資訊等待MS
1-在SMSC中沒有更多的資訊等待MS
MTI:資訊類型訓示(Message Type Indicator)
不太了解 有待于再查資料
MR:資訊參考 不太了解 置為00即可
DA/OA:接收方與發送方位址
DA與OA編碼方式是一樣的 2-12個8位位組
例:0D91685150800576F7
Lenghth | Type | Address |
0D | 91 | 685150800576F7 |
Lenghth:位址長度 指8615050850677的長度。與SCA中不一樣!
Type:位址類型 訓示國内(81) 還是國際(91)
示例:
号碼 | PDU編碼 |
+8615050850677 | 0D91685150800576F7 |
15050850677 | 0B815150800576F7 |
123456 | 0681214365 |
PID:協定辨別(Protocol Identifier)
對于标準情況下的MS-to-SC短消息傳送,隻需設定PID為00
DCS:資料編碼方案(DataCoding Scheme)
Bit No. | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 描述 |
示例: | 00h 7bit資料編碼 預設字元集 | |||||||
1 | 1 | 1 | 1 | 1 | 1 | F6h 8bit資料編碼 Class1 | ||
1 | 08h USC2(16bit)雙位元組字元集 |
Bit No.7與Bit No.6:
一般設定為00
Bit No.5:
0-文本未壓縮
1-文本用GSM标準壓縮算法壓縮
Bit No.4:
0-訓示Bit No.1 Bit No.0為保留位,不含資訊類型資訊
1-訓示Bit No.1 Bit No.0含資訊類型資訊
Bit No.3與Bit No.2:
00-預設的字元集,每字元占7bit,此時最大可發送160字元
01-8bit,此時最大可發送140字元
10-USC2(16bit),發送雙位元組字元集
11-預留
Bit N0.1與Bit No.0:
00-Class 0,短消息直接顯示在螢幕上
01-Class 1,
10-Class 2(SIM卡特定資訊),
11-Class 3
示例:
DCS | 字元集 | 資訊Class |
00 | 7-bit | No Class |
F0 | 7-bit | Class 0(Immediate Display) |
F1 | 7-bit | Class 1(Mobile Equipment-specific) |
F2 | 7-bit | Class 2(SIM specific Message) |
F3 | 7-bit | Class 3(Terminate Equipment-specific) |
F4 | 8-bit | Class 0(Immediate Display) |
F5 | 8-bit | Class 1(Mobile Equipment-specific) |
F6 | 8-bit | Class 2(SIM specific Message) |
F7 | 8-bit | Class 3(Terminate Equipment-specific) |
08 | 16-bit | No Class |
18 | 16-bit | Class 0(Immediate Display) |
VP:資訊有效期(Validity Period)
第一種情況(相對的):VPF=10 VP=AAH(四天)
第二種情況(絕對的):VPF=11
表示:03-08-20 09:45:33
年 月 日 時 分 秒 時區 30 80 02 90 54 33 20
VP段以整形或半個8位位組形式提供
第一種情況,VP為一個8位組,給定有效期的長度
從消息被SMSC接收開始計算
第二種情況,VP為七個8位組,給定有效期終止的絕對時間 時間形式與SCTS形式一緻
VP 相應的有效期 00-8F (VP+1)*5分鐘 從5分鐘間隔到12小時 90-A7 12小時+(VF-143)*30分鐘 A8-C4 (VP-166)*1天 C5-FF (VP-192)*1周
SCTS:服務中心時間戳(Service Center Time Stamp)
占用7個8位組,格式和VP第二種情況一緻,請參考其中的表格
UDL:使用者資料長度(User Data Lenghth)
UDL以整形形式提供,訓示後面使用者資料段的長度(UD的8位組的個數)
UD:使用者資料(User Data)
英文編碼:7bit編碼,依次将下一位的後幾位移至前面形成新的8位編碼
示例:Test
T:01010100 e:01100101 s:01110011 t:01110100
去最高位0,變為7位
T:1010100 e:1100101 s:1110011 t:1110100
後面低位移至前面形成8位編碼
Test:11010100111100101001110000001110
UD:D4F29C0E UDL:04
中文編碼:取USC2編碼 高低位元組交換即可
注意:7bit編碼的UDL部分計算的是編碼前的字元串長度,而不是編碼後的8位組個數!
注:AT+CMGS=<Len><cr>中Len為出SCA外8位組的個數
參考資料:SMS with the SMS PDU-mode
轉載于:https://www.cnblogs.com/Engin/archive/2010/11/02/GSM_PDU.html