short message
对短信的操作包括有 “发短信”,“收短信”,“复制短信到SIM/UIM","从SIM/UIM读取短信“,”还有通过UTK/STK发短信“,这个过程中,包括一些协议,还有不同的Ril层返回不同的字串,这些都需要了解,匹配。还有各种编码 BCD, HEX, byte, 7bit,ASCII等
CDMA
UTK
做UTK,首先要参考文档“中国电信CDMA卡需求规范-UTK应用分册”,还要参考文档“3GPP2 C.S0015-A”和“TIA/EIA-637-A”,这两个文档有许多内容是相同的,好像是对TPDU的描述.
qcril进行UTK操作是,会上报如下的字串:
D0 33 | 81 03 011300 | 82 02 8183 | 85 0D 8077ED4FE153D190014E2D2026 |48 19 000002100204040146AA84080C000320000001050019898188
按照文档“中国电信CDMA卡需求规范-UTK应用分册 10.3 双向的 SIMPLE-TLV 标识”分析:
D0 主动UIM命令标识
33 length
81 命令说明标识
03 length
82 命令说明标识
02 length
85 Alpha 标识符标识 //短信发送中...
0D length
48 CDMA SMS TPDU 标识
19 length
其中 “000002100204040146AA84080C000320000001050019898188“ 为TPDU, 需要参考文档“3GPP2 C.S0015-A”和“TIA/EIA-637-A”分析,
参考文档“3GPP2 C.S0015-A 3.4 及 Table 3.4.3-1“
00 | 00 02 1002 | 04 04 0146AA84 | 08 0C 00 03 200000 01 05 0019898188
SMS P2P| TeleserviceID TI_length id | DstAddress DA_length address(10001) | BearerData length Mesage_Id id_length id User_data data_len
其中BearerData参考文档“3GPP2 C.S0015-A Table 4.5-1"
08 0C | 00 03 200000 | 01 05 0019898188
BearerData length Mesage_Id id_length id User_data data_len
这样一个UTK的字串就解析完了。
32 UTK上报的字串 d0 2a 7f 8001 03 001300 | 7f 8005 05 3130303031 | 7f 800d 04 04313031 | 7f 8005 0e 8077ed4fe153d190014e2d2026 00
按照文档“中国电信CDMA卡需求规范-UTK应用分册 10.3 双向的 SIMPLE-TLV 标识”分析:
D0 主动UIM命令标识
2a length
看代码ComprehensionTlv.decode, 7f 代表tag is in three-byte format
8001 命令说明标识 //相当于上面qcril的81
03 length
8005 Alpha 标识符标识 //10001
05 length
800d 正文串识 //101
8005 Alpha 标识符标识 //短信发送中...
0e length
UtkService: TERMINAL RESPONSE: 810300240082028281830100900101
D/RILJ ( 104): [0058]> REQUEST_STK_SEND_TERMINAL_RESPONSE
D/RILD ( 35): onRequest: STK_SEND_TERMINAL_RESPONSE
D/AT ( 35): AT> AT+WTKM=1,1
D/AT ( 35): AT< OK
D/RILJ ( 104): [0058]< REQUEST_STK_SEND_TERMINAL_RESPONSE
D/AT ( 35): AT< +WTKP:12,10001,4,313031,8,8077ED4FE153D190014E2D202600
D/RILJ ( 104): [UNSL]< UNSOL_STK_PROACTIVE_COMMAND d02a7f8001030013007f80050531303030317f800d04043130317f80050e8077ed4fe153d190014e2d202600
D/STK ( 104): CommandParamsFactory: address.text =========================10001
D/STK ( 104): CommandParamsFactory: content.text =========================101
D/STK ( 104): CommandParamsFactory: displayText.text =======================短信发送中…
E/SMS ( 104): sendRawPdu parsePdu: destination = 10001
D/SMS ( 104): SMS send size=1time=1300875739155
D/RILJ ( 104): [0059]> RIL_REQUEST_CDMA_SEND_SMS
D/RILD ( 35): onRequest: CDMA_SEND_SMS
D/RILD ( 35): send sms da: 10001
D/RILD ( 35): CDMA SMS encoding 2
D/AT ( 35): AT> AT+CNMI=1,2,0,1,1
//
32 read sms from uim 12345678900 hello
D/RILD ( 830): onRequest: SIM_IO
D/AT ( 830): AT> AT^HCMGR=1
D/AT ( 830): AT< ^HCMGR: 13671835306,2009,01,01,00,00,00,0,1,5,0,0,0,1
D/AT ( 830): AT< Hello
D/AT ( 830): Get UIM SMS ind: ^HCMGR: 13671835306,2009,01,01,00,00,00,0,1,5,0,0,0,1
D/AT ( 830): Get UIM SMS hex pdu: 48656c6c6f1a
D/AT ( 830): AT< OK
D/RILD ( 830): p_response->p_intermsdiates->line ========= ^HCMGR: 13671835306,2009,01,01,00,00,00,0,1,5,0,0,0,1
D/RILD ( 830): Hello.........ghd
D/RILJ ( 96): < iccIO:
0x90 0x0 01 33 | 00 03 100000 | 01 06 102c8cbb366f | 02 01 01 | 03 06 090101000000| 08 01 00 |
09 01 00 | 0d 01 00 | 0e 0d 910b3133363731383335333036 | 0f 01 40
32 write sms to uim
D/CDMA ( 96): [RuimSmsInterfaceManager] copyMessageToIccEf: status=1 ==> pdu=([B@444f4e48)
D/RILJ ( 96): [0177]> RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 1
D/RILD ( 28): onRequest: CDMA_WRITE_SMS_TO_RUIM
D/AT ( 28): AT> AT^HCMGW="13671835306",0,1,0,0,1,0,2009,1,1,0,0,0
D/AT ( 28): AT< >
D/AT ( 28): AT> Hello^Z
D/AT ( 28): AT< ^HCMGW: 0
D/AT ( 28): AT< OK
D/RILJ ( 96): [0177]< RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM {0}
D/SmsProvider( 105): smsBytes ..======= ghd 41545e48434d47573d223133363731383335333036222c302c312c302c302c312c302c323030392c312c312c302c302c302c300d48656c6c6f1a
D/CDMA ( 105): [RuimSmsInterfaceManager] copyMessageToIccEf: status=1 ==> pdu=([B@444de330)
D/RILJ ( 105): [0065]> RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 1
D/RILD ( 35): onRequest: CDMA_WRITE_SMS_TO_RUIM
D/AT ( 35): AT> AT^HCMGW="13671835306",0,1,0,0,1,0,2009,1,1,0,0,0,0
D/AT ( 35): AT< +CSQ: 26,99
D/RILD ( 35): dbm level 3
D/RILD ( 35): cdmaDbm_backlog 1
D/AT ( 35): AT< +CMS ERROR: operation not supported
E/RILD ( 35): Write CDMA SMS to UIM card failed!
D/RILJ ( 105): [0065]< RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM error: com.android.internal.telephony.CommandException: GENERIC_FAILURE
W/InputManagerService( 56): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4473b548
CDMA
99
write SIM
//write.................. hello
D/++++++++++++++++++++++++++++++++++++++++++( 219): 5
D/++++++++++++++++++++++++++++++++++++++++++( 219): 1
D/sunruijian/SmsProvider( 219): ++++++++++++++++++++++++++++++++++++++++smsBytes =0891683108100005f004098121436587f900001110320154132305c8329bfd06
D/GSM ( 219): [SimSmsInterfaceManager] copyMessageToIccEf: status=1 ==> pdu=([8, -111, 104, 49, 8, 16, 0, 5, -16, 4, 9, -127, 33, 67, 101, -121, -7, 0, 0, 17, 16, 50, 1, 84, 19, 35, 5, -56, 50, -101, -3, 6]), smsm=(null)
D/RILJ ( 219): [0332]> WRITE_SMS_TO_SIM 1
D/RILC ( 73): [qcril.c 2070] UI --- RIL_REQUEST_WRITE_SMS_TO_SIM (63) ---> RIL [token id 332, data len 12]
D/RILC ( 73): [qcril_reqlist.c 169] Not found ReqList entry : token id 332
D/RILC ( 73): [qcril_reqlist.c 400] Event RIL_REQUEST_WRITE_SMS_TO_SIM (63) pending receipt of WMS_MSG_EVENT_WRITE, token id 332 [0x2d618]
read SIM
TIA/EIA-637-A 3.4.3.3 等同与UTK TPDU 段
ptp TeleserviceID Originating Address(10659165) bearerdata
03 3e | 00 | 00 02 1002 | 02 06 020699645940 | 06 01 fc | 08 2c 00 03 1077b0 | 01 1a 20600188017801b2c823a032716bb42002800290026337a32d80 | 03 06 11 04 08 09 45 09 | 0a 01 40
01 ac 00 00 02 1002 | 02 07 02c69964450684 | 06 01 fc |08 99 00 03 107e60 | 01 84220a98ba75628fd44262a08adfe001d27652c94a000000000000000000000
write UIM
read UIM
send gsm sms
receiver gsm sms
send cdma sms
receiver cdma sms
SmsMessage.newFromParcel();
18901339893
00000000 00001002 00000000 00 00 00 00 0b 3138393031333339383933 00000000 00 00 00 00000016 00 03 100c60 | 01 04
阿 11-03-30-11-19-54
200cb1f8 | 03 06 110330111954 | 09 01 00
qcril 读UIM卡短信的完整LOG如下:
D/RILJ ( 625): [0509]< SIM_IO IccIoResponse sw1:0x90 sw2:0x0
D/RILJ ( 625): [0510]> iccIO: SIM_IO 0xb2 0x6f3c path: 3F007F25,1,4,255, null, null
D/RILC ( 80): [qcril.c 2089] UI --- RIL_REQUEST_SIM_IO (28) ---> RIL [token id 510, data len 32]
D/RILC ( 80): [qcril_mmgsdi_common.c 3004] qcril_mmgsdi_request_sim_io(178, 28476, 3F007F25, 1, 4, 255, NULL, NULL)
D/RILC ( 80): [qcril_reqlist.c 169] Not found ReqList entry : token id 510
D/RILC ( 80): [qcril_reqlist.c 400] Event RIL_REQUEST_SIM_IO (28) pending receipt of <none>, token id 510 [0x2b688]
D/RILC ( 80): [qcril_reqlist.c 1065] ReqList entries :
D/RILC ( 80): [qcril_reqlist.c 1071] RIL_REQUEST_SIM_IO (28), token id 510
D/RILC ( 80): [qcril_mmgsdi_common.c 932] parse_ef_path(fileid=0x6f3c, path_ptr=3F007F25)
D/RILC ( 80): [qcril_mmgsdi_common.c 959] parse_ef_path: unsupported path: 3F007F25
D/RILC ( 80): [qcril_mmgsdi_common.c 869] Path:
D/RILC ( 80): [qcril_mmgsdi_common.c 777] parse_hex_ascii(path=3F007F25)
D/RILC ( 80): [qcril_mmgsdi_common.c 877] 3F00
D/RILC ( 80): [qcril_mmgsdi_common.c 777] parse_hex_ascii(path=7F25)
D/RILC ( 80): [qcril_mmgsdi_common.c 877] 7F25
D/RILC ( 80): [qcril_mmgsdi_common.c 777] parse_hex_ascii(path=)
D/RILC ( 80): [qcril_mmgsdi.c 1108] qcril_mmgsdi_command_callback: cnf = 0x4, status = 0x0
D/RILC ( 80): [qcril_mmgsdi.c 1120] qcril_mmgsdi_command_callback qcril_event_queue2
D/RILC ( 80): [qcril_event.c 407] Queued event MMGSDI_COMMAND_CALLBACK (516 bytes)
D/RILC ( 80): [qcril_event.c 290] qcril_event_main(): 1 items on queue
D/RILC ( 80): [qcril_event.c 311] De-queued event MMGSDI_COMMAND_CALLBACK (196609)
D/RILC ( 80): [qcril.c 2236] RIL <--- MMGSDI_COMMAND_CALLBACK (196609) --- AMSS
D/RILC ( 80): [qcril_mmgsdi.c 4282] qcril_mmgsdi_process_command_callback: QCRIL_EVT_MMGSDI_COMMAND_CALLBACK
D/RILC ( 80): [qcril_mmgsdi_common.c 3378] qcril_mmgsdi_common_simio_read_cnf
D/RILC ( 80): [qcril_mmgsdi_common.c 3395] RIL_SIM_IO_Response: sw1=144 sw2=0 data=07b10000021002040702c699644506840601fc089e0003200020018c222a98ba75628fd44262a08adfe001d27652c94ac8e4afa4b1acb740016270e29abcc670018801680193f538016338027a7360a371480190018af53001db3072c94bb3eac94cb1acb740016270e29abcc6700193f53801600190019291800198018af5300173e95ac8b3f5fc7c82e022c94b60a00162c8b28fd32fb2f7d45d736c13273315240522a60801700501f5030611072011062300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
D/RILC ( 80): [qcril_mmgsdi.c 195] mmgsdi status 0x0 -> RIL_E_SUCCESS
D/RILC ( 80): [qcril_reqlist.c 160] Found ReqList entry : RIL_REQUEST_SIM_IO (28), token id 510
D/RILC ( 80): [qcril_reqlist.c 160] Found ReqList entry : RIL_REQUEST_SIM_IO (28), token id 510
D/RILC ( 80): [qcril_reqlist.c 599] Deleted ReqList entry : token id 510 [0x2b688]
D/RILC ( 80): [qcril_reqlist.c 1061] ReqList entries : Empty
D/RILC ( 80): [qcril.c 3668] UI <--- RIL_REQUEST_SIM_IO (28) Complete --- RIL [Token 510, RIL_E_SUCCESS, Len 12 ]
D/RILC ( 80): [qcril.c 2264] Exit qcril_process_event() : MMGSDI_COMMAND_CALLBACK, err_no 0
D/RILC ( 80): [qcril_event.c 273] qcril_event_main(): Waiting...
D/RILJ ( 625): < responseICC_IO: 0x90 0x0 07b10000021002040702c699644506840601fc089e0003200020018c222a98ba75628fd44262a08adfe001d27652c94ac8e4afa4b1acb740016270e29abcc670018801680193f538016338027a7360a371480190018af53001db3072c94bb3eac94cb1acb740016270e29abcc6700193f53801600190019291800198018af5300173e95ac8b3f5fc7c82e022c94b60a00162c8b28fd32fb2f7d45d736c13273315240522a60801700501f5030611072011062300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
D/RILJ ( 625): [0510]< SIM_IO IccIoResponse sw1:0x90 sw2:0x0