Skip to content
LIVE FEED

BlogSMPP mang OTA — Tài liệu tham chiếu đầy đủ

SMPP mang OTA — Tài liệu tham chiếu đầy đủ

Tổng hợp cấu trúc một bản tin SMPP submit_sm mang OTA Command Packet, map đủ 4 tầng: SMPP → SMS TPDU (TP-PID…) → OTA Command Packet → APDU. Kèm ví dụ byte thật, kiểm tra chéo mọi trường độ dài.


0. Bức tranh 4 tầng lồng nhau

┌─ TẦNG 1: SMPP submit_sm (ESME → SMSC, chạy trên TCP/IP) ──────────┐
│  Header 16 byte + Body (source, dest, protocol_id, data_coding…)   │
│  ┌─ TẦNG 2: SMS TPDU (SMSC dựng ra, chở qua SS7/MAP) ───────────┐  │
│  │  TP-PID, TP-DCS, TP-UDHI, TP-UD …                            │  │
│  │  ┌─ TẦNG 3: OTA Command Packet (TS 23.048/31.115) ────────┐  │  │
│  │  │  CPL CHL SPI KIc KID TAR CNTR PCNTR [CC]               │  │  │
│  │  │  ┌─ TẦNG 4: APDU (ISO 7816-4) ────────────────────┐    │  │  │
│  │  │  │  SELECT / UPDATE BINARY …  (lệnh thật cho SIM)  │    │  │  │
│  │  │  └────────────────────────────────────────────────┘    │  │  │
│  │  └───────────────────────────────────────────────────────┘  │  │
│  └─────────────────────────────────────────────────────────────┘  │
└────────────────────────────────────────────────────────────────────┘

Nguyên tắc lồng nhau: SMPP là xe tải, SMS/UDH là nhãn “giao cho SIM”, OTA là kiện hàng niêm phong, APDU là món đồ bên trong.


1. VÍ DỤ XUYÊN SUỐT

Kịch bản: hệ thống OTA ghi lại tên nhà mạng hiển thị (file EF_SPN = 6F46) trên SIM của thuê bao 84981111111. Gói không bảo mật (no-security) cho dễ đọc.

PDU đầy đủ (hex)

0000005900000004000000000000010A0005004F544153657276657200
0101383439383131313131313100407F0000000100F60024
027000001F0D00000000A1B2C3000000000100A0A40000026F46A0D60000050056494554

short_message (hex)

027000001F0D00000000A1B2C3000000000100A0A40000026F46A0D60000050056494554
  • sm_length = 36 (0x24)
  • command_length = 89

2. Bảng A — TẦNG 1: SMPP PDU (Header + Body)

TrườngByteGiá trị ví dụÝ nghĩa
command_length400 00 00 5989 — tổng độ dài, tự tính
command_id400 00 00 04submit_sm
command_status400 00 00 000 trong request
sequence_number400 00 01 0A266 — vé ghép với response
service_typeC-str00rỗng
source_addr_ton/npi205 0005 = Alphanumeric (brandname)
source_addrC-str"OTAServer" 00nguồn
dest_addr_ton/npi201 01quốc tế / E.164
destination_addrC-str"84981111111" 00UE A chứa SIM
esm_class140bật UDHI → map sang TP-UDHI
protocol_id17F→ TP-PID
priority_flag100thường
schedule_delivery_timeC-str00gửi ngay
validity_periodC-str00mặc định
registered_delivery101xin DLR/PoR
replace_if_present100không thay
data_coding1F6→ TP-DCS
sm_default_msg_id100không dùng
sm_length12436 — độ dài short_message, tự tính
short_message36(bảng C)UDH + OTA

3. Bảng B — Map SMPP → SMS TPDU (chỗ TP-PID nằm) ★

SMPP không truyền SMS thô. SMSC lấy trường SMPP dựng thành SMS-DELIVER TPDU, rồi nhét TPDU vào tham số SM-RP-UI của MAP MT-ForwardSM để chở qua SS7.

Trường SMPPGiá trị→ Trường SMS (TS 23.040)Giá trịVai trò
protocol_id7FTP-PID7F“SIM Data Download” — dữ liệu cho SIM
data_codingF6TP-DCSF68-bit + message class 2 = riêng cho SIM
esm_class bit640TP-UDHIbit = 1TP-UD mở đầu bằng UDH
destination_addr8498…TP-DA0B 91 48 89…F1Số nhận, semi-octet đảo
source_addrOTAServerTP-OA(SMSC dựng)Số/tên gửi
short_message027000…TP-UD027000…UDH + payload
sm_length24TP-UDL24Độ dài User Data

Bộ ba “gửi cho SIM, không hiện màn hình”: TP-PID = 7F + TP-DCS class 2 + TP-UDHI = 1. Thiếu một là phone xử lý sai.

Vị trí TP-PID trong MAP MT-ForwardSM

