利用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; |