Telit LN920A06
def text_to_ucs2_hex(text):
return text.encode('utf-16-be').hex().upper()
def encode_phone_number(number):
# 處理台灣號碼,如 0966123456 → +886966123456
if number.startswith('0'):
number = '886' + number[1:]
elif number.startswith('+'):
number = number[1:]
if len(number) % 2 != 0:
number += 'F'
swapped = ''.join([number[i+1] + number[i] for i in range(0, len(number), 2)])
return swapped, len(number)
def generate_pdu_and_cmgs(phone, message):
# UCS2 編碼
ucs2 = text_to_ucs2_hex(message)
ucs2_len = len(ucs2) // 2 # bytes
# 編碼電話號碼
phone_enc, phone_digits = encode_phone_number(phone)
phone_len_hex = f"{phone_digits:X}".zfill(2)
# 組合 PDU
smsc = "00"
pdu_type = "11"
mr = "00"
toa = "91"
pid = "00"
dcs = "08"
vp = "AA" # 約 4 天
udl = f"{ucs2_len:02X}"
pdu_body = (
pdu_type + mr + phone_len_hex + toa + phone_enc +
pid + dcs + vp + udl + ucs2
)
full_pdu = smsc + pdu_body
# CMGS = 從 PDU_TYPE 開始的長度(即去掉 SMSC 的 "00" 開頭,長度為 1 byte = 2 hex)
cmgs_len = (len(full_pdu) - 2) // 2
return full_pdu, cmgs_len
# 測試
phone = "0966123456"
message = "哈囉世界"
pdu, cmgs_len = generate_pdu_and_cmgs(phone, message)
print(f"AT+CMGF=0")
print(f"AT+CMGS={cmgs_len}")
print(pdu)
ref:1. GSM Modem 傳送簡訊的幾個 AT 指令
2. GPRS應用之: AT指令發送PDU簡訊詳解
沒有留言:
張貼留言