Example #1
0
//�����豸״̬
int upgradeapp::update_device(uint dev, uint cpy, int state, app_connection*n){

	int upgrade_state = e_upgradesucc;
	std::map<uint, dev_state> ::iterator it = m_devmap.find(dev);
	if(it == m_devmap.end()){
		dev_state ds;
		ds.line_state = state;
		ds.upgrade_state = e_upgradesucc;
		ds.con = n;
		m_devmap[dev] = ds;
	} 
	else{
		it->second.line_state = state;
		it->second.con = n;
		upgrade_state = it->second.upgrade_state;
	}

	if(state == em_online){
		char data[128] = {0};
		sprintf(data, "{\"device_id\":%d}", dev);
		post_req(n, get_device_version_req, data);
		log_out(log_debug, "update_device::get_device_version_req %s\n", data);
	}

	log_out(log_debug, "update_device::device(%u) company(%u) state(%u) upgrade(%u) count(%d)\n", 
			dev, cpy, state, upgrade_state, m_devmap.size());
	return 0;
}
Example #2
0
int upgradeapp::send_keepalive(){

	std::map<uint, app_connection*>::iterator it = m_svrmap.begin();
	for(; it != m_svrmap.end(); it++){
		post_req(it->second, client_keepalive_mgr_req);
	}
	return 0;
}
Example #3
0
int svrapp::client_req(param_list * pl){

	ipaddr &peeraddr = pl->n->get_peeraddr();
	
	log_out(log_debug, "client_req::%s..%s\n", peeraddr.ip, pl->content);

	cnt_info * c = (cnt_info*)pl->n->get_context();
	if (!c){
		cJSON * jsfrom = cJSON_GetObjectItem(pl->jsdata, "from");
		if(!jsfrom || jsfrom->type != cJSON_String 
		  || strcmp(jsfrom->valuestring, "web")){
			log_out(log_debug, "client_req::no permission\n");
			post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_NO_PERMISSION, "no permission");
			return -1;
		}
		else{
			c = new cnt_info(cnt_type);
			c->parse_token(NULL) ;
			pl->n->set_context(c);
			m_cntmap[c->get_id()] = pl->n;
		}
	}
	
	cJSON * jsdev = cJSON_GetObjectItem(pl->jsdata, "device_id");
	if(!jsdev || jsdev->type != cJSON_Number){
		log_out(log_error, "client_req::invalid device(%s)\n", pl->content);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_PARAM, "device id invalid");
		return -1;
	}

	std::map<uint, app_connection*>::iterator it = m_devmap.find(jsdev->valueuint);
	if(it == m_devmap.end()){
		log_out(log_error, "client_req::device(%u) off line\n",jsdev->valueuint);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline");
		return -1;
	}	

	char new_serial[128] = {0};
	create_serial(c->get_id(), pl->serial, new_serial, sizeof(new_serial));
	char * out = cJSON_PrintUnformatted(pl->jsdata);
	
	app_connection * dn = it->second;
	post_req(dn, pl->cmd, out, new_serial);
	free(out);

	return 0;
}
Example #4
0
int upgradeapp::login_mgr_req(const char * cpy_list, const char * svr_token, app_connection *n){

	ipaddr & peer = n->get_peeraddr();
	server_info * s = (server_info*)n->get_context();
	m_svrmap[s->get_id()] = n;
	s->reset_interval();
	
	char events[256]   = {0};
	sprintf(events, "\"event\":[\"%s\",\"%s\"]", online_alarm, offline_alarm);
	
	char identify[512] = {0};
	sprintf(identify, "{\"token\":\"%s\",%s,\"company\":%s}", svr_token, events, cpy_list);
	
	post_req(n, client_login_mgr_req, identify);

	log_out(log_debug, "login_mgr_req::to(%s:%d) %s\n", peer.ip, peer.port, identify);
	return 0;
}
Example #5
0
//�����豸״̬
int upgradeapp::update_device(const char* dev, int state, app_connection*n){

	int upgrade_state = e_upgradesucc;
	std::map<strkey_t, dev_state> ::iterator it = m_devmap.find(dev);
	if(it == m_devmap.end()){
		dev_state ds;
		ds.line_state = state;
		ds.upgrade_state = e_upgradesucc;
		ds.con = n;
		m_devmap[dev] = ds;
	} 
	if(state == em_offline && it != m_devmap.end()){
		server_info * sif1 = (server_info*)it->second.con->get_context();
		server_info * sif2 = (server_info*)n->get_context();

		//fixed bug
		upgrade_state = it->second.upgrade_state;
		if(sif1->get_numkey() == sif2->get_numkey()){

			it->second.line_state = state;
			it->second.con = n;
			//upgrade_state = it->second.upgrade_state;
		}
		else{
			log_out(log_warn, "update_device::from different server\n");
		}
	}
	if(state == em_online && it != m_devmap.end()){
		it->second.line_state = state;
		it->second.con = n;
		upgrade_state = it->second.upgrade_state;
	}

	log_out(log_debug, "update_device::device(%s) state(%u) upgrade(%u) count(%d)\n", 
			dev, state, upgrade_state, m_devmap.size());

	if(state == em_online){
		char data[128] = {0};
		sprintf(data, "{\"sn\":\"%s\"}", dev);
		post_req(n, get_device_version_req, data);
		log_out(log_debug, "update_device::get_device_version_req %s\n", data);
	}
	return 0;
}
Example #6
0
int svrapp::cmd_poll(){

	std::map<strkey_t, cmd_s> & temp = m_cmds_map[m_group_index];
	std::map<strkey_t, cmd_s>::iterator it = temp.begin();
	time_t now = time(NULL);
    char devkey[strkey_len] = {0};
    
	while(it != temp.end()){
		cmd_s &cs = it->second;
		
		if(now - cs.last_cmd_time  < m_stop_threshold ||
		   strcmp(cs.last_cmd, stop_ctrl_req) == 0){
			it++;
			continue;
		}
		
      
		uint chn = 0;
		parse_chnkey(devkey, chn, it->first.c_str());
        
		std::map<strkey_t, app_connection*>::iterator it1 =  m_devmap.find(devkey);
		if (it1 == m_devmap.end()){
			log_out(log_warn, "cmd_poll::device_id(%s) offline, delete cmd\n", devkey);
			temp.erase(it++);
			continue;
		}
		
		char buf[128] = {0};
		sprintf(buf, "{\"devkey\":\"%s\",\"channel\":%u}", devkey, chn);
		post_req(it1->second, stop_ctrl_req, buf, "ptzctrl");
		log_out(log_debug, "cmd_poll::send stop cmd(%s), last_time(%u) last_cmd(%s)\n", 
		buf, cs.last_cmd_time, cs.last_cmd);
		
		temp.erase(it++);
	}

	if(++m_group_index >= max_group_count){
		m_group_index = 0;
	}

	return 0;
}
Example #7
0
int svrapp::login_mgr_req(app_connection *n){

	ipaddr & peer = n->get_peeraddr();
	server_info * sif = (server_info*)n->get_context();
	m_svrmap[sif->get_numkey()] = n;
	sif->reset_interval();
	
	const char *token = "\"token\":\"motiondetect\"";
	
	char event_list[256] = {0};
	sprintf(event_list, "\"event_list\":[\"%s\"]", motion_detect_alarm);
	
	char identify[512] = {0};
	sprintf(identify, "{%s,%s}", token, event_list);
	
	post_req(n, client_login_mgr_req, identify);

	log_out(log_debug, "login_mgr_req::to(%s:%d) %s\n", peer.ip, peer.port, identify);
	return 0;
}
Example #8
0
int baseapp::connect_mgr_ok(const char * cfg, const char * name, app_connection *n){

	ipaddr & peer = n->get_peeraddr();
	server_info * s = (server_info*)n->get_context();
	m_svrmap[s->get_id()] = n;
	s->reset_interval();
	
	char events[256]   = {0};
	sprintf(events, "\"event\":[\"%s\",\"%s\"]", online_alarm, offline_alarm);
	
	char companys[512] = {0};
	read_companys(cfg, "company", companys);
	
	char identify[512] = {0};
	sprintf(identify, "{\"token\":\"%s\",%s,\"company\":%s}", name, events, companys);
	
	post_req(n, client_login_mgr_req, identify);

	log_out(log_debug, "connect ok %s:%d login mgr %s\n", peer.ip, peer.port, identify);
	return 0;
}
Example #9
0
/*
{
	"serial":"",
	"cmd":"",
	"data":{
		"channel":0,
		"sub_channel":0
	}
}
*/
int svrapp::send_dev_ctrl_req(realplay_info * rpif, 
								const char * cmd, 
								const char * serial){
	//通知设备
	stream_key * stmkey = rpif->get_stream_key();
	uint device_id = stmkey->device_id;
	std::map<uint, app_connection*> ::iterator it0 = m_devmap.find(device_id);
	if(it0 == m_devmap.end()){
		log_out(log_error, "send_dev_ctrl_req::%s->device(%u) offline\n", cmd, device_id);
		return -1;
	}
	
	
	char sentbuf[256] = {0};
	sprintf(sentbuf, "{\"device_id\":%u, \"channel\":%u,\"sub_channel\":%u}", 
	stmkey->device_id, stmkey->chn, stmkey->sub_chn);
	post_req(it0->second, cmd, sentbuf, serial);
	log_out(log_warn, "send_dev_ctrl_req::%s->%s\n", cmd, sentbuf);
	
	return 0;	
}
Example #10
0
int svrapp::login_mgr_req(app_connection *n){

	ipaddr & peer = n->get_peeraddr();
	server_info * s = (server_info*)n->get_context();
	m_svrmap[s->get_id()] = n;
	s->reset_interval();
	
	const char *token = "\"token\":\"offline alarm server\"";
	
	char events[256] = {0};
	sprintf(events, "\"event\":[\"%s\",\"%s\"]", online_alarm, offline_alarm);
	
	char companys[512] = {0};
	read_companys(ulu_c2hd_offline_conf, "company", companys);
	
	char identify[512] = {0};
	sprintf(identify, "{%s,%s,\"company\":%s}", token, events, companys);
	
	post_req(n, client_login_mgr_req, identify);

	log_out(log_debug, "login_mgr_req::to(%s:%d) %s\n", peer.ip, peer.port, identify);
	return 0;
}
bool NetBalanceGetter::login_cabinet(){
	QTimer timeout;
	timeout.setSingleShot(true);
	
	QEventLoop waitLoop;
	
	QObject::connect(&timeout, SIGNAL(timeout()), &waitLoop, SLOT(quit()) );
	QNetworkReply* reply;


	timeout.start(timeout_ms);
	reply = post_req();
	QObject::connect(reply, SIGNAL(finished()), &waitLoop, SLOT(quit()));
	waitLoop.exec();
	
	if( timeout.isActive() && (reply->error() == QNetworkReply::NoError) ) {
		timeout.stop();
		return true;
	}else
	{
		emit failed();
		return false;
	}
}
Example #12
0
int upgradeapp::device_update_data(char * result, int length){
	if(length <= 0){
		log_out(log_warn, "device_update_data:receive data length is %d\n", length);
	}

	cJSON * json = cJSON_Parse(result);
	if(!json){
		log_out(log_error, "device_update_data:invalid json %s\n", result);
		return -1;
	}

	cJSON * jscode = cJSON_GetObjectItem(json, "code");
	cJSON * jsmessage = cJSON_GetObjectItem(json, "message");
	cJSON * jsdata = cJSON_GetObjectItem(json, "data");
	if(!jscode || jscode->type != cJSON_Number ||
			!jsmessage || jsmessage->type != cJSON_String ||
			!jsdata){
		cJSON_Delete(json);
		log_out(log_error, "device_update_data::invalid json %s\n", result);
		return -1;
	}

	if(jscode->valueint != 0){
		log_out(log_error, "device_update_data::code %d\n", jscode->valueint);
		cJSON_Delete(json);
		return -1;
	}

	cJSON * jslst = cJSON_GetObjectItem(jsdata, "upgrade");
	if(!jslst){
		log_out(log_warn, "device_update_data::no devices\n");
		cJSON_Delete(json);
		return -1;
	}

	int count = cJSON_GetArraySize(jslst);
	log_out(log_debug, "device_update_data::device count %d\n", count);

	for(int k = 0; k < count; k++){
		cJSON * jsdev = cJSON_GetArrayItem(jslst, k);

		cJSON * jsid = cJSON_GetObjectItem(jsdev, "device_id");
		uint dev = jsid->valueuint;
		cJSON * jsver = cJSON_GetObjectItem(jsdev, "version");
		cJSON * jsforce = cJSON_GetObjectItem(jsdev, "force");
		cJSON * jsurl = cJSON_GetObjectItem(jsdev, "url");
		cJSON * jsver_id = cJSON_GetObjectItem(jsdev, "version_id");

		cJSON * jscheck = cJSON_GetObjectItem(jsdev, "check");
		cJSON * jstype = cJSON_GetObjectItem(jscheck, "type");
		cJSON * jsvalue = cJSON_GetObjectItem(jscheck, "value");
		cJSON * jssize = cJSON_GetObjectItem(jscheck, "size");

		if(!jsforce || jsforce->type != cJSON_Number ||
				!jsver || jsver->type != cJSON_String ||
				!jsurl || jsurl->type != cJSON_String ||
				!jsid || jsid->type != cJSON_Number ||
				!jsver_id || jsver_id->type != cJSON_Number ||
				!jscheck || !jstype || jstype->type != cJSON_String ||
				!jsvalue || jsvalue->type != cJSON_String ||
				!jssize || jssize->type != cJSON_Number){
			log_out(log_error, "start_update_req::invalid json %s\n", jsdev->valuestring);
			continue;
		}

		std::map<uint, dev_state>::iterator it = m_devmap.find(dev);
		if(it != m_devmap.end()){
			it->second.version_id = jsver_id->valueuint;

			if(jsforce->valueuint == e_force && it->second.line_state == em_online){	
				char identify[512] = {0};
				sprintf(identify, "{\"device_id\":%u,\"url\":\"%s\",\"check\":{\"type\":\"%s\",\"value\":\"%s\",\"size\":%d}}",
						it->first, jsurl->valuestring, jstype->valuestring, jsvalue->valuestring, jssize->valueint);
				post_req(it->second.con, start_update_req, identify);
				it->second.upgrade_state = e_upgrading;			
				log_out(log_warn, "device_update_data:: mgrserver: %s\n", identify);

				char buf[512] = {0};
				sprintf(buf, "msg={\"platform\":\"device\",\"data\":[{\"device_id\":%u,\"version_id\":%u,\"status\":%d}]}", 
						it->first, it->second.version_id, e_upgrading);
				log_out(log_debug, "device_update_data:post status %s\n", buf);
				char result[128 * 128] = {0};
				if(post(m_api_upgrade_status, buf, strlen(buf), result, sizeof(result)) < 0){
					log_out(log_error, "device_update_data:post status fail\n");	
				}
			}
		}
		else{
			log_out(log_warn, "device_update_data:: invalid device(%u)\n", dev);
		}
	}
	cJSON_Delete(json);
	return 0;
}
Example #13
0
int upgradeapp::login_mgr_ack(param_list * pl){

	log_out(log_debug, "login_mgr_ack::%s\n", pl->content);
	post_req(pl->n, get_online_device_req);
	return 0;
}
Example #14
0
int upgradeapp::device_update_data(char * result, int length){
	if(length <= 0){
		log_out(log_warn, "device_update_data:receive data length is %d\n", length);
		return -1;
	}

	cJSON * json = cJSON_Parse(result);
	if(!json){
		log_out(log_error, "device_update_data:invalid json %s\n", result);
		cJSON_Delete(json);
		return -1;
	}

	cJSON * jscode = cJSON_GetObjectItem(json, "code");
	cJSON * jsmessage = cJSON_GetObjectItem(json, "message");
	cJSON * jsdata = cJSON_GetObjectItem(json, "data");
	if(!jscode || jscode->type != cJSON_Number ||
	   !jsmessage || jsmessage->type != cJSON_String ||
	   !jsdata){
		log_out(log_error, "device_update_data::invalid json %s\n", result);
		cJSON_Delete(json);
		return -1;
	}

	if(jscode->valueint != 0){
		log_out(log_error, "device_update_data:: error code %d\n", jscode->valueint);
		cJSON_Delete(json);
		return -1;
	}

	int count = cJSON_GetArraySize(jsdata);
	log_out(log_debug, "device_update_data::device count %d\n", count);

	for(int k = 0; k < count; k++){
		cJSON * jsdev = cJSON_GetArrayItem(jsdata, k);
		cJSON * jsstatus = cJSON_GetObjectItem(jsdev, "status");
		if(!jsstatus || jsstatus->type != cJSON_Number){
			continue;
		}
		if(jsstatus->valueint){
			continue;
		}

		cJSON * jssn = cJSON_GetObjectItem(jsdev, "ulusn");
		cJSON * jsver = cJSON_GetObjectItem(jsdev, "target_ver");
		cJSON * jsforce = cJSON_GetObjectItem(jsdev, "force");
		cJSON * jsurl = cJSON_GetObjectItem(jsdev, "url");
		cJSON * jsmiss_id = cJSON_GetObjectItem(jsdev, "mission_id");

		cJSON * jstype = cJSON_GetObjectItem(jsdev, "check_type");
		cJSON * jsvalue = cJSON_GetObjectItem(jsdev, "check_value");
		cJSON * jssize = cJSON_GetObjectItem(jsdev, "size");

		if(!jsforce || jsforce->type != cJSON_Number ||
		    !jsver || jsver->type != cJSON_String ||
			!jssn || jssn->type != cJSON_String ||
			!jsurl || jsurl->type != cJSON_String ||
			!jsmiss_id || jsmiss_id->type != cJSON_Number ||
			!jstype || jstype->type != cJSON_String ||
			!jsvalue || jsvalue->type != cJSON_String ||
			!jssize || jssize->type != cJSON_Number){
			continue;
		}

		std::map<strkey_t, dev_state>::iterator it = m_devmap.find(jssn->valuestring);
		if(it != m_devmap.end()){
			it->second.mission_id = jsmiss_id->valueint;

			if(jsforce->valueuint == e_force && it->second.line_state == em_online && (jsver->valuestring != it->second.version)
					&& it->second.upgrade_state != e_upgrading){
				char identify[512] = {0};
				sprintf(identify, "{\"sn\":\"%s\",\"url\":\"%s\",\"check\":{\"type\":\"%s\",\"value\":\"%s\",\"size\":%d}}",
						it->first.c_str(), jsurl->valuestring, jstype->valuestring, jsvalue->valuestring, jssize->valueint);
				post_req(it->second.con, start_update_req, identify);
				it->second.upgrade_state = e_upgrading;			

				log_out(log_debug, "device_update_data::post data to mgrserver: %s\n", identify);

				char buf[512] = {0};
				sprintf(buf, "{\"platform\":\"device\",\"sn\":\"%s\",\"version\":\"%s\",\"mission_id\":%d,\"status\":%d,\"time\":%d}", 
						it->first.c_str(), it->second.version.c_str(), it->second.mission_id, e_upgrading, (int)time(NULL));
				char result[128 * 128] = {0};
				if(post(gs_svr_data.m_api_upgrade_status, buf, strlen(buf), result, sizeof(result)) < 0){
				//	log_out(log_error, "device_update_data:post status fail\n");	
					//	return -1;
				}
				log_out(log_debug, "device_update_data:post status %s\n", buf);
			}
			else{
				log_out(log_warn, "device_update_data:: device(%s) offline or optional(%u) or upgrading or same version\n", jssn->valuestring, jsforce->valueuint);
			}
		}
		else{
			log_out(log_warn, "device_update_data:: invalid device(%s)\n", jssn->valuestring);
		}
	}
	cJSON_Delete(json);
	return 0;
}
Example #15
0
/*
{
	"serial":"",
	"cmd":"start_realpaly_req",
	"data":{
		"token":"",
		"channel":0,
		"sub_channel":0,
	}
}*/
int svrapp::start_realplay_reqx(param_list * pl){

	realplay_info * rpif = (realplay_info*)pl->n->get_context();
	if(!rpif){
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_NO_SUPPORT, "try again");
		log_out(log_error, "start_realplay_reqx::unknow error\n");
		return -1;
	}
	
	if(rpif->is_playing()){
		rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_NO_SUPPORT, "is playing");
		log_out(log_error, "start_realplay_reqx::is playing\n");
		return -1;
	}
	
	stream_key  * stmkey = rpif->get_stream_key();
	uint64 key64 = rpif->get_key64();
	
	//find dev
	std::map<uint, app_connection*>::iterator it = m_devmap.find(stmkey->device_id);
	if(it == m_devmap.end()){
		log_out(log_error, "start_realpaly_req::device(%u) off line\n", stmkey->device_id);
		rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline");
		return -1;
	}
	
	std::map<uint, app_connection*>::iterator it1 = m_cntmap.find(rpif->get_id());
	if(it1 == m_cntmap.end() ){
		m_cntmap[rpif->get_id()] = pl->n;
	}

	//判断是否已经在播放
	std::map<uint64, stream_info*>::iterator it0 = m_realplaymap.find(key64);
	if(it0 != m_realplaymap.end()){
		stream_info * stmif = it0->second;
		stmif->add(rpif->get_id(), pl->n);
		
		rpif->reset_resource();
		rpif->set_playing();
		rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_OK, "ok");
		log_out(log_debug, "start_realpaly_req::appid(%d) stream(%llX) already playing, clients(%u)\n",
		get_appid(), key64, stmif->client_number());		
		return 0;
	}
	else{
		stream_info * stmif = new stream_info(stm_type, stmkey);
		m_realplaymap[key64] = stmif;
		stmif->add(rpif->get_id(), pl->n);
	}

	rpif->reset_resource();
	rpif->set_playing();
	
	///add realplay server
	char serverAddr[64] = {0};
	sprintf(serverAddr, "%s:%d",g_sdr->self_ipaddr.ip, g_sdr->self_ipaddr.port);
	cJSON_AddStringToObject(pl->jsdata, "server", serverAddr);
	cJSON_AddStringToObject(pl->jsdata, "transport_protocol", "tcp");
	
	//generate token
	char token[128] = {0};
	sprintf(token, "%08X%04X%04X", stmkey->device_id, stmkey->chn, stmkey->sub_chn);
	cJSON_DeleteItemFromObject(pl->jsdata, "token");
	cJSON_AddStringToObject(pl->jsdata, "token", token);
	
	
	//send request to mgr
	char new_serial[128] = {0};
	create_serial(rpif->get_id(), pl->serial, new_serial, sizeof(new_serial));
	char * out = cJSON_PrintUnformatted(pl->jsdata);
	log_out(log_debug, "start_realpaly_req::appid(%d) %s\n",get_appid(),  out);
		
	app_connection * dn = it->second;
	post_req(dn, pl->cmd, out, new_serial);
	free(out);
	return 0;
}
Example #16
0
int svrapp::client_req(param_list * pl){

	ipaddr &peeraddr = pl->n->get_peeraddr();
	log_out(log_debug, "client_req::%s..%s\n", peeraddr.ip, pl->content);

	cnt_info * cif = (cnt_info*)pl->n->get_context();
	if (!cif){
		cif = new cnt_info(cnt_type);
		cif->parse_token(NULL) ;
		pl->n->set_context(cif);
		m_cntmap[cif->get_numkey()] = pl->n;
	}
	
	cJSON * jsdev = cJSON_GetObjectItem(pl->jsdata, "device_id");
	if(!jsdev || jsdev->type != cJSON_Number){
		log_out(log_error, "client_req::invalid device(%s)\n", pl->content);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_PARAM, "device_id invalid");
		return -1;
	}
    
    uint platform = get_platform_code_delete_item(pl->jsdata);
    
    char devkey[strkey_len] = {0};
    create_devkey(platform, jsdev->valueuint64, devkey);

	std::map<strkey_t, app_connection*>::iterator it = m_devmap.find(devkey);
	if(it == m_devmap.end()){
		log_out(log_error, "client_req::device(%s) off line\n", devkey);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline");
		return -1;
	}	
	
	//***********save cmd****************
    //here fixed
	int channel = 0;
	cJSON * jschn = cJSON_GetObjectItem(pl->jsdata, "channel");
	if(jschn && jschn->type == cJSON_Number){
		channel = jschn->valueint;
	}

    char chnkey[strkey_len] = {0};
    create_chnkey(devkey, channel, chnkey);
    
	int index = hash_key(jsdev->valueuint64, max_group_count);
	std::map<strkey_t, cmd_s> & temp = m_cmds_map[index];
	std::map<strkey_t, cmd_s>::iterator it1 = temp.find(chnkey);
	if(it1 == temp.end()){
		cmd_s cs;
		memset(&cs, 0, sizeof(cs));
		it1 = temp.insert(std::make_pair(chnkey, cs)).first;	
	}
	cmd_s &cs = it1->second;
	cs.last_cmd_time = (uint)time(NULL);
	strncpy(cs.last_cmd, pl->cmd, sizeof(cs.last_cmd) -1 );
	//***********save cmd****************

    //create_serial
	char new_serial[128] = {0};
	create_serial(cif->get_numkey(), pl->serial, new_serial, sizeof(new_serial));
    
    //create devkey
    cJSON_DeleteItemFromParent(pl->jsdata, jsdev);
    cJSON_AddStringToObject(pl->jsdata, "devkey", devkey);
	char * out = cJSON_PrintUnformatted(pl->jsdata);
	
	app_connection * dn = it->second;
	post_req(dn, pl->cmd, out, new_serial);
	free(out);

	return 0;
}