当SP端和ISMG端建立Connect连接后,我们就要开始发送短信了,而Submit操作的目的是SP在与ISMG建立应用层连接后向ISMG提交短信。ISMG以Submit_Resp消息响应。下面还是要看它的消息定义:
字段名 | 字节数 | 属性 | 描述 |
Msg_Id | 8 | Unsigned Integer | 信息标识。 |
Pk_total | 1 | Unsigned Integer | 相同Msg_Id的信息总条数,从1开始。 |
Pk_number | 1 | Unsigned Integer | 相同Msg_Id的信息序号,从1开始。 |
Registered_Delivery | 1 | Unsigned Integer | 是否要求返回状态确认报告: 0:不需要; 1:需要。 |
Msg_level | 1 | Unsigned Integer | 信息级别。 |
Service_Id | 10 | Octet String | 业务标识,是数字、字母和符号的组合。 |
Fee_UserType | 1 | Unsigned Integer | 计费用户类型字段: 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费; 2:对SP计费; 3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。 |
Fee_terminal_Id | 32 | Octet String | 被计费用户的号码,当Fee_UserType为3时该值有效,当Fee_UserType为0、1、2时该值无意义。 |
Fee_terminal_type | 1 | Unsigned Integer | 被计费用户的号码类型,0:真实号码;1:伪码。 |
TP_pId | 1 | Unsigned Integer | GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9。 |
TP_udhi | 1 | Unsigned Integer | GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。 |
Msg_Fmt | 1 | Unsigned Integer | 信息格式: 0:ASCII串; 3:短信写卡操作; 4:二进制信息; 8:UCS2编码; 15:含GB汉字。。。。。。 |
Msg_src | 6 | Octet String | 信息内容来源(SP_Id)。 |
FeeType | 2 | Octet String | 资费类别: 01:对“计费用户号码”免费; 02:对“计费用户号码”按条计信息费; 03:对“计费用户号码”按包月收取信息费。 |
FeeCode | 6 | Octet String | 资费(以分为单位)。 |
ValId_Time | 17 | Octet String | 存活有效期,格式遵循SMPP3.3协议。 |
At_Time | 17 | Octet String | 定时发送时间,格式遵循SMPP3.3协议。 |
Src_Id | 21 | Octet String | 源号码。SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。 |
DestUsr_tl | 1 | Unsigned Integer | 接收信息的用户数量(小于100个用户)。 |
Dest_terminal_Id | 32*DestUsr_tl | Octet String | 接收短信的MSISDN号码。 |
Dest_terminal_type | 1 | Unsigned Integer | 接收短信的用户的号码类型,0:真实号码;1:伪码。 |
Msg_Length | 1 | Unsigned Integer | 信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节),取值大于或等于0。 |
Msg_Content | Msg_length | Octet String | 信息内容。 |
LinkID | 20 | Octet String | 点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。 |
有上面的定义就可以写出代码了,如下:
void Ccmpp_API::CmppSend(const char *tempMsgSrc, const char *tempFeeType, const char *tempFeeCode, const char *tempSrcId,
const char *tempDestTerminalId, const char *tempMsgContent,const char *tempServiceId,
char tempPKTotal, char tempPKNumber, char tempRegisteredDelivery,char tempMsgLevel,
char tempFeeUserType,char tempTpPid,char tempTpUdhi,char tempMsgFmt,char tempDstUsrTl)
{
char netBuffer[400];
CMPP_SUBMIT * buffer;
buffer = (CMPP_SUBMIT*)netBuffer;
memset(buffer, 0, 400);
buffer->nTotalLength = htonl(195 + strlen(tempMsgContent));
buffer->nCommandId = htonl(CMPP_SUBMIT_tag);
if (sequenceid == 123456789i32)
{
sequenceid = 1;
}
else
{
sequenceid++;
}
buffer->nSeqId = htonl(sequenceid);
buffer->uchPkTotal = tempPKTotal;
buffer->uchPkNumber = tempPKNumber;
buffer->uchRegisteredDelivery = tempRegisteredDelivery;//目前不需要返回状态确认报告
buffer->uchMsgLevel = tempMsgLevel;
memcpy(buffer->sServiceId, tempServiceId, strlen(tempServiceId));
buffer->uchFeeUserType = tempFeeUserType;
memcpy(buffer->sFeeTerminalId, " ", 0);//不知道此字段的意思,胡乱添的一个字段
buffer->uchTpPid = tempTpPid;
buffer->uchTpUdhi = tempTpUdhi;
buffer->uchMsgFmt = tempMsgFmt;
memcpy(buffer->sMsgSrc, tempMsgSrc, strlen(tempMsgSrc));
memcpy(buffer->sFeeType, tempFeeType, strlen(tempFeeType));
memcpy(buffer->sFeeCode, tempFeeCode, strlen(tempFeeCode));
memcpy(buffer->sValidTime, " ",0);
memcpy(buffer->sAtTime, " ", 0);
memcpy(buffer->sSrcId, tempSrcId, strlen(tempSrcId));
buffer->uchDstUsrTl = tempDstUsrTl;
buffer->uchMsgLength = strlen(tempMsgContent);
memcpy(buffer->sDstTerminalId, tempDestTerminalId, strlen(tempDestTerminalId));
memcpy(buffer->sMsgContent, tempMsgContent, strlen(tempMsgContent));
//LinkId字段没有填,此处是空,以后再添
CmppSocket.Send(buffer, 195 + strlen(tempMsgContent), 0);
Sleep(100);
return;
} 目前这个代码写的还是很不好,这个软件是我毕业后第一次所写的代码,所以很不规范,希望大家见谅!我一直想用STL把它再实现一遍,苦于现在没有时间,等有时间一定写完它!希望和在这方面有了解的朋友多交流。
posted on 2006-03-20 20:43
炙热的太阳 阅读(1838)
评论(0) 编辑 收藏 引用