短信PDU编码详解:Android开发中的关键参考

需积分: 14 1 下载量 179 浏览量 更新于2024-09-17 收藏 11KB TXT 举报
SMS短信PDU编码是移动通信中一种重要的技术,特别是在Android等移动设备应用开发过程中,它对于理解和处理短消息服务(Short Message Service)的传输数据至关重要。PDU,即Protocol Data Unit,是网络通信中的数据单元,负责承载和封装短信的信息内容。在短信应用开发时,对SMS PDU的编码规则有明确的要求,以便正确发送和接收短信。 短信PDU通常包含以下几个部分: 1. **TextPDU**: 这是最基础的短信类型,使用文本格式(Text PDU Type),字符编码可能采用7-bit ASCII或8-bit UCS2(Unicode)。例如,'ABCD'这样的四字符信息,每个字符占用1到2个字节,具体取决于编码方式。 2. **地址和路由信息**:这部分包括SMSC(Short Message Service Center)的地址以及发送方和接收方的号码。如"SMSC + 8613800250500"代表短信中心的号码,而"8613693092030"则是接收方号码。 3. **消息头(TP-MTI, TP-VP等)**:这些字段用于指示消息类型、消息来源、目的地址和其它控制信息,比如时间戳、错误检测、优先级等。 4. **编码格式**:短信内容通常按照特定的编码方式进行处理,如7-bit或8-bit编码。对于较长的文本,可能会进行分段传输,每个部分都有其特定的标识符。 5. **加密与解码**:在某些情况下,如上述例子中的"TP-PID"字段表示的GSM加密机制,可能需要对短信内容进行加密,以确保数据的安全性。 6. **终结标志和填充**:例如,'F011'和'F084'可能是结束标志,用来标记PDU的结束,而'F0'后的数字可能是填充位,用于保持PDU长度的整数倍。 举例来说,一个完整的PDU如"M0891683108200505F011000D91683196032930F000000006C8329BFD0E01"包含了SMSC、发送者和接收者的号码、消息类型、编码格式、数据内容等信息。在实际开发中,开发者需要了解这些结构,以便正确解析和生成PDU,实现短信的发送和接收功能。 总结来说,SMS短信PDU编码是移动应用开发中不可忽视的一部分,理解其工作原理和结构有助于确保短信通信的可靠性和效率。开发者在编写短信相关功能时,必须遵循相应的标准和规范,以确保消息能够准确无误地在网络中传递。

解释下面代码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 上传