理解SMS PDU模式:AT指令详解与示例

需积分: 10 3 下载量 126 浏览量 更新于2024-08-02 收藏 114KB DOC 举报
"本文主要介绍了AT指令以及SMS PDU模式在短信通信中的应用,适合对嵌入式系统、物联网设备或GSM模块进行短信控制的开发者。内容包括设置指令、短信文本模式和PDU模式的使用,以及PDU的基本组成元素和相关AT指令的实例。" AT指令是通用分组无线服务(GSM)中用于控制调制解调器或其它支持GSM通讯的设备的一种命令集。这些指令基于ASCII文本,允许用户配置和操作设备,如设置网络参数、发送和接收短信等。 SMS PDU(Protocol Data Unit)模式是短信通信的二进制格式,适用于更复杂的短信操作,如包含特殊字符、多部分消息或编码非拉丁字符。在这种模式下,短信被编码为一系列的八位字节,以便在GSM网络中传输。 1. **服务中心号码(+CSCA)**: 这个指令用于设置短消息服务中心(SMSC)的电话号码,SMSC是短信的中转站,负责转发短信到目标手机。 2. **选择消息服务(+CSMS)**: 该指令用于选择短信服务的模式,可以是PDU模式或文本模式。 3. **选择消息格式(+CMGF)**: 这个AT命令用于切换短信的发送格式,0表示PDU模式,1表示文本模式。 在**SMS文本模式**下,短信以人类可读的形式发送,而**SMSPDU模式**则需要将短信转换为特定的二进制格式,包括: - **发送方SMS-Submit**: 包括向SIM卡存储区写入SMS (+CMGW),发送SIM卡中的SMS (+CMSS) 和直接通过终端设置发送SMS (+CMGS)。 - **接收方SMS-DELIVER**: 包括列出、读取和删除SIM卡上的接收到的短信。 PDU的基本组成元素包括: - **PDU Type**: 表示短信类型,如提交或送达。 - **MR信息参考**: 用于跟踪和确认短信。 - **DA/OA**: 接收方和发送方的地址编码。 - **PID协议标识**: 识别短信使用的编码标准。 - **DCS数据编码方案**: 描述短信的数据编码,如7位ASCII、8位字节或16位UCS2。 - **VP信息有效期**: 确定短信的有效时间。 - **SCTS服务中心时间戳**: 记录短信在服务中心的时间。 - **UDL用户数据长度**: 表示用户数据部分的字符数量。 文章还提供了**常用AT指令**的列表和**PDU操作实例**,帮助开发者了解如何实际操作这些指令。例如,如何连接手机、准备发送PDU SMS以及处理不同的错误代码。此外,还提到了**SMS编码方案**,这对于处理不同语言和字符集的短信至关重要。 这篇文章对于需要使用AT指令和SMS PDU模式进行GSM通信的开发者来说是一份宝贵的参考资料,它涵盖了从基础设置到实际操作的所有关键步骤。
2023-07-14 上传

解释下面代码static UINT8 libTXT2PDU( UINT8* msgData, UINT16 msgLen, UINT8* pTpdu, AtciMsgInfo *pAtSmsMessage, AtciCharacterSet chset_type ) { UINT8 offset = 0; UINT16 len=0; //CPUartLogPrintf("%s: enter", __FUNCTION__); //int i; //for(i=0;i<msgLen;i++) //CPUartLogPrintf("%s: msgData[%d] %d 0x%x", __FUNCTION__, i, msgData[i], msgData[i]); /* Copy the first octet */ /*SIMCom xiaokai.yang sync sms code @2023-02-06 begin*/ #ifdef FEATURE_SIMCOM_SMS char headbuf[PDU_HEAD_SIZE] = {0x05,0x00,0x03}; scCmssexInfoT* p_CmgsexInfo = (scCmssexInfoT*)getCmgsexInfoInd(); if(pAtSmsMessage->udhPresent) { pTpdu[ offset++ ] = (pAtSmsMessage->fo)|(0x1<<6); } else #endif /*SIMCom xiaokai.yang sync sms code @2023-02-06 end*/ pTpdu[ offset++ ] = pAtSmsMessage->fo; /* Message Reference */ pTpdu[ offset++ ] = pAtSmsMessage->msgRef; /* Originating Address (TP-OA) */ { UINT8 idx; UINT8 *data; data = pTpdu + offset; /* Set the Address Length octet */ *data++ = strlen( (char *)pAtSmsMessage->destAddr ); #ifdef FEATURE_SIMCOM_SMS PAL_LogIo(SC_MODULE_SMS,PAL_DBG_LEVEL_INFO,"destAddr [%s]",( (char *)pAtSmsMessage->destAddr )); #endif /* Format the TON/NPI octet */ *data++ = (UINT8)((pAtSmsMessage->addrType << 4) | pAtSmsMessage->addrPlan | 0x80); /* Format the BCD digits */ for ( idx = 0; idx < strlen( (char *)pAtSmsMessage->destAddr ); idx++ ) { libPutPackedBcd( data, idx, pAtSmsMessage->destAddr[ idx ], TRUE ); } /* check if we need to tack on a filler */ if( idx & 0x01 ) { /* Yup -- do it! , reversed nibbles */ libPutPackedBcd( data, idx, ATCI_BCD_FILLER, TRUE ); ++idx; } /* We're done -- update the PDU byte index */ offset += idx/2 + ATCI_SMS_BCD_POS; } /* Protocol Identifier (TP-PID) */ pTpdu[ offset++ ] = pAtSmsMessage->pid; /* Data Coding Scheme (TP-DCS) */ pTpdu[ offset++ ] = pAtSmsMessage->dcs; if(((pAtSmsMessage->fo&ATCI_TP_MTI_MASK)==ATCI_SMS_SUBMIT_MTI)&&((pAtSmsMessage->fo&ATCI_SMS_TP_VPF)==0x10)) { pTpdu[ offset++ ] = pAtSmsMessage->vp; } /*SIMCom xiaokai.yang sync sms code @2023-02-06 begin*/ #ifdef FEATURE_SIMCOM_SMS if(pAtSmsMessage->udhPresent) { headbuf[3] = p_CmgsexInfo->mr; headbuf[4] = p_CmgsexInfo->msg_total; headbuf[5] = p_CmgsexInfo->msg_seg; memmove(msgData+PDU_HEAD_SIZE,msgData,msgLen); memcpy(msgData, headbuf, PDU_HEAD_SIZE); msgLen+=PDU_HEAD_SIZE; } PAL_LogIo(SC_MODULE_SMS,PAL_DBG_LEVEL_INFO,"offset1 [%d],msgLen=%d",offset,msgLen);//274 #endif /*SIMCom xiaokai.yang sync sms code @2023-02-06 end*/ /* Now for the Message Data (TP-UDL + TP-UD) */ //ScShowDataByHex((char *)pTpdu, offset); //CPUartLogPrintf("[sms]msgLen=%d",msgLen); libMsgEncodeUserData( pAtSmsMessage->udhPresent, pAtSmsMessage->dcs, pTpdu, msgData, msgLen, offset, &len,chset_type); return len; }

2023-06-08 上传