MAP: MT-ForwardSM              ← phong bì định tuyến (IMSI, địa chỉ SMSC…)
 └─ SM-RP-UI                   ← tham số chở payload
     └─ SMS-DELIVER TPDU       ← lá thư
         ├─ TP-PID = 7F   ★
         ├─ TP-DCS = F6
         └─ TP-UD  = UDH + OTA

MAP MT-ForwardSM tự nó không có “trường TP-PID”; TP-PID nằm trong TPDU được đóng gói nguyên khối trong SM-RP-UI.


4. Bảng C — TẦNG 2→3: bóc short_message từng byte

02 70 00 | 00 1F | 0D | 00 00 | 00 | 00 | A1 B2 C3 | 00 00 00 00 01 | 00 | A0A40000026F46 | A0D60000050056494554
OffsetByteTầngTrườngÝ nghĩa
002SMS/UDHUDHLUDH dài 2 byte
170SMS/UDHIEICommand Packet (chiều về = 71)
200SMS/UDHIEDLkhông dữ liệu phụ
3–400 1FOTACPL31 — độ dài phần còn lại
50DOTACHL13 — độ dài header bảo mật
6–700 00OTASPIkhông mã hoá, không ký
800OTAKIcchỉ số khoá mã hoá
900OTAKIDchỉ số khoá chữ ký
10–12A1 B2 C3OTATARapplet đích trên SIM
13–1700 00 00 00 01OTACNTRchống phát lại = 1
1800OTAPCNTR0 byte đệm
19–25A0A40000026F46APDUSELECTbảng E
26–35A0D6…56494554APDUUPDATEbảng E

Kiểm tra chéo: 3 (UDH) + 2 (CPL) + 31 (CPL khai) = 36 = sm_length ✓ · CHL = SPI..PCNTR = 2+1+1+3+5+1 = 13 ✓


5. Bảng D — TẦNG 3: các trường OTA Command Packet (TS 23.048 / 31.115)

TrườngĐộ dàiBắt buộc?Ghi chú
CPL2có= số byte đứng sau CPL
CHL1có= SPI đến hết CC
SPI2cóchính sách bảo mật (bảng F)
KIc1cóchỉ số + thuật toán mã hoá
KID1cóchỉ số + thuật toán chữ ký
TAR3cóđịa chỉ applet; 000000 = card manager
CNTR5cóchống phát lại
PCNTR1cósố byte padding
RC/CC/DS0..ntuỳ SPIchữ ký; rỗng nếu no-security
Secured Databiến đổicóAPDU hoặc dữ liệu applet

6. Bảng E — TẦNG 4: bóc APDU (ISO 7816-4 / TS 51.011)

APDUCLAINSP1P2LcDataNghĩa
A0 A4 00 00 02 6F46A0 GSMA4 SELECT0000026F46Mở file EF_SPN (tên nhà mạng)
A0 D6 00 00 05 00 56494554A0D6 UPDATE BINARY00000500+“VIET”Ghi 5 byte từ đầu file

Ghi chú CLA: SIM 2G dùng A0; USIM 3G/4G dùng 00.

Vài file EF thường gặp

MãFileNội dung
6F46EF_SPNTên nhà mạng hiển thị
6F07EF_IMSISố nhận dạng thuê bao
6F3AEF_ADNDanh bạ trên SIM
6F30EF_PLMNselDanh sách mạng ưu tiên
6FADEF_ADDữ liệu quản trị

7. Bảng F — Giải mã SPI / KIc / KID khi BẬT bảo mật

TrườngBitÝ nghĩa khi = 1
SPI byte 1b0–b101 = có RC, 10 = có CC, 11 = có DS (chữ ký)
SPI byte 1b2có mã hoá
SPI byte 1b3–b4kiểm tra CNTR (chống phát lại)
SPI byte 2b0yêu cầu PoR
SPI byte 2b1–b2PoR có CC/DS
KIcb0–b1thuật toán: 01=DES, 10=AES
KIcb2–b3chế độ (00=CBC…)
KIcb4–b7chỉ số bộ khoá
KIDnhư KIcdùng cho khoá chữ ký

Khoá thật (giá trị DES/AES) nạp vào SIM lúc cá thể hoá, chỉ có ở SIM và hệ thống quản lý khoá của nhà mạng — không bao giờ truyền trên mạng.


8. Bảng G — Chuỗi phản hồi

Bản tinChiềuNội dungÝ nghĩa
submit_sm_respSMSC → ESMEseq 010A, status 0, message_idSMSC đã nhận, chưa nói gì về SIM
PoR (Response Packet)SIM → OTAUDH 71, TAR, CNTR, statusKết quả thật trên SIM

Mã status PoR hay gặp: 00 thành công · 01 sai CC/RC · 02 sai CNTR · 06 TAR không tồn tại.


9. Bảng H — Đối chiếu 2 kịch bản OTA

