2025年5月22日 星期四

Send SMS via AT commands

Module:
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簡訊詳解

沒有留言:

張貼留言