Esempio n. 1
0
// 处理数据
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 ;
}
Esempio n. 2
0
// 转换监管协议
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 ;
}