📄 rc_server.cpp.svn-base
字号:
} 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, ¶m)) { //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, ¶m, &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, ¶m)) { // 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, ¶m, &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, ¶m)) { // 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, ¶m)) { power_on(rc_msg, param); } else if (pcrecpp::RE("ISAL\\:(\\w{4})\\*").FullMatch(message_real, ¶m)) { 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, ¶m)) { // 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 + -