Ghi file (RFM)Kích SIM gửi SMS (Warehouse)
TAR000000 card managerapplet riêng, vd B00010
Secured Data chứaAPDU (A0A4, A0D6)số UE B + text (dữ liệu applet)
SIM làm gìghi vào file EFphát proactive SEND SHORT MESSAGE
APDU tầng ME↔SIMENVELOPE giao góiENVELOPE + FETCH + TERMINAL RESPONSE

Ví dụ kịch bản Warehouse (gửi “He Thong Binh Thuong” tới UE B 84982222222)

Gói OTA trên dây (lớp 1):

short_message =
02 70 00                UDH: Command Packet
00 2E                   CPL = 46
0D                      CHL = 13
00 00 00 00             SPI, KIc, KID
B0 00 10                TAR = applet Warehouse
00 00 00 00 01          CNTR = 1
00                      PCNTR
── Secured Data (applet đọc) ──
0B                      độ dài số UE B = 11
38 34 39 38 32 32 32 32 32 32 32   "84982222222" (ASCII)
48 65 20 54 68 6F 6E 67 …          "He Thong Binh Thuong"

Proactive command applet tự dựng (lớp 2):

D0 2C                   Proactive command, 44 byte
  81 03 01 13 00        Command details: type 13 = SEND SHORT MESSAGE
  82 02 81 83           Device identities: SIM → Network
  8B 21 <SMS-SUBMIT>    SMS TPDU tới UE B
     01 00              SMS-SUBMIT, TP-MR
     0B 91 48 89 22 22 22 F2   TP-DA = 84982222222 (semi-octet đảo)
     00 04 14           TP-PID, TP-DCS(8-bit), TP-UDL=20
     48 65 20 …         "He Thong Binh Thuong"

Luồng APDU tầng ME↔SIM:

1. ME→SIM : A0 C2 00 00 Lc … ENVELOPE (giao OTA vào SIM)
2. SIM→ME : SW = 91 2E        (có proactive command 46 byte)
3. ME→SIM : A0 12 00 00 2E    FETCH → nhận D0 2C … SEND SHORT MESSAGE
   → điện thoại A phát SMS tới UE B
4. ME→SIM : A0 14 00 00 Lc … TERMINAL RESPONSE (result 83 01 00 = OK)

10. Nguyên tắc mã hoá số điện thoại (TS 23.040 §9.1.2.5)

Số nằm ở đâuQuy tắc
Trường địa chỉ SMS (TP-DA / TP-OA / SCA, Address TLV, SMS TPDU)BẮT BUỘC: length(số chữ số) + TON/NPI + semi-octet đảo nibble + đệm F nếu lẻ
Secured Data (dữ liệu ứng dụng của applet)TỰ DO: ASCII / BCD / nhị phân — server và applet tự thống nhất

Ví dụ 84982222222 (11 số, quốc tế): 0B (11) + 91 (quốc tế/E.164) + đảo 84→48, 98→89, …, 2F→F2 = 0B 91 48 89 22 22 22 F2

Ngoại lệ: TON = alphanumeric (101, vd “OTAServer”) → Address-Value là chuỗi đóng gói GSM 7-bit, không phải BCD đảo.


11. Ba quy tắc vàng

  1. Bộ định tuyến “gửi cho SIM” — protocol_id(→TP-PID) = 7F, data_coding(→TP-DCS) = class 2, esm_class(→TP-UDHI) = bật — nằm ở tầng SMPP/SMS, KHÔNG thuộc gói OTA.
  2. OTA bắt đầu sau UDH (từ byte CPL); và sm_length, CPL, CHL, command_length phải luôn tự nhất quán.
  3. Đảo nibble + đệm F chỉ áp dụng cho trường địa chỉ SMS (TS 23.040); trong Secured Data thì format do applet quy định.

12. protocol_id ↔ TP-PID — quan hệ chi tiết

protocol_id (SMPP) và TP-PID (SMS) là hai tên cho cùng một byte ý nghĩa. SMPP được thiết kế phản chiếu SMS TPDU nên SMSC dịch gần như một-đổi-một:

SMPP (SMSC nhận)SMS-DELIVER TPDU (SMSC gửi qua MAP)Quan hệ
protocol_id 7FTP-PID 7Fcopy thẳng
data_coding F6TP-DCS F6copy thẳng
esm_class bit UDHITP-UDHI bitánh xạ bit
short_messageTP-UDcopy thẳng
destination_addrTP-DAđổi sang semi-octet đảo

Chiều ngược (MO / PoR): MSC bọc SMS-SUBMIT TPDU vào MO-ForwardSM → SMSC → deliver_sm, protocol_id lấy lại từ TP-PID.


Tài liệu tổng hợp cho mục đích học tập. Các giá trị timestamp (TP-SCTS) và địa chỉ SMSC trong ví dụ ENVELOPE là minh hoạ; cấu trúc TLV và số byte thì chính xác.

Contact
Facebook
TOP