1>初始化:ATZ\r
2>設置文本模式:AT+CMGF=0\r(0:pdu模式,1:text模式)
3>設置PDU頭:
typedef struct {
char SCA[16]; // 短消息服務中心號碼(SMSC地址)
char TPA[16]; // 目標號碼或回復號碼(TP-DA或TP-RA)
char TP_PID; // 用戶信息協議標識(TP-PID)
char TP_DCS; // 用戶信息編碼方式(TP-DCS)
char TP_SCTS[16]; // 服務時間戳字符串(TP_SCTS), 接收時用到
char TP_UD[16]; // 原始用戶信息
char index; //短消息序號,在讀取時用到
}SM_PARAM;
// SMSC地址信息段
memset(buf, 0, sizeof(buf));
nLength = strlen(pSrc->SCA); // SMSC地址字符串的長度
buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息長度
buf[1] = 0x91; // 固定: 用國際格式號碼
nDstLength = gsmBytes2String(buf, pDst, 2); // 轉換2個字節到目標PDU串
nDstLength += gsmInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 轉換SMSC到目標PDU串
// TPDU段基本參數、目標地址等
memset(buf, 0, sizeof(buf));
nLength = strlen(pSrc->TPA); // TP-DA地址字符串的長度
buf[0] = 0x11; // 是發送短信(TP-MTI=01),TP-VP用相對格式(TP-VPF=10)
buf[1] = 0; // TP-MR=0
buf[2] = (char)nLength; // 目標地址數字個數(TP-DA地址字符串真實長度)
buf[3] = 0x91; // 固定: 用國際格式號碼
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4); // 轉換4個字節到目標PDU串
nDstLength += gsmInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 轉換TP-DA到目標PDU串
// TPDU段協議標識、編碼方式、用戶信息等
//nLength = strlen(pSrc->TP_UD); // 用戶信息字符串的長度
memset(buf, 0, sizeof(buf));
buf[0] = pSrc->TP_PID; // 協議標識(TP-PID)
buf[1] = pSrc->TP_DCS; // 用戶信息編碼方式(TP-DCS)
buf[2] = 1; // 有效期(TP-VP)為5分鐘
buf[3] = str2hex(user_pdu, pSrc->TP_UD); //用戶信息的長度
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4); // 轉換該段數據到目標PDU串
strcat(pdu, "\x01a"); //以CTRL-A結束
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息長度
4>發送信息長度:AT+CMGS=長度,這步重要長度不對是發不出去的。
5>發送用戶信息
1、目前,發送短消息常用Text和PDU(Protocol Data Unit,協議數據單元)模式。
1>使用Text模式收發短信代碼簡單,實現起來十分容易,但最大的缺點是不能收發中文短信;
2>使用PDU模式不僅支持中文短信,也能發送英文短信。
2、PDU模式收發短信可以使用3種編碼:
1>7-bit(用於發送普通的ASCII字符,它將壹串7-bit的字符(最高位為0)編碼成8-bit的數據,每8個字符可 “壓縮”成7個)
2>8-bit(通常用於發送數據消息,如:圖片了,鈴聲等等)
3>UCS2編碼(用於發送Unicode字符)