⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc_server.cpp.svn-base

📁 sigmadesign smp8623 gui source code ,bingo
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
		}		else		{			pthread_mutex_lock(&ctxt.rooms[msg->ip]->lock);			ctxt.rooms[msg->ip]->tryprog = 0;			while(ctxt.rooms[msg->ip]->key_map.size() != 0)			{				std::map<string, bool>::iterator some = ctxt.rooms[msg->ip]->key_map.begin();				ctxt.rooms[msg->ip]->key_map.erase(some);			}			while(ctxt.rooms[msg->ip]->key_map_send.size() != 0)			{				std::map<string, bool>::iterator some = ctxt.rooms[msg->ip]->key_map_send.begin();				ctxt.rooms[msg->ip]->key_map_send.erase(some);			}			pthread_mutex_unlock(&ctxt.rooms[msg->ip]->lock);		}		END_DB()		//	progs ++;		//	if(progs == 10)		//	{		//		progs = 0;		//		//		 std::ostringstream udp_send;		//		//                  udp_send.fill('0');		//                                //udp_send << "PROG:" << some->first << "*";		//  	          udp_send <<"BLNK:0000000000000000*";		//	          std::cout<<udp_send.str()<<std::endl;		//		//                  //CRC(udp_send);		//		//                  send_to_rc(msg->ip, udp_send);		//		//	}	}void reset_rc(rc_msg_t* msg, string& param){	map<string, linked_ptr<room_status_t> >::iterator i = ctxt.rooms.find(msg->ip);	if (i == ctxt.rooms.end())		return;	std::ostringstream message;	message << "Рестартиран е RC" << ctxt.rooms[msg->ip]->room << " (номер на рестарта: " << param;	write_event(2, message);}void pannic_off(rc_msg_t* msg){	map<string, linked_ptr<room_status_t> >::iterator i = ctxt.rooms.find(msg->ip);	if (i == ctxt.rooms.end())		return;	BEGIN_DB()std::ostringstream room_status;		room_status << "UPDATE RoomStatus SET  Bathroom='FALSE' WHERE RoomID=" << ctxt.rooms[msg->ip]->room;		DB_EXECUTE(room_status.str().c_str());		std::ostringstream access_log;		access_log << "INSERT INTO AccessControlLog( RoomID, Date, DoorOpen, SafeOpen, Bathroom, GreenIndic, RedIndic, Tampering, Zone1, Zone2, Zone3, Zone4, Zone5, Zone6) SELECT " << ctxt.rooms[msg->ip]->room << ", '"<< get_date_time <<"', RoomStatus.DoorOpen, RoomStatus.SafeOpen, 'FALSE', RoomStatus.GreenIndic, RoomStatus.RedIndic, RoomStatus.Tampering, RoomStatus.Zone1, RoomStatus.Zone2, RoomStatus.Zone3, RoomStatus.Zone4, RoomStatus.Zone5, RoomStatus.Zone6 FROM RoomStatus WHERE RoomStatus.RoomID=" << ctxt.rooms[msg->ip]->room;		DB_EXECUTE(access_log.str().c_str());		END_DB()	}void fail_pannic_off(rc_msg_t* msg, uint16 error){	map<string, linked_ptr<room_status_t> >::iterator i = ctxt.rooms.find(msg->ip);	if (i == ctxt.rooms.end())		return;	std::string message;	switch (error)	{	case 0:		message = "неизвестна";		break;	default:		message = "";		break;	}	std::ostringstream str_err_msg;	str_err_msg << "Неуспешно изключване на аларма в стая " << ctxt.rooms[msg->ip]->room << ". Причина: " << message;	write_event(4, str_err_msg);}void set_indc(rc_msg_t* msg, uint16 green, uint16 red){	map<string, linked_ptr<room_status_t> >::iterator i = ctxt.rooms.find(msg->ip);	if (i == ctxt.rooms.end())		return;	BEGIN_DB()std::ostringstream access_log;		access_log << "INSERT INTO AccessControlLog ( RoomID, Date, DoorOpen, SafeOpen, Bathroom, GreenIndic, RedIndic, Tampering, Zone1, Zone2, Zone3, Zone4, Zone5, Zone6) SELECT RoomStatus.RoomID, '"<<get_date_time<<"', RoomStatus.DoorOpen, RoomStatus.SafeOpen, RoomStatus.Bathroom, '"<<green<<"','"<< red <<"', RoomStatus.Tampering, RoomStatus.Zone1, RoomStatus.Zone2, RoomStatus.Zone3, RoomStatus.Zone4, RoomStatus.Zone5, RoomStatus.Zone6 FROM RoomStatus WHERE RoomStatus.RoomID="<< ctxt.rooms[msg->ip]->room;		DB_EXECUTE(access_log.str().c_str());		END_DB()	}void fail_set_indc(rc_msg_t* msg, uint16 error){	map<string, linked_ptr<room_status_t> >::iterator i = ctxt.rooms.find(msg->ip);	if (i == ctxt.rooms.end())		return;	std::string message;	switch (error)	{	case 0:		message = "неизвестна";		break;	default:		message = "";		break;	}	std::ostringstream str_err_msg;	str_err_msg << "Неуспешно включване/изключване на индикатор в стая " << ctxt.rooms[msg->ip]->room << ". Причина: " << message;	write_event(4, str_err_msg);}void rc_msg_handler(void* msg){	rc_msg_t* rc_msg = static_cast<rc_msg_t*> (msg);	pcrecpp::RE("(\\s+)").Replace("", &rc_msg->command);	string command;	string crc;	pcrecpp::StringPiece input(rc_msg->command);	pcrecpp::RE("([\\w\\:]+\\*)(\\w+)").FullMatch(input, &command, &crc);	map<string, linked_ptr<room_status_t> >::iterator i = ctxt.rooms.find(rc_msg->ip);	if (i == ctxt.rooms.end())	{		if(rc_msg)			delete rc_msg;		return;	}	mysqlpp::Connection::thread_start();	logger(RECV, "%s crc: %s from: %s room %d\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str(), ctxt.rooms[rc_msg->ip]->room);	uint16 crc16 = get_crc(command);	int crc_command = strtol(crc.c_str(), (char**) NULL, 16);	if ((unsigned) crc_command == crc16)	{		pcrecpp::StringPiece message_real(command);		uint16 aa, w, ct, tg, tt, m, s, z1, z2, z3, z4, z5, z6;		std::string param;		if (pcrecpp::RE("CLMT\\:(\\d{2})(\\d{1})(\\d{2})(\\d{2})(\\d{2})(\\d{1})(\\d+)\\*").FullMatch(message_real, &aa, &w, &ct, &tg,				&tt, &m, &s))		{			set_temp(rc_msg, aa, w, ct, tg, tt, m, s);		}		else if (pcrecpp::RE("CLFL\\:(\\d{2})(\\d{1})\\*").FullMatch(message_real, &aa, &w))		{			fail_set_temp(rc_msg, aa, w);		}		else if (pcrecpp::RE(				"SCRT\\:(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})(\\d{1})\\*").FullMatch(				message_real, &aa, &w, &ct, &tt, &z1, &z2, &z3, &z4, &z5, &z6, &m, &s))		{			//	logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			door_control(rc_msg, aa, w, ct, tt, z1, z2, z3, z4, z5, z6, m, s);		}		else if (pcrecpp::RE("NPNC\\:\\*").FullMatch(message_real))		{			pannic_off(rc_msg);		}		else if (pcrecpp::RE("NPNF\\:(\\d{1})\\*").FullMatch(message_real, &aa))		{			fail_pannic_off(rc_msg, aa);		}		else if (pcrecpp::RE("INDC\\:(\\d{1})(\\d{1})\\*").FullMatch(message_real, &tt, &tg))		{			set_indc(rc_msg, tt, tg);		}		else if (pcrecpp::RE("INDF\\:(\\d{1})\\*").FullMatch(message_real, &aa))		{			fail_set_indc(rc_msg, aa);		}		else if (pcrecpp::RE("PROG\\:(\\w{18})\\*").FullMatch(message_real, &param))		{			//logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			ok_prog_card(rc_msg, param);		}		else if (pcrecpp::RE("PRFL\\:(\\w{16})(\\d{1})\\*").FullMatch(message_real, &param, &aa))		{			//	logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			fail_prog_card(rc_msg, param, aa);		}		else if (pcrecpp::RE("BLNK\\:(\\w{16})\\*").FullMatch(message_real, &param))		{			//	logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			ok_del_card(rc_msg, param);		}		else if (pcrecpp::RE("BLFL\\:(\\w{16})(\\d{1})\\*").FullMatch(message_real, &param, &aa))		{			//	logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			fail_del_card(rc_msg, param, aa);		}		else if (pcrecpp::RE("OPEN\\:(\\w{16})\\*").FullMatch(message_real, &param))		{			//	logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			open_door(rc_msg, param);		}		else if (pcrecpp::RE("POWR\\:(\\w{16})\\*").FullMatch(message_real, &param))		{			power_on(rc_msg, param);		}		else if (pcrecpp::RE("ISAL\\:(\\w{4})\\*").FullMatch(message_real, &param))		{			pthread_mutex_lock(&ctxt.rooms[rc_msg->ip]->lock);			//			if(ctxt.rooms[rc_msg->ip]->key_map_send.size() != 0)			//			{			//				std::cout<< "fake ISAL! Ignorring sie of keys " << ctxt.rooms[rc_msg->ip]->key_map_send.size() << std::endl;			//				pthread_mutex_unlock(&ctxt.rooms[rc_msg->ip]->lock);			//			//				delete rc_msg;			//				return;			//			}			pthread_mutex_unlock(&ctxt.rooms[rc_msg->ip]->lock);			is_alive(rc_msg, param);		}		else if (pcrecpp::RE("RSET\\:(\\w{10})\\*").FullMatch(message_real, &param))		{			//	logger(INFO, "Command %s crc: %s from: %s\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());			reset_rc(rc_msg, param);		}		else		{			logger(ERROR, "Command %s crc: %s from: %s. Command Unknown!\n", command.c_str(), crc.c_str(), rc_msg->ip.c_str());		}	}	else		logger(ERROR, "Bad CRC\n");	if(rc_msg)		delete rc_msg;	mysqlpp::Connection::thread_end();}void*rc_server(void*){	time_t lastcheck = time(NULL);	int nCount = 0;	sigset_t mask;	sigfillset(&mask); /* Mask all allowed signals */	pthread_sigmask(SIG_BLOCK, &mask, NULL);	check_room_status(NULL);	ctxt.rcsock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);	if (ctxt.rcsock == -1)	{		logger(ERROR, "Can't create socket for rc server: %s\n", strerror(errno));		ctxt.shutdown = 1;		return NULL;	}	int reuse = 1;	setsockopt(ctxt.rcsock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));	struct sockaddr_in isa;	isa.sin_family = AF_INET;	isa.sin_port = htons(ctxt.conf->rc_port);	inet_aton(ctxt.conf->rc_host.c_str(), &isa.sin_addr);	try	{		if (bind(ctxt.rcsock, (struct sockaddr*) &isa, sizeof isa) == -1)		{			throw errno;		}		logger(INFO, "Successfully started rc server\n");		do		{			pollfd pfd;			pfd.fd = ctxt.rcsock;			pfd.events = POLLIN;			time_t now = time(NULL);			if (difftime(now, lastcheck) > 120)			{				ctxt.pool->tpool_add_work(check_room_status, NULL );				lastcheck = time(NULL);				if (nCount == 14)				{					ctxt.pool->tpool_add_work(check_card_validity, NULL);					nCount = 0;				}				else					nCount++;			}			int ready = poll(&pfd, 1, 2000);			if (ready != -1)			{				if (pfd.revents == POLLIN)				{					sockaddr_in client;					int received = 0;					socklen_t clientlen = sizeof(client);					char buffer[RC_MSG_LENGTH];					if ((received = recvfrom(ctxt.rcsock, buffer, RC_MSG_LENGTH, 0, (sockaddr *) &client, &clientlen)) < 0)					{						logger(ERROR, "Error receive data from IP address %s: %s\n", inet_ntoa(client.sin_addr), strerror(errno));					}					else					{						buffer[received - 1] = '\0';						rc_msg *msg = new rc_msg(buffer);						msg->ip = inet_ntoa(client.sin_addr);						ctxt.pool->tpool_add_work(rc_msg_handler, msg);					}				}				continue;			}			else			{				throw errno;			}		} while (ctxt.shutdown != 1);	} catch (int& n)	{		logger(FATAL, "Error in rc server on IP address %s: %s\n", ctxt.conf->rc_host.c_str(), strerror(n));		ctxt.shutdown = 1;	}	shutdown(ctxt.rcsock, SHUT_RDWR);	close(ctxt.rcsock);	logger(INFO, "Closing rc server\n");	return NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -