C++中的一粒沙子
学习C++,做应用开发
posts - 10,comments - 22,trackbacks - 0
   当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_UserType3时该值有效,当Fee_UserType012时该值无意义。

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

信息格式:

0ASCII串;

3:短信写卡操作;

4:二进制信息;

8UCS2编码;

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, 
0400);

    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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理