UMX-MTP协议网关

 

       利用UMX-MTP转换模块,手机可以访问UMX实现的所有服务.服务端不再区分是否针对手机协议.沿用以前的开发方式.

 

       以下是手机MTP和UMX自动转换的约定,应用设计时需要注意.

1.commandType=50用于以后供应宝的应用开发,利用userdata区分不同的功能,对应UMX消息编号. 同一消息ID的消息映射到相同的MTP协议上, userdata高字节在前(BigEndian)

2.返回码和错误信息

       .#SC自动映射到rcode(供应宝相关移动应用的固有参数)

        #SS自动映射到rdesc

        作为第个表的列

3.如果UMX没有应用参数,则转换的MTP的第个表只有rcode,rdesc

4.MTP的功能号转换为UMX的MT_REQUEST类型(来自手机的消息都按请求理解)

5.MTP的第1个表只能有一条记录

 

以下是定义文件内容:

const unsigned short CQQ_MTP_COMMAND_TYPE = 50; ///< 供应宝应用的命令类型

//

struct CMtpData {

     TmtSocketMessage head_; ///< 传输头

     ///< @note TmtSocketMessage的保留字userdata用于应用功能编号(unsigned int32).高位在前

 

     unsigned char *data_;  ///< 数据包块

 

     CAutoVector<mtMemoryTable*> v_table_; ///< 数据表

 

     CMtpData();

    

     int Load(unsigned char *buffer,unsigned long size);

     int Stream(unsigned char **buffer,unsigned int &size);

};

 

//

class CUMXMTPConvertor {

public:

     static int UMX2MTP(CMsg* msg,CMtpData **mtp);

     static int MTP2UMX(CMtpData *mtp,CMsg **msg);

};

 

接收MTP数据包处理:

//

int CMPPlugin::CallUMXService(CWrappedMsg<> *in,vector<CWrappedMsg<> *> &out,DISPATCH_RESULT &or,BYTE* inData,unsigned long lSize) {

     CMtpData mtp;

     if (mtp.Load(inData,lSize))

         return -1;

     CMsg *msg = 0;

     if (CUMXMTPConvertor::MTP2UMX(&mtp,&msg)) {

         return -2;

     }

     CMsg *old_msg = in->Detach();

     in->Attach(msg);

     int result = 0;

     int ret = plugin_mgr_->CallGlobalNSFunc(in,out,or,result);

 

     in->Attach(old_msg);

     msg->Release();

 

     return 0;

}

 

向手机端发送消息处理

         /// 自动转换UMX消息为MTP

         CMtpData *mtp = 0;

         CUMXMTPConvertor::UMX2MTP(in,&mtp);

         if (mtp==0) {

              return ERR_MP_PROTTRANSERROR;

         }

         unsigned char *buffer = 0;

         unsigned int len = 0;

         if (mtp->Stream(&buffer,len)) {

              delete mtp;

              return ERR_MP_PROTTRANSERROR;

         }

 

         CMsg* msg = new CMsg;

         msg->SetMsgID(828);

         msg->SetMsgType(MT_INDICATION);

         msg->AddParam("Data",(char*)buffer, len);

         free(buffer);

 

         *out = msg;

         delete mtp;

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值