// 处理数据 bool CPlugin::Process( InterData &data , User &user ) { // if ( ! _enable ) return true ; // U_REPT 91:20,90:base64.GetBuffer() // D_SETP 91:20,90:base64.GetBuffer() CPlugUtil util ; if ( ! util.parse( data._packdata.c_str() ) ) { OUT_ERROR( NULL, 0, "Plugin", "parser kv map string %s failed", data._packdata.c_str() ) ; return false ; } int cmd = 0 ; if( ! util.getinteger( "91", cmd ) ){ OUT_ERROR( NULL, 0, "Plugin" , "get command key failed" ) ; return false ; } // 查找处理通道,如果查找失败就直接返回了,如果成功就继续下一步 CPlugWay *way = _waymgr->CheckOut( cmd , true ) ; if ( way == NULL ) { OUT_ERROR( NULL, 0, "Plugin", "get plug way failed" ) ; return false ; } string sval ; if ( ! util.getstring( "90", sval ) ) { OUT_ERROR( NULL, 0, "Plugin" , "get content data failed" ) ; _waymgr->CheckIn( way ) ; return false ; } CBase64 base ; if ( ! base.Decode( sval.c_str(), sval.length() ) ) { OUT_ERROR( NULL, 0, "Plugin" , "base64 decode failed" ) ; _waymgr->CheckIn( way ) ; return false ; } // 处理透传的命令字 cmd = cmd & 0xff ; if ( data._command == "U_REPT" ) { cmd = cmd | MSG_PLUG_IN ; // 上行数据 } else { cmd = cmd | MSG_PLUG_OUT ; // 下行数据 } // 取得对应的FD值 unsigned int fd = _fdmgr.AddUser( user._user_id.c_str(), data._macid.c_str() ) ; // 提交对应的通道进行处理数据 bool result = way->Process( fd, base.GetBuffer(), base.GetLength(), cmd , data._macid.c_str() ) ; _waymgr->CheckIn( way ) ; return result ; }
// 转换监管协议 char * PConvert::convert_lplat( const string &key, const string &seqid, const string &val , int &len, string &areacode ) { MapString map ; if ( ! parse_jkpt_value( val, map ) ) { OUT_ERROR( NULL, 0, NULL, "parse data %s failed", val.c_str() ) ; return NULL ; } string type ; if ( ! get_map_string( map , "TYPE", type ) || type != "D_INFO") { OUT_ERROR( NULL, 0, NULL, "get data %s type failed", val.c_str() ) ; return NULL ; } string text; if (!get_map_string(map, "TEXT", text) || text.empty()) { OUT_ERROR( NULL, 0, NULL, "get data %s type failed", val.c_str() ); return NULL; } vector<string> fields; if (Utils::splitStr(text, fields, '|') != 2) { OUT_ERROR( NULL, 0, NULL, "%s, inner msg invalid", val.c_str() ); return NULL; } unsigned short msgid_master = 0x1600; unsigned short msgid_slave= 0; if(fields[0] == "COMPANY") { msgid_slave = 0x1605; } else if(fields[0] == "VEHICLE") { msgid_slave = 0x1606; } else if(fields[0] == "PERSON") { msgid_slave = 0x1607; } CBase64 base; if(!base.Decode(fields[1].c_str(), fields[1].length())) { OUT_ERROR( NULL, 0, NULL, "%s, inner msg invalid", val.c_str() ); return NULL; } len = sizeof(UpbaseMsgVehicleAddedAck) + base.GetLength() + sizeof(Footer); char *buf = new char[len]; UpbaseMsgVehicleAddedAck addedAck; Footer footer; addedAck.header.msg_len = htonl(len); addedAck.header.msg_seq = htonl(_seq_gen.get_next_seq()); addedAck.header.msg_type = htons(msgid_master); addedAck.msg_header.data_type = htons(msgid_slave); addedAck.msg_header.data_length = htonl(base.GetLength()); int pos = 0; memcpy(buf + pos, &addedAck, sizeof(UpbaseMsgVehicleAddedAck)); pos += sizeof(UpbaseMsgVehicleAddedAck); memcpy(buf + pos, base.GetBuffer(), base.GetLength()); pos += base.GetLength(); memcpy(buf + pos, &footer, sizeof(Footer)); return buf ; }