// YAServerDlg.cpp : 实现文件 // #include "stdafx.h" #include "YAServer.h" #include "YAServerDlg.h" #include "afxdialogex.h" #include #include //#include //#include // c++11init_reader //#include // c++11 #include #include #include "def.h" #include "socketdef.h" #include #include #include "MysqlConnPool.h" #include "locate_algorithm.h" #include #include #include #include "log_def.h" #include "DbSettingDlg.h" #include "LogSetting.h" #include "SysSetting.h" #define STR_LEN_TIME 30 #ifdef _DEBUG #ifndef DEBUG_NEW #define new DEBUG_NEW #endif #endif typedef struct { CYAServerDlg* handle; int len; DWORD dwConnID; BYTE buf[LENGTH_MSG_4K]; }ParseData; typedef struct { CYAServerDlg* handle; bool useTime; char* path; char* strLog; }LogInfo; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 DWORD g_tickcount; DWORD g_diffTickCount = 0; DWORD g_send_tickout; DWORD g_last_send_time; DWORD g_testtick; bool g_is_rec_hist = false; class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CYAServerDlg 对话框 CYAServerDlg::CYAServerDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CYAServerDlg::IDD, pParent), _server(this), _io(new client()) , m_reader_id_hist(0) { ws_init(); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CYAServerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_BTN_START, m_btStart); DDX_Control(pDX, IDC_BTN_STOP, m_btStop); DDX_Control(pDX, IDC_LIST_READER, m_listctrl_reader); DDX_Control(pDX, IDC_LIST_LOG, m_list_log); DDX_Text(pDX, IDC_EDIT_READERID, m_reader_id_hist); } BEGIN_MESSAGE_MAP(CYAServerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_BN_CLICKED(IDC_BTN_START, &CYAServerDlg::OnBnStart) ON_BN_CLICKED(IDC_BTN_STOP, &CYAServerDlg::OnBnStop) ON_BN_CLICKED(IDC_BTN_EXIT, &CYAServerDlg::OnBnExit) ON_BN_CLICKED(IDC_BTN_SYNCTIME, &CYAServerDlg::OnBnSyncTime) ON_MESSAGE(WM_ON_MONITOR, on_monitor) ON_COMMAND(ID_MENU_DB, &CYAServerDlg::OnMenuDb) ON_COMMAND(ID_MENU_LOG, &CYAServerDlg::OnMenuLog) ON_COMMAND(ID_MENU_PARAM, &CYAServerDlg::OnMenuParam) ON_BN_CLICKED(IDC_BTN_HIS, &CYAServerDlg::OnBnCallHisData) ON_MESSAGE(WM_REFRESH_IP_LIST, &CYAServerDlg::OnMsgRefreshIpList) ON_MESSAGE(WM_CARD_ADD_DIST, &CYAServerDlg::OnCardAddDist) ON_MESSAGE(WM_REMOVE_SOCKET, &CYAServerDlg::OnRemoveSocket) ON_EN_UPDATE(IDC_EDIT_READERID, &CYAServerDlg::OnEnUpdateEditReaderid) ON_COMMAND(ID_ABOUT, &CYAServerDlg::OnAbout) END_MESSAGE_MAP() // CYAServerDlg 消息处理程序 UINT WaitForS(int nSecond,bool bSleep=false)//用于等待一段时间的函数,普通精度的,参数单位秒 { COleDateTime start_time = COleDateTime::GetCurrentTime(); COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time; while(end_time.GetTotalSeconds() < nSecond){ if(!bSleep){ MSG msg; PeekMessage(&msg,NULL,0,0,PM_NOREMOVE); TranslateMessage(&msg); DispatchMessage(&msg); //以上四行是实现在延时或定时期间能处理其他的消息,降低CPU的占有率,但也降低延时或定时精度 } Sleep(80); end_time = COleDateTime::GetCurrentTime()-start_time; } return 0; } UINT WaitForMS(int mSecond,bool bSleep=false)//高精度的等待函数,参数单位毫秒 { double dfFreq; LARGE_INTEGER litmp; QueryPerformanceFrequency(&litmp); dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率 QueryPerformanceCounter(&litmp); LONGLONG QPart0 = litmp.QuadPart;// 获得初始值 while((double)(litmp.QuadPart-QPart0)/dfFreq < double(mSecond/1000)){ if(!bSleep){ MSG msg; PeekMessage(&msg,NULL,0,0,PM_NOREMOVE); TranslateMessage(&msg); DispatchMessage(&msg); //以上四行是实现在延时或定时期间能处理其他的消息,降低CPU的占有率,但也降低延时或定时精度 } QueryPerformanceCounter(&litmp); } return 0; } ULONGLONG time_send_json_counting; ULONGLONG time_send_json_device_state; ULONGLONG time_send_json_alarm; ULONGLONG time_send_json_postion; ULONGLONG time_sync_reader_time; ULONGLONG time_clear_call_time; ULONGLONG time_send_call; ULONGLONG time_send_help; ULONGLONG time_ws_connect; bool g_exit=false; long giSqlCount=0; long giSqlThreadCount=0; long gSqlTimes=0; long giAllSqlCount=0; long giAllThreadCount=0; HANDLE hSemaHandle=NULL; DWORD WINAPI _exec_sql(LPVOID lparam) { char *sql = (char*)lparam ; CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ delete[] sql; sql = NULL; //TRACE(_T("failed \n")); return 1; } MYSQL_RES* pRes; int err = 0; //pRes = pConn->Execute(sql, err); pRes = pConn->MultiExecute(sql,err); if(err > 0){ TRACE(_T("sql error \n")); } mysql_free_result(pRes); //TRACE(_T("passed\n")); delete[] sql; sql = NULL; Sleep(1); return 0; } DWORD WINAPI _write_error_log(LPVOID lparam) { LogInfo* err = (LogInfo*)lparam; CYAServerDlg* dlg = reinterpret_cast(err->handle); dlg->writeErrorLogEx(err->path, err->strLog, err->useTime); // malloc if(err){ free(err->path); err->path = NULL; free(err->strLog); err->strLog = NULL; delete err; err = NULL; } Sleep(1); return 0; } DWORD WINAPI _parse_package_data(LPVOID lparam) { ParseData* data = (ParseData*)lparam; CYAServerDlg* dlg = reinterpret_cast(data->handle); dlg->parse_package_data(data->buf, data->len, data->dwConnID); //dlg->parse_data_receive_package(data->buf, data->len, data->dwConnID); free(data); Sleep(1); return 0; } DWORD WINAPI _parse_data_server(LPVOID lparam) { //TRACE(_T("in thread \n")); ParseData* data = (ParseData*)lparam; CYAServerDlg* dlg = reinterpret_cast(data->handle); //dlg->parse_package_data(data->buf, data->len, data->dwConnID); dlg->parse_data_server(data->buf, data->len, data->dwConnID); //TRACE(_T("do not come here \n")); data->handle->m_nMallocTimes--; //TRACE(_T("use data over %d = \n"),data->handle->m_nMallocTimes); free(data); Sleep(1); return 0; } UINT _thread_timer(LPVOID lparam) { CYAServerDlg* dlg = reinterpret_cast(lparam); while(!g_exit){ ULONGLONG cur_time =::GetTickCount(); // send_json_counting if(cur_time - time_send_json_counting > theApp.send_json_counting ){ //time_send_json_counting = cur_time; //dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_counting()); } // send_json_alarm if(cur_time - time_send_json_alarm > theApp.send_json_alarm){ time_send_json_alarm = cur_time; dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_alarm()); } // send_json_device if(cur_time - time_send_json_device_state > theApp.send_json_alarm){ time_send_json_device_state = cur_time; dlg->deal_readers(); dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_device_state()); } // send_json_postion if(cur_time - time_send_json_postion > theApp.send_json_postion){ time_send_json_postion = cur_time; DWORD dw = ::GetTickCount(); dlg->package_data(); } //send help if(cur_time - time_send_help > theApp.send_json_alarm){ if(dlg->get_help_card_nums() > 0){ time_send_help = cur_time; dlg->send_json_data(JSON_CMD_VALUE_PUSH,dlg->get_json_help()); } } // send_call_data if(cur_time - time_send_call > theApp.send_json_alarm){ time_send_call = cur_time; dlg->send_call_info(); //dlg->clear_call_info(); } if(!dlg->is_websocket_login &&cur_time - time_ws_connect > theApp.ws_connect_interval){ time_ws_connect = cur_time; if(!dlg->is_websocket_ok){ dlg->ws_open(); } dlg->ws_login(); } WaitForMS(10); } return 0; } UINT _thread_monitor(LPVOID lparam) { CYAServerDlg* dlg = reinterpret_cast(lparam); time_t time_end = time(NULL); while (!g_exit){ time_t time_current = time(NULL); // 判断采集状态, 20s没有接收到数据认为采集中断 dlg->is_server_ok = (difftime(time_current, dlg->m_time_last_rec) > 20) ? false : true; dlg->set_run_state(); // 更新采集运行状态 if(!IsWindow(theApp.m_hwnd_monitor)){ // 监控程序没有打开 theApp.m_hwnd_monitor = NULL; //// 启动监控程序 //if(strlen(theApp.m_path_monitor)<=0){ // strcpy(theApp.m_path_monitor, "YAMonitor.exe");//启动同目录下的monitor //} //WinExec(theApp.m_path_monitor, SW_HIDE); } // 发送给监控程序 if(theApp.m_hwnd_monitor && dlg->m_bListen){ WPARAM wpSERVERSTATE=WPARAM(dlg->m_uint_state); ::PostMessage(theApp.m_hwnd_monitor, WM_ON_MONITOR, wpSERVERSTATE, LPARAM(dlg->m_hWnd)); } WaitForS(10); } return 0; } BOOL CYAServerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } //加载系统配置 m_bUseFilter = theApp.use_filter; if(m_bUseFilter){ m_nFilterType = FILTER_KALMAN; }else{ m_nFilterType = NO_FILTER; } m_log_sys_status = theApp.log_sys_status; m_log_raw_data = theApp.log_raw_data; m_log_parse_data = theApp.log_parse_data; m_log_send_package = theApp.log_send_package; m_log_recv_package = theApp.log_recv_package; m_log_locate_data = theApp.log_locate_data; m_reader_interval_time = theApp.reader_interval_time * 1.0 / 1000.0; m_nMallocTimes = 0; //初始化线程池 //m_LogThreadPool.Initialize((void*)100,THREADPOOL_SIZE); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 init_queuestring(); init_param(); init_ui(); init_base_data(); load_his_data(); //ReceiveDateTime=COleDateTime::GetCurrentTime(); theApp.set_server_handle(this->m_hWnd); theApp.load_monitor_conf(); m_thread_monitor = ::AfxBeginThread(_thread_monitor, this, THREAD_PRIORITY_HIGHEST); RECT rc; GetWindowRect(&rc); rc.left=rc.right; rc.right+=250; //创建菜单 m_mnMain.LoadMenu(IDR_MENUMAIN); SetMenu(&m_mnMain); CString strInfo; //// 将图标放入系统托盘 //nd.cbSize = sizeof (NOTIFYICONDATA); //nd.hWnd = m_hWnd; //nd.uID = IDI_ICON; //nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; //nd.uCallbackMessage= WM_NOTIFYICON; //nd.hIcon = m_hIcon; //strcpy(nd.szTip, "采集应用服务器"); //Shell_NotifyIcon(NIM_ADD, &nd); SetWindowText(_T("永安信通数据采集系统")); OnBnStart(); time_send_json_counting = time_send_json_device_state=time_send_json_alarm=time_send_json_postion=::GetTickCount(); time_sync_reader_time=time_clear_call_time=time_send_call=time_send_help=::GetTickCount(); m_thread_timer = ::AfxBeginThread(_thread_timer, this, THREAD_PRIORITY_HIGHEST); UpdateData(FALSE); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CYAServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CYAServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文or SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CYAServerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } /* * 点击启动按钮 * 登录websocket服务器 * 启动tcp server * * param * 无 * * return * 无 * */ void CYAServerDlg::OnBnStart() { //Test(); if(!is_websocket_login){ ws_login(); } start_tcp_server(); } /* * 点击停止按钮 * 退出websocket服务器 * 停止tcp server * * param * 无 * * return * 无 * */ void CYAServerDlg::OnBnStop() { //if(MessageBoxEx(m_hWnd, _T("确定停止吗?"), _T("询问"), MB_ICONQUESTION|MB_OKCANCEL|MB_DEFBUTTON2,NULL) == IDCANCEL){ // return; //} stop_tcp_server(); if(is_websocket_login){ ws_logout(); is_websocket_login = false; } } LRESULT CYAServerDlg::on_monitor(WPARAM wParam, LPARAM lParam) { if(m_bListen){ m_uint_state = wParam ; } if(wParam == 0xFFFF){ stop_and_exit(); } return S_OK; } /* * 初始化对话框ui * * param * 无 * * return * 无 * */ void CYAServerDlg::init_ui() { set_app_state(ST_STOPPED); m_listctrl_reader.SetColumnHeader(_T("分站号,60;分站地址,120;状态,60;")); m_listctrl_reader.SetGridLines(TRUE); m_listctrl_reader.SetEditable(FALSE); m_listctrl_reader.SetSortable(FALSE); Invalidate(FALSE); } void CYAServerDlg::set_app_state( EnAppState eas ) { m_enState = eas; if(this->GetSafeHwnd() == nullptr) return; m_btStart.EnableWindow(m_enState == ST_STOPPED); m_btStop.EnableWindow(m_enState == ST_STARTED); //m_Close.EnableWindow(m_enState == ST_STARTED); //m_SycnTime.EnableWindow(m_enState == ST_STARTED); //m_HistoryData.EnableWindow(m_enState == ST_STARTED); } void CYAServerDlg::init_param() { ::SetMainWnd(this); ::SetInfoList(&m_list_log); g_last_send_time = ::GetTickCount(); m_time_last_rec = time(NULL); m_bListen = FALSE; m_nPort = PORT_SERVER_MASTER; m_nCountClick = 0; m_ws_url = TEST_WS_URL; time_over_count_person = time_over_count_vehicle = 0; is_server_ok = true; g_exit = false; umpRootSyncNum.swap(unordered_map()); InitializeCriticalSection(&m_csWriteLog); InitializeCriticalSection(&m_csRefreshList); InitializeCriticalSection(&m_csRemoveSocket); InitializeCriticalSection(&m_csParseDataServer); InitializeCriticalSection(&m_csAddDist); InitializeCriticalSection(&m_csSyncTime); InitializeCriticalSection(&m_csCallInfo); //从配置中读取(regedit) load_param_from_ini(); database_connect(); ws_open(); //UpdateData(FALSE); } void CYAServerDlg::stop_and_exit() { stop_tcp_server(); //set_button_state(TRUE); ws_close(); //m_listctrl_reader.DeleteAllItems(); //if(m_bIsInit) //停止定时器(停止呼叫、通行侦测) // ::KillTimer(NULL, CLEAR_CALL_TIMER); //::KillTimer(NULL, CLEAR_PASS_TIMER); //{ // //m_Comm.Stop(1); // //?m_Comm // ShowAppMessage("停止采集数据"); // READER_EX_INFO *pCurReaderEx; // for(int i=0;im_hThread,INFINITE); } m_thread_monitor = NULL; if(m_thread_timer){ WaitForSingleObject(m_thread_timer->m_hThread, INFINITE); } m_thread_timer = NULL; DeleteCriticalSection(&m_csWriteLog); DeleteCriticalSection(&m_csParseDataServer); DeleteCriticalSection(&m_csRemoveSocket); DeleteCriticalSection(&m_csRefreshList); DeleteCriticalSection(&m_csAddDist); DeleteCriticalSection(&m_csSyncTime); DeleteCriticalSection(&m_csCallInfo); } void CYAServerDlg::set_run_state() { m_uint_state = 0; if(!is_server_ok){ m_uint_state |= 0x10; // 长时间未接收到采集数据(网络故障,采集故障) } //m_uKJ133State=0; //UINT uNoClient=0x0002; //UINT uClientError=0; //for(POSITION pos = m_connectionList.GetHeadPosition(); pos != NULL;) //{ // CClientSocket* pSocket = (CClientSocket*)m_connectionList.GetNext(pos); // uNoClient=0; // if(pSocket->bError) // uClientError=0x0004; //} //m_uKJ133State |= uNoClient; //m_uKJ133State |= uClientError; //m_uKJ133State |= (m_bListen?0:0x0001); //m_uKJ133State |= uReaderError; //m_uKJ133State |= iMo;//0x0010,采集数据出问题 0x0000,没问题 //if(g_DisconnectDB) // m_uKJ133State |=0x0100; //UINT uDBError=0; //UINT uDisconnect=0; //COleDateTime nowTime=COleDateTime::GetCurrentTime(); //COleDateTimeSpan spDateTime; //spDateTime.SetDateTimeSpan(0,1,0,0); //if(g_LastDBErrorTime + spDateTime > nowTime) // uDBError=0x0200; //if(g_LastDisconnectTime + spDateTime > nowTime) // uDisconnect=0x0400; //m_uKJ133State |= uDBError; //m_uKJ133State |= uDisconnect; } int CYAServerDlg::init_staffer(string staff_id /* = "" */, bool is_card /*= false*/ ) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; if(staff_id.length() == 0){ sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \ s.dept_id, s.group_id, s.occupation_id, \ d.name as dname, g.name as gname, o.name as oname \ FROM dat_staff s \ LEFT JOIN dat_card c ON s.card_id = c.card_id \ LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \ LEFT JOIN dat_group g ON s.group_id = g.group_id \ LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \ WHERE c.card_type_id = 1 and s.state = 0;"); }else if(is_card){ sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \ s.dept_id, s.group_id, s.occupation_id, \ d.name as dname, g.name as gname, o.name as oname \ FROM dat_staff s \ LEFT JOIN dat_card c ON s.card_id = c.card_id \ LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \ LEFT JOIN dat_group g ON s.group_id = g.group_id \ LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \ WHERE c.card_type_id = 1 and s.state = 0 AND s.card_id = '%s';", staff_id.c_str()); }else{ sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \ s.dept_id, s.group_id, s.occupation_id, \ d.name as dname, g.name as gname, o.name as oname \ FROM dat_staff s \ LEFT JOIN dat_card c ON s.card_id = c.card_id \ LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \ LEFT JOIN dat_group g ON s.group_id = g.group_id \ LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \ WHERE c.card_type_id = 1 and s.state = 0 AND staffer_id = '%s';", staff_id.c_str()); } pRes = pConn->Execute(buf, err); Card* pCard = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)) { CardMap::iterator it = mp_card_list_all.find(pRow[1]); if(it != mp_card_list_all.end()){ pCard = it->second; }else{ pCard = new Card(pRow[1], atoi(pRow[2]), theApp.z_offset); #ifdef ALGORITHM_TYPE_TOF pCard->set_reader_path(&mp_reader_path_list); #elif defined ALGORITHM_TYPE_TDOA pCard->set_reader_path(&mp_reader_path_list_tdoa); #endif mp_card_list_all.insert(make_pair(pCard->card_id, pCard)); } nRow++; pCard->id = pRow[0]; pCard->name = pRow[3]; pCard->dept_id = atoi(pRow[4]); pCard->group_id = atoi(pRow[5]); pCard->department = (pRow[7] == NULL?"":pRow[7]); pCard->group = pRow[8]; pCard->occupation = pRow[9]; if(m_bUseFilter){ if(theApp.use_filter_odd){ std::string temp = pRow[1]; int a = atoi(temp.substr(temp.length() - 1 , 1).c_str()); if(0 == a%2){ pCard->EnableFilter(m_nFilterType); } }else{ pCard->EnableFilter(m_nFilterType); } } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_STAFF), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } /* * 初始化所有车卡信息 * * param * vehicle_id ------ 车卡id * is_card ------ 是否是卡 * * return * 成功返回0,失败返回1 * */ int CYAServerDlg::init_vehicle(string vehicle_id /* = "" */, bool is_card /*= false*/) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; if(vehicle_id.length() == 0){ sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \ v.dept_id, v.group_id, v.vehicle_type_id, \ d.name as dname, g.name as gname, vt.name as vtname \ FROM dat_vehicle v \ LEFT JOIN dat_card c ON v.card_id = c.card_id \ LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \ LEFT JOIN dat_group g ON v.group_id = g.group_id \ LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \ WHERE c.card_type_id = 2 and v.state = 0;"); }else if(is_card){ sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \ v.dept_id, v.group_id, v.vehicle_type_id, \ d.name as dname, g.name as gname, vt.name as vtname \ FROM dat_vehicle v \ LEFT JOIN dat_card c ON v.card_id = c.card_id \ LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \ LEFT JOIN dat_group g ON v.group_id = g.group_id \ LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \ WHERE c.card_type_id = 2 and v.state = 0 AND v.card_id ='%s';", vehicle_id.c_str()); }else{ sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \ v.dept_id, v.group_id, v.vehicle_type_id, \ d.name as dname, g.name as gname, vt.name as vtname \ FROM dat_vehicle v \ LEFT JOIN dat_card c ON v.card_id = c.card_id \ LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \ LEFT JOIN dat_group g ON v.group_id = g.group_id \ LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \ WHERE c.card_type_id = 2 and v.state = 0 AND vehicle_id='%s';", vehicle_id.c_str()); } pRes = pConn->Execute(buf, err); Card* pCard = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)){ CardMap::iterator it = mp_card_list_all.find(pRow[1]); if(it != mp_card_list_all.end()){ pCard = it->second; }else{ pCard = new Card(pRow[1], atoi(pRow[2]), theApp.z_offset); #ifdef ALGORITHM_TYPE_TOF pCard->set_reader_path(&mp_reader_path_list); #elif defined ALGORITHM_TYPE_TDOA pCard->set_reader_path(&mp_reader_path_list_tdoa); #endif mp_card_list_all.insert(make_pair(pCard->card_id, pCard)); //return 1; } nRow++; pCard->id = (pRow[0] == NULL) ? "" : pRow[0]; pCard->name = (pRow[3] == NULL) ? "" : pRow[3]; pCard->number = (pRow[4] == NULL) ? "" : pRow[4]; pCard->dept_id = atoi(pRow[5]); pCard->group_id = atoi(pRow[6]); pCard->department = (pRow[8] == NULL) ? "" : pRow[8]; pCard->group = (pRow[9] == NULL) ? "" : pRow[9]; pCard->worktype = (pRow[10] == NULL) ? "" : pRow[10]; if(m_bUseFilter){ if(theApp.use_filter_odd){ std::string temp = pRow[1]; int a = atoi(temp.substr(temp.length() - 1 , 1).c_str()); if(0 == a%2){ pCard->EnableFilter(m_nFilterType); } }else{ pCard->EnableFilter(m_nFilterType); } } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } /* * 初始化所有自组网卡信息 * * param * adhoc_id ------ 自组网卡id * is_card ------ 是否是卡 * * return * 成功返回0,失败返回1 * */ int CYAServerDlg::init_adhoc(string adhoc_id /*= ""*/,bool is_card /*= false*/) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; char buf[LENGTH_SQL] = {0}; if(adhoc_id.length() == 0){ sprintf_s(buf,"select adhoc_id,v.card_id,v.dept_id, \ d.name as dname \ from dat_adhoc v \ LEFT JOIN dat_card c ON v.card_id = c.card_id \ LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \ where c.card_type_id = 3 and v.state = 0 ;"); }else if(is_card){ sprintf_s(buf,"select adhoc_id,v.card_id,v.dept_id, \ d.name as dname \ from dat_adhoc v \ LEFT JOIN dat_card c ON v.card_id = c.card_id \ LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \ where c.card_type_id = 3 and v.state = 0 and v.card_id ='%s';",adhoc_id.c_str()); }else{ sprintf_s(buf,"select adhoc_id,v.card_id,v.dept_id, \ d.name as dname \ from dat_adhoc v \ LEFT JOIN dat_card c ON v.card_id = c.card_id \ LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \ where c.card_type_id = 3 and v.state = 0 and v.adhoc_id ='%s';",adhoc_id.c_str()); } pRes = pConn->Execute(buf, err); if(pRes == NULL){ return 1; } Card* pCard = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)){ CardMap::iterator it = mp_card_list_all.find(pRow[1]); if(it != mp_card_list_all.end()){ pCard = it->second; }else{ pCard = new Card(pRow[1], CT_ADHOC, theApp.z_offset); mp_card_list_all.insert(make_pair(pCard->card_id, pCard)); } pCard->id = (pRow[0] == NULL) ? "" : pRow[0]; pCard->card_id = (pRow[1] == NULL) ? "" : pRow[1]; pCard->dept_id = (pRow[2] == NULL) ? 0:atoi(pRow[2]); pCard->department = (pRow[3] == NULL) ? "" : pRow[3]; nRow++; } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ADHOC), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } int CYAServerDlg::init_map(int map_id /*= 0*/) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; char strsql[LENGTH_SQL] = {0}; if(map_id == 0){ sprintf_s(strsql, "SELECT map_id, name, scale FROM dat_map;"); }else{ sprintf_s(strsql, "SELECT map_id, name, scale FROM dat_map WHERE map_id = %d; ", map_id); } pRes = pConn->Execute(strsql, err); MapInfo* pMap = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)){ MapInfoMap::iterator it = mp_map_list.find(atoi(pRow[0])); if(it != mp_map_list.end()){ pMap = it->second; }else{ pMap = new MapInfo(); pMap->map_id = atoi(pRow[0]); mp_map_list.insert(make_pair(pMap->map_id, pMap)); nRow++; } pMap->map_name = pRow[1]; pMap->map_scale = atof(pRow[2]); } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_MAP), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } int CYAServerDlg::init_area(int area_id /* = 0 */) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; char strsql[LENGTH_SQL] = {0}; if(area_id == 0){ sprintf_s(strsql, "SELECT area_id, name, map_id, area_type_id, path, \ over_count_person, over_count_vehicle, over_time_person, over_time_vehicle, is_attendance \ FROM dat_area;"); }else{ sprintf_s(strsql, "SELECT area_id, name, map_id, area_type_id, path, \ over_count_person, over_count_vehicle, over_time_person, over_time_vehicle, is_attendance \ FROM dat_area WHERE area_id = %d; ", area_id); } pRes = pConn->Execute(strsql, err); Area* pArea = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)){ AreaMap::iterator it = mp_area_list.find(atoi(pRow[0])); if(it != mp_area_list.end()){ pArea = it->second; }else{ pArea = new Area(); pArea->area_id = atoi(pRow[0]); mp_area_list.insert(make_pair(pArea->area_id, pArea)); nRow++; } pArea->map_id = atoi(pRow[2]); MapInfoMap::iterator map_it = mp_map_list.find(pArea->map_id); if(map_it != mp_map_list.end()){ AreaMap::iterator area_it = map_it->second->map_area_list.find(pArea->area_id); if(area_it == map_it->second->map_area_list.end()){ map_it->second->map_area_list.insert(make_pair(pArea->area_id, pArea)); } } pArea->area_name = pRow[1]; pArea->area_type_id = atoi(pRow[3]); pArea->path = pRow[4]; // 多边形 pArea->over_count_person = atoi(pRow[5]); pArea->over_count_vehicle = atoi(pRow[6]); pArea->over_time_person = atoi(pRow[7]); pArea->under_time_vehicle = atoi(pRow[8]); pArea->is_att = atoi(pRow[9]); pArea->init_border(pRow[4]); //pArea->x1 = atof(pRow[8]); //pArea->y1 = atof(pRow[9]); //pArea->z1 = atof(pRow[10]); //pArea->sr = atof(pRow[11]); } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_AREA), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } int CYAServerDlg::init_reader(int reader_id /* = 0 */) { // 从数据库中读取 CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; char strsql[LENGTH_SQL] = {0}; if(reader_id == 0){ sprintf_s(strsql, "SELECT reader_id, map_id, area_id, name, x, y, z, angle, \ state, ip, device_type_id, reader_type_id,isSpecial \ FROM dat_reader WHERE state=0;"); }else{ sprintf_s(strsql, "SELECT reader_id, map_id, area_id, name, x, y, z, angle, \ state, ip, device_type_id, reader_type_id,isSpecial \ FROM dat_reader WHERE state=0 AND reader_id = %d; ", reader_id); } pRes = pConn->Execute(strsql, err); Reader* pReader = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)) { ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[0])); if(it != mp_reader_list.end()){ pReader = it->second; }else{ pReader = new Reader(); pReader->reader_interval_time = m_reader_interval_time; pReader->reader_id = atoi(pRow[0]); mp_reader_list.insert(make_pair(pReader->reader_id, pReader)); nRow++; } pReader->map_id = atoi(pRow[1]); MapInfoMap::iterator map_it = mp_map_list.find(pReader->map_id); if(map_it != mp_map_list.end()){ ReaderMap::iterator reader_it = map_it->second->map_reader_list.find(pReader->reader_id); if(reader_it == map_it->second->map_reader_list.end()){ map_it->second->map_reader_list.insert(make_pair(pReader->reader_id, pReader)); } pReader->map_scale = map_it->second->map_scale; } pReader->area_id = atoi(pRow[2]); pReader->reader_name = pRow[3]; pReader->reader_x = atof(pRow[4]); pReader->reader_y = atof(pRow[5]); pReader->reader_z = atof(pRow[6]); pReader->reader_angle = atof(pRow[7]) * M_PI /180; pReader->ip = pRow[9]; pReader->device_type_id = atoi(pRow[10]); pReader->pos_state = atoi(pRow[11]); pReader->m_nIsSpecial = atoi(pRow[12]); } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_READER), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } int CYAServerDlg::init_antenna(int reader_id /* = 0 */) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; char strsql[LENGTH_SQL] = {0}; if(reader_id == 0){ sprintf_s(strsql, "SELECT antenna_id, a.reader_id, reader_idx, a.x, a.y, a.z, a.angle \ FROM dat_antenna a, dat_reader r \ WHERE a.reader_id = r.reader_id;"); }else{ sprintf_s(strsql, "SELECT antenna_id, a.reader_id, reader_idx, a.x, a.y, a.z, a.angle \ FROM dat_antenna a, dat_reader r \ WHERE a.reader_id = r.reader_id AND reader_id = %d; ", reader_id); } pRes = pConn->Execute(strsql,err); int nRow = 0; while(pRow = mysql_fetch_row(pRes)){ ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[1])); if(it != mp_reader_list.end()){ Antenna* ant = new Antenna(); ant->antenna_id = atoi(pRow[0]); ant->antenna_x = atof(pRow[3]); ant->antenna_y = atof(pRow[4]); ant->antenna_z = atof(pRow[5]); ant->antenna_angle = atof(pRow[6]) * M_PI / 180.0; int idx = (atoi(pRow[2]) == 1) ? 0 : 1; it->second->ant[idx] = ant; nRow++; } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ANTENNA), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } int CYAServerDlg::init_dev_adhoc( int reader_id /*= 0*/ ) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; char strsql[LENGTH_SQL] = {0}; if(reader_id == 0){//dat_dev_adhoc sprintf_s(strsql, "select ad.id, ad.reader_id, ad.level, ad.x, ad.y, ad.z from dat_dev_adhoc ad, dat_reader r \ where ad.reader_id = r.reader_id;"); }else{ sprintf_s(strsql, "select ad.id, ad.reader_id, ad.level, ad.x, ad.y, ad.z from dat_dev_adhoc ad, dat_reader r \ where ad.reader_id = r.reader_id and ad.reader_id = %d; ", reader_id); } pRes = pConn->Execute(strsql,err); if(pRes == NULL){ return 1; } int nRow = 0; int idx = 0; while(pRow = mysql_fetch_row(pRes)){ ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[1])); if(it != mp_reader_list.end()){ Adhoc* adhoc = new Adhoc(); adhoc->adhoc_id = atoi(pRow[0]); adhoc->idx = atoi(pRow[2]); adhoc->x = atof(pRow[3]); adhoc->y = atof(pRow[4]); adhoc->z = atof(pRow[5]); idx = (adhoc->idx < ADHOC_COUNT)?adhoc->idx:0; it->second->adhoc[idx] = adhoc; nRow++; } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ADHOC_LOCATE), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } /* * 函数名:init_all_readers_coverage * 从数据库的dat_reader_path表中读取指定map_id和reader_id的地图范围集, * 将此分站的地图范围集保存在分站类中的readerCoverage中; * 如果指定了相同的地图范围集的reader_id,则直接将指定的reader_id的地图范围集赋值给此reader_id的地图范围集 * 然后将地图集赋值给station * * * @param * reader_id 分站id号 * * @return * -1,表示在分站map中未找到此分站信息或者未正常执行;0,表示正常执行 * */ int CYAServerDlg::init_all_readers_coverage(int reader_id) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); //如果无可用数据库连接,不执行后续操作 if(pConn == NULL){ return 1; } char sql[LENGTH_SQL] = {0}; if(reader_id == 0){ sprintf_s(sql, "select p.start_reader_id,p.end_reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_tdoa p ,dat_reader r where p.start_reader_id = r.reader_id;"); }else{ sprintf_s(sql, "select p.start_reader_id,p.end_reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_tdoa p ,dat_reader r where p.start_reader_id = %d; ", reader_id); } MYSQL_RES* pRes = NULL; MYSQL_ROW pRow; int err = 0; int nRow = 0; //查询数据库 pRes = pConn->Execute(sql,err); //从数据库获得信息赋给分站对象的地图集 while(pRow = mysql_fetch_row(pRes)){ int nReaderId = atoi(pRow[1]); ReaderMap::iterator it = mp_reader_list.find(nReaderId); int nSameConfigReader = atoi(pRow[0]); int nIdx = atoi(pRow[2]); //判断地图集信息是否可利用其它分站的覆盖范围,如果可用,则使用其它分站的覆盖范围 //-1表示不可用,否则表示可复用分站id号为nSameConfigReader的地图集覆盖范围 if(nSameConfigReader == -1){ _point p; p.x = atof(pRow[3]); p.y = atof(pRow[4]); p.z = atof(pRow[5]); it->second->readerCoveragePath.insert(make_pair(nIdx,p)); it->second->bIsInitCoverage = true; nRow++; }else{ it->second->readerCoveragePath = mp_reader_list.find(nSameConfigReader)->second->readerCoveragePath; it->second->bIsInitCoverage = true; nRow++; } } mysql_free_result(pRes); //输出操作数据库的日志信息 CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_READER_PATH), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); //根据获得地图集将其赋给mp_reader_path_list ReaderMap::iterator it = mp_reader_list.begin(); for(it;it!=mp_reader_list.end();it++){ if(it->second->bIsInitCoverage){ int nReaderId = it->second->reader_id - 1; double dMapScale = mp_map_list.find(it->second->map_id)->second->map_scale; ReaderPath* pReaderPath = NULL; ReaderPathMap::iterator prpIt = mp_reader_path_list.find(nReaderId); if(prpIt != mp_reader_path_list.end()){ pReaderPath = prpIt->second; }else{ pReaderPath = new ReaderPath(); mp_reader_path_list.insert(make_pair(nReaderId,pReaderPath)); } pReaderPath->nRealCalcPoints = it->second->readerCoveragePath.size(); for(int i=0;i<2;i++){ pReaderPath->x[i] = it->second->ant[i]->antenna_x*dMapScale; pReaderPath->y[i] = it->second->ant[i]->antenna_y*dMapScale; pReaderPath->z[i] = it->second->ant[i]->antenna_z*dMapScale; } for(size_t j = 1;j <= it->second->readerCoveragePath.size(); j++){ pReaderPath->px[j - 1] = it->second->readerCoveragePath.find(j)->second.x*dMapScale; pReaderPath->py[j - 1] = it->second->readerCoveragePath.find(j)->second.y*dMapScale; pReaderPath->pz[j - 1] = it->second->readerCoveragePath.find(j)->second.z*dMapScale; } } } return 0; } /* * 函数名:init_tdoa_all_readers_coverage * 实现初始化TDOA方式的地图集描述,并存储冗余数据 * 冗余数据的主要作用在于:例如存在分站之间的地图集描述,那么也存在的对应关系 * * param * reader_id ------ 分站id号 * * return * 如果执行失败返回-1 * 正确执行,返回0 * */ //int CYAServerDlg::init_tdoa_all_readers_coverage(int reader_id) //{ // CMysqlConn* pConn = NULL; // CDBConnGuard pDbGuard(pConn); // // //无可用数据库连接 // if(pConn == NULL){ // return 1; // } // // char sql[LENGTH_SQL] = {0}; // if(reader_id == 0){ // //dat_reader_path_tdoa_bjd1 // //dat_reader_path_tdoa // sprintf_s(sql, "select p.start_reader_id,p.end_reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_tdoa p ,dat_reader r where p.start_reader_id = r.reader_id;"); // }else{ // sprintf_s(sql, "select start_reader_id,end_reader_id,idx,x,y,z,is_bezier from dat_reader_path_tdoa where p.start_reader_id =%d; ", reader_id); // } // // MYSQL_RES* pRes = NULL; // MYSQL_ROW pRow; // int err = 0; // int nRow = 0; // // //查询数据库 // pRes = pConn->Execute(sql,err); // // double mapScale = 0.0; // while(pRow = mysql_fetch_row(pRes)){ // int start_reader_id = atoi(pRow[0]); // int end_reader_id = atoi(pRow[1]); // int ndx = atoi(pRow[2]); // // //后缀_r都为冗余信息 // ReaderPath* prp = NULL; // ReaderPath* prp_r = NULL; // // TDOAReaderPathMap::iterator it = mp_reader_path_list_tdoa.find(start_reader_id); // // if(it == mp_reader_path_list_tdoa.end()){ // ReaderPathMap* prpm = new ReaderPathMap(); // ReaderPath* prp1 = new ReaderPath(); // //prp1->nRealCalcPoints++; // prpm->insert(make_pair(end_reader_id,prp1)); // mp_reader_path_list_tdoa.insert(make_pair(start_reader_id,prpm)); // // //冗余数据 // ReaderPathMap* prpm_r = new ReaderPathMap(); // ReaderPath* prp1_r = new ReaderPath(); // //prp1_r->nRealCalcPoints++; // prpm_r->insert(make_pair(start_reader_id,prp1_r)); // mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,prpm_r)); // }else{ // ReaderPathMap::iterator it2; // it2 = it->second->find(end_reader_id); // if(it2 == it->second->end()){ // ReaderPath* prp1 = new ReaderPath(); // //prp1->nRealCalcPoints++; // it->second->insert(make_pair(end_reader_id,prp1)); // // //冗余数据 // ReaderPathMap* prpm_r = new ReaderPathMap(); // ReaderPath* prp1_r = new ReaderPath(); // //prp1_r->nRealCalcPoints++; // prpm_r->insert(make_pair(start_reader_id,prp1_r)); // mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,prpm_r)); // } // } // // ReaderPathMap::iterator it_rpm = mp_reader_path_list_tdoa.find(start_reader_id)->second->find(end_reader_id); // if(it_rpm!=mp_reader_path_list_tdoa.find(start_reader_id)->second->end()){ // prp = it_rpm->second; // }else{ // prp = new ReaderPath(); // mp_reader_path_list_tdoa.find(start_reader_id)->second->insert(make_pair(end_reader_id,prp)); // } // // //冗余信息 // ReaderPathMap::iterator it_rpm_r = mp_reader_path_list_tdoa.find(end_reader_id)->second->find(start_reader_id); // if(it_rpm_r!=mp_reader_path_list_tdoa.find(end_reader_id)->second->end()){ // prp_r = it_rpm_r->second; // }else{ // prp_r = new ReaderPath(); // mp_reader_path_list_tdoa.find(end_reader_id)->second->insert(make_pair(start_reader_id,prp)); // } // // //获得地图比例 // int map_id = mp_reader_list.find(start_reader_id)->second->map_id; // MapInfoMap::iterator mit = mp_map_list.find(map_id); // if(mit == mp_map_list.end()){ // //没有相关地图信息,要输出错误日志 // AfxMessageBox(_T("分站所在地图不存在!")); // break; // } // mapScale = mp_map_list.find(map_id)->second->map_scale; // // if(prp->nRealCalcPoints < ndx){ // prp->nRealCalcPoints = ndx; // } // if(prp_r->nRealCalcPoints < ndx){ // prp_r->nRealCalcPoints = ndx; // } // // if(!prp->bIsInit){ // //获得分站坐标,其中索引0表示起始分站坐标,索引1表示结束分站坐标 // prp->x[0] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale; // prp->y[0] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale; // prp->z[0] = 0; // prp->x[1] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale; // prp->y[1] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale; // prp->z[1] = 0; // prp->px[ndx-1] = atof(pRow[3])*mapScale; // prp->py[ndx-1] = atof(pRow[4])*mapScale; // prp->bIsInit = true; // } // // if(!prp_r->bIsInit){ // //冗余信息 // prp_r->x[0] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale; // prp_r->y[0] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale; // prp_r->z[0] = 0; // prp_r->x[1] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale; // prp_r->y[1] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale; // prp_r->z[1] = 0; // prp_r->px[ndx-1] = atof(pRow[3])*mapScale; // prp_r->py[ndx-1] = atof(pRow[4])*mapScale; // prp->bIsInit = true; // } // // //prp_r->nRealCalcPoints++; // } // mysql_free_result(pRes); // // //输出操作结果信息 // CString strlog; // strlog.Format(_T("%s%d%s"), _T(LOG_INIT_MAP_PATH), nRow, _T(LOG_RECORD_COUNT)); // show_log(strlog); // // return 0; //} int CYAServerDlg::init_tdoa_all_readers_coverage(int reader_id) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); //无可用数据库连接 if(pConn == NULL){ return 1; } char sql[LENGTH_SQL] = {0}; if(reader_id == 0){ //dat_reader_path_tdoa_bjd1 //dat_reader_path_tdoa sprintf_s(sql, "select p.start_reader_id,p.end_reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_tdoa p ,dat_reader r where p.start_reader_id = r.reader_id;"); }else{ sprintf_s(sql, "select start_reader_id,end_reader_id,idx,x,y,z,is_bezier from dat_reader_path_tdoa where p.start_reader_id =%d; ", reader_id); } MYSQL_RES* pRes = NULL; MYSQL_ROW pRow; int err = 0; int nRow = 0; //查询数据库 pRes = pConn->Execute(sql,err); double mapScale = 0.0; while(pRow = mysql_fetch_row(pRes)){ int start_reader_id = atoi(pRow[0]); int end_reader_id = atoi(pRow[1]); int ndx = atoi(pRow[2]); //后缀_r都为冗余信息 ReaderPath* prp = NULL; ReaderPath* prp_r = NULL; TDOAReaderPathMap::iterator it = mp_reader_path_list_tdoa.find(start_reader_id); if(it == mp_reader_path_list_tdoa.end()){ ReaderPathMap* prpm = new ReaderPathMap(); ReaderPath* prp1 = new ReaderPath(); //prp1->nRealCalcPoints++; prpm->insert(make_pair(end_reader_id,prp1)); mp_reader_path_list_tdoa.insert(make_pair(start_reader_id,prpm)); //冗余数据 ReaderPathMap* prpm_r = new ReaderPathMap(); ReaderPath* prp1_r = new ReaderPath(); //prp1_r->nRealCalcPoints++; prpm_r->insert(make_pair(start_reader_id,prp1_r)); mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,prpm_r)); }else{ ReaderPathMap::iterator it2; it2 = it->second->find(end_reader_id); if(it2 == it->second->end()){ ReaderPath* prp1 = new ReaderPath(); //prp1->nRealCalcPoints++; it->second->insert(make_pair(end_reader_id,prp1)); } } TDOAReaderPathMap::iterator it_r = mp_reader_path_list_tdoa.find(end_reader_id); if(it_r == mp_reader_path_list_tdoa.end()){ ReaderPathMap* prpm = new ReaderPathMap(); ReaderPath* prp1 = new ReaderPath(); //prp1->nRealCalcPoints++; prpm->insert(make_pair(start_reader_id,prp1)); mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,prpm)); }else{ ReaderPathMap::iterator it2; it2 = it_r->second->find(start_reader_id); if(it2 == it_r->second->end()){ ReaderPath* prp1 = new ReaderPath(); //prp1->nRealCalcPoints++; it_r->second->insert(make_pair(start_reader_id,prp1)); } } ReaderPathMap::iterator it_rpm = mp_reader_path_list_tdoa.find(start_reader_id)->second->find(end_reader_id); if(it_rpm!=mp_reader_path_list_tdoa.find(start_reader_id)->second->end()){ prp = it_rpm->second; }else{ prp = new ReaderPath(); mp_reader_path_list_tdoa.find(start_reader_id)->second->insert(make_pair(end_reader_id,prp)); } //冗余信息 ReaderPathMap::iterator it_rpm_r = mp_reader_path_list_tdoa.find(end_reader_id)->second->find(start_reader_id); if(it_rpm_r!=mp_reader_path_list_tdoa.find(end_reader_id)->second->end()){ prp_r = it_rpm_r->second; }else{ prp_r = new ReaderPath(); mp_reader_path_list_tdoa.find(end_reader_id)->second->insert(make_pair(start_reader_id,prp)); } //获得地图比例 int map_id = mp_reader_list.find(start_reader_id)->second->map_id; MapInfoMap::iterator mit = mp_map_list.find(map_id); if(mit == mp_map_list.end()){ //没有相关地图信息,要输出错误日志 AfxMessageBox(_T("分站所在地图不存在!")); break; } mapScale = mp_map_list.find(map_id)->second->map_scale; if(prp->nRealCalcPoints < ndx){ prp->nRealCalcPoints = ndx; } if(prp_r->nRealCalcPoints < ndx){ prp_r->nRealCalcPoints = ndx; } if(!prp->bIsInit){ //获得分站坐标,其中索引0表示起始分站坐标,索引1表示结束分站坐标 prp->x[0] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale; prp->y[0] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale; prp->z[0] = 0; prp->x[1] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale; prp->y[1] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale; prp->z[1] = 0; prp->bIsInit = true; } prp->px[ndx-1] = atof(pRow[3])*mapScale; prp->py[ndx-1] = atof(pRow[4])*mapScale; if(!prp_r->bIsInit){ //冗余信息 prp_r->x[0] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale; prp_r->y[0] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale; prp_r->z[0] = 0; prp_r->x[1] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale; prp_r->y[1] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale; prp_r->z[1] = 0; prp_r->bIsInit = true; } prp_r->px[ndx-1] = atof(pRow[3])*mapScale; prp_r->py[ndx-1] = atof(pRow[4])*mapScale; //prp_r->nRealCalcPoints++; } mysql_free_result(pRes); //输出操作结果信息 CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_MAP_PATH), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } void CYAServerDlg::ws_init() { is_websocket_ok = false; is_websocket_login = false; _io->set_reconnect_attempts(3); using std::placeholders::_1; using std::placeholders::_2; using std::placeholders::_3; using std::placeholders::_4; socket::ptr sock = _io->socket(); //default socket opened, also we have "set_open_listener" for monitoring physical connection opened. //sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnLoginMessage,this,_1,_2,_3,_4))); sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnLogin, this, _1,_2,_3,_4))); sock->on(JSON_CMD_VALUE_CALL, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnCallMessage,this,_1,_2,_3,_4))); sock->on(JSON_CMD_VALUE_PUSH, sio::socket::event_listener(std::bind(&CYAServerDlg::OnPushMessage, this))); //sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener(std::bind(&CYAServerDlg::OnLoginCallBack, this, std::placeholders::_1))); _io->set_socket_open_listener(std::bind(&CYAServerDlg::OnConnected, this)); //_io->set_open_listener(std::bind(&CYAServerDlg::OnConnected, this)); //physical connection closed or drop. _io->set_close_listener(std::bind(&CYAServerDlg::OnClosed,this, std::placeholders::_1)); //physical connection fail to establish. _io->set_fail_listener(std::bind(&CYAServerDlg::OnFailed,this)); } void CYAServerDlg::ws_close() { //_io->socket()->off_all(); //_io->socket()->off_error(); } void CYAServerDlg::ws_login() { USES_CONVERSION; CC2UTF8 conv = (char*)get_json_login().c_str(); string szlogin = conv.c_str(); _io->socket()->emit(JSON_CMD_VALUE_USER, szlogin, [&](sio::message::list const& msglist){ message::ptr msg_ptr = msglist[0]; int n =(int)msg_ptr->get_map()["code"]->get_int(); is_websocket_login = (0 == n) ? true : false; CString strlog; wchar_t* p_url = CFunctions::c2wc(m_ws_url.c_str()); if(is_websocket_login){ strlog.Format(_T("%s: %s"), _T(LOG_LOGIN_WEB_SERVER), p_url/*CFunctions::c2wc(m_ws_url.c_str())*/); //show_log(strlog); }else{ p_url = CFunctions::c2wc(m_ws_url.c_str()); strlog.Format(_T("%s: %s, err: %d"), _T(LOG_LOGIN_WEB_SERVER_FAILED), p_url, n/*CFunctions::c2wc(m_ws_url.c_str())*/); } show_log(strlog); if(p_url){ free(p_url); p_url = NULL; } }); } void CYAServerDlg::ws_logout() { USES_CONVERSION; CC2UTF8 conv = (char*)get_json_logout().c_str(); string szlogout = conv.c_str(); _io->socket()->emit(JSON_CMD_VALUE_USER, szlogout, [&](sio::message::list const& msglist){ message::ptr msg_ptr = msglist[0]; int n =(int)msg_ptr->get_map()["code"]->get_int(); CString strlog; wchar_t* p_url = CFunctions::c2wc(m_ws_url.c_str()); if(n == 0){ strlog.Format(_T("%s: %s"), _T(LOG_LOGOUT_WEB_SERVER), p_url/*CFunctions::c2wc(m_ws_url.c_str())*/); //show_log(strlog); }else{ p_url = CFunctions::c2wc(m_ws_url.c_str()); strlog.Format(_T("%s: %s, err: %d"), _T(LOG_LOGOUT_WEB_SERVER_FAILED), p_url, n/*CFunctions::c2wc(m_ws_url.c_str())*/); } show_log(strlog); if(p_url){ free(p_url); p_url = NULL; } }); //send_json_data(JSON_CMD_VALUE_USER, get_json_logout().c_str()); //CString strlog; //wchar_t* p_url = CFunctions::c2wc(m_ws_url.c_str()); //strlog.Format(_T("%s: %s"), _T(LOG_LOGOUT_WEB_SERVER), p_url/*CFunctions::c2wc(m_ws_url.c_str())*/); //show_log(strlog); //if(p_url){ // free(p_url); // p_url = NULL; //} } void CYAServerDlg::start_tcp_server() { set_app_state(ST_STARTING); if(_server.Start(LOCAL_ADDRESS, PORT_SERVER_MASTER)) { ::LogServerStart(LOCAL_ADDRESS, PORT_SERVER_MASTER); set_app_state(ST_STARTED); } else { ::LogServerStartFail(_server.GetLastError(), _server.GetLastErrorDesc()); set_app_state(ST_STOPPED); } } void CYAServerDlg::stop_tcp_server() { set_app_state(ST_STOPPING); if(_server.Stop()){ ::LogServerStop(); set_app_state(ST_STOPPED); } else{ //ASSERT(FALSE); } } void CYAServerDlg::clear_listener() { //SocketMap::iterator it_sock = mp_socket_list.begin(); //for(; it_sock != mp_socket_list.end();){ // it_sock->second->Close(); // mp_socket_list.erase(it_sock++); //} } void CYAServerDlg::clear_all_list() { // 清空创建的对象 //mp_card_list_all.clear(); //mp_reader_list.clear(); //mp_area_list.clear(); //mp_map_list.clear(); } void CYAServerDlg::parse_data(BYTE *pData, int nLen, DWORD dwConnID) { //CString strBuf; //formatByteArray(strBuf, (BYTE*)pData, nLen); //writeErrorLog(_T("RAW_SS"), strBuf, false); WORD tmplen = 0; SocketBufferMap::iterator it = mp_socket_buffer_list.find(dwConnID); if(it != mp_socket_buffer_list.end()){ // 有此socket数据 if(0 == it->second->wReadLen){ // 新的数据包 memset(it->second->pData, 0, LENGTH_MSG_4K); tmplen = MAKEWORD(pData[1], pData[0]) + sizeof(WORD); // 加上描述长度的两字节 it->second->wLen = tmplen; if(tmplen > nLen){ tmplen = nLen; } //TRACE(_T("1 \n")); memcpy(it->second->pData, pData, tmplen); }else{ // 接着上一次收取 tmplen = min(nLen, it->second->wLen - it->second->wReadLen); //TRACE(_T("2 \n")); memcpy(&it->second->pData[it->second->wReadLen], pData, tmplen); } it->second->wReadLen += tmplen; if(it->second->wReadLen >= it->second->wLen){ // 接收完毕 parse_data_receive(&it->second->pData[sizeof(WORD)], it->second->wLen - sizeof(WORD), dwConnID); // 减去表示长度的两个字节 it->second->wReadLen = 0; // 重置 } }else{ // 无此socket数据 _SOCKET_BUFFER* _sockbuf = new _SOCKET_BUFFER; _sockbuf->wReadLen = 0; _sockbuf->dwConnID = dwConnID; _sockbuf->wLen = MAKEWORD(pData[1], pData[0]) + sizeof(WORD); // 加上描述长度的两个字节 memset(_sockbuf->pData, 0, LENGTH_MSG_4K); //TRACE(_T("3 \n")); memcpy(_sockbuf->pData, pData, nLen); _sockbuf->wReadLen += nLen; mp_socket_buffer_list.insert(make_pair(dwConnID, _sockbuf)); if(_sockbuf->wReadLen >= _sockbuf->wLen){ parse_data_receive(&_sockbuf->pData[sizeof(WORD)], nLen - sizeof(WORD), dwConnID); // 减去表示长度的两个字节 _sockbuf->wReadLen = 0; } } } void CYAServerDlg::parse_data_receive(BYTE *pData, int nLen, DWORD dwConnID ) { if(m_log_raw_data){ //CString strBuf; //formatByteArray(strBuf, (BYTE*)pData, nLen); //writeErrorLog(_T("RAW_SS"), strBuf, false); } int total_pos = 0; WORD pkg_len = 0; while(total_pos < nLen){ // 处理粘包 if(total_pos + sizeof(WORD) >= nLen){ int aa = 20; //break; } pkg_len = MAKEWORD(pData[total_pos+1], pData[total_pos]); // 单个数据包长度 if(total_pos + pkg_len> nLen) { int aa = 20; } TRACE("new memory = %d\n",pkg_len); BYTE* DataBuffer = new BYTE[pkg_len]; if(DataBuffer){ memset(DataBuffer, 0, pkg_len); //TRACE(_T("4 \n")); memcpy(DataBuffer, &pData[total_pos], pkg_len + sizeof(WORD)); // 一个数据包 parse_package_data(DataBuffer, pkg_len + sizeof(WORD), dwConnID); // 解析数据包 } //WaitForMS(3); //delete[] DataBuffer; //DataBuffer = NULL; total_pos += pkg_len + sizeof(WORD); // 数据包长度 + 长度自身两个字节 } } void CYAServerDlg::parse_package_data(BYTE* DataBuffer, int nLen, DWORD dwConnID ) { if(DataBuffer == NULL){ return; } DWORD dw = ::GetTickCount(); CString strBuf = _T(""); if(m_log_raw_data){ formatByteArray(strBuf, DataBuffer, nLen); writeErrorLog(_T("RAW_S"), strBuf, false); //strBuf = _T(""); strBuf.Empty(); } int nCurPos = 0; nCurPos += sizeof(WORD); nLen -= sizeof(WORD); // 减去数据长度 WORD wCrc = CFunctions::getCRC(&DataBuffer[nCurPos], nLen - sizeof(WORD)); // CRC校验码 WORD w ; CFunctions::getWord(&DataBuffer[nCurPos], &w, nLen - sizeof(WORD)); if( w != wCrc ){ // 校验不对 //if(theApp.log_raw_data){ if(m_log_raw_data){ strBuf = _T("CRC校验不通过"); writeErrorLog(_T("RAW_S"), strBuf); //strBuf = _T(""); strBuf.Empty(); } return; } WORD wChr = 0; CFunctions::getWord(DataBuffer, &wChr, nCurPos); nCurPos += sizeof(WORD); int reader_id = 0; int nTick = 0; CString strtime = _T(""); switch (wChr){ case CHAR_LOCATEDATA: // 定位数据 { parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id); ReaderMap::iterator it = mp_reader_list.find(reader_id); if(it != mp_reader_list.end()){ while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc parse_data_locate_card(DataBuffer, nCurPos, reader_id, wChr); } } break; } case CHAR_LOCATEDATA_TDOA: { parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id); ReaderMap::iterator it = mp_reader_list.find(reader_id); if(it != mp_reader_list.end()){ while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc parse_data_locate_card(DataBuffer, nCurPos, reader_id, wChr); } } break; } case CHAR_LOCATEDATAHIS: { g_is_rec_hist = true; parse_data_locate_reader_his(DataBuffer, nLen, nCurPos, reader_id, nTick, strtime, wChr); while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc parse_data_locate_card_his(DataBuffer, nCurPos, reader_id, nTick, strtime, wChr); } break; } case CHAR_LOCATEDATAHIS_TDOA: { g_is_rec_hist = true; parse_data_locate_reader_his(DataBuffer, nLen, nCurPos, reader_id, nTick, strtime, wChr); BYTE* bt = new BYTE[nLen]; while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc // 获取一条记录的长度 WORD wframelen = 0; CFunctions::getWord(DataBuffer, &wframelen, nCurPos); nCurPos += sizeof(WORD); if(bt){ memset(bt, 0, nLen); memcpy(bt, &DataBuffer[nCurPos], wframelen); parse_data_locate_card_his_tdoa(bt, wframelen, reader_id, nTick, strtime); } nCurPos += nLen; } delete[] bt; break; } case CHAR_HIST_DATA_FINISH: { g_is_rec_hist = false; // 完成历史数据上传,可点名下一分站 } case CHAR_READER_SYNC_TIME: { parse_data_reader_synctime(DataBuffer ,nLen ,nCurPos, CHAR_READER_SYNC_TIME); break; } case CHAR_READER_SYNC_TIME_ROOT: { parse_data_reader_synctime(DataBuffer ,nLen ,nCurPos, CHAR_READER_SYNC_TIME_ROOT); break; } case CHAR_ADHOC: { parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id); ReaderMap::iterator it = mp_reader_list.find(reader_id); if(it != mp_reader_list.end()){ while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc parse_data_adhoc(DataBuffer, nCurPos, reader_id); } } break; } default: //WriteInfoFile("未能解析的命令!"); break; } strtime.ReleaseBuffer(); //TRACE(_T("parse_package_data: id: %Iu, t: %d,total t: %d, len: %d\r\n"),dwConnID,::GetTickCount()-dw,::GetTickCount()-g_testtick,nLen); } void CYAServerDlg::parse_data_locate_reader(BYTE * DataBuffer, int& nCurPos, int nLen, DWORD dwConnID, int& reader_id ) { // 分站号 DWORD dwReaderID; CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos); nCurPos += sizeof(DWORD); reader_id = dwReaderID; //_SOCK* sock = get_socket_by_count(dwConnID); //if(NULL == sock){ // 列表中不存在 // if(_server.Disconnect(dwConnID)) // ::LogDisconnect(dwConnID); // else // ::LogDisconnectFail(dwConnID); // return; //} ReaderMap::iterator itReader = mp_reader_list.find(dwReaderID); Reader* pReader; bool isErrorReader = false; if(itReader != mp_reader_list.end()){ pReader = itReader->second; add_socket_to_list(dwConnID, reader_id); }else{ return; isErrorReader = true; pReader = new Reader(); pReader->reader_id = dwReaderID; TRACE(_T("parse_data_locate_reader : new Reader \n")); //mp_reader_list.insert(make_pair(dwReaderID, pReader)); // 只处理在数据库中维护的 } // 接收数据时间 //TRACE(_T("time memcpy \n")); pReader->rec_time = time(NULL); // COleDateTime::GetTickCount(); m_time_last_rec = pReader->rec_time; // 更新最后信号时间 // 分站时间戳 WORD wTickCount = 0; CFunctions::getWord(DataBuffer, &wTickCount, nCurPos); nCurPos += sizeof(WORD); pReader->tick_count = wTickCount; // 分站时间 // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年 BYTE btSec = 0; //TRACE(_T("5 \n")); memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btMin = 0; memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btHour = 0; memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btDay = 0; memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btWeek = 0; memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btMonth = 0; memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btYear = 0; memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); struct tm reader_time; reader_time.tm_sec = btSec; reader_time.tm_min = btMin; reader_time.tm_hour = btHour; reader_time.tm_mday = btDay; reader_time.tm_wday = btWeek; reader_time.tm_mon = btMonth - 1; reader_time.tm_year = btYear + 100; // + 2000 - 1900 pReader->reader_time = mktime(&reader_time); // 温度 BYTE btTemperature = 0; memcpy(&btTemperature, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); pReader->temperature = btTemperature; // 状态 WORD wState = 0; CFunctions::getWord(DataBuffer, &wState, sizeof(WORD)); nCurPos += sizeof(WORD); // pReader->state = wState; //if(theApp.log_parse_data){ if(m_log_parse_data){ CString strLog; strLog.Format(_T("id:%d, n:%d, %.2d-%.2d-%.2d %.2d:%.2d:%.2d, tep:%d, sta:%d"), dwReaderID, wTickCount, btYear, btMonth, btDay, btHour, btMin, btSec, btTemperature, wState); writeErrorLog(_T("PARSE_S"), strLog); //strLog = _T(""); strLog.Empty(); } } void CYAServerDlg::parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr) { ReaderMap::iterator it = mp_reader_list.find(reader_id); // 卡类型 BYTE btCardType = 0; //TRACE(_T("6 \n")); memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); // 卡号 DWORD dwCardId = 0; CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos); nCurPos += sizeof(DWORD); // 获取标识卡编号, 3位卡类型 + 10位卡号 string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10); Card* card = NULL; bool isErrorCard = false; CardMap::iterator it_card = mp_card_list_all.find(str_card_id); if(it_card != mp_card_list_all.end()){ card = it_card->second; }else{ isErrorCard = true; card = new Card(str_card_id, btCardType, theApp.z_offset); //TRACE(_T("parse_data_locate_card : new Card \n")); #ifdef ALGORITHM_TYPE_TOF card->set_reader_path(&mp_reader_path_list); #elif defined ALGORITHM_TYPE_TDOA card->set_reader_path(&mp_reader_path_list_tdoa); #endif //mp_card_list_all.insert(make_pair(str_card_id, card)); } // 设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图 card->set_reader(it->second); card->reader_tickcount = it->second->tick_count; card->is_hist = false; switch(btCardType) { case CT_VEHICLE: { //DWORD dw = ::GetTickCount(); parse_data_locate_card_vehicle(DataBuffer, nCurPos, card, wChr); if(isErrorCard){ //TRACE(_T("delete card: %d \r\n")); delete card; card = NULL; return; } deal_card_msg(card); //TRACE(_T("deal_card: %d \r\n"), ::GetTickCount() - dw); break; } case CT_PERSON: { parse_data_locate_card_vehicle(DataBuffer, nCurPos, card, wChr); if(isErrorCard){ //TRACE(_T("delete card: %d \r\n")); delete card; card = NULL; return; } deal_card_msg(card); break; } default: { // 无法识别的数据 break; } } /*if(isErrorCard){ wchar_t* p_card_id = CFunctions::c2wc(card->card_id.c_str()); TRACE(_T("card_id : %s\n"),p_card_id); if(p_card_id){ free(p_card_id); p_card_id = NULL; } delete card; card = NULL; }*/ } void CYAServerDlg::parse_data_locate_card_vehicle(BYTE* DataBuffer, int& nCurPos, Card* card, unsigned short wChr ) { if(LT_READER == theApp.locate_type){ card->isdealed = false; card->isreceive = true; card->issent = false; } // 报文时间 WORD wCardTickCount; CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos); nCurPos += sizeof(WORD); BYTE btTypeAndPower; //TRACE(_T("7 \n")); memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //报文类型 BYTE btType; btType = (btTypeAndPower >>4) & 0x0F; //电池电量 BYTE btPower; btPower = btTypeAndPower & 0x0F; //保留 nCurPos += sizeof(BYTE); //加速度 BYTE btAcceleration; memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //定位时间戳Tsp // 字序 LONG64 lTime1 = 0; BYTE btTemp = 0; int nRangingPos = nCurPos; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwTemp = 0; CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime1 = btTemp; lTime1 = lTime1 << 32; lTime1 |= ((long long)dwTemp & 0xffffffff); // 距离 double dldist = CFunctions::getDistance(lTime1); //dldist *= card->map_scale; // 天线 BYTE btAntenna; memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); WORD wSyncNum = 0; WORD wStrength = 0; if(CHAR_LOCATEDATA_TDOA == wChr){ // 分站时间同步序列号 CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos); nCurPos += sizeof(WORD); // 信号强度 CFunctions::getWord(DataBuffer, &wStrength, nCurPos); nCurPos += sizeof(WORD); } #ifdef ALGORITHM_TYPE_INS if(card->accelerate_state != btAcceleration){ //如果加速度状态发生了改变,就重置惯导的权重值 card->ins_weight = INS_WEIGHT; } #endif if(LT_COORDINATE == theApp.locate_type){ card->time_stamp = wCardTickCount; card->ranging_type = btType; card->power_state = btPower; card->accelerate_state = btAcceleration; card->flying_time = lTime1; card->sync_num = wSyncNum; card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1; card->distance = dldist; if(m_log_parse_data){ CString strLog; wchar_t* p_card_id = CFunctions::c2wc(card->card_id.c_str()); strLog.Format(_T("id:%s, n:%d, type:%d, power:%d, acc:%d, flytime:%I64u, d:%f, ant:%d, syncnum:%d, strength:%d"), p_card_id/*CFunctions::c2wc(card->card_id.c_str())*/, wCardTickCount, btType, btPower, btAcceleration, lTime1, dldist, btAntenna, wSyncNum, wStrength); writeErrorLog(_T("PARSE_S"), strLog, true); //strLog = _T(""); strLog.Empty(); if(p_card_id){ free(p_card_id); p_card_id = NULL; } } }else if(LT_READER == theApp.locate_type){ if(card->time_stamp < 0xFF && card->time_stamp < wCardTickCount){ card->time_stamp = wCardTickCount; card->ranging_type = btType; card->power_state = btPower; card->accelerate_state = btAcceleration; card->flying_time = lTime1; card->sync_num = wSyncNum; card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1; card->distance = dldist; }else if(0xFF == card->time_stamp && wCardTickCount == 0){ card->time_stamp = wCardTickCount; card->ranging_type = btType; card->power_state = btPower; card->accelerate_state = btAcceleration; card->flying_time = lTime1; card->sync_num = wSyncNum; card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1; card->distance = dldist; } } } void CYAServerDlg::parse_data_adhoc( BYTE* DataBuffer, int& nCurPos, int reader_id ) { ReaderMap::iterator it = mp_reader_list.find(reader_id); BYTE nlen = 0, nDeal = nCurPos; //获取自组网数据长度,1字节 memcpy(&nlen, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); while (nlen > nCurPos - nDeal){ //获取命令字,1字节 BYTE btCmd = 0; memcpy(&btCmd, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); btCmd = btCmd&0x3F; //获取源地址ID,1字节 BYTE btId = 0; memcpy(&btId, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //时间戳,1字节 BYTE btTickcount = 0; memcpy(&btTickcount, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //节点级别,1字节 BYTE btIdx = 0; memcpy(&btIdx, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); if(btId != 0){ string str_card_id = CFunctions::getstrwithzero(CT_ADHOC, 3) + CFunctions::getstrwithzero(btId, 10); Card* card = NULL; CardMap::iterator it_card = mp_card_list_all.find(str_card_id); if(it_card != mp_card_list_all.end()){ card = it_card->second; }else{ card = new Card(str_card_id, CT_ADHOC, theApp.z_offset); mp_card_list_all.insert(make_pair(str_card_id, card)); } CardMap::iterator it_adhoc_card = mp_card_list_down_adhoc.find(str_card_id); if(it_adhoc_card==mp_card_list_down_adhoc.end()&&it_card!=mp_card_list_all.end()){ if(card == NULL){ mp_card_list_down_adhoc.insert(make_pair(str_card_id, it_card->second)); }else{ mp_card_list_down_adhoc.insert(make_pair(str_card_id, card)); } } //设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图 card->set_reader(it->second); if(btIdx < 0 || btIdx >= ADHOC_COUNT){ btIdx = 0; } if(it->second->adhoc[btIdx]){ card->x = it->second->adhoc[btIdx]->x; card->y = it->second->adhoc[btIdx]->y; card->z = it->second->adhoc[btIdx]->z; } if(btCmd & 0x01){ // 呼救 card->status_help = STATUS_ERROR; }else if(btCmd & 0x02){ // 呼叫应答,即呼叫成功 if(STATUS_NORMAL == card->status_call){ card->state_biz = STATUS_NORMAL; } }else { card->status_call = STATUS_NORMAL; card->status_help = STATUS_NORMAL; } card->issent = false; //if(card->status_help != btCmd){ // card->status_help = btCmd; //} deal_card_msg(card); } } } void CYAServerDlg::add_socket_to_list(DWORD dwConnID, DWORD reader_id ) { TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); USHORT usPort; if( _server.GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort)){ SocketMap::iterator itSock = mp_socket_list.find(szAddress); if(itSock != mp_socket_list.end()){ itSock->second->dwConnID = dwConnID; itSock->second->state = 0; itSock->second->reader_id = reader_id; }else{ _SOCK *sock = new _SOCK(); sock->sip = szAddress; sock->dwConnID = dwConnID; sock->state = 0; sock->reader_id = reader_id; mp_socket_list.insert(make_pair(szAddress, sock)); ::PostMessage(this->GetSafeHwnd(), WM_REFRESH_IP_LIST, 1, 0); } } } void CYAServerDlg::remove_socket(DWORD dwConnID ) { EnterCriticalSection(&m_csRemoveSocket); bool bNeedRefresh = false; SocketMap::iterator _sock = mp_socket_list.begin(); while(_sock != mp_socket_list.end()){ if(_sock->second->dwConnID == dwConnID){ _SOCK* s = _sock->second; mp_socket_list.erase(_sock++); bNeedRefresh = true; if(s){ delete s; s = NULL; } }else{ ++_sock; } } if(bNeedRefresh){ ::PostMessage(this->GetSafeHwnd(), WM_REFRESH_IP_LIST, 0, 0); } LeaveCriticalSection(&m_csRemoveSocket); } // 获取设备状态信息, 分站、红绿灯、道岔、扩音器 std::string CYAServerDlg::get_json_device_state() { char _time[STR_LEN_TIME]; struct tm local_time; Json::Value root; Json::Value state_maps; MapInfoMap::iterator it_map = mp_map_list.begin(); int nn = 0; for(; it_map != mp_map_list.end(); ++it_map){ Json::Value state_map; Json::Value state_devs; int n = 0; ReaderMap::iterator it = mp_reader_list.begin(); for(; it != mp_reader_list.end(); ++it){ if(it->second->map_id != it_map->second->map_id) continue; //if(it->second->state != it->second->state_old){ Json::Value state_dev; state_dev[JSON_KEY_DEV_STATE_DEVICE_ID] = it->second->reader_id; state_dev[JSON_KEY_DEV_STATE_STATE_DESC] = it->second->get_state_text(); state_dev[JSON_KEY_DEV_STATE_STATE] = it->second->state; state_dev[JSON_KEY_DEV_STATE_DEVICE_TYPE_ID] = it->second->device_type_id; localtime_s(&local_time, &it->second->rec_time); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); state_dev[JSON_KEY_DEV_STATE_TIME] = _time; n++; state_devs.append(state_dev); it->second->state_old = it->second->state; //} } if(n >0){ state_map[JSON_KEY_DEV_STATE_MAP_ID] = it_map->second->map_id; state_map[JSON_KEY_DEV_STATE_DEVICES] = state_devs; nn++; state_maps.append(state_map); } } if(nn>0){ root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_DEV_STATE; root[JSON_ROOT_KEY_DATA] = state_maps; return root.toFastString(); } return ""; } std::string CYAServerDlg::get_json_alarm() { Json::Value root; Json::Value data; Json::Value _global; Json::Value _areas; Json::Value _readers; Json::Value _staff; Json::Value _vehicle; Json::Value _adhoc; unsigned int alarm_count = 0; char _time[STR_LEN_TIME]; struct tm local_time; // global // 人员超员 alarm_count = mp_card_list_down_person.size(); if(alarm_count > sls_setting.over_count_person){ // if(time_over_count_person >0) Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_PERSON; detail[JSON_KEY_ALARM_MAX] = sls_setting.over_count_person; detail[JSON_KEY_ALARM_CURRENT] = alarm_count; alarm[JSON_KEY_ALARM_DETAIL] = detail; _global.append(alarm); } // 车辆超员 alarm_count = mp_card_list_down_vehicle.size(); if(alarm_count > sls_setting.over_count_vehicle){ Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_VEHICLE; detail[JSON_KEY_ALARM_MAX] = sls_setting.over_count_vehicle; detail[JSON_KEY_ALARM_CURRENT] = alarm_count; alarm[JSON_KEY_ALARM_DETAIL] = detail; _global.append(alarm); } // 人员超时 alarm_count = mp_card_list_over_time_person.size(); if(alarm_count > 0){ Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_PERSON; detail[JSON_KEY_ALARM_MAX] = sls_setting.over_time_person; detail[JSON_KEY_ALARM_CURRENT] = alarm_count; alarm[JSON_KEY_ALARM_DETAIL] = detail; _global.append(alarm); } // 车辆超时 alarm_count = mp_card_list_over_time_vehicle.size(); if(alarm_count > 0){ Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE; detail[JSON_KEY_ALARM_MAX] = sls_setting.over_time_vehicle; detail[JSON_KEY_ALARM_CURRENT] = alarm_count; alarm[JSON_KEY_ALARM_DETAIL] = detail; _global.append(alarm); } // 车辆超速 alarm_count = mp_card_list_over_speed_vehicle.size(); if(alarm_count > 0){ Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE; detail[JSON_KEY_ALARM_MAX] = sls_setting.over_speed; detail[JSON_KEY_ALARM_CURRENT] = alarm_count; alarm[JSON_KEY_ALARM_DETAIL] = detail; _global.append(alarm); } // areas // 人员超员 AreaMap::iterator it_area = mp_area_list.begin(); bool is_alarm = false; for(; it_area != mp_area_list.end(); ++it_area){ is_alarm = false; Json::Value area; Json::Value alarms; if(it_area->second->count_area_over_count_person > 0){ is_alarm = true; Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_PERSON; detail[JSON_KEY_ALARM_MAX] = it_area->second->over_count_person; detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_person; alarm[JSON_KEY_ALARM_DETAIL] = detail; alarms.append(alarm); } if(it_area->second->count_area_over_count_vehicle > 0){ is_alarm = true; Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_VEHICLE; detail[JSON_KEY_ALARM_MAX] = it_area->second->over_count_vehicle; detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_vehicle; alarm[JSON_KEY_ALARM_DETAIL] = detail; alarms.append(alarm); } if(it_area->second->count_area_over_time_person > 0){ is_alarm = true; Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_PERSON; detail[JSON_KEY_ALARM_MAX] = it_area->second->over_time_person; detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_area_over_time_person; alarm[JSON_KEY_ALARM_DETAIL] = detail; alarms.append(alarm); } if(it_area->second->count_area_over_time_vehicle > 0){ is_alarm = true; Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE; detail[JSON_KEY_ALARM_MAX] = it_area->second->over_time_vehicle; detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_area_over_time_vehicle; alarm[JSON_KEY_ALARM_DETAIL] = detail; alarms.append(alarm); } if(it_area->second->count_area_forbidden_person > 0 || it_area->second->count_area_forbidden_vehicle > 0){ is_alarm = true; Json::Value alarm; Json::Value detail; alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_AREA_FORBIDDEN; detail[JSON_KEY_ALARM_PERSON] = it_area->second->count_area_forbidden_person; detail[JSON_KEY_ALARM_VEHICLE] = it_area->second->count_area_forbidden_vehicle; alarm[JSON_KEY_ALARM_DETAIL] = detail; alarms.append(alarm); } if(is_alarm){ area[JSON_KEY_ALARM_AREA_ID] = it_area->first;//it_area->second->area_id; area[JSON_KEY_ALARM_ALARMS] = alarms; _areas.append(area); } } // 分站 ReaderMap::iterator it_reader = mp_reader_list.begin(); alarm_count = 0; for(; it_reader != mp_reader_list.end(); ++it_reader){ if (it_reader->second->state == STATUS_DEVICE_ERROR){ Json::Value alarm; int r_id = it_reader->second->reader_id; alarm[JSON_KEY_ALARM_READER_ID] = it_reader->second->reader_id; alarm[JSON_KEY_ALARM_TYPE_ID] = ATID_READER; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_READER); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_reader->second->rec_time); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); //strftime(_time, STR_LEN_TIME, "%m-%d %H:%M", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; _readers.append(alarm); } } CardMap::iterator it_staff = mp_card_list_down_person.begin(); for(; it_staff != mp_card_list_down_person.end(); ++it_staff){ if(it_staff->second->status_area_over_time == STATUS_NORMAL && it_staff->second->status_area_forbidden == STATUS_NORMAL && it_staff->second->status_over_time == STATUS_NORMAL && it_staff->second->status_power == STATUS_NORMAL) { continue; } Json::Value alarms; Json::Value staff; if(it_staff->second->status_area_forbidden == STATUS_ERROR){ time_t tt = it_staff->second->time_area_forbidden; Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_FORBIDDEN_PERSON); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &tt); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_staff->second->status_area_over_time == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_OVER_TIME_PERSON); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_staff->second->time_area_over_time); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_staff->second->status_over_time == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_TIME_PERSON); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_staff->second->time_over_time); strftime(_time, STR_LEN_TIME, "%m-%d %H:%M", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_staff->second->status_power == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_POWER); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_staff->second->time_low_power); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(alarms != NULL){ staff[JSON_KEY_ALARM_STAFFER_ID] = it_staff->first;//it_staff->second->id; staff[JSON_KEY_ALARM_ALARMS] = alarms; _staff.append(staff); } } CardMap::iterator it_vehicle = mp_card_list_down_vehicle.begin(); for(; it_vehicle != mp_card_list_down_vehicle.end(); ++it_vehicle){ if(it_vehicle->second->status_area_forbidden == STATUS_NORMAL && it_vehicle->second->status_area_over_time == STATUS_NORMAL && it_vehicle->second->status_over_speed == STATUS_NORMAL && it_vehicle->second->status_over_time == STATUS_NORMAL && it_vehicle->second->status_power == STATUS_NORMAL ){ continue; } Json::Value alarms; Json::Value vehichle; if(it_vehicle->second->status_area_forbidden == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_FORBIDDEN_VEHICLE); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_vehicle->second->time_area_forbidden); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_vehicle->second->status_area_over_time == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_OVER_TIME_VEHICLE); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_vehicle->second->time_area_over_time); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_vehicle->second->status_over_time == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_TIME_VEHICLE); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_vehicle->second->time_over_time); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_vehicle->second->status_power == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_POWER); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_vehicle->second->time_low_power); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(it_vehicle->second->status_over_speed == STATUS_ERROR){ Json::Value alarm; AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_SPEED); if(it_alarm != mp_alarm_type_list.end()){ alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second; } localtime_s(&local_time, &it_vehicle->second->time_over_speed); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm[JSON_KEY_ALARM_START_TIME] = _time; alarms.append(alarm); } if(alarms != NULL){ vehichle[JSON_KEY_ALARM_STAFFER_ID] = it_vehicle->first; vehichle[JSON_KEY_ALARM_ALARMS] = alarms; _vehicle.append(vehichle); } } if(_global != NULL){ data[JSON_KEY_ALARM_GLOBAL] = _global; } if(_areas != NULL){ data[JSON_KEY_ALARM_AREA] = _areas; } if(_readers != NULL){ data[JSON_KEY_ALARM_READER] = _readers; } if(_staff != NULL){ data[JSON_KEY_ALARM_STAFF] = _staff; } if(_vehicle != NULL){ data[JSON_KEY_ALARM_VEHICLE] = _vehicle; } if(data != NULL){ root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_ALARM; root[JSON_ROOT_KEY_DATA] = data; return root.toFastString(); } return ""; } int CYAServerDlg::get_help_card_nums() { int nRet = 0; CardMap::iterator it = mp_card_list_down_adhoc.begin(); for(it;it!=mp_card_list_down_adhoc.end();++it){ if(it->second->status_help == STATUS_ERROR){ nRet++; } } return nRet; } std::string CYAServerDlg::get_json_help() { Json::Value root; Json::Value alarms; Json::Value adhoc; char _time[STR_LEN_TIME]; struct tm local_time; CardMap::iterator it_adhoc = mp_card_list_down_adhoc.begin(); for(;it_adhoc!=mp_card_list_down_adhoc.end();++it_adhoc){ if(it_adhoc->second->status_help == STATUS_NORMAL){ continue; } Json::Value alarm; if(it_adhoc->second->status_help == STATUS_ERROR){ alarm[JSON_KEY_CARD_ID] = it_adhoc->second->card_id; alarm[JSON_KEY_CARD_TYPE_ID] = it_adhoc->second->card_type; localtime_s(&local_time, &it_adhoc->second->enter_reader_time); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); alarm["start_time"] = _time; } if(!alarm.isNull()){ //alarms.append(alarm); //alarms=alarm; alarms.append(alarm); string sss = ""; sss = alarms.toStyledString(); //adhoc.append(alarms); } } if(!alarms.isNull()){ root[JSON_ROOT_KEY_CMD] = "helpme_req"; root[JSON_ROOT_KEY_DATA] = alarms; } string aa = ""; aa = root.toStyledString(); return root.toFastString(); } std::string CYAServerDlg::get_json_down_and_up( Card* card ) { //新json格式 Json::Value root; Json::Value val_card; Json::Value val_cards; //卡号 val_card[JSON_KEY_CARD_ID] = card->card_id; val_cards.append(val_card[JSON_KEY_CARD_ID]); if(card->pos_state == DT_DOWN){ //x,y坐标 val_card[JSON_KEY_CORDINATE_X] = CFunctions::round(card->x,2); val_cards.append(val_card[JSON_KEY_CORDINATE_X]); val_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(card->y,2); val_cards.append(val_card[JSON_KEY_CORDINATE_Y]); }else{ val_card[JSON_KEY_CORDINATE_X] = 0; val_cards.append(val_card[JSON_KEY_CORDINATE_X]); val_card[JSON_KEY_CORDINATE_Y] = 0; val_cards.append(val_card[JSON_KEY_CORDINATE_Y]); } int ms = 1000; //入井时间戳 double t = *((int64_t*)&card->down_time)*ms; //转为ms val_card[JSON_KEY_DOWN_TIME] = t; val_cards.append(val_card[JSON_KEY_DOWN_TIME]); //进入区域时间戳 t = *((int64_t*)&card->enter_area_time)*ms; val_card[JSON_KEY_ENTER_AREA_TIME] = t; val_cards.append(val_card[JSON_KEY_ENTER_AREA_TIME]); if(card->pos_state == DT_DOWN){ //接收时间戳 t = *((int64_t*)&card->rec_time)*ms; val_card[JSON_KEY_REC_TIME] = t; val_cards.append(val_card[JSON_KEY_REC_TIME]); //工作时长 t = (int)(difftime(time(NULL), card->down_time))*ms; val_card[JSON_KEY_WORK_TIME] = t; val_cards.append(val_card[JSON_KEY_WORK_TIME]); }else{ val_card[JSON_KEY_REC_TIME] = 0; val_cards.append(val_card[JSON_KEY_REC_TIME]); //工作时长 //t = (int)(difftime(time(NULL), card->down_time)); val_card[JSON_KEY_WORK_TIME] = 0; val_cards.append(val_card[JSON_KEY_WORK_TIME]); } //地图编号 val_card[JSON_KEY_MAP_ID] = card->map_id; val_cards.append(val_card[JSON_KEY_MAP_ID]); //区域编号 val_card[JSON_KEY_AREA_ID] = card->area_id; val_cards.append(val_card[JSON_KEY_AREA_ID]); //部门编号 val_card[JSON_KEY_DEPT_ID] = card->dept_id; val_cards.append(val_card[JSON_KEY_DEPT_ID]); if(card->pos_state == DT_DOWN){ card->get_state_text(); //状态 val_card[JSON_KEY_STATE] = card->state; val_cards.append(val_card[JSON_KEY_STATE]); //运行状态 val_card[JSON_KEY_STATE_MOVING] = card->state_moving; val_cards.append(val_card[JSON_KEY_STATE_MOVING]); //业务状态 val_card[JSON_KEY_STATE_BIZ] = card->state_biz; val_cards.append(val_card[JSON_KEY_STATE_BIZ]); //速度 val_card[JSON_KEY_SPEED] = CFunctions::round(card->v,2); val_cards.append(val_card[JSON_KEY_SPEED]); }else{ //状态 val_card[JSON_KEY_STATE] = 0; val_cards.append(val_card[JSON_KEY_STATE]); //运行状态 val_card[JSON_KEY_STATE_MOVING] = 0; val_cards.append(val_card[JSON_KEY_STATE_MOVING]); //业务状态 val_card[JSON_KEY_STATE_BIZ] = 0; val_cards.append(val_card[JSON_KEY_STATE_BIZ]); //速度 val_card[JSON_KEY_SPEED] = 0; val_cards.append(val_card[JSON_KEY_SPEED]); } root[JSON_ROOT_KEY_CMD] = (DT_DOWN == card->pos_state)? JSON_CMD_VALUE_DOWN_MINE : JSON_CMD_VALUE_UP_MINE; root[JSON_ROOT_KEY_DATA].append(val_cards); string ss = root.toStyledString(); return root.toFastString(); //旧版本json //Json::Value root; //Json::Value val_map; //Json::Value val_maps; //Json::Value val_card; //Json::Value val_cards; //char _time[STR_LEN_TIME]; //struct tm local_time; //val_card[JSON_KEY_CARD_ID] = card->card_id; //val_card[JSON_KEY_CARD_TYPE_ID] = card->card_type; //val_card[JSON_KEY_CARD_NUM] = card->id; //localtime_s(&local_time, &card->down_time); //strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); //val_card[JSON_KEY_DOWN_TIME] = _time; //val_card[JSON_KEY_WORK_TIME] = CFunctions::getworktimebysec((int)difftime(time(NULL), card->down_time)); //localtime_s(&local_time, &card->enter_area_time); //strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); //val_card[JSON_KEY_ENTER_AREA_TIME] = _time; //val_card[JSON_KEY_AREA_ID] = card->area_id; //val_card[JSON_KEY_DEPT_ID] = card->dept_id; //val_card[JSON_KEY_STATE] = card->state; //localtime_s(&local_time, &card->rec_time); //strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); //val_card[JSON_KEY_REC_TIME] = _time; //val_card[JSON_KEY_CORDINATE_X] = card->x; //val_card[JSON_KEY_CORDINATE_Y] = card->y; //val_card[JSON_KEY_CORDINATE_Z] = 0; // card->z; //val_cards.append(val_card); //val_map[JSON_KEY_MAP_ID] = card->map_id; //val_map[JSON_KEY_POS_CARD] = val_cards; //val_maps.append(val_map); //root[JSON_ROOT_KEY_CMD] = (DT_DOWN == card->pos_state)? JSON_CMD_VALUE_DOWN_MINE : JSON_CMD_VALUE_UP_MINE; //root[JSON_ROOT_KEY_DATA] = val_maps; //string ss = root.toStyledString(); //return root.toFastString(); } std::string CYAServerDlg::get_json_position() { Json::Value root; int cnt = 0; MapInfoMap::iterator it_map = mp_map_list.begin(); for(; it_map != mp_map_list.end(); ++it_map){ CardMap::iterator it = mp_card_list_all.begin(); for(; it != mp_card_list_all.end(); ++it){ /*if(it->second->pos_state != DT_DOWN){ continue; }*/ if(it->second->issent) { continue; } if(it->second->map_id != it_map->second->map_id){ continue; } if(!it->second->isdealed){ continue; } if(_isnan(it->second->x) || _isnan(it->second->y) || _isnan(it->second->v)){ continue; } Json::Value pos_cards; Json::Value pos_card; it->second->isdealed = false; it->second->issent = true; //卡号 pos_card[JSON_KEY_CARD_ID] = it->second->card_id; pos_cards.append(pos_card[JSON_KEY_CARD_ID]); //x,y坐标 pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2); pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]); pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2); pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]); int ms = 1000; //转为ms //入井时间戳 double t = *((int64_t*)&it->second->down_time)*ms; pos_card[JSON_KEY_DOWN_TIME] = t; pos_cards.append(pos_card[JSON_KEY_DOWN_TIME]); //进入区域时间戳 t = *((int64_t*)&it->second->enter_area_time)*ms; pos_card[JSON_KEY_ENTER_AREA_TIME] = t; pos_cards.append(pos_card[JSON_KEY_ENTER_AREA_TIME]); //最后接收时间戳 t = *((int64_t*)&it->second->rec_time)*ms; pos_card[JSON_KEY_REC_TIME] = t; pos_cards.append(pos_card[JSON_KEY_REC_TIME]); //工作时长 t = (int)difftime(time(NULL), it->second->down_time)*ms; pos_card[JSON_KEY_WORK_TIME] = t; pos_cards.append(pos_card[JSON_KEY_WORK_TIME]); //地图编号 pos_card[JSON_KEY_MAP_ID] = it->second->map_id; pos_cards.append(pos_card[JSON_KEY_MAP_ID]); //区域编号 pos_card[JSON_KEY_AREA_ID] = it->second->area_id; pos_cards.append(pos_card[JSON_KEY_AREA_ID]); //部门编号 pos_card[JSON_KEY_DEPT_ID] = it->second->dept_id; pos_cards.append(pos_card[JSON_KEY_DEPT_ID]); it->second->get_state_text(); //状态 pos_card[JSON_KEY_STATE] = it->second->state; pos_cards.append(pos_card[JSON_KEY_STATE]); //运行状态 pos_card[JSON_KEY_STATE_MOVING] = it->second->state_moving; pos_cards.append(pos_card[JSON_KEY_STATE_MOVING]); //业务状态 pos_card[JSON_KEY_STATE_BIZ] = it->second->state_biz; pos_cards.append(pos_card[JSON_KEY_STATE_BIZ]); //速度 pos_card[JSON_KEY_SPEED] = CFunctions::round(it->second->v,2); pos_cards.append(pos_card[JSON_KEY_SPEED]); if(!pos_cards.isNull()){ root[JSON_ROOT_KEY_DATA].append(pos_cards); cnt++; } } } std::string ret = ""; if(cnt > 0){ root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP; ret = root.toFastString().c_str(); } return ret; } std::string CYAServerDlg::get_json_position_all() { Json::Value root; int cnt = 0; MapInfoMap::iterator it_map = mp_map_list.begin(); for(; it_map != mp_map_list.end(); ++it_map){ CardMap::iterator it = mp_card_list_all.begin(); for(; it != mp_card_list_all.end(); ++it){ if(it->second->map_id != it_map->second->map_id){ continue; } if(_isnan(it->second->x) || _isnan(it->second->y) || _isnan(it->second->v)){ continue; } it->second->issent = true; Json::Value pos_cards; Json::Value pos_card; //卡号 pos_card[JSON_KEY_CARD_ID] = it->second->card_id; pos_cards.append(pos_card[JSON_KEY_CARD_ID]); //x,y坐标 pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2); pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]); pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2); pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]); int ms = 1000; //转为ms //入井时间戳 double t = *((int64_t*)&it->second->down_time)*ms; pos_card[JSON_KEY_DOWN_TIME] = t; pos_cards.append(pos_card[JSON_KEY_DOWN_TIME]); //进入区域时间戳 t = *((int64_t*)&it->second->enter_area_time)*ms; pos_card[JSON_KEY_ENTER_AREA_TIME] = t; pos_cards.append(pos_card[JSON_KEY_ENTER_AREA_TIME]); //最后接收时间戳 t = *((int64_t*)&it->second->rec_time)*ms; pos_card[JSON_KEY_REC_TIME] = t; pos_cards.append(pos_card[JSON_KEY_REC_TIME]); //工作时长 t = (int)difftime(time(NULL), it->second->down_time)*ms; pos_card[JSON_KEY_WORK_TIME] = t; pos_cards.append(pos_card[JSON_KEY_WORK_TIME]); //地图编号 pos_card[JSON_KEY_MAP_ID] = it->second->map_id; pos_cards.append(pos_card[JSON_KEY_MAP_ID]); //区域编号 pos_card[JSON_KEY_AREA_ID] = it->second->area_id; pos_cards.append(pos_card[JSON_KEY_AREA_ID]); //部门编号 pos_card[JSON_KEY_DEPT_ID] = it->second->dept_id; pos_cards.append(pos_card[JSON_KEY_DEPT_ID]); it->second->get_state_text(); //状态 pos_card[JSON_KEY_STATE] = it->second->state; pos_cards.append(pos_card[JSON_KEY_STATE]); //运行状态 pos_card[JSON_KEY_STATE_MOVING] = it->second->state_moving; pos_cards.append(pos_card[JSON_KEY_STATE_MOVING]); //业务状态 pos_card[JSON_KEY_STATE_BIZ] = it->second->state_biz; pos_cards.append(pos_card[JSON_KEY_STATE_BIZ]); //速度 pos_card[JSON_KEY_SPEED] = CFunctions::round(it->second->v,2); pos_cards.append(pos_card[JSON_KEY_SPEED]); if(!pos_cards.isNull()){ root[JSON_ROOT_KEY_DATA].append(pos_cards); cnt++; } } } std::string ret = ""; if(cnt > 0){ root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP; ret = root.toFastString().c_str(); } return ret; } std::string CYAServerDlg::get_json_login() { Json::Value root; Json::Value data; data[JSON_KEY_USERNAME] = JSON_VALUE_USERNAME; data[JSON_KEY_PASSWORD] = JSON_VALUE_PASSWORD; root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_LOGIN; root[JSON_ROOT_KEY_DATA] = data; return root.toFastString(); } std::string CYAServerDlg::get_json_logout() { Json::Value root; Json::Value data; //data[JSON_KEY_USERNAME] = JSON_VALUE_USERNAME; data["name"] = JSON_VALUE_USERNAME; root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_LOGOUT; //root[JSON_ROOT_KEY_DATA] = data; root["user"] = data; return root.toFastString(); } void CYAServerDlg::send_json_data(string cmd, string data, bool is_login /* = false*/) { USES_CONVERSION; CC2UTF8 conv = (char*)data.c_str(); string utf8_data = conv.c_str(); CString strlog; if(is_login){ if(is_websocket_ok){ _io->socket()->emit(cmd, utf8_data); is_websocket_login = true; strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), _T("登录数据")); show_log(strlog); } }else if(is_websocket_login){ strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), _T("常规数据")); _io->socket()->emit(cmd, utf8_data); if(m_log_send_package){ wchar_t* p_data = CFunctions::c2wc(data.c_str()); writeErrorLog(L"JSON_S", p_data/*CFunctions::c2wc(data.c_str())*/,false); if(p_data){ free(p_data); p_data = NULL; } } } //strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), CFunctions::c2wc(cmd.c_str())); //show_log(strlog); } // 处理分站状态 void CYAServerDlg::deal_readers() { ReaderMap::iterator it = mp_reader_list.begin(); for(; it != mp_reader_list.end(); ++ it){ int ndiff = (int)difftime(time(NULL), it->second->rec_time); if(STATUS_DEVICE_ERROR == it->second->state){ // 异常 if(ndiff < READER_TIMEOUT){ // 恢复正常 store_data_reader(it->second, ALARM_READER_LOST_END); it->second->state = STATUS_DEVICE_NORMAL; } }else{ if(ndiff >= READER_TIMEOUT){ //异常 it->second->state = STATUS_DEVICE_ERROR; it->second->lost_time = time(NULL); store_data_reader(it->second, ALARM_READER_LOST_START); } } } } void CYAServerDlg::deal_areas() { // 区域人数,区域超员数,区域超时数 int count_person, count_vehicle, count_total, count_over_time_person, count_over_time_vehicle; int over_time_vehicle, over_time_person, over_time; //TRACE(_T("time memcpy 9\n")); time_t current_time(time(NULL)); AreaMap::iterator it_Area = mp_area_list.begin(); bool is_true; for(; it_Area != mp_area_list.end(); ++it_Area){ count_person = count_vehicle = count_total = count_over_time_vehicle = count_over_time_person = 0; over_time_person = it_Area->second->over_time_person * 60; // 转为秒 over_time_vehicle = it_Area->second->over_time_vehicle * 60; // 转为秒 over_time = over_time_person; // 遍历卡,计数 CardMap::iterator it_card_person = it_Area->second->area_card_list_person.begin(); for(; it_card_person != it_Area->second->area_card_list_person.end(); ++it_card_person){ // 计数 count_total++; count_person++; // 超时 is_true = difftime(current_time, it_card_person->second->enter_area_time) > over_time; if(is_true){ if(!it_card_person->second->is_area_over_time){ it_card_person->second->is_area_over_time = true; it_card_person->second->time_area_over_time = current_time; store_data_card(it_card_person->second, ALARM_CARD_OVER_TIME_AREA_START); deal_alarm_card(it_card_person->second, &mp_card_list_area_over_time_person, is_true, AF_CARD_AREA_OVER_TIME); } over_time_person++; }else if(it_card_person->second->is_area_over_time){ // 理论上不会走这条分支,应该走cards_leave_area() it_card_person->second->is_area_over_time = false; deal_alarm_card(it_card_person->second, &mp_card_list_area_over_time_person, is_true, AF_CARD_AREA_OVER_TIME); } } over_time = over_time_vehicle; CardMap::iterator it_card_vehicle = it_Area->second->area_card_list_vehicle.begin(); for(;it_card_vehicle != it_Area->second->area_card_list_vehicle.end(); ++it_card_vehicle){ // 计数 count_total++; // 区域超速,暂无此逻辑 count_vehicle++; // 超时 if(difftime(current_time, it_card_vehicle->second->enter_area_time) > over_time){ if(!it_card_vehicle->second->is_area_over_time){ it_card_vehicle->second->is_area_over_time = true; it_card_vehicle->second->time_area_over_time = current_time; store_data_card(it_card_person->second, ALARM_CARD_OVER_TIME_AREA_START); deal_alarm_card(it_card_vehicle->second, &mp_card_list_area_over_time_vehicle, is_true, AF_CARD_AREA_OVER_TIME); } over_time_vehicle++; }else if(it_card_vehicle->second->is_area_over_time){ // 理论上不会走这条分支,应该走cards_leave_area() it_card_vehicle->second->is_area_over_time = false; deal_alarm_card(it_card_vehicle->second, &mp_card_list_area_over_time_vehicle, is_true, AF_CARD_AREA_OVER_TIME); } } it_Area->second->count_person = count_person; it_Area->second->count_vehicle = count_vehicle; it_Area->second->count_area_over_time_person = count_over_time_person; it_Area->second->count_area_over_time_vehicle = count_over_time_vehicle; // 区域禁入 人员 //if(it_Area->second->over_count_person == 0){ if(it_Area->second->area_type_id == 3){ if(count_person > 0){ if(!it_Area->second->is_area_forbidden_person){ it_Area->second->is_area_forbidden_person = true; it_Area->second->count_area_forbidden_person = count_person; it_Area->second->time_forbidden_person = current_time; store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_FORBIDDEN_PERSON_START); deal_alarm_area(it_Area->second, &mp_area_forbidden_person, true, AF_AREA_FORBIDDEN); } }else{ if(it_Area->second->is_area_forbidden_person){ it_Area->second->is_area_forbidden_person = false; // 结束报警 store_data_area(it_Area->second, current_time, it_Area->second->time_forbidden_person, ALARM_AREA_FORBIDDEN_PERSON_END); deal_alarm_area(it_Area->second, &mp_area_forbidden_person, false, AF_AREA_FORBIDDEN); } } } else { if(count_person > it_Area->second->over_count_person ){ // 区域人员超员 if(!it_Area->second->is_area_over_count_person){ it_Area->second->is_area_over_count_person = true; it_Area->second->count_area_over_count_person = count_person - it_Area->second->over_count_person; it_Area->second->time_over_count_person = current_time; store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_OVER_COUNT_PERSON_START); deal_alarm_area(it_Area->second, &mp_area_over_count_person, true, AF_AREA_OVER_COUNT); } }else{ if(it_Area->second->is_area_over_count_person){ // 结束超员 it_Area->second->is_area_over_count_person = false; store_data_area(it_Area->second, current_time, it_Area->second->time_over_count_person, ALARM_AREA_OVER_COUNT_PERSON_END); deal_alarm_area(it_Area->second, &mp_area_over_count_person, false, AF_AREA_OVER_COUNT); } } // 区域人员超时 if(count_over_time_person > 0){ if(!it_Area->second->is_area_over_time_person){ it_Area->second->is_area_over_time_person = true; it_Area->second->time_over_time_person = current_time; deal_alarm_area(it_Area->second, &mp_area_over_time_person, true, AF_AREA_OVER_TIME); } }else{ if(it_Area->second->is_area_over_time_person){ // 结束 it_Area->second->is_area_over_time_person = false; deal_alarm_area(it_Area->second, &mp_area_over_time_person, false, AF_AREA_OVER_TIME); } } } // 区域禁入 车辆 //if(it_Area->second->over_count_vehicle == 0){ if(it_Area->second->area_type_id == 3){ if(count_vehicle > 0){ if(!it_Area->second->is_area_forbidden_vehicle){ it_Area->second->is_area_forbidden_vehicle = true; it_Area->second->count_area_forbidden_vehicle = count_vehicle; it_Area->second->time_forbidden_vehicle = current_time; store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_FORBIDDEN_VEHICLE_START); deal_alarm_area(it_Area->second, &mp_area_forbidden_vehicle, true, AF_AREA_FORBIDDEN); } }else{ if(it_Area->second->is_area_forbidden_vehicle){ it_Area->second->is_area_forbidden_vehicle = false; // 结束报警 store_data_area(it_Area->second, current_time, it_Area->second->time_forbidden_vehicle, ALARM_AREA_FORBIDDEN_VEHICLE_END); deal_alarm_area(it_Area->second, &mp_area_forbidden_vehicle, false, AF_AREA_FORBIDDEN); } } }else { if(count_vehicle > it_Area->second->over_count_vehicle){ // 区域车辆超员 if(!it_Area->second->is_area_over_count_vehicle){ it_Area->second->is_area_over_count_vehicle = true; it_Area->second->count_area_over_count_vehicle = count_vehicle - it_Area->second->over_count_vehicle; it_Area->second->time_over_count_vehicle = current_time; store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_OVER_COUNT_VEHICLE_START); deal_alarm_area(it_Area->second, &mp_area_over_count_vehicle, true, AF_AREA_OVER_COUNT); } }else{ it_Area->second->is_area_over_count_vehicle = false; // 结束 store_data_area(it_Area->second, current_time, it_Area->second->time_over_count_vehicle, ALARM_AREA_OVER_COUNT_VEHICLE_END); deal_alarm_area(it_Area->second, &mp_area_over_count_vehicle, false, AF_AREA_OVER_COUNT); } // 区域车辆超时 if(count_over_time_vehicle > 0){ if(!it_Area->second->is_area_over_time_vehicle){ it_Area->second->is_area_over_time_vehicle = true; it_Area->second->time_over_time_vehicle = current_time; deal_alarm_area(it_Area->second, &mp_area_over_time_vehicle, true, AF_AREA_OVER_TIME); } }else{ if(it_Area->second->is_area_over_time_vehicle){ // 结束 it_Area->second->is_area_over_time_vehicle = false; deal_alarm_area(it_Area->second, &mp_area_over_time_vehicle, false, AF_AREA_OVER_TIME); // 写入数据库 } } } } } void CYAServerDlg::card_enter_mine( Card* card ) { if(!card->is_pos_state_changed(TEST_CONFIRM_COUNT)){ // 位置没有变化 if(DT_DOWN == card->pos_state){ if(CT_PERSON == card->card_type){ if(difftime(time(NULL), card->get_working_time()) > sls_setting.over_time_person){ store_data_card(card, ALARM_CARD_OVER_TIME_START); deal_alarm_card(card, &mp_card_list_over_time_person, true, AF_CARD_OVER_TIME); } }else if(CT_VEHICLE == card->card_type){ if(difftime(time(NULL), card->get_working_time()) > sls_setting.over_time_vehicle){ store_data_card(card, ALARM_CARD_OVER_TIME_START); deal_alarm_card(card, &mp_card_list_over_time_vehicle, true, AF_CARD_OVER_TIME); } if(card->get_speed() > sls_setting.over_speed){ store_data_card(card, ALARM_CARD_OVER_SPEED_START); deal_alarm_card(card, &mp_card_list_over_speed_vehicle, true, AF_CARD_OVER_SPEED); } } } }else{ if(DT_UP == card->pos_state){ // 升井 card_up_mine(card); // 升井,补全离开区域时间 store_data_card(card, HIS_AREA_LOCATION_LEAVE); }else if(DT_DOWN == card->pos_state){ // 入井 card_down_mine(card); } send_json_data(JSON_CMD_VALUE_PUSH, get_json_down_and_up(card)); } } void CYAServerDlg::card_enter_park( Card* card ) { if(card->is_pos_state_pack_changed(TEST_CONFIRM_COUNT)){ // 位置没有变化 if(AAT_ENTER == card->pos_state_park){ // //card->up_time = card->deal_time; card->up_time = CFunctions::systime_to_timet(card->deal_time); store_data_card(card, RPT_ATTEND_UP); }else if(AAT_LEAVE == card->pos_state_park){ // 入井 //card->down_time = card->deal_time; card->down_time = CFunctions::systime_to_timet(card->deal_time); store_data_card(card, RPT_ATTEND_DOWN); } } } void CYAServerDlg::card_enter_map( Card* card ) { if(card->map_id == card->map_id_old) return ; // 离开原地图,进入新地图 MapInfoMap::iterator it_map_old = mp_map_list.find(card->map_id_old); if(it_map_old != mp_map_list.end()){ if(CT_PERSON == card->card_type){ CardMap::iterator it_card = it_map_old->second->map_card_list_person.find(card->card_id); if(it_card != it_map_old->second->map_card_list_person.end()){ it_map_old->second->map_card_list_person.erase(it_card); } }else if(CT_VEHICLE == card->card_type){ CardMap::iterator it_card = it_map_old->second->map_card_list_vehicle.find(card->card_id); if(it_card != it_map_old->second->map_card_list_vehicle.end()){ it_map_old->second->map_card_list_vehicle.erase(it_card); } } } card->map_id_old = card->map_id; MapInfoMap::iterator it_map = mp_map_list.find(card->map_id); if(it_map != mp_map_list.end()){ card->map_scale = it_map->second->map_scale; if(CT_PERSON == card->card_type){ it_map->second->map_card_list_person.insert(make_pair(card->card_id, card)); }else if(CT_VEHICLE == card->card_type){ it_map->second->map_card_list_vehicle.insert(make_pair(card->card_id, card)); } } } //卡card进入区域 void CYAServerDlg::card_enter_area( Card* card) { _point p1, p2; double r, scale; bool b_in_area = false; p1.x = card->x, p1.y = card->y, p1.z = card->z; //TRACE(_T("x: %f , y: %f ,z: %f \n"),p1.x,p1.y,p1.z); AreaMap::iterator it_area_cur = mp_area_list.find(card->area_id); if(it_area_cur != mp_area_list.end()){ // 在区域中 if(it_area_cur->second->is_in_polygon(p1)) { // 区域没有变化 return; } } int old_area_id = card->area_id; AreaMap::iterator it_area = mp_area_list.begin(); for(; it_area != mp_area_list.end(); ++it_area){ if(card->map_id == it_area->second->map_id){ // 必须在同一地图内 if(it_area->second->is_in_polygon(p1)){ // 在区域内 if(it_area->second->area_id == old_area_id){ return; } if(it_area_cur != mp_area_list.end()){ // 离开区域 store_data_card(card, HIS_AREA_LOCATION_LEAVE); card_leave_area(card, it_area_cur->second); } card->area_id = it_area->second->area_id; //card->enter_area_time = card->deal_time; card->enter_area_time = CFunctions::systime_to_timet(card->deal_time); card->pos_state = (0 == it_area->second->area_type_id) ? DT_UP :DT_DOWN; card->pos_state_park = it_area->second->is_att; if(CT_PERSON == card->card_type){ it_area->second->area_card_list_person.insert(make_pair(card->card_id, card)); //if(it_area->second->over_count_person == 0){ if(it_area->second->area_type_id == 3){ store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START); deal_alarm_card(card, &mp_card_list_forbidden_person, true, AF_CARD_AREA_FORBIDDEN); } }else if(CT_VEHICLE == card->card_type){ it_area->second->area_card_list_vehicle.insert(make_pair(card->card_id, card)); //if(it_area->second->over_count_vehicle == 0){ if(it_area->second->area_type_id == 3){ store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START); deal_alarm_card(card, &mp_card_list_forbidden_vehicle, true, AF_CARD_AREA_FORBIDDEN); } } b_in_area = true; break; } } } if(!b_in_area){ // 找不到区域,使用分站所属区域 //从区域列表中查找卡所属分站的区域ID AreaMap::iterator it_area_reader = mp_area_list.find(card->p_reader->area_id); if(it_area_reader == mp_area_list.end()){ return; } if(card->area_id == it_area_reader->second->area_id){ return; } if(it_area_cur != mp_area_list.end()){ store_data_card(card, HIS_AREA_LOCATION_LEAVE); card_leave_area(card, it_area_cur->second); } card->area_id = it_area_reader->second->area_id; //card->enter_area_time = card->deal_time; card->enter_area_time = CFunctions::systime_to_timet(card->deal_time); card->pos_state = (0 == it_area_reader->second->area_type_id) ? DT_UP :DT_DOWN; card->pos_state_park = it_area_reader->second->is_att; if(CT_PERSON == card->card_type){ it_area_reader->second->area_card_list_person.insert(make_pair(card->card_id, card)); //if(it_area_reader->second->over_count_person == 0){ if(it_area_reader->second->area_type_id == 3){ store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START); deal_alarm_card(card, &mp_card_list_forbidden_person, true, AF_CARD_AREA_FORBIDDEN); } }else if(CT_VEHICLE == card->card_type){ it_area_reader->second->area_card_list_vehicle.insert(make_pair(card->card_id, card)); //if(it_area_reader->second->over_count_vehicle == 0){ if(it_area_reader->second->area_type_id == 3){ store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START); deal_alarm_card(card, &mp_card_list_forbidden_vehicle, true, AF_CARD_AREA_FORBIDDEN); } } } // 保存区域信息 store_data_card(card, HIS_AREA_LOCATION_ENTER); // 升入井判断 card_enter_mine(card); if(CT_VEHICLE == card->card_type){ card_enter_park(card); } } void CYAServerDlg::card_leave_area( Card* card, Area* area) { // 从列表中删除 CardMap *card_map, *alarm_card_map, *alarm_forbidden_map; if(CT_PERSON == card->card_type){ card_map = &area->area_card_list_person; alarm_card_map = &mp_card_list_area_over_time_person; alarm_forbidden_map = &mp_card_list_forbidden_person; }else if(CT_VEHICLE == card->card_type){ card_map = &area->area_card_list_vehicle; alarm_card_map = &mp_card_list_area_over_time_vehicle; alarm_forbidden_map = &mp_card_list_forbidden_vehicle; } CardMap::iterator it_card = card_map->find(card->card_id); if(it_card != card_map->end()){ // 如果区域超时 if(it_card->second->is_area_over_time){ it_card->second->is_area_over_time = false; store_data_card(card, ALARM_CARD_OVER_TIME_AREA_END); deal_alarm_card(card, alarm_card_map, false, AF_CARD_AREA_OVER_TIME); } store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_END); deal_alarm_card(card, alarm_forbidden_map, false, AF_CARD_AREA_FORBIDDEN); // 先处理,后删除 card_map->erase(it_card); } } void CYAServerDlg::reset_map_card() { MapInfoMap::iterator it_map = mp_map_list.begin(); for(; it_map != mp_map_list.end(); ++ it_map){ //用map.erase(map.begin(),map.end())比较好 清空元素 it_map->second->map_card_list_person.erase(it_map->second->map_card_list_person.begin(), it_map->second->map_card_list_person.end()); it_map->second->map_card_list_vehicle.erase(it_map->second->map_card_list_vehicle.begin(), it_map->second->map_card_list_vehicle.end()); //it_map->second->map_card_list.clear(); // 删除map } } bool CYAServerDlg::is_in_rectangle( _point p, double dblleft, double dbltop, double dblright, double dblbottom ) { return (p.x >= dblleft && p.x <= dblright && p.y >= dbltop && p.y <= dblbottom); } bool CYAServerDlg::is_in_circle( _point p1, _point p2, double r, double scale ) { return sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y)) <= r * scale; } void CYAServerDlg::package_data() { string strJson = get_json_position(); // 定位数据 if(strJson == "") return ; send_json_data(JSON_CMD_VALUE_PUSH, strJson); g_last_send_time = ::GetTickCount(); } void CYAServerDlg::package_data_test() { Json::Value root; Json::Value valStaffer; Json::Value valStaffers; Json::Value valDistance; Json::Value valDist; Json::Value valReaders; Json::Value valReader; int nCnt = 0; std::string strJson; for(int i = 1; i < 4; i++){ valStaffer["id"] = i; valStaffer["x"] = 50 * (m_nCountClick + i); valStaffer["y"] = 50 * sin(20.0) * (m_nCountClick + i); valStaffers.append(valStaffer); nCnt++; } root["staffer"] = valStaffers; //map::iterator itReader = m_mpReaderInfo.begin(); //for(; itReader != m_mpReaderInfo.end(); ++itReader) //{ // valReader["id"] = (unsigned int)itReader->second->readerid; // valReader["x"] = itReader->second->X; // valReader["y"] = itReader->second->Y; // valReaders.append(valReader); //} root["reader"] = valReaders; if(nCnt == 0){ return; } strJson = root.toFastString(); send_json_data(JSON_CMD_VALUE_PUSH, strJson.c_str()); } void CYAServerDlg::formatByteArray( CString &strBuf, BYTE * buf, int nLen ) { CString strBuf1 = _T(""); for(int i = 0; i < nLen; i++){ strBuf1.Format(_T("%.2X "),buf[i]); strBuf += strBuf1; if((i + 1) % 16 == 0){ strBuf += _T("\n"); } } } void CYAServerDlg::writeErrorLog( const CString strFile, const CString strErr, bool bTime /*= true*/ ) { LogInfo* err = new LogInfo; err->handle = NULL; err->useTime = false; err->path = NULL; err->strLog = NULL; err->handle = this; err->useTime = bTime; err->path = CFunctions::CString2char(strFile); err->strLog = CFunctions::CString2char(strErr); QueueUserWorkItem(_write_error_log, (LPVOID)err, WT_EXECUTEDEFAULT); } BOOL CYAServerDlg::openLogFile(CString strFile) { TCHAR lpstrCurDir[MAX_PATH] = _T(""); CString ctemp; GetModuleFileName(NULL,lpstrCurDir,MAX_PATH); ctemp = lpstrCurDir; int index = ctemp.ReverseFind('\\'); CString strFilePath = ctemp.Left(index+1); CString strFileName; strFileName.Format(_T("%s_%s.log"), strFile, COleDateTime::GetCurrentTime().Format(_T("%Y%m%d"))); strFilePath += _T("error\\"); strFilePath += strFileName; if (cfErrorLog == NULL){ return FALSE; } BOOL bOpenFile=FALSE;//是否需要重新打开文件 if(cfErrorLog.m_pStream==NULL){ bOpenFile=TRUE; }else{ if(cfErrorLog.GetFilePath()!=strFilePath){ bOpenFile=TRUE; cfErrorLog.Close(); } } if(bOpenFile){ return cfErrorLog.Open(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone); }else{ return TRUE; } } BOOL CYAServerDlg::openLogFile(const char* strFile) { TCHAR lpstrCurDir[MAX_PATH] = _T(""); CString ctemp; GetModuleFileName(NULL,lpstrCurDir,MAX_PATH); ctemp = lpstrCurDir; int index = ctemp.ReverseFind('\\'); CString strFilePath = ctemp.Left(index+1); CString strFileName; //CString strTemp; //strTemp.Format(_T("%S"),strFile); strFileName.Format(_T("%S_%s.log"), strFile, COleDateTime::GetCurrentTime().Format(_T("%Y%m%d"))); strFilePath += _T("error\\"); strFilePath += strFileName; if (cfErrorLog == NULL){ return FALSE; } BOOL bOpenFile=FALSE;//是否需要重新打开文件 if(cfErrorLog.m_pStream==NULL){ bOpenFile=TRUE; }else{ if(cfErrorLog.GetFilePath()!=strFilePath){ bOpenFile=TRUE; cfErrorLog.Close(); } } if(bOpenFile){ return cfErrorLog.Open(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone); }else{ return TRUE; } } void CYAServerDlg::OnBnExit() { stop_tcp_server(); ws_logout(); is_websocket_login = false; clear_all_list(); GetConnPool().CloseAllConn(); CDialogEx::OnCancel(); } void CYAServerDlg::OnBnSyncTime() { send_sync_reader(); } CYAServerDlg::~CYAServerDlg() { release_memory(); ws_close(); } void CYAServerDlg::OnConnected() { is_websocket_ok = true; //Sleep(50); // need delay time_ws_connect = ::GetTickCount(); } void CYAServerDlg::OnClosed( client::close_reason const& reason ) { int i = -1; if(reason == client::close_reason_drop){ i = (int) reason; }else{ i = (int) reason; } } void CYAServerDlg::OnFailed() { is_websocket_login = false; is_websocket_ok = false; _io->close(); } void CYAServerDlg::ws_open() { //m_ws_url="ws://localhost:8086/"; _io->connect(m_ws_url); CString strlog = _T(""); //strlog.Format(_T("%s: %s"), _T(LOG_CONNECT_WEB_SERVER), CFunctions::c2wc(m_ws_url.c_str())); wchar_t* p = CFunctions::c2wc(m_ws_url.c_str()); strlog.Format(_T("%s: %s"), _T(LOG_CONNECT_WEB_SERVER), p); if(p){ free(p); p = NULL; } show_log(strlog); } void CYAServerDlg::OnPushMessage() { string aa = ""; } void CYAServerDlg::store_data_card( Card* card, int tag ) { char sql[LENGTH_SQL] = {0}; char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME]; struct tm local_time, local_time_ex; //localtime_s(&local_time, &card->deal_time); //strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); bool b_exec = false; sprintf_s(_time, STR_LEN_TIME, "%u-%u-%u %u:%u:%u.%u", card->deal_time.wYear,card->deal_time.wMonth,card->deal_time.wDay, card->deal_time.wHour + 8,card->deal_time.wMinute,card->deal_time.wSecond,card->deal_time.wMilliseconds); switch(tag){ case TEST_LOCATE_COMPARE: { b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO test_locate_compare(x, y, xx, yy, x1, x2, x3, x4, y1, y2, y3, y4, rec_time)\ VALUES(%.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, '%s');", card->x, card->y, card->xx, card->yy, card->x1, card->x2, card->x3, card->x4, card->y1, card->y2, card->y3, card->y4, _time); break; } case TEST_LOCATE_DATA: { b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO test_locatedata(card_id, reader_id, antenna_id, \ reader_stamp, card_stamp, locatetime, distance, stamp_type, power_state,\ accelerate, rec_time, card_x, card_y) \ VALUES(%s, %d, %d, %d, %d, %lld, %f, %d, %d, %d, '%s', %.4f, %.4f);", card->card_id.c_str(), card->reader_id, card->antenna_id, card->p_reader->tick_count, card->time_stamp, card->flying_time, card->distance, card->ranging_type, card->power_state, card->accelerate_state, _time, card->x, card->y); break; } case HIS_LOCATION: { if(card->map_id != 0 && card->area_id != 0){ b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_location(card_id, cur_time, x, y, z, map_id, area_id, state) VALUES(%s, '%s', %.3f, %.3f, %.3f, %d, %d, %d);", card->card_id.c_str(), _time, card->x, card->y, card->z, card->map_id, card->area_id, card->state); } break; } case HIS_RAW_DATA: { b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_raw_data(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \ fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time ) \ VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s');", card->card_id.c_str(), card->reader_id, card->antenna_id, card->reader_tickcount, card->time_stamp, card->flying_time, card->distance, card->ranging_type, card->power_state, card->accelerate_state, card->str_his_time.c_str(), card->str_rec_time.c_str()); break; } case HIS_AREA_LOCATION_ENTER: { if(card->map_id != 0 && card->area_id != 0){ b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_location_area(card_id, area_id, map_id, enter_time) VALUES(%s, %d, %d, '%s');", card->card_id.c_str() , card->area_id, card->map_id, _time); } break; } case HIS_AREA_LOCATION_LEAVE: { if(card->map_id != 0 && card->area_id != 0){ b_exec = true; localtime_s(&local_time_ex, &card->enter_area_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); sprintf_s(sql, LENGTH_SQL, "UPDATE his_location_area SET leave_time = '%s' WHERE card_id = %s AND area_id=%d AND enter_time = '%s';", _time, card->card_id.c_str(), card->area_id, _time_ex); } break; } case RPT_ATTEND_DOWN: { if(card->map_id != 0 && card->area_id != 0){ b_exec = true; //sprintf_s(sql, LENGTH_SQL, // "INSERT INTO rpt_attendance(card_id, start_time, att_date) VALUES(%s, '%s', '%s');", // card->card_id.c_str(), _time, _time); sprintf_s(sql, LENGTH_SQL, "CALL add_att(%s, '%s', '%s');", card->card_id.c_str(), _time, _time); } break; } case RPT_ATTEND_UP: { if(card->map_id != 0 && card->area_id != 0){ TRACE(_T(" 6 ")); b_exec = true; localtime_s(&local_time_ex, &card->down_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); //sprintf_s(sql, LENGTH_SQL, // "UPDATE rpt_attendance SET end_time = '%s' WHERE card_id = %s AND start_time = '%s';", // _time, card->card_id.c_str(), _time_ex); sprintf_s(sql, LENGTH_SQL, "CALL add_att(%s, '%s', '%s');", card->card_id.c_str(), _time, _time_ex); } break; } case ALARM_CARD_LOW_POWER_START: { b_exec = true; int alarm_type_id = ATID_POWER; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \ VALUES(%s, %d, %d, '%s');", card->card_id.c_str(), alarm_type_id, card->card_type, _time); break; } case ALARM_CARD_LOW_POWER_END: { b_exec = true; localtime_s(&local_time_ex, &card->low_power_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); int alarm_type_id = ATID_POWER; sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_card SET end_time = '%s' WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';", _time, card->card_id.c_str(), alarm_type_id, _time_ex); break; } //case ALARM_CARD_OVER_TIME_AREA_START: // { // int alarm_type_id = ATID_AREA_OVER_TIME_PERSON; // if(CT_VEHICLE == card->card_type){ // alarm_type_id = ATID_AREA_OVER_TIME_VEHICLE; // } // sprintf_s(sql, LENGTH_SQL, // "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \ // VALUES(%s, %d, %d, '%s')", // card->card_id.c_str(), alarm_type_id, card->card_type, _time); // break; // } //case ALARM_CARD_OVER_TIME_AREA_END: // { // localtime_s(&local_time_ex, &card->time_area_over_time); // strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); // int alarm_type_id = ATID_AREA_OVER_TIME_PERSON; // if(CT_VEHICLE == card->card_type){ // alarm_type_id = ATID_AREA_OVER_TIME_VEHICLE; // } // sprintf_s(sql, LENGTH_SQL, // "UPDATE his_alarm_card SET end_time = '%s' \ // WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';", // _time, card->card_id.c_str(), alarm_type_id, _time_ex); // break; // } //case ALARM_CARD_OVER_TIME_START: // { // int alarm_type_id = ATID_OVER_TIME_PERSON; // if(CT_VEHICLE == card->card_type){ // alarm_type_id = ATID_OVER_TIME_VEHICLE; // } // sprintf_s(sql, LENGTH_SQL, // "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \ // VALUES(%s, %d, %d, '%s')", // card->card_id.c_str(), alarm_type_id, card->card_type, _time); // break; // } //case ALARM_CARD_OVER_TIME_END: // { // localtime_s(&local_time_ex, &card->time_over_time); // strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); // int alarm_type_id = ATID_OVER_TIME_PERSON; // if(CT_VEHICLE == card->card_type){ // alarm_type_id = ATID_OVER_TIME_VEHICLE; // } // sprintf_s(sql, LENGTH_SQL, // "UPDATE his_alarm_card SET end_time = '%s' \ // WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';", // _time, card->card_id.c_str(), alarm_type_id, _time_ex); // break; // } default: return; } try { if(b_exec){ execute_sql(sql); } } catch (...) { CString str = _T(""); //str.Format(_T("%s\n"), CFunctions::c2wc(sql)); wchar_t* p = CFunctions::c2wc(sql); str.Format(_T("%s\n"), p); writeErrorLog(_T("SQL_S"), str); //str = _T(""); str.Empty(); if(p){ free(p); p = NULL; } } } std::string CYAServerDlg::get_json_counting() { Json::Value root; Json::Value data; Json::Value mapcounts; int total_count = 0,total_count_vehicle = 0,total_count_person = 0; int map_count_total, map_count_vehicle, map_count_person; int area_count_total, area_count_vehicle, area_count_person; MapInfoMap::iterator it_map = mp_map_list.begin(); for(; it_map != mp_map_list.end(); ++it_map){ Json::Value mapcount; Json::Value areacounts; // area map_count_total = map_count_vehicle = map_count_person = 0; AreaMap::iterator it_area = it_map->second->map_area_list.begin(); for(; it_area != it_map->second->map_area_list.end(); ++it_area){ area_count_total = area_count_vehicle = area_count_person = 0; Json::Value areacount; // person CardMap::iterator it_card = it_area->second->area_card_list_person.begin(); for(; it_card != it_area->second->area_card_list_person.end(); ++ it_card){ if(DT_DOWN == it_card->second->pos_state){ area_count_person++; area_count_total++; } else { continue; } } // vehicle it_card = it_area->second->area_card_list_vehicle.begin(); for(; it_card != it_area->second->area_card_list_vehicle.end(); ++ it_card){ if(DT_DOWN == it_card->second->pos_state){ area_count_vehicle++; area_count_total++; } else { continue; } } //if(area_count_total > 0){ areacount[JSON_KEY_COUNTING_AREA_COUNT_PERSON] = area_count_person; areacount[JSON_KEY_COUNTING_AREA_COUNT_VEHICLE] = area_count_vehicle; areacount[JSON_KEY_COUNTING_AREA_COUNT] = area_count_total; areacount[JSON_KEY_COUNTING_AREA_ID] = it_area->second->area_id; map_count_total += area_count_total; map_count_person += area_count_person; map_count_vehicle += area_count_vehicle; areacounts.append(areacount); //} } //if(map_count_total > 0){ mapcount[JSON_KEY_COUNTING_MAP_ID] = it_map->second->map_id; mapcount[JSON_KEY_COUNTING_MAP_COUNT_PERSON] = map_count_person; mapcount[JSON_KEY_COUNTING_MAP_COUNT_VEHICLE] = map_count_vehicle; mapcount[JSON_KEY_COUNTING_MAP_COUNT_TOTAL] = map_count_total; mapcount[JSON_KEY_COUNTING_AREA_COUNT] = areacounts; total_count += map_count_total; total_count_person += map_count_person; total_count_vehicle += map_count_vehicle; mapcounts.append(mapcount); //} } // dept Json::Value deptcounts; Json::Value deptcount; int dept_person_count, dept_vehicle_count, total_dept_count = 0; DeptMap::iterator it_dept = mp_dept_list.begin(); for(; it_dept != mp_dept_list.end(); ++it_dept){ deptcount[JSON_KEY_COUNTING_DEPT_ID] = it_dept->second->dept_id; //deptcount[JSON_KEY_COUNTING_DEPT_NAME] = it_dept->second->dept_name; dept_person_count = it_dept->second->dept_card_list_person.size(); dept_vehicle_count = it_dept->second->dept_card_list_vehicle.size(); deptcount[JSON_KEY_COUNTING_DEPT_COUNT_TOTAL] = dept_person_count + dept_vehicle_count; deptcount[JSON_KEY_COUNTING_DEPT_COUNT_PERSON] = dept_person_count; deptcount[JSON_KEY_COUNTING_DEPT_COUNT_VEHICLE] = dept_vehicle_count; //if(dept_vehicle_count + dept_person_count > 0){ // total_dept_count += dept_vehicle_count + dept_person_count; deptcounts.append(deptcount); //} } //if(total_dept_count>0){ data[JSON_KEY_COUNTING_DEPT_COUNT] = deptcounts; //} data[JSON_KEY_COUNTING_MAP_COUNT] = mapcounts; data[JSON_KEY_COUNTING_COUNT_TOTAL] = total_count; data[JSON_KEY_COUNTING_COUNT_VEHICLE] = total_count_vehicle; data[JSON_KEY_COUNTING_COUNT_PERSON] = total_count_person; root[JSON_ROOT_KEY_DATA] = data; root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_COUNTING; //string ss = root.toStyledString(); return root.toFastString(); } void CYAServerDlg::OnTimer( UINT nIDEvent ) { // 需要优化,如果数据没有变化,则不重复发送数据,数据变化后再发送 switch ( nIDEvent) { case TMR_SEND_COUNTING: { send_json_data(JSON_CMD_VALUE_PUSH, get_json_counting()); break; } case TMR_SEND_ALARM: { send_json_data(JSON_CMD_VALUE_PUSH, get_json_alarm()); break; } case TMR_SEND_DEVICE_STATE: { deal_readers(); send_json_data(JSON_CMD_VALUE_PUSH, get_json_device_state()); break; } case TMR_SEND_POSTION: { package_data(); break; } case TMR_SYNC_READER_TIME: { send_sync_reader(); break; } case TMR_CLEAR_CALL_TIMER: { clear_call_info(); break; } case TMR_SEND_CALL: { send_call_info(); break; } default: break; } } /* * 从配置文件中载入数据库配置 * * param * 无 * * return * 无 */ void CYAServerDlg::load_param_from_ini() { IniFile ini; string strvalue; int nTemp = 0; //show_log(_T(LOG_LOAD_CONFIG), FALSE); //输出操作日志到日志文件 show_log(_T(LOG_LOAD_CONFIG)); if(ini.open(FILEPATH_SERVER_CONFIG)){ strvalue = ini.read(CONF_SECT_SERVER_SETTING, CONF_SERVER_WS_URL); m_ws_url = strvalue; int nBackup = atoi(theApp.dbbackup.c_str()); switch(nBackup){ case 0: m_db_setting.host = ini.read(CONF_SECT_DB, CONF_DB_KEY_HOST); m_db_setting.user = ini.read(CONF_SECT_DB, CONF_DB_KEY_USER); m_db_setting.password = ini.read(CONF_SECT_DB, CONF_DB_KEY_PWD); m_db_setting.dbname = ini.read(CONF_SECT_DB, CONF_DB_KEY_DBNAME); m_db_setting.encoding = ini.read(CONF_SECT_DB, CONF_DB_KEY_ENCODING); m_db_setting.port = atoi(ini.read(CONF_SECT_DB, CONF_DB_KEY_PORT).c_str()); break; case 1: m_db_setting.host = ini.read(CONF_SECT_DB_BK, CONF_DB_KEY_HOST); m_db_setting.user = ini.read(CONF_SECT_DB_BK, CONF_DB_KEY_USER); m_db_setting.password = ini.read(CONF_SECT_DB_BK, CONF_DB_KEY_PWD); m_db_setting.dbname = ini.read(CONF_SECT_DB_BK, CONF_DB_KEY_DBNAME); m_db_setting.encoding = ini.read(CONF_SECT_DB_BK, CONF_DB_KEY_ENCODING); m_db_setting.port = atoi(ini.read(CONF_SECT_DB_BK, CONF_DB_KEY_PORT).c_str()); break; } /*m_db_setting.host = ini.read(CONF_SECT_DB, CONF_DB_KEY_HOST); m_db_setting.user = ini.read(CONF_SECT_DB, CONF_DB_KEY_USER); m_db_setting.password = ini.read(CONF_SECT_DB, CONF_DB_KEY_PWD); m_db_setting.dbname = ini.read(CONF_SECT_DB, CONF_DB_KEY_DBNAME); m_db_setting.encoding = ini.read(CONF_SECT_DB, CONF_DB_KEY_ENCODING); m_db_setting.port = atoi(ini.read(CONF_SECT_DB, CONF_DB_KEY_PORT).c_str());*/ //show_log(_T(LOG_LOAD_CONFIG_SUCCESS), FALSE); show_log(_T(LOG_LOAD_CONFIG_SUCCESS)); }else{ //show_log(_T(LOG_LOAD_CONFIG_FAIL)); show_log(_T(LOG_LOAD_CONFIG_FAIL)); } } int CYAServerDlg::init_dept() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; pRes = pConn->Execute("select dept_id, name from dat_dept order by rank;", err); Dept* dept = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)) { DeptMap::iterator it = mp_dept_list.find(atoi(pRow[0])); if(it != mp_dept_list.end()){ dept = it->second; }else{ dept = new Dept(atoi(pRow[0]), pRow[1]); mp_dept_list.insert(make_pair(dept->dept_id, dept)); nRow++; } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_DEPT), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } /* * 从数据库的dat_setting表初始化系统阈值, * 包括:井下人员阈值,井下车辆阈值,人员超时阈值,车辆超时阈值,车辆超速阈值 * * param * 无 * * return * 无 */ int CYAServerDlg::init_setting() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; pRes = pConn->Execute("select setting_id, name, type, value from dat_setting;", err); string name, val, type; while(pRow = mysql_fetch_row(pRes)) { name = pRow[1], type = pRow[2], val = pRow[3]; if("over_count_person" == name){ sls_setting.over_count_person = atoi(val.c_str()); }else if("over_count_vehicle" == name){ sls_setting.over_count_vehicle = atoi(val.c_str()); }else if("over_time_person" == name){ sls_setting.over_time_person = atoi(val.c_str()); }else if("over_time_vehicle" == name){ sls_setting.over_time_vehicle = atoi(val.c_str()); }else if("over_speed" == name){ sls_setting.over_speed = atof(val.c_str()); } } mysql_free_result(pRes); show_log(_T(LOG_INIT_SETTING)); return 0; } void CYAServerDlg::deal_alarm_card(Card* card, CardMap* dest_card_list, bool is_alarm, ALARM_FLAG tag) { //TRACE(_T("start \n")); CardMap::iterator it_card = dest_card_list->find(card->card_id); //TRACE(_T("end \n")); if(it_card != dest_card_list->end()){ if(!is_alarm){ // 取消报警 dest_card_list->erase(it_card); } }else { if(is_alarm){ dest_card_list->insert(make_pair(card->card_id, card)); } } switch (tag) // savetodb { case AF_CARD_AREA_FORBIDDEN: { card->time_area_forbidden = is_alarm ? time(NULL) : 0; card->status_area_forbidden = is_alarm ? 1 : 0; break; } case AF_CARD_AREA_OVER_TIME: { card->time_area_over_time = is_alarm ? time(NULL) : 0; card->status_area_over_time = is_alarm ? 1 : 0; break; } case AF_AREA_OVER_TIME: { card->time_over_time = is_alarm ? time(NULL) : 0; card->status_over_time = is_alarm ? 1 : 0; break; } case AF_CARD_OVER_SPEED: { card->time_over_speed = is_alarm ? time(NULL) : 0; card->status_over_speed = is_alarm ? 1 : 0; break; } default: break; } } void CYAServerDlg::deal_alarm_area( Area* area, AreaMap* dest_area_list, bool is_alarm, ALARM_FLAG tag ) { AreaMap::iterator it_area = dest_area_list->find(area->area_id); if(it_area != dest_area_list->end()){ if(!is_alarm){ //savetodb dest_area_list->erase(it_area); } }else{ if(is_alarm){ // savetodb dest_area_list->insert(make_pair(area->area_id, area)); } } } /* * 从数据库的dat_alarm_type表初始化告警类型和名称 * * param * 无 * * return * 无 */ int CYAServerDlg::init_alarm_type() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_ROW pRow; MYSQL_RES *pRes = NULL; int err = 0; pRes = pConn->Execute("select alarm_type_id, name from dat_alarm_type;", err); while(pRow = mysql_fetch_row(pRes)) { AlarmTypeMap::iterator it = mp_alarm_type_list.find(atoi(pRow[0])); if(it != mp_alarm_type_list.end()){ it->second = pRow[1]; }else{ mp_alarm_type_list.insert(make_pair(atoi(pRow[0]), pRow[1])); } } mysql_free_result(pRes); show_log(_T(LOG_INIT_ALARM_TYPE)); return 0; } void CYAServerDlg::AddItem( CString strvalue, int readerid, BOOL is_closed /*= false*/ ) { CString strRow; int nRow = 0; bool bFind = false; for(int i = 0; i < m_listctrl_reader.GetItemCount(); i++){ if(strvalue == m_listctrl_reader.GetItemText(i, 1)){ nRow = i; bFind = true; break; } } if(!bFind){ nRow = m_listctrl_reader.GetItemCount(); //strRow.Format(_T("%d"), nRow + 1); nRow = m_listctrl_reader.InsertItem(nRow, CFunctions::formatInt(readerid)); } m_listctrl_reader.SetItemText(nRow, 1, strvalue); m_listctrl_reader.SetItemText(nRow, 2, is_closed ? _T("中断"): _T("已连接")); } void CYAServerDlg::show_log( LPCTSTR szlog, BOOL bSave ) { CString sMsg, sLog; CString sTime=COleDateTime::GetCurrentTime().Format(_T(LOG_TIME_FORMAT)); sMsg.Format(_T("%s %s\n"), sTime, szlog); try{ ::LogMsg(sMsg); } catch(...){ } /*if(bSave && theApp.log_sys_status){ writeErrorLog(_T("LOG_S"), sMsg); }*/ if(m_log_sys_status){ writeErrorLog(_T("LOG_S"), sMsg,false); //sMsg = _T(""); sMsg.Empty(); } } /* * 初始化数据库连接 * * param * 无 * * return * 无 * */ void CYAServerDlg::database_connect() { //show_log(_T(LOG_CONNECT_DB), FALSE); show_log(_T(LOG_CONNECT_DB)); GetConnPool().Init(m_db_setting.encoding.c_str(), m_db_setting.host.c_str(), m_db_setting.user.c_str(), m_db_setting.password.c_str(), m_db_setting.dbname.c_str(), m_db_setting.port, NULL, 0); int nConn = GetConnPool().InitAllConn(); if(nConn > 0){ show_log(_T(LOG_CONNECT_DB_SUCCESS)); }else{ show_log(_T(LOG_CONNECT_DB_FAIL)); } } void CYAServerDlg::stop_timer() { KillTimer(TMR_SEND_COUNTING); KillTimer(TMR_SEND_ALARM); KillTimer(TMR_SEND_DEVICE_STATE); KillTimer(TMR_SEND_POSTION); } void CYAServerDlg::OnMenuDb() { CDbSettingDlg dlg; dlg.DoModal(); } void CYAServerDlg::OnCallMessage(string const& name, message::ptr const& data, bool isAck,message::list &ack_resp ) { if(data->get_flag() == message::flag_object){ /*string jsonString = name; if(m_log_recv_package){ CString strlog = _T(""); strlog.Format(_T("1%s"),CFunctions::c2wc(jsonString.c_str())); writeErrorLog(_T("JSON_R"),strlog,false); }*/ string cmd = data->get_map()[JSON_ROOT_KEY_CMD]->get_string(); if(JSON_CMD_VALUE_META_DATA_CHANGED == cmd){ map data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map(); string name = data_map[JSON_KEY_NAME]->get_string().c_str(); string op_type = data_map[JSON_KEY_OP_TYPE]->get_string().c_str(); EDIT_TYPE_ID edit_type_id = (JSON_KEY_OP_TYPE_INSERT == op_type)? ET_INSERT: ((JSON_KEY_OP_TYPE_UPDATE == op_type)? ET_UPDATE: ET_DELETE); if(JSON_KEY_NAME_VEHICLE == name){ string id = data_map[JSON_KEY_ID]->get_string().c_str(); deal_call_edit_vehicle(id, edit_type_id); }else if(JSON_KEY_NAME_STAFF == name){ string id = data_map[JSON_KEY_ID]->get_string().c_str(); deal_call_edit_staff(id, edit_type_id); }else if(JSON_KEY_NAME_READER == name){ int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str()); deal_call_edit_reader(id, edit_type_id); }else if(JSON_KEY_NAME_CARD == name){ string id = data_map[JSON_KEY_ID]->get_string().c_str(); deal_call_edit_card(id, edit_type_id); }else if(JSON_KEY_NAME_AREA == name){ int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str()); deal_call_edit_area(id, edit_type_id); }else if(JSON_KEY_NAME_MAP == name){ int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str()); deal_call_edit_map(id, edit_type_id); }else if(JSON_KEY_NAME_PATH == name){ //int id = data_map[JSON_KEY_ID]->get_int(); //deal_call_edit_path(id, edit_type_id); } }else if(JSON_CMD_VALUE_SET_LIMIT_VALUE == cmd){ //阈值限制接口 string json_data = data->get_map()[JSON_ROOT_KEY_DATA]->get_string(); parse_json_data_set_limit_value(json_data.c_str()); } else if(JSON_CMD_VALUE_REQUEST_ALL_POSTION == cmd){ //请求全部位置信息 send_json_data(JSON_CMD_VALUE_REQUEST_ALL_POSTION, get_json_position_all()); } else if(JSON_CMD_VALUE_DEAL_HELP == cmd){ // 处理呼救信息 string json_data = data->get_map()[JSON_ROOT_KEY_DATA]->get_string(); parse_json_data_deal_help(json_data.c_str()); } else if(JSON_CMD_VALUE_CALL_CARD_START == cmd){ //呼叫 parse_json_data_call_card(data); } else if(JSON_CMD_VALUE_CALL_CARD_CANCEL == cmd){ //取消呼叫 parse_json_data_call_card_cancel(data); } else if(JSON_CMD_VALUE_CLEAR_CARD == cmd) { // 清楚盲区卡 //map data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map(); //parse_json_data_clear_card(data_map); } } } void CYAServerDlg::parse_json_data_set_limit_value( const char* sz ) { //USES_CONVERSION; //CUTF82C strJson(szJson); Json::Value root; Json::Reader reader; CString strlog; if (!reader.parse(sz,root)){ strlog.Format(_T("%s%s"), _T(LOG_SET_LIMIT_VALUE), _T(LOG_FAIL)); show_log(strlog); return ; } sls_setting.over_count_person = root[JSON_KEY_ALARM_OVER_COUNT_PERSON].asInt(); sls_setting.over_count_vehicle = root[JSON_KEY_ALARM_OVER_COUNT_VEHICLE].asInt(); sls_setting.over_time_person = root[JSON_KEY_ALARM_OVER_TIME_PERSON].asInt(); sls_setting.over_time_vehicle = root[JSON_KEY_ALARM_OVER_TIME_VEHICLE].asInt(); sls_setting.over_speed = root[JSON_KEY_ALARM_OVER_SPEED_VEHICLE].asDouble(); strlog.Format(_T("%s%s"), _T(LOG_SET_LIMIT_VALUE), _T(LOG_SUCCESS)); show_log(strlog); if(m_log_recv_package){ strlog = _T(""); strlog.Format(_T("%s"),sz); writeErrorLog(_T("JSON_R"),strlog,false); //strlog = _T(""); strlog.Empty(); } } void CYAServerDlg::parse_json_data_call_card(message::ptr const& data /*const char* sz*/ ) { CString strlog; string call_id, user_name, call_time; string cardid, readerid; int call_time_out, reader_count, card_count, call_type_id; map data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map(); call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string(); call_time_out = data_map[JSON_KEY_CALL_CARD_CALL_TIME_OUT]->get_int(); call_type_id = data_map[JSON_KEY_CALL_CARD_CALL_TYPE]->get_int(); user_name = data_map[JSON_KEY_CALL_CARD_USER_NAME]->get_string(); call_time = data_map[JSON_KEY_CALL_CARD_CALL_TIME]->get_string(); vector reader_vec = data_map[JSON_KEY_CALL_CARD_STATIONS]->get_vector(); vector card_vec = data_map[JSON_KEY_CALL_CARD_CARDS]->get_vector(); if(reader_vec.size() == 0 && card_vec.size() == 0) { return; } int reader_id, npos; SocketMap::iterator it_sock; BYTE buf[LENGTH_SEND_BUF]; _call_info_reader* call_reader; _call_info_card* call_card; //呼叫发起有两种, //一种通过分站发起呼叫即为对此分站下的所有自组网卡全员呼叫 //一种是对单卡发起的呼叫 vector::const_iterator it_reader = reader_vec.begin(); if(reader_vec.size() > 0){ for(; it_reader != reader_vec.end(); ++it_reader){ string s_reader_id = ""; s_reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_string(); reader_id = atoi(s_reader_id.c_str()); CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id); if(it_call_reader != mp_call_info.end()){ call_reader = it_call_reader->second; if(call_reader->call_type > call_type_id){ call_reader->call_type = call_type_id; } }else{ call_reader = new _call_info_reader; call_reader->call_type = call_type_id; mp_call_info.insert(make_pair(reader_id, call_reader)); } vector::const_iterator it_card = card_vec.begin(); if(card_vec.size() == 0 || "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){ call_reader->cards_count = 0; call_reader->is_call_all = true; call_reader->is_start_call = true; }else{ call_reader->cards_count = card_vec.size(); call_reader->is_call_all = false; call_reader->is_start_call = true; BYTE card_type = 0; for(; it_card != card_vec.end(); ++it_card){ if( "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){ call_reader->cards_count = 0; call_reader->is_call_all = true; }else{ string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string(); string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string(); //string str_card_id = CFunctions::getstrwithzero(card_type, 3) + CFunctions::getstrwithzero(card_id, 10); CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id); int card_id = atoi(s_card_id.c_str()); int card_type = atoi(s_card_type.c_str()); if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表 call_card = it_call_card->second; if(call_card->call_type < call_type_id){ // 原呼叫优先级低 call_card->card_type = card_type; call_card->call_type = call_type_id; call_card->start_time = time(NULL); call_card->time_out = call_time_out; }else { call_card->start_time = time(NULL); call_card->time_out = call_time_out; } }else{ // 未在呼叫列表 call_card = new _call_info_card; //call_card->card_id = card_id; call_card->card_type = card_type; call_card->start_time = time(NULL); call_card->time_out = call_time_out; call_card->call_type = call_type_id; call_reader->mpCard.insert(make_pair(s_card_id, call_card)); } } } } } } //单卡发送呼叫 it_reader = reader_vec.begin(); if(it_reader == reader_vec.end() && card_vec.size() > 0 ){ int nCounts = 0; int card_id = 0; BYTE card_type = 0; string s_card_id = ""; string s_card_type = ""; vector::const_iterator it_card = card_vec.begin(); for(; it_card != card_vec.end(); ++it_card){ card_type = 0; s_card_id = ""; s_card_type = ""; call_type_id = 0; nCounts++; s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string(); s_card_type =(*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string(); string new_card_id = s_card_id.substr(3,s_card_id.length()); card_id = atoi(new_card_id.c_str()); card_type = CT_ADHOC; reader_id = mp_card_list_down_adhoc.find(s_card_id)->second->reader_id; CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id); if(it_call_reader != mp_call_info.end()){ call_reader = it_call_reader->second; call_reader->is_start_call = true; call_reader->is_call_all = false; call_reader->cards_count = 1; if(call_reader->call_type > call_type_id){ call_reader->call_type = call_type_id; } }else{ call_reader = new _call_info_reader; call_reader->call_type = call_type_id; call_reader->is_call_all = false; call_reader->cards_count = 1; call_reader->is_start_call = true; mp_call_info.insert(make_pair(reader_id, call_reader)); } CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id); if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表 call_card = it_call_card->second; if(call_card->call_type < call_type_id){ // 原呼叫优先级低 call_card->card_type = card_type; call_card->card_id = 1; call_card->call_type = call_type_id; call_card->start_time = time(NULL); call_card->time_out = call_time_out; }else { call_card->start_time = time(NULL); call_card->time_out = call_time_out; } }else{ // 未在呼叫列表 call_card = new _call_info_card; call_card->card_id = card_id; call_card->card_type = card_type; call_card->start_time = time(NULL); call_card->time_out = call_time_out; call_card->call_type = call_type_id; call_reader->mpCard.insert(make_pair(s_card_id, call_card)); } } } strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::parse_json_data_clear_card( const char* sz ) { Json::Value root; Json::Reader reader; CString strlog = _T(""); if (!reader.parse(sz,root)){ strlog.Format(_T("%s%s"), _T(LOG_CLEAR_CARD), _T(LOG_FAIL)); show_log(strlog); return ; } if(root.isNull() || !root.isArray()){ return; } int card_type_id, edit_type_id; string cardid = ""; for(unsigned int i = 0; i < root.size(); i++){ cardid = root[i][JSON_KEY_EDIT_CARD_ID].asString(); edit_type_id = root[i][JSON_KEY_EDIT_EDIT_TYPE_ID].asInt(); CardMap::iterator it_card = mp_card_list_all.find(cardid); if(it_card != mp_card_list_all.end()){ if(STATUS_ERROR == it_card->second->status_lost){ // 升井 //TRACE(_T("time memcpy 8\n")); it_card->second->up_time = time(NULL); it_card->second->pos_state = DT_UP; card_enter_mine(it_card->second); remove_card(cardid); // reset_card_status(); } } } strlog.Format(_T("%s%s"), _T(LOG_CLEAR_CARD), _T(LOG_SUCCESS)); show_log(strlog); if(m_log_recv_package){ strlog = _T(""); strlog.Format(_T("%s"),sz); writeErrorLog(_T("JSON_R"),strlog,false); } } void CYAServerDlg::parse_json_data_deal_help( const char* sz ) { Json::Value root; Json::Reader reader; CString strlog; if (!reader.parse(sz,root)){ strlog.Format(_T("%s%s"), _T(LOG_DEAL_HELP), _T(LOG_FAIL)); show_log(strlog); return ; } int card_type_id, edit_type_id; string cardid = root[JSON_KEY_EDIT_CARD_ID].asString(); card_type_id = root[JSON_KEY_CARD_TYPE_ID].asInt(); edit_type_id = root[JSON_KEY_EDIT_EDIT_TYPE_ID].asInt(); CardMap::iterator it_card = mp_card_list_help.find(cardid); if(it_card != mp_card_list_help.end()){ it_card->second->status_help = STATUS_HELP_DEALED; } strlog.Format(_T("%s%s"), _T(LOG_DEAL_HELP), _T(LOG_SUCCESS)); show_log(strlog); if(m_log_recv_package){ strlog = _T(""); strlog.Format(_T("%s"),sz); writeErrorLog(_T("JSON_R"),strlog,false); strlog.Empty(); } } void CYAServerDlg::deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id) { CString strlog = _T(""); switch (edit_type_id) { case ET_INSERT: { init_map(id); break; } case ET_UPDATE: { init_map(id); break; } case ET_DELETE: { MapInfoMap::iterator it_map = mp_map_list.find(id); if(it_map != mp_map_list.end()){ mp_map_list.erase(it_map); } break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_MAP), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id) { CString strlog; switch (edit_type_id) { case ET_INSERT: { init_area(id); break; } case ET_UPDATE: { init_area(id); break; } case ET_DELETE: { AreaMap::iterator it_area = mp_area_list.find(id); MapInfoMap::iterator it_map = mp_map_list.find(it_area->second->map_id); if(it_map != mp_map_list.end()){ AreaMap::iterator it_map_area = it_map->second->map_area_list.find(id); it_map->second->map_area_list.erase(it_map_area); } if(it_area != mp_area_list.end()){ mp_area_list.erase(it_area); } it_area = mp_area_over_count_person.find(id); if(it_area != mp_area_over_count_person.end()){ mp_area_over_count_person.erase(it_area); } it_area = mp_area_over_time_person.find(id); if(it_area != mp_area_over_time_person.end()){ mp_area_over_time_person.erase(it_area); } it_area = mp_area_forbidden_person.find(id); if(it_area != mp_area_forbidden_person.end()){ mp_area_forbidden_person.erase(it_area); } it_area = mp_area_over_count_vehicle.find(id); if(it_area != mp_area_over_count_vehicle.end()){ mp_area_over_count_vehicle.erase(it_area); } it_area = mp_area_over_time_vehicle.find(id); if(it_area != mp_area_over_time_vehicle.end()){ mp_area_over_time_vehicle.erase(it_area); } it_area = mp_area_forbidden_vehicle.find(id); if(it_area != mp_area_forbidden_vehicle.end()){ mp_area_forbidden_vehicle.erase(it_area); } break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_AREA), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::deal_call_edit_reader(int id, EDIT_TYPE_ID edit_type_id) { CString strlog; switch (edit_type_id) { case ET_INSERT: { init_reader(id); init_antenna(id); #ifdef ALGORITHM_TYPE_TOF init_all_readers_coverage(); #elif defined ALGORITHM_TYPE_TDOA init_tdoa_all_readers_coverage(id); #endif break; } case ET_UPDATE: { init_reader(id); init_antenna(id); #ifdef ALGORITHM_TYPE_TOF init_all_readers_coverage(); #elif defined ALGORITHM_TYPE_TDOA init_tdoa_all_readers_coverage(id); #endif break; } case ET_DELETE: { ReaderMap::iterator it_reader = mp_reader_list.find(id); MapInfoMap::iterator it_map = mp_map_list.find(it_reader->second->map_id); if(it_map != mp_map_list.end()){ ReaderMap::iterator it_map_reader = it_map->second->map_reader_list.find(id); if(it_map_reader != it_map->second->map_reader_list.end()){ it_map->second->map_reader_list.erase(it_map_reader); } } if(it_reader != mp_reader_list.end()){ mp_reader_list.erase(it_reader); } break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_READER), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::deal_call_edit_card(string id, EDIT_TYPE_ID edit_type_id) { CString strlog; CardMap::iterator it_card = mp_card_list_all.find(id); if(it_card == mp_card_list_all.end()){ return; } int card_type_id = it_card->second->card_type; switch (edit_type_id) { case ET_INSERT: { if(CT_VEHICLE == card_type_id){ init_vehicle(id, true); }else if(CT_PERSON == card_type_id) { init_staffer(id, true); }else if(CT_ADHOC == card_type_id){ init_adhoc(id, true); } break; } case ET_UPDATE: { if(CT_VEHICLE == card_type_id){ init_vehicle(id, true); }else if(CT_PERSON == card_type_id) { init_staffer(id, true); }else if(CT_ADHOC == card_type_id){ init_adhoc(id, true); } break; } case ET_DELETE: { remove_card(id); break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_CARD), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::deal_call_edit_staff(string id, EDIT_TYPE_ID edit_type_id) { CString strlog; switch (edit_type_id) { case ET_INSERT: { init_staffer(id); break; } case ET_UPDATE: { init_staffer(id); break; } case ET_DELETE: { string cardid = ""; CardMap::iterator it_card = mp_card_list_down_person.begin(); for(; it_card != mp_card_list_down_person.end(); ++it_card){ if(it_card->second->id == id){ cardid = it_card->second->card_id; break; } } remove_card(cardid); break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_STAFFER), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::deal_call_edit_vehicle(string id, EDIT_TYPE_ID edit_type_id) { CString strlog; switch (edit_type_id) { case ET_INSERT: { init_vehicle(id); break; } case ET_UPDATE: { init_vehicle(id); break; } case ET_DELETE: { string cardid = ""; CardMap::iterator it_card = mp_card_list_down_vehicle.begin(); for(; it_card != mp_card_list_down_vehicle.end(); ++it_card){ if(it_card->second->id == id){ cardid = it_card->second->card_id; break; } } remove_card(cardid); break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_VEHICLE), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::deal_call_edit_adhoc(string id, EDIT_TYPE_ID edit_type_id) { CString strlog; switch (edit_type_id) { case ET_INSERT: { init_adhoc(id); break; } case ET_UPDATE: { init_adhoc(id); break; } case ET_DELETE: { string cardid = ""; CardMap::iterator it_card = mp_card_list_down_adhoc.begin(); for(; it_card != mp_card_list_down_adhoc.end(); ++it_card){ if(it_card->second->id == id){ cardid = it_card->second->card_id; break; } } remove_card(cardid); break; } default: break; } strlog.Format(_T("%s%s"), _T(LOG_EDIT_ADHOC), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::remove_card( string card_id ) { if(card_id.length() == 0) return; int card_type_id = 0; CardMap::iterator it_card = mp_card_list_all.find(card_id); if(it_card == mp_card_list_all.end()){ return; } card_type_id = it_card->second->card_type; mp_card_list_all.erase(it_card); MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id); if(it_map != mp_map_list.end()){ if(CT_VEHICLE == card_type_id){ CardMap::iterator it_map_card = it_map->second->map_card_list_vehicle.find(card_id); if(it_map_card != it_map->second->map_card_list_vehicle.end()){ it_map->second->map_card_list_vehicle.erase(it_map_card); } }else if(CT_PERSON == card_type_id){ CardMap::iterator it_map_card = it_map->second->map_card_list_person.find(card_id); if(it_map_card != it_map->second->map_card_list_person.end()){ it_map->second->map_card_list_person.erase(it_map_card); } } } AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id); if(it_area != mp_area_list.end()){ if(CT_VEHICLE == card_type_id){ CardMap::iterator it_area_card = it_area->second->area_card_list_vehicle.find(card_id); if(it_area_card != it_area->second->area_card_list_vehicle.end()){ it_area->second->area_card_list_vehicle.erase(it_area_card); } }else if(CT_PERSON == card_type_id){ CardMap::iterator it_area_card = it_area->second->area_card_list_person.find(card_id); if(it_area_card != it_area->second->area_card_list_person.end()){ it_area->second->area_card_list_person.erase(it_area_card); } } } DeptMap::iterator it_dept = mp_dept_list.find(it_card->second->dept_id); if(it_dept != mp_dept_list.end()){ if(CT_VEHICLE == card_type_id){ CardMap::iterator it_dept_card = it_dept->second->dept_card_list_vehicle.find(card_id); if(it_dept_card != it_dept->second->dept_card_list_vehicle.end()){ it_dept->second->dept_card_list_vehicle.erase(it_dept_card); } }else if(CT_PERSON == card_type_id){ CardMap::iterator it_dept_card = it_dept->second->dept_card_list_person.find(card_id); if(it_dept_card != it_dept->second->dept_card_list_person.end()){ it_dept->second->dept_card_list_person.erase(it_dept_card); } } } if(CT_VEHICLE == card_type_id){ it_card = mp_card_list_down_vehicle.find(card_id); if(it_card != mp_card_list_down_vehicle.end()){ mp_card_list_down_vehicle.erase(it_card); } it_card = mp_card_list_forbidden_vehicle.find(card_id); if(it_card != mp_card_list_forbidden_vehicle.end()){ mp_card_list_forbidden_vehicle.erase(it_card); } it_card = mp_card_list_over_time_vehicle.find(card_id); if(it_card != mp_card_list_over_time_vehicle.end()){ mp_card_list_over_time_vehicle.erase(it_card); } it_card = mp_card_list_area_over_time_vehicle.find(card_id); if(it_card != mp_card_list_area_over_time_vehicle.end()){ mp_card_list_area_over_time_vehicle.erase(it_card); } it_card = mp_card_list_over_speed_vehicle.find(card_id); if(it_card != mp_card_list_over_speed_vehicle.end()){ mp_card_list_over_speed_vehicle.erase(it_card); } }else if(CT_PERSON == card_type_id) { it_card = mp_card_list_down_person.find(card_id); if(it_card != mp_card_list_down_person.end()){ mp_card_list_down_person.erase(it_card); } it_card = mp_card_list_over_time_person.find(card_id); if(it_card != mp_card_list_over_time_person.end()){ mp_card_list_over_time_person.erase(it_card); } it_card = mp_card_list_forbidden_person.find(card_id); if(it_card != mp_card_list_forbidden_person.end()){ mp_card_list_forbidden_person.erase(it_card); } it_card = mp_card_list_help.find(card_id); if(it_card != mp_card_list_help.end()){ mp_card_list_help.erase(it_card); } it_card = mp_card_list_area_over_time_person.find(card_id); if(it_card != mp_card_list_area_over_time_person.end()){ mp_card_list_area_over_time_person.erase(it_card); } } } void CYAServerDlg::save_card_postion( Card* card ) { // 位置发生变化 double moved_dist = sqrt(pow(card->x - card->stored_x, 2) + pow(card->y - card->stored_y, 2) + pow(card->z - card->stored_z, 2)); //if(moved_dist > card->map_scale * 20){ //移动距离大于20m,认为出错 // card->x = card->last_x; // card->y = card->last_y; // card->z = card->last_z; // return; //} // 位置变化幅度大于1m if( moved_dist < card->map_scale / 2.0){ // 移动位置小于半米,不记录数据 return ; } card->stored_x = card->x; card->stored_y = card->y; card->stored_z = card->z; //card->is_first_location = false; store_data_card(card, HIS_LOCATION); } void CYAServerDlg::store_data_area( Area* area, time_t cur_time, time_t start_time, int tag ) { char sql[LENGTH_SQL] = {'\0'}; char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME]; struct tm local_time, local_time_ex; localtime_s(&local_time, &cur_time); localtime_s(&local_time_ex, &start_time); strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); switch(tag){ case ALARM_AREA_OVER_COUNT_PERSON_START: { int alarm_type_id = ATID_AREA_OVER_COUNT_PERSON; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_area(area_id, alarm_type_id, start_time) VALUES(%d, %d, '%s');", area->area_id, alarm_type_id, _time); break; } case ALARM_AREA_OVER_COUNT_PERSON_END: { localtime_s(&local_time_ex, &area->time_over_count_person); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); int alarm_type_id = ATID_AREA_OVER_COUNT_PERSON; sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_area SET end_time = '%s' WHERE area_id=%d AND alarm_type_id=%d AND start_time = '%s';", _time, area->area_id, alarm_type_id, _time_ex); break; } default: return; } execute_sql(sql); } void CYAServerDlg::store_data_reader( Reader* reader, int tag ) { char sql[LENGTH_SQL] = {'\0'}; char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME]; struct tm local_time, local_time_ex; localtime_s(&local_time, &reader->lost_time); localtime_s(&local_time_ex, &reader->rec_time); strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); switch(tag){ case ALARM_READER_LOST_START: { int alarm_type_id = ATID_READER; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_reader(reader_id, alarm_type_id, start_time, rec_time) VALUES(%d, %d, '%s', '%s');", reader->reader_id, alarm_type_id, _time, _time_ex); break; } case ALARM_READER_LOST_END: { int alarm_type_id = ATID_READER; sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_reader set end_time='%s' where reader_id=%d and alarm_type_id=%d and start_time='%s';", _time_ex, reader->reader_id, alarm_type_id, _time); break; } default: return; } execute_sql(sql); } void CYAServerDlg::execute_sql( const char* sql ) { m_qsmSQL->AddString(sql); } /* * 日志菜单设置 * 将日志菜单设置内容同步更新到主对话框中的相应变量 * * param * 无 * * return * 无 */ void CYAServerDlg::OnMenuLog() { CLogSetting dlg; dlg.DoModal(); m_log_sys_status = dlg.m_log_sys_status; m_log_raw_data = dlg.m_log_raw_data; m_log_parse_data = dlg.m_log_parse_data; m_log_recv_package = dlg.m_log_recv_package; m_log_send_package = dlg.m_log_send_package; m_log_locate_data = dlg.m_log_locate_data; } void CYAServerDlg::OnMenuParam() { CSysSetting dlg; dlg.DoModal(); m_bUseFilter = dlg.m_use_filter; if(m_bUseFilter){ m_nFilterType = FILTER_KALMAN; }else{ m_nFilterType = NO_FILTER; } CardMap::iterator it = mp_card_list_all.begin(); for(it;it!=mp_card_list_all.end();it++){ it->second->m_nFilterType = m_nFilterType; if(it->second->m_pKalmanFilter == NULL && m_nFilterType != NO_FILTER){ if(theApp.use_filter_odd){ std::string temp = it->second->card_id; int a = atoi(temp.substr(temp.length() - 1 , 1).c_str()); if(0 == a%2){ it->second->EnableFilter(m_nFilterType); } }else{ it->second->EnableFilter(m_nFilterType); } } } } void CYAServerDlg::OnLogin(string const& name, message::ptr const& data, bool isAck, message::list &ack_resp) { int res_code = (int)data->get_map()["code"]->get_int(); switch (res_code) { case -1: // 用户未登录 { //ws_login(); is_websocket_login = false; break; } case 0: { if("" == data->get_map()["code"]->get_string()){ // 登录成功 is_websocket_login = true; }else{ // 退出登录 is_websocket_login = false; } break; } default: break; } } void CYAServerDlg::OnLoginCallBack( message::list const& msglist /*= nullptr*/ ) { message::ptr msg_ptr = msglist[0]; int n = (int)msg_ptr->get_map()["code"]->get_int(); is_websocket_login = (0 == n) ? true : false; } void CYAServerDlg::send_call_info() { EnterCriticalSection(&m_csCallInfo); BYTE buf[LENGTH_SEND_BUF]; SocketMap::iterator it_sock; CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin(); if(it_call_reader == mp_call_info.end()){ LeaveCriticalSection(&m_csCallInfo); return; } if(!it_call_reader->second->is_start_call){ LeaveCriticalSection(&m_csCallInfo); return; } for(; it_call_reader != mp_call_info.end(); ++it_call_reader){ it_sock = mp_socket_list.begin(); for(it_sock;it_sock!=mp_socket_list.end();++it_sock){ if(it_sock->second->reader_id == it_call_reader->first){ break; } } if(it_sock != mp_socket_list.end()){ memset(buf, 0, LENGTH_SEND_BUF); int npos = 0, card_count = 0; //卡数 card_count = it_call_reader->second->cards_count; memcpy(&buf[npos], &card_count, sizeof(BYTE)); npos += sizeof(BYTE); //呼叫类型 memcpy(&buf[npos], &it_call_reader->second->call_type, sizeof(BYTE)); npos += sizeof(BYTE); if(!it_call_reader->second->is_call_all){ // 定员呼叫,加入卡列表 //循环添加卡信息 CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin(); for(; it_call_card != it_call_reader->second->mpCard.end(); ++it_call_card){ //呼叫类型 memcpy(&buf[npos], &it_call_card->second->call_type, sizeof(BYTE)); npos += sizeof(BYTE); //卡类型 memcpy(&buf[npos], &it_call_card->second->card_type, sizeof(BYTE)); npos += sizeof(BYTE); //卡ID长度 BYTE id_len = (BYTE)get_card_id_len(it_call_card->second->card_type); memcpy(&buf[npos], &id_len, sizeof(BYTE)); npos += sizeof(BYTE); //卡ID if(id_len > 1){ // 标准卡id为4个字节,自组网卡为1个字节 CFunctions::memcpyDWord(buf, it_call_card->second->card_id, npos); }else{ memcpy(&buf[npos], &it_call_card->second->card_id, id_len); } npos += id_len; } memcpy(&buf[0], &card_count, sizeof(BYTE)); } SendData(it_sock->second->dwConnID,CHAR_CALL, npos, buf); } } LeaveCriticalSection(&m_csCallInfo); } void CYAServerDlg::clear_call_info() { EnterCriticalSection(&m_csCallInfo); CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin(); time_t current_time = time(NULL); for(; it_call_reader != mp_call_info.end(); ++it_call_reader){ if(it_call_reader->second->is_call_all){ }else{ CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin(); for(; it_call_card != it_call_reader->second->mpCard.end();){ if(difftime(current_time, it_call_card->second->start_time) > it_call_card->second->time_out * 60 ){ it_call_reader->second->mpCard.erase(it_call_card++); it_call_reader->second->is_start_call = false; } } } } LeaveCriticalSection(&m_csCallInfo); } int CYAServerDlg::get_card_id_len( int card_type ) { switch (card_type) { //case CT_PERSON: // return 4; //case CT_VEHICLE: // return 4; case CT_ADHOC: return 1; default: return 4; //break; } } std::string CYAServerDlg::get_json_call_test() { Json::Value root; Json::Value val_data; Json::Value val_stations; Json::Value val_station; Json::Value val_cards; Json::Value val_card; char _time[STR_LEN_TIME]; struct tm local_time; //TRACE(_T("time memcpy 7\n")); time_t tt = time(NULL); localtime_s(&local_time, &tt); strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time); val_data[JSON_KEY_CALL_CARD_CALL_TIME] = _time; val_data[JSON_KEY_CALL_CARD_CALL_TYPE] = 0; val_data[JSON_KEY_CALL_CARD_USER_NAME] = "aaaaaa"; val_data[JSON_KEY_CALL_CARD_CALL_TIME_OUT] = 5; val_station[JSON_KEY_CALL_CARD_STATION_ID] = 233; val_stations.append(val_station); val_station[JSON_KEY_CALL_CARD_STATION_ID] = 59; val_stations.append(val_station); val_card[JSON_KEY_CALL_CARD_CARD_TYPE_ID] = 3; val_card[JSON_KEY_CALL_CARD_CARD_ID] = 5; val_cards.append(val_card); val_card[JSON_KEY_CALL_CARD_CARD_TYPE_ID] = 3; val_card[JSON_KEY_CALL_CARD_CARD_ID] = 8; val_cards.append(val_card); val_data[JSON_KEY_CALL_CARD_STATIONS] = val_stations; val_data[JSON_KEY_CALL_CARD_CARDS] = val_cards; root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_CALL_CARD_START; root[JSON_ROOT_KEY_DATA] = val_data; return root.toFastString(); } void CYAServerDlg::init_base_data() { init_setting(); init_alarm_type(); init_dept(); init_map(); init_area(); init_reader(); init_antenna(); #ifdef ALGORITHM_TYPE_TOF init_all_readers_coverage(); #elif defined ALGORITHM_TYPE_TDOA init_tdoa_all_readers_coverage(); #endif init_dev_adhoc(); init_antenna_sync(); init_card(); init_staffer(); init_vehicle(); init_adhoc(); } void CYAServerDlg::load_his_data() { //load_his_down(); // 入井状态 //load_his_area(); // 所在区域 load_his_reader(); // 分站状态 load_his_card_postion(); // 所在位置 load_his_card_state(); deal_hist_card_postion(); } void CYAServerDlg::load_his_down() { } void CYAServerDlg::load_his_area() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; sprintf_s(buf, "select la.card_id, la.area_id, la.map_id, la.enter_time from his_location_area la \ where not exists(select 1 from his_location_area where card_id=la.card_id and enter_time> la.enter_time) \ and la.leave_time is null;"); pRes = pConn->Execute(buf, err); int nRow = 0; std::string enter_time; while(pRow = mysql_fetch_row(pRes)){ CardMap::iterator it = mp_card_list_all.find(pRow[0]); if(it != mp_card_list_all.end()){ it->second->area_id = atoi(pRow[1]); it->second->map_id = atoi(pRow[2]); enter_time = pRow[3]; API_StringToTime(enter_time, it->second->enter_area_time); nRow++; } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_AREA), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); } void CYAServerDlg::load_his_card_postion() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; sprintf_s(buf, "select l.card_id, l.cur_time, l.x, l.y, l.z, la.map_id, la.area_id, la.enter_time, att.start_time \ from his_location l, (select card_id, max(cur_time) cur_time from his_location where cur_time >= date_sub(now(), interval 2 hour) group by card_id) lx, \ (select la.* from his_location_area la, (select card_id, max(enter_time) enter_time from his_location_area where leave_time is null group by card_id) lax \ where la.card_id = lax.card_id and la.enter_time = lax.enter_time and la.leave_time is null) la, \ (select att.* from rpt_attendance att, (select card_id, max(start_time) start_time from rpt_attendance where end_time is null group by card_id) attx \ where att.card_id = attx.card_id and att.start_time = attx. start_time and att.end_time is null) att \ where l.card_id = lx.card_id and l.cur_time = lx.cur_time \ and l.card_id = la.card_id and l.area_id = la.area_id and l.cur_time >= la.enter_time \ and l.card_id = att.card_id and l.cur_time >= att.start_time;"); //sprintf_s(buf, "select l.card_id, l.cur_time, l.x, l.y, l.z, la.map_id, la.area_id, la.enter_time, att.start_time \ // from his_location l \ // ,(select l.card_id, l.cur_time from his_location l where not exists(select 1 from his_location where card_id=l.card_id and cur_time>l.cur_time) and cur_time>= date_sub(now(), interval 2 hour)) lx \ // ,(select la.card_id, la.map_id, la.area_id, la.enter_time from his_location_area la where not exists(select 1 from his_location_area where card_id=la.card_id and enter_time > la.enter_time) and la.leave_time is null) la \ // ,(select att.card_id, att.start_time from rpt_attendance att where not exists(select 1 from rpt_attendance where card_id=att.card_id and start_time>att.start_time) and att.end_time is null) att \ // where l.cur_time >= date_sub(now(), interval 2 hour) and l.card_id = lx.card_id and l.cur_time = lx.cur_time \ // and l.card_id = la.card_id and l.area_id = la.area_id and l.cur_time >= la.enter_time \ // and l.card_id = att.card_id and l.cur_time >= att.start_time;"); //pRes = pConn->Execute(buf, err); pRes = pConn->Execute(buf, err); int nRow = 0; std::string rec_time, enter_time, start_time; while(pRow = mysql_fetch_row(pRes)){ CardMap::iterator it = mp_card_list_all.find(pRow[0]); if(it != mp_card_list_all.end()){ rec_time = pRow[1]; API_StringToTime(rec_time, it->second->rec_time); it->second->x = atof(pRow[2]); it->second->y = atof(pRow[3]); it->second->z = atof(pRow[4]); it->second->last_x = it->second->x; it->second->last_y = it->second->y; it->second->last_z = it->second->z; it->second->area_id = atoi(pRow[5]); it->second->map_id = atoi(pRow[6]); //it->second->map_scale = enter_time = pRow[7]; API_StringToTime(enter_time, it->second->enter_area_time); start_time = pRow[8]; API_StringToTime(start_time, it->second->down_time); it->second->pos_state = DT_DOWN; it->second->pos_state_old = DT_DOWN; //it->second->deal_time = time(NULL); it->second->is_hist = true; it->second->isdealed = true; it->second->issent = false; nRow++; //card_down_mine(it->second, true); //card_enter_map(it->second, true); //card_enter_area(it->second, true); //if(it->second->card_type == CT_VEHICLE){ // mp_card_list_down_vehicle.insert(make_pair(it->second->card_id, it->second)); //}else if(it->second->card_type == CT_PERSON){ // mp_card_list_down_person.insert(make_pair(it->second->card_id, it->second)); //} } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_POSTION), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); } int CYAServerDlg::API_TimeToString( string &strDateStr,const time_t &timeData ) { char chTmp[100] = {0}; memset(chTmp, 0, sizeof(chTmp)); struct tm *p = 0; localtime_s(p, &timeData); //p = localtime(&timeData); p->tm_year = p->tm_year + 1900; p->tm_mon = p->tm_mon + 1; sprintf_s(chTmp,sizeof(chTmp),"%.4d-%.2d-%.2d %.2d:%.2d:%.2d", p->tm_year, p->tm_mon, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec); strDateStr = chTmp; return 0; } int CYAServerDlg::API_StringToTime( const string &strDateStr,time_t &timeData ) { char *pBeginPos = (char*) strDateStr.c_str(); char *pPos = strstr(pBeginPos,"-"); if(pPos == NULL){ //printf("strDateStr[%s] err /n", strDateStr.c_str()); return -1; } int iYear = atoi(pBeginPos); int iMonth = atoi(pPos + 1); pPos = strstr(pPos + 1,"-"); if(pPos == NULL){ //printf("strDateStr[%s] err /n", strDateStr.c_str()); return -1; } int iDay = atoi(pPos + 1); int iHour=0; int iMin=0; int iSec=0; pPos = strstr(pPos + 1," "); //为了兼容有些没精确到时分秒的 if(pPos != NULL){ iHour=atoi(pPos + 1); pPos = strstr(pPos + 1,":"); if(pPos != NULL){ iMin=atoi(pPos + 1); pPos = strstr(pPos + 1,":"); if(pPos != NULL){ iSec=atoi(pPos + 1); } } } struct tm sourcedate; memset((void*)&sourcedate, 0, sizeof(sourcedate)); sourcedate.tm_sec = iSec; sourcedate.tm_min = iMin; sourcedate.tm_hour = iHour; sourcedate.tm_mday = iDay; sourcedate.tm_mon = iMonth - 1; sourcedate.tm_year = iYear - 1900; timeData = mktime(&sourcedate); return 0; } int CYAServerDlg::init_card( string card_id /*= ""*/ ) { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return 1; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; if(card_id.length() == 0){ sprintf_s(buf, "select card_id, card_type_id, state, is_count, ident from dat_card where state = 0;"); }else{ sprintf_s(buf, "select card_id, card_type_id, state, is_count, ident from dat_card where state = 0 and card_id='%s';", card_id.c_str()); } pRes = pConn->Execute(buf, err); Card* pCard = NULL; int nRow = 0; while(pRow = mysql_fetch_row(pRes)){ CardMap::iterator it = mp_card_list_all.find(pRow[0]); if(it != mp_card_list_all.end()){ pCard = it->second; }else{ pCard = new Card(pRow[0], atoi(pRow[1]), theApp.z_offset); #ifdef ALGORITHM_TYPE_TOF pCard->set_reader_path(&mp_reader_path_list); #elif defined ALGORITHM_TYPE_TDOA pCard->set_reader_path(&mp_reader_path_list_tdoa); #endif mp_card_list_all.insert(make_pair(pCard->card_id, pCard)); nRow++; if(m_bUseFilter){ if(theApp.use_filter_odd){ std::string temp = pRow[1]; int a = atoi(temp.substr(temp.length() - 1 , 1).c_str()); if(0 == a%2){ pCard->EnableFilter(m_nFilterType); } }else{ pCard->EnableFilter(m_nFilterType); } } } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_INIT_CARD), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); return 0; } void CYAServerDlg::card_up_mine( Card* card ) { //card->up_time = card->deal_time; card->up_time = CFunctions::systime_to_timet(card->deal_time); store_data_card(card, RPT_ATTEND_UP); if(CT_PERSON == card->card_type){ CardMap::iterator it_card = mp_card_list_down_person.find(card->card_id); if(it_card != mp_card_list_down_person.end()){ mp_card_list_down_person.erase(it_card); // 从井下卡列表删除 } if(mp_card_list_down_person.size() <= sls_setting.over_count_person && time_over_count_person >0){ // 取消报警 store_data_mine(ALARM_MINE_OVER_COUNT_PERSON_END); time_over_count_person = 0; } }else if(CT_VEHICLE == card->card_type){ CardMap::iterator it_card = mp_card_list_down_vehicle.find(card->card_id); if(it_card != mp_card_list_down_vehicle.end()){ //Card* card = it_card->second; mp_card_list_down_vehicle.erase(it_card); // 从井下卡列表删除 if(card){ //delete card; //card = NULL; } } if(mp_card_list_down_vehicle.size() < sls_setting.over_count_vehicle && time_over_count_vehicle > 0){ store_data_mine(ALARM_MINE_OVER_COUNT_VEHICLE_END); time_over_count_vehicle = 0; } } DeptMap::iterator it_dept = mp_dept_list.find(card->dept_id); if(it_dept != mp_dept_list.end()){ if(CT_PERSON == card->card_type){ CardMap::iterator it_card = it_dept->second->dept_card_list_person.find(card->card_id); if(it_card != it_dept->second->dept_card_list_person.end()){ it_dept->second->dept_card_list_person.erase(it_card); // 从井下卡列表删除 } store_data_card(card, ALARM_CARD_OVER_TIME_END); deal_alarm_card(card, &mp_card_list_over_time_person, false, AF_CARD_OVER_TIME); }else if(CT_VEHICLE == card->card_type){ CardMap::iterator it_card = it_dept->second->dept_card_list_vehicle.find(card->card_id); if(it_card != it_dept->second->dept_card_list_vehicle.end()){ it_dept->second->dept_card_list_vehicle.erase(it_card); // 从井下卡列表删除 } store_data_card(card, ALARM_CARD_OVER_TIME_END); deal_alarm_card(card, &mp_card_list_over_time_vehicle, false, AF_CARD_OVER_TIME); } } } void CYAServerDlg::card_down_mine( Card* card ) { //card->down_time = card->deal_time; card->down_time = CFunctions::systime_to_timet(card->deal_time); if(CT_PERSON == card->card_type){ CardMap::iterator it_card = mp_card_list_down_person.find(card->card_id); if(it_card == mp_card_list_down_person.end()){ mp_card_list_down_person.insert(make_pair(card->card_id, card)); // 添加到井下卡列表 } if(time_over_count_person == 0 && mp_card_list_down_person.size() > sls_setting.over_count_person){ //TRACE(_T("time memcpy 6\n")); time_over_count_person = time(NULL); store_data_mine(ALARM_MINE_OVER_COUNT_PERSON_START); } }else if(CT_VEHICLE == card->card_type){ CardMap::iterator it_card = mp_card_list_down_vehicle.find(card->card_id); if(it_card == mp_card_list_down_vehicle.end()){ mp_card_list_down_vehicle.insert(make_pair(card->card_id, card)); // 添加到井下卡列表 } //如果井下车辆总数超过系统设置的车辆阈值,则存储车辆超员告警信息 if(time_over_count_vehicle == 0 && mp_card_list_down_vehicle.size() > sls_setting.over_count_vehicle){ //TRACE(_T("time memcpy 5\n")); time_over_count_vehicle = time(NULL); store_data_mine(ALARM_MINE_OVER_COUNT_VEHICLE_START); } } DeptMap::iterator it_dept = mp_dept_list.find(card->dept_id); if(it_dept != mp_dept_list.end()){ if(CT_PERSON == card->card_type){ CardMap::iterator it_card = it_dept->second->dept_card_list_person.find(card->card_id); if(it_card == it_dept->second->dept_card_list_person.end()){ it_dept->second->dept_card_list_person.insert(make_pair(card->card_id, card)); // 添加到井下卡列表 } // 判断是否超员 }else if(CT_VEHICLE == card->card_type){ CardMap::iterator it_card = it_dept->second->dept_card_list_vehicle.find(card->card_id); if(it_card == it_dept->second->dept_card_list_vehicle.end()){ it_dept->second->dept_card_list_vehicle.insert(make_pair(card->card_id, card)); // 添加到井下卡列表 } // 判断是否超员 } } store_data_card(card, RPT_ATTEND_DOWN); } void CYAServerDlg::send_sync_reader() { time_t cur_time; struct tm local; int wlen = 0; BYTE SendBuffer[LENGTH_SEND_BUF]; BYTE bt_tmp; // 遍历发送数据 int nPos = 0; SocketMap::iterator it_sock = mp_socket_list.begin(); for(; it_sock != mp_socket_list.end(); ++it_sock){ wlen = 0; cur_time = time(NULL); memset(SendBuffer, 0, LENGTH_SEND_BUF); localtime_s(&local, &cur_time); bt_tmp = local.tm_sec; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); bt_tmp = local.tm_min; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); bt_tmp = local.tm_hour; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); bt_tmp = local.tm_mday; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); bt_tmp = local.tm_wday; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); bt_tmp = local.tm_mon + 1; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); bt_tmp = (local.tm_year + 1900)%100; memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE)); wlen += sizeof(BYTE); SendData(it_sock->second->dwConnID , CHAR_SYNC_TIME, wlen, SendBuffer); Sleep(20); TRACE(_T("dwConnID: %d"),it_sock->second->dwConnID); } } void CYAServerDlg::send_call_his_data() { if(g_is_rec_hist){ if(MessageBox(_T("正在接受收历史数据,请稍后再试"), _T("接收历史数据"), MB_OK) == IDOK){ return; } } if (MessageBox(_T("确定要接收历史数据吗?"), _T("接收历史数据"), MB_OKCANCEL) != IDOK){ return; } UpdateData(FALSE); bool bExit = false; SocketMap::iterator it_sock = mp_socket_list.begin(); for(; it_sock != mp_socket_list.end(); ++it_sock){ if(it_sock->second->reader_id == m_reader_id_hist){ int wlen = 0; WORD wchr = CHAR_LOCATEDATAHIS_TDOA; BYTE SendBuffer[LENGTH_SEND_BUF]; memset(SendBuffer, 0, LENGTH_SEND_BUF); SendData(it_sock->second->dwConnID, wchr, wlen, SendBuffer); bExit = true; break; } } if(!bExit){ //if (MessageBox(_T("此分站未连接"), _T("请求历史数据"), MB_OK) == IDOK){ // //} } } void CYAServerDlg::OnBnCallHisData() { send_call_his_data(); } void CYAServerDlg::deal_hist_card_postion() { CardMap::iterator it_card = mp_card_list_all.begin(); for(; it_card != mp_card_list_all.end(); ++it_card){ if(it_card->second->is_hist){ if(CT_VEHICLE == it_card->second->card_type){ MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id); if(it_map != mp_map_list.end()){ it_map->second->map_card_list_vehicle.insert(make_pair(it_card->first, it_card->second)); it_card->second->map_scale = it_map->second->map_scale; } mp_card_list_down_vehicle.insert(make_pair(it_card->first, it_card->second)); AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id); if(it_area != mp_area_list.end()){ it_area->second->area_card_list_vehicle.insert(make_pair(it_card->first, it_card->second)); if(0 == it_area->second->over_count_vehicle){ mp_card_list_forbidden_vehicle.insert(make_pair(it_card->first, it_card->second)); } } }else if(CT_PERSON == it_card->second->card_type){ MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id); if(it_map != mp_map_list.end()){ it_map->second->map_card_list_person.insert(make_pair(it_card->first, it_card->second)); it_card->second->map_scale = it_map->second->map_scale; } mp_card_list_down_person.insert(make_pair(it_card->first, it_card->second)); AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id); if(it_area != mp_area_list.end()){ it_area->second->area_card_list_person.insert(make_pair(it_card->first, it_card->second)); if(0 == it_area->second->over_count_person){ mp_card_list_forbidden_person.insert(make_pair(it_card->first, it_card->second)); } } } } } } void CYAServerDlg::deal_hist_card_alarm() { //CardMap mp_card_list_forbidden_vehicle; //CardMap mp_card_list_over_time_vehicle; //CardMap mp_card_list_over_speed_vehicle; //CardMap mp_card_list_area_over_time_vehicle; //CardMap mp_card_list_over_time_person; // //CardMap mp_card_list_forbidden_person; //CardMap mp_card_list_help; //CardMap mp_card_list_area_over_time_person; } void CYAServerDlg::deal_hist_area() { //AreaMap mp_area_over_count_person; //AreaMap mp_area_over_time_person; //AreaMap mp_area_forbidden_person; //AreaMap mp_area_over_count_vehicle; //AreaMap mp_area_over_time_vehicle; //AreaMap mp_area_forbidden_vehicle; } void CYAServerDlg::load_his_reader() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; sprintf_s(buf, "select ar.reader_id, ar.start_time, ar.rec_time from his_alarm_reader ar \ where not exists(select 1 from his_alarm_reader where reader_id=ar.reader_id and start_time> ar.start_time) \ and ar.end_time IS NULL;"); pRes = pConn->Execute(buf, err); int nRow = 0; std::string rec_time, lost_time; while(pRow = mysql_fetch_row(pRes)){ ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[0])); if(it != mp_reader_list.end()){ lost_time = pRow[1]; rec_time = pRow[2]; API_StringToTime(rec_time, it->second->rec_time); API_StringToTime(lost_time, it->second->lost_time); it->second->state = STATUS_DEVICE_ERROR; nRow++; } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_READER), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); } void CYAServerDlg::store_data_mine( int tag ) { char sql[LENGTH_SQL] = {'\0'}; char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME]; //TRACE(_T("time memcpy 3\n")); time_t cur_time = time(NULL); struct tm local_time, local_time_ex; switch(tag){ case ALARM_MINE_OVER_COUNT_PERSON_START: { localtime_s(&local_time, &time_over_count_person); localtime_s(&local_time_ex, &cur_time); strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); int alarm_type_id = ATID_OVER_COUNT_PERSON; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_info(alarm_type_id, start_time) VALUES(%d, '%s');", alarm_type_id, _time); break; } case ALARM_MINE_OVER_COUNT_PERSON_END: { localtime_s(&local_time, &time_over_count_person); localtime_s(&local_time_ex, &cur_time); strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); int alarm_type_id = ATID_OVER_COUNT_PERSON; sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_info set end_time='%s' where alarm_type_id=%d and start_time='%s';", _time_ex, alarm_type_id, _time); break; } case ALARM_MINE_OVER_COUNT_VEHICLE_START: { localtime_s(&local_time, &time_over_count_vehicle); localtime_s(&local_time_ex, &cur_time); strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); int alarm_type_id = ATID_OVER_COUNT_VEHICLE; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_info(alarm_type_id, start_time) VALUES(%d, '%s');", alarm_type_id, _time); break; } case ALARM_MINE_OVER_COUNT_VEHICLE_END: { localtime_s(&local_time, &time_over_count_vehicle); localtime_s(&local_time_ex, &cur_time); strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time); strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex); int alarm_type_id = ATID_OVER_COUNT_VEHICLE; sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_info set end_time='%s' where alarm_type_id=%d and start_time='%s';", _time_ex, alarm_type_id, _time); break; } default: return; } execute_sql(sql); } void CYAServerDlg::deal_card_state( Card* card ) { // 电量 if(card->power_state == 0 && card->power_state_last != 0){ card->status_power = STATUS_NORMAL; store_data_card(card, ALARM_CARD_LOW_POWER_END); } if(card->power_state_last == 0 && card->power_state != 0){ //card->low_power_time = card->deal_time;CFunctions::systime_to_timet(card->deal_time) card->low_power_time = CFunctions::systime_to_timet(card->deal_time); store_data_card(card, ALARM_CARD_LOW_POWER_START); } card->power_state_last = card->power_state; } void CYAServerDlg::load_his_card_state() { CMysqlConn* pConn = NULL; CDBConnGuard pDbGuard(pConn); if(pConn == NULL){ return ; } MYSQL_RES* pRes; MYSQL_ROW pRow; int err = 0; char buf[LENGTH_SQL] = {0}; sprintf_s(buf, "select ac.card_id, ac.alarm_type_id, ac.start_time from his_alarm_card ac \ where not exists(select 1 from his_alarm_card where card_id=ac.card_id and alarm_type_id=ac.alarm_type_id and start_time> ac.start_time) \ and ac.end_time is NULL;"); pRes = pConn->Execute(buf, err); int nRow = 0; std::string start_time; while(pRow = mysql_fetch_row(pRes)){ CardMap::iterator it = mp_card_list_all.find(pRow[0]); if(it != mp_card_list_all.end()){ switch (atoi(pRow[1])) { case ATID_POWER: it->second->power_state = 1; it->second->power_state_last = 1; it->second->status_power = STATUS_ERROR; start_time = pRow[2]; API_StringToTime(start_time, it->second->low_power_time); default: break; } nRow++; } } mysql_free_result(pRes); CString strlog; strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_STATE), nRow, _T(LOG_RECORD_COUNT)); show_log(strlog); } EnHandleResult CYAServerDlg::OnPrepareListen( ITcpServer* pSender, SOCKET soListen ) { TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); USHORT usPort; pSender->GetListenAddress(szAddress, iAddressLen, usPort); //::PostOnPrepareListen(szAddress, usPort); return HR_OK; } EnHandleResult CYAServerDlg::OnAccept( ITcpServer* pSender, CONNID dwConnID, SOCKET soClient ) { BOOL bPass = TRUE; TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); USHORT usPort; pSender->GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort); //::PostOnAccept(dwConnID, szAddress, usPort, bPass); return HR_OK; } EnHandleResult CYAServerDlg::OnSend( ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength ) { //::PostOnSend(dwConnID, pData, iLength); return HR_OK; } EnHandleResult CYAServerDlg::OnReceive( ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength ) { TRACE(_T("OnReceive: %d, %d\n"), iLength, dwConnID); DWORD dw = ::GetTickCount(); ParseData *data = NULL; data = (ParseData*)malloc(sizeof(ParseData)); data->handle = this; data->dwConnID = dwConnID; data->len = iLength; memset(data->buf, 0, LENGTH_MSG_4K); //TRACE(_T("9 malloc \n")); memcpy(data->buf, pData, iLength); //TRACE(_T("m_nMalloctimes = %d \n"),++m_nMallocTimes); QueueUserWorkItem(_parse_data_server, (LPVOID)data, WT_EXECUTEDEFAULT); //parse_data_server(pData, iLength, dwConnID); //TRACE(_T("parse_data_server: %d, %d, %d\r\n"), ::GetTickCount() - dw, dwConnID, iLength); return HR_OK; } EnHandleResult CYAServerDlg::OnClose( ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode ) { ::PostMessage(this->GetSafeHwnd(), WM_REMOVE_SOCKET, NULL, (LPARAM)dwConnID); return HR_OK; } EnHandleResult CYAServerDlg::OnShutdown( ITcpServer* pSender ) { return HR_OK; } _SOCK* CYAServerDlg::get_socket_by_count( DWORD dwConnID ) { SocketMap::iterator _sock = mp_socket_list.begin(); for(; _sock != mp_socket_list.end(); ++_sock){ if(_sock->second->dwConnID == dwConnID){ return _sock->second; } } return NULL; } afx_msg LRESULT CYAServerDlg::OnMsgRefreshIpList(WPARAM wParam, LPARAM lParam) { EnterCriticalSection(&m_csRefreshList); m_listctrl_reader.SetRedraw(FALSE); m_listctrl_reader.DeleteAllItems(); SocketMap::reverse_iterator it_sock = mp_socket_list.rbegin(); for(; it_sock != mp_socket_list.rend(); ++it_sock){ AddItem(it_sock->second->sip, it_sock->second->reader_id, it_sock->second->state); } m_listctrl_reader.SetRedraw(TRUE); LeaveCriticalSection(&m_csRefreshList); return 0; } void CYAServerDlg::parse_data_locate_card_his( BYTE* DataBuffer, int& nCurPos, int reader_id, DWORD wTickCount, CString strTime, unsigned short wChr) { // 按时间分组解析 // 组长度 WORD wframelen = 0; CFunctions::getWord(DataBuffer, &wframelen, nCurPos); nCurPos += sizeof(WORD); int nframepos = nCurPos; // 数据保存时间 7字节,年,月,周,日,时,分,秒 BYTE btSec = 0; //TRACE(_T("10 \n")); memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btMin = 0; memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btHour = 0; memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btDay = 0; memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btWeek = 0; memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btMonth = 0; memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btYear = 0; memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); CString strhistime; strhistime.Format(_T("20%.2d-%.2d-%.2d %.2d:%.2d:%.2d"), btYear%100, btMonth, btDay, btHour, btMin, btSec ); while(nCurPos - nframepos < wframelen){ // 一组数据 BYTE btCardType = 0; memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwCardId = 0; CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos); nCurPos += sizeof(DWORD); string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10); Card* pCard = new Card(str_card_id, btCardType, theApp.z_offset); pCard->reader_id = reader_id; pCard->str_his_time = CFunctions::wc2c(strhistime); pCard->reader_tickcount = wTickCount; pCard->str_rec_time = CFunctions::wc2c(strTime); //LONG64 l64cardid = btCardType; //l64cardid <<= 32; //l64cardid |= dwCardId; switch(btCardType) { case CT_VEHICLE: { //报文时间 WORD wCardTickCount = 0; CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos); nCurPos += sizeof(WORD); pCard->time_stamp = wCardTickCount; BYTE btTypeAndPower = 0; memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //报文类型 BYTE btType = 0; btType = (btTypeAndPower >>4) & 0x0F; //电池电量 BYTE btPower = 0; btPower = btTypeAndPower & 0x0F; pCard->ranging_type = btType; pCard->power_state = btPower; //保留 nCurPos += sizeof(BYTE); //加速度 BYTE btAcceleration = 0; memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); pCard->accelerate_state = btAcceleration; //定位时间戳Tsp // 字序 LONG64 lTime1 = 0; BYTE btTemp = 0; int nRangingPos = nCurPos; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwTemp = 0; CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime1 = btTemp; lTime1 = lTime1 << 32; lTime1 |= dwTemp; pCard->flying_time = lTime1; double dbldist = CFunctions::getDistance(lTime1); pCard->distance = dbldist; BYTE btAntenna = 0; memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); btAntenna = btAntenna & 0xFF; pCard->antenna_id = btAntenna; if(CHAR_LOCATEDATAHIS_TDOA == wChr ){ // 分站时间同步序列号 WORD wSyncNum = 0; CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos); nCurPos += sizeof(WORD); // 信号强度 WORD wStrength = 0; CFunctions::getWord(DataBuffer, &wStrength, nCurPos); nCurPos += sizeof(WORD); } break; } case CT_PERSON: { break; } default: { //strBuf.Format(_T("无法识别的卡类型:%d\r\n"), btCardType); break; } } store_data_card(pCard, HIS_RAW_DATA); delete pCard; pCard = NULL; } } void CYAServerDlg::parse_data_locate_reader_his( BYTE * DataBuffer, int nLen, int& nCurPos, int& reader_id, int& nTick, CString& strtime, unsigned short wChr) { //CString strTime; strtime.Format(_T("%s"), COleDateTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"))); DWORD dwReaderID = 0; CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos); nCurPos += sizeof(DWORD); WORD wTickCount = 0; CFunctions::getWord(DataBuffer, &wTickCount, nCurPos); nCurPos += sizeof(WORD); } void CYAServerDlg::parse_data_reader_synctime(BYTE *DataBuffer, int nLen, int& nCurPos, WORD wChr) { while(nCurPos < nLen - sizeof(WORD)){ DWORD dwReaderID = 0; // 本机分站号 CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos); nCurPos += sizeof(DWORD); BYTE btAnt = 0; // 本机发送天线 //TRACE(_T("11 \n")); memcpy(&btAnt, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwUpperReaderID = 0; // root分站号 CFunctions::getDWord(DataBuffer, &dwUpperReaderID, nCurPos); nCurPos += sizeof(DWORD); BYTE btUpperAnt = 0; // root天线 memcpy(&btUpperAnt, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); WORD wSyncNum = 0; // 序列号 CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos); nCurPos += sizeof(WORD); WORD wSyncLevel = 0; // 同步等级 CFunctions::getWord(DataBuffer, &wSyncLevel, nCurPos); nCurPos += sizeof(WORD); LONG64 lTime1 = 0, lTime2 = 0; BYTE btTemp = 0; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwTemp = 0; CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime1 = btTemp; // 本机发送时间戳 lTime1 = lTime1 << 32; lTime1 |= dwTemp; btTemp = 0; dwTemp = 0; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime2 = btTemp; // 本机接收时间戳 lTime2 = lTime2 << 32; lTime2 |= dwTemp; DWORD dwRootReaderID = 0; // root分站号 BYTE btRootAnt = 0; // root天线 if(CHAR_READER_SYNC_TIME_ROOT == wChr){ CFunctions::getDWord(DataBuffer, &dwRootReaderID, nCurPos); nCurPos += sizeof(DWORD); memcpy(&btRootAnt, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); } /*CString strLog; strLog.Format(_T("id1:%d, id2:%d, syncnum:%d, level:%d, send:%I64u, rec:%I64u"), dwReaderID, dwRootReaderID, wSyncNum, wSyncLevel, lTime1, lTime2); writeErrorLog(_T("SYNC_S"), strLog, true);*/ HostServer::SyncTimeMsg msg; msg.LocalIdCode(dwReaderID); msg.LocalIdCode((msg.LocalIdCode() << 8) + btAnt); msg.UpperIdCode(dwUpperReaderID); msg.UpperIdCode((msg.UpperIdCode() << 8) + btUpperAnt); msg.RootIdCode(dwRootReaderID); msg.RootIdCode((msg.RootIdCode() << 8) + btRootAnt); msg.SyncNum(wSyncNum); msg.SyncLevel(wSyncLevel); msg.LocalStationSendTime(lTime1); msg.LocalStationReceiveTime(lTime2); syncmanager.analyzeSyncMsg(msg); if(wSyncLevel == 0){ EnterCriticalSection(&m_csSyncTime); umpRootSyncNum[dwReaderID] = wSyncNum; LeaveCriticalSection(&m_csSyncTime); } ReaderMap::iterator it = mp_reader_list.find(dwReaderID); if(it != mp_reader_list.end()){ it->second->sync_level = wSyncLevel; } if(m_log_parse_data){ CString strLog; strLog.Format(_T("id1:%d, id2:%d, root:%d, syncnum:%d, level:%d, send:%I64u, rec:%I64u"), dwReaderID, dwUpperReaderID, dwRootReaderID, wSyncNum, wSyncLevel, lTime1, lTime2); writeErrorLog(_T("SYNC_S"), strLog, true); //strLog = _T(""); strLog.Empty(); } } } int CYAServerDlg::init_antenna_sync() { ReaderMap::iterator itReader = mp_reader_list.begin(); // 初始化数组,将分站添加到列表,只有一个天线 for(; itReader != mp_reader_list.end(); ++itReader){ syncmanager.updateAnchor(itReader->second->reader_id, 1, itReader->second->ant[0]->antenna_x * itReader->second->map_scale, itReader->second->ant[0]->antenna_y * itReader->second->map_scale, itReader->second->ant[0]->antenna_z * itReader->second->map_scale); } // 根据坐标计算分站间距离 for (auto it = syncmanager._anchors.begin(); it != syncmanager._anchors.end(); it++) { for (auto it2 = syncmanager._anchors.begin(); it2 != syncmanager._anchors.end(); it2++) { if(it != it2) { double d = sqrt(pow((it->second.x - it2->second.x), 2) + pow((it->second.y - it2->second.y), 2) + pow((it->second.z - it2->second.z), 2)) * 10000 / (2.99702547 * 15.65); syncmanager.updateDistance(it->first >>8, it->first & 0xFF, it2->first >> 8, it2->first & 0xFF,d); } } } return 0; } void CYAServerDlg::Test() { ReceiveDataMap pRdm; pRdm.clear(); double dMapScale = 3.46; /*_coordinate** cd = new _coordinate*[4]; cd[0] = NULL; cd[1] = NULL; cd[2] = NULL; cd[3] = NULL; _coordinate c1; c1.tt = 448142133759; cd[0] = &c1; _coordinate c2; c2.tt = 448142159656; cd[1] = &c2; _coordinate c3; c3.tt = 448142221673; cd[2] = &c3; _coordinate c4; c4.tt = 448142175733; cd[3] = &c4; //HeapSort(cd,4); SelectSort(cd,4);*/ //34 ReceiveData* prd2 = new ReceiveData(); prd2->reader_id = 217; prd2->antenna_id = 1; prd2->rec_time_stamp = 777596169634;//283613853712;// prd2->x = 210.1*dMapScale; prd2->y = 449.5*dMapScale; prd2->z = 0; prd2->special = 1; pRdm.insert(ReceiveDataMap::value_type(prd2->reader_id,*prd2)); //35 ReceiveData* prd3 = new ReceiveData(); prd3->reader_id = 218; prd3->antenna_id = 1; prd3->rec_time_stamp = 777596203395;//283613846609; prd3->x = 164.0*dMapScale; prd3->y = 449.5*dMapScale; prd3->z = 0; prd2->special = 0; pRdm.insert(ReceiveDataMap::value_type(prd3->reader_id,*prd3)); //36 ReceiveData* prd1 = new ReceiveData(); prd1->reader_id = 216; prd1->antenna_id = 1; prd1->rec_time_stamp = 777596203705;//283613846791; prd1->x = 242.8*dMapScale; prd1->y = 449.5*dMapScale; prd1->z = 0; prd1->special = 0; pRdm.insert(ReceiveDataMap::value_type(prd1->reader_id,*prd1)); ReceiveData* prd4 = new ReceiveData(); prd4->reader_id = 215; prd4->antenna_id = 1; prd4->rec_time_stamp = 777596242277;//283613846609; prd4->x = 296.4*dMapScale; prd4->y = 449.5*dMapScale; prd4->z = 0; pRdm.insert(ReceiveDataMap::value_type(prd4->reader_id,*prd4)); //ReceiveData* prd5 = new ReceiveData(); //prd5->reader_id = 214; //prd5->antenna_id = 1; //prd5->rec_time_stamp = 277993299781;//283613846609; //prd5->x = 328.7*dMapScale; //prd5->y = 449.5*dMapScale; //prd5->z = 0; //pRdm.insert(ReceiveDataMap::value_type(prd5->reader_id,*prd5)); //ReceiveData* prd5 = new ReceiveData(); //prd5->reader_id = 205; //prd5->antenna_id = 1; //prd5->rec_time_stamp = 630968206079;//283613846609; //prd5->x = 804.000000*dMapScale; //prd5->y = 449.500000*dMapScale; //prd5->z = 0; //pRdm.insert(ReceiveDataMap::value_type(prd5->reader_id,*prd5)); POS* p = NULL; p = LocateAlgorithm::Pos(&pRdm,mp_reader_path_list_tdoa); bool bRet = false; bRet = LocateAlgorithm::CheckPosInValid(p,&pRdm,dMapScale); if(bRet){ p->posx = INVALID_COORDINATE ; p->posy = INVALID_COORDINATE ; p->posz = -2 ; } double x = p->posx / dMapScale; double y = p->posy / dMapScale; } void CYAServerDlg::release_memory() { //释放CYAServer中new的内存 if(theApp.m_path_monitor){ delete[] theApp.m_path_monitor; theApp.m_path_monitor = NULL; } int nSize = 0; //mp_area_list release_area_memory(); //mp_map_list release_map_memory(); //mp_card_list_all release_card_memory(); //mp_reader_list release_reader_memory(); //mp_dept_list release_dept_memory(); if(m_qsmSQL){ delete m_qsmSQL; m_qsmSQL = NULL; } } void CYAServerDlg::release_area_memory() { if(mp_area_list.size() > 0){ AreaMap::iterator it = mp_area_list.begin(); for(;it!=mp_area_list.end();){ Area* tmp = (Area*)(it->second); mp_area_list.erase(it); if(tmp){ /*if(tmp->polygon){ delete[] tmp->polygon; tmp->polygon = NULL; }*/ delete tmp; tmp = NULL; } it = mp_area_list.begin(); } } } void CYAServerDlg::release_map_memory() { if(mp_map_list.size() > 0 ){ MapInfoMap::iterator it = mp_map_list.begin(); for(it;it!=mp_map_list.end();){ MapInfo* tmp = (MapInfo*)(it->second); mp_map_list.erase(it); if(tmp){ delete tmp; tmp = NULL; } it = mp_map_list.begin(); } } } void CYAServerDlg::release_card_memory() { if(mp_card_list_all.size()>0){ CardMap::iterator it = mp_card_list_all.begin(); for(;it!=mp_card_list_all.end();){ Card* tmp = (Card*)(it->second); mp_card_list_all.erase(it); if(tmp){ delete tmp; tmp = NULL; } it = mp_card_list_all.begin(); } } } void CYAServerDlg::release_reader_memory() { if(mp_reader_list.size() > 0 ){ ReaderMap::iterator it = mp_reader_list.begin(); for(;it!=mp_reader_list.end();){ Reader* tmp = (Reader*)(it->second); mp_reader_list.erase(it); if(tmp){ delete tmp; tmp = NULL; } it = mp_reader_list.begin(); } } if(mp_reader_path_list_tdoa.size() > 0 ){ TDOAReaderPathMap::iterator it = mp_reader_path_list_tdoa.begin(); for(;it != mp_reader_path_list_tdoa.end();){ ReaderPathMap* tmpMap = (ReaderPathMap*)(it->second); for(ReaderPathMap::iterator it_r = tmpMap->begin();it_r != tmpMap->end();){ ReaderPath* tmpPath = (ReaderPath* )(it_r->second); tmpMap->erase(it_r); if(tmpPath){ delete tmpPath; tmpPath = NULL; } it_r = tmpMap->begin(); } mp_reader_path_list_tdoa.erase(it); if(tmpMap){ delete tmpMap; tmpMap = NULL; } it = mp_reader_path_list_tdoa.begin(); } } } /* * 释放mp_dept_list中的new的内存 * * param * 无 * * return * 无 * */ void CYAServerDlg::release_dept_memory() { if(mp_dept_list.size() > 0){ DeptMap::iterator it = mp_dept_list.begin(); for(it ;it != mp_dept_list.end();){ Dept* tmp = (Dept*)(it->second); mp_dept_list.erase(it); delete tmp; tmp = NULL; it = mp_dept_list.begin(); } } } afx_msg LRESULT CYAServerDlg::OnWriteErrorLog(WPARAM wParam, LPARAM lParam) { LogMsg* pMsg = (LogMsg*)wParam; CString strFile = pMsg->strFile; bool bTime = pMsg->isNeedTime; CString strErr = pMsg->strLog; writeErrorLogEx(strFile, strErr, bTime); strErr.Empty(); strFile.Empty(); delete pMsg; return 0; } void CYAServerDlg::parse_data_server( const BYTE * pData, int nLen, DWORD dwConnId ) { //TRACE(_T("in server \n")); //改为拆成小包post EnterCriticalSection(&m_csParseDataServer); //TRACE(_T("in server cs \n")); //if(m_log_raw_data){ // //CString strBuf; // //formatByteArray(strBuf, (BYTE*)pData, nLen); // //writeErrorLog(_T("RAW_SSSS"), strBuf, false); //} int read_length = 0; int pkg_len = 0; BYTE *Buf = new BYTE[LENGTH_MSG_1M]; if(Buf == NULL){ LeaveCriticalSection(&m_csParseDataServer); return; } memset(Buf, 0, LENGTH_MSG_1M); //TRACE(_T("12 \n")); SocketBufferMap::iterator it = mp_socket_buffer_list.find(dwConnId); if(it != mp_socket_buffer_list.end()){ // 有此socket数据 if(nLen + it->second->wReadLen > LENGTH_MSG_1M){ //_server->Disconnect(dwConnId); // 出现错误数据或者溢出,断开连接 //ASSERT(0); LeaveCriticalSection(&m_csParseDataServer); return ; } if(it->second->wReadLen > 0){ memcpy(Buf, it->second->pData, it->second->wReadLen); } memcpy(&Buf[it->second->wReadLen], pData, nLen); it->second->wReadLen += nLen; nLen = it->second->wReadLen; // read_length = it->second->wReadLen + nLen; }else{ memcpy(Buf, pData, nLen); } while (read_length < nLen){ pkg_len = MAKEWORD(Buf[read_length + 1], Buf[read_length]); pkg_len += sizeof(WORD); // 长度 if(read_length + pkg_len > nLen){ break; // 有半个包,溢出,保留与下个包合并 } //将完整包送出 ParseData *data = (ParseData*)malloc(sizeof(ParseData)); data->handle = this; data->dwConnID = dwConnId; data->len = pkg_len; memset(data->buf, 0, LENGTH_MSG_4K); //由于存在pkg_len大于LENGTH_MSG_4K的情况,导致memcpy出错的问题; //原因猜测可能是第三方库缓存过大再发送过来的原因 if(pkg_len > LENGTH_MSG_4K){ //TRACE(_T("package is too long. \n")); free(data); data = NULL; if(Buf){ delete[] Buf; Buf = NULL; } LeaveCriticalSection(&m_csParseDataServer); return; } memcpy(data->buf, &Buf[read_length], pkg_len); QueueUserWorkItem(_parse_package_data, (LPVOID)data, WT_EXECUTEDEFAULT); read_length += pkg_len; //TRACE(_T("while 1: %d"),read_length); } if(read_length >= nLen){ //没剩下数据, 直接解析 if(it != mp_socket_buffer_list.end()){ it->second->wLen = 0; it->second->wReadLen = 0; it->second->dwConnID = dwConnId; //memset(it->second->pData, 0, LENGTH_MSG_1M); _SOCKET_BUFFER* pp = it->second; mp_socket_buffer_list.erase(it); free(pp); //memset(pp, 0, sizeof(_SOCKET_BUFFER)); pp = NULL; } }else{ // 有剩余数据,保存起来 if(it != mp_socket_buffer_list.end()){ //it->second->wLen = pkg_len - sizeof(WORD); try{ if(it->second->wReadLen > 0){ memset(&it->second->pData[it->second->wReadLen], 0, LENGTH_MSG_1M - it->second->wReadLen); } }catch(...){ int tt = it->second->wReadLen; } try{ //TRACE(_T("13 \n")); memcpy(&it->second->pData[it->second->wReadLen], &Buf[read_length], nLen - read_length); }catch(...){ int tt = it->second->wReadLen; } it->second->wReadLen += nLen - read_length; }else{ _SOCKET_BUFFER* _sockbuf = (_SOCKET_BUFFER*)malloc(sizeof(_SOCKET_BUFFER)); _sockbuf->wReadLen = 0; _sockbuf->dwConnID = dwConnId; _sockbuf->wLen = pkg_len; memset(_sockbuf->pData, 0, LENGTH_MSG_1M); //TRACE("5\n"); //TRACE(_T("13_2 new socket_buffer\n")); memcpy(_sockbuf->pData, &Buf[read_length], nLen - read_length); _sockbuf->wReadLen += nLen - read_length; mp_socket_buffer_list.insert(make_pair(dwConnId, _sockbuf)); } } delete[] Buf; Buf = NULL; //TRACE(_T("release memory \n")); LeaveCriticalSection(&m_csParseDataServer); //TRACE(_T("out server \n")); } void CYAServerDlg::parse_data_receive_package(BYTE *pData, int nLen, DWORD dwConnID ) { //CString strBuf; //formatByteArray(strBuf, (BYTE*)pData, nLen); //writeErrorLog(_T("RAW_SSS"), strBuf, false); int read_length = 0; int pkg_len = 0; BYTE* Buf = new BYTE[LENGTH_MSG_4K]; while (read_length < nLen){ pkg_len = MAKEWORD(pData[read_length + 1], pData[read_length]); //TRACE(_T("14 read_length: %d; pkg_len: %d \n"),read_length,pkg_len); if(Buf){ memset(Buf, 0, LENGTH_MSG_4K); memcpy(Buf, &pData[read_length + sizeof(WORD)], pkg_len); parse_package_data(Buf, pkg_len, dwConnID); } /*parse_data_receive(Buf, pkg_len, dwConnID);*/ read_length += pkg_len + sizeof(WORD); //TRACE(_T("parse_data_receive_package : read_length: %d, nLen: %d \n"),read_length, nLen); } delete[] Buf; Buf = NULL; } void CYAServerDlg::deal_card_msg( Card* card, bool is_hist /*= false*/ ) { DWORD dw; if(!is_hist){ if(card->card_type == CT_ADHOC){ // 此处不需处理,已经在解析时计算了坐标位置 }else if( LT_READER == theApp.locate_type){ card->x = card->p_reader->ant[card->antenna_id]->antenna_x; card->y = card->p_reader->ant[card->antenna_id]->antenna_y; card->z = card->p_reader->ant[card->antenna_id]->antenna_z; card->a = card->p_reader->ant[card->antenna_id]->antenna_angle; card->reader_id = card->p_reader->reader_id; }else{ // 将距离加入到距离列表 _coordinate* dist = new _coordinate; dist->t = card->time_stamp; dist->x = card->p_reader->ant[card->antenna_id]->antenna_x; dist->y = card->p_reader->ant[card->antenna_id]->antenna_y; dist->z = card->p_reader->ant[card->antenna_id]->antenna_z; dist->a = card->p_reader->ant[card->antenna_id]->antenna_angle; dist->reader_id = card->p_reader->reader_id; dist->antenna_id = card->antenna_id; dist->d = card->distance; dist->v = 0; dist->d_offset = 0; dist->special = card->p_reader->m_nIsSpecial; dist->st = card->sync_num; dist->acce_state = card->accelerate_state; unsigned short root_sync_num = 0; bool bUseAlgo = false; if(umpRootSyncNum.size() > 0){ root_sync_num = umpRootSyncNum.begin()->second; // 单root可行,多root还要处理 if(root_sync_num >= dist->st){ if(root_sync_num - dist->st <= 5){ bUseAlgo = true; } }else{ if(dist->st - root_sync_num >= 65530){ bUseAlgo = true; } } } if(card->p_reader->sync_level == 0){ bUseAlgo = true; } if(bUseAlgo){ HostServer::TagMsg tagMsg; tagMsg.ReceiveTime = card->flying_time; tagMsg.StationIdCode = HostServer::SyncHelper::parseId((unsigned long long)card->reader_id, (unsigned long long)(card->antenna_id + 1)); tagMsg.SyncNum = card->sync_num; if(card->p_reader->sync_level == 0){ dist->tt = card->flying_time; }else{ dist->tt = syncmanager.calTimeByLinar(tagMsg); } EnterCriticalSection(&m_csAddDist); card->is_deal_by_algo = false; card->add_dist(dist); LeaveCriticalSection(&m_csAddDist); } if(m_log_locate_data){ CString strLog = _T(""); wchar_t* p_card_id = CFunctions::c2wc(card->card_id.c_str()); strLog.Format(_T("r: %d-%d, t: %d, l:%d, tt: %I64u, ft: %I64u, x1: %f, y1: %f, z1: %f, ct: %d, cardid:%s"), dist->reader_id, dist->antenna_id + 1, dist->st, card->p_reader->sync_level, dist->tt, card->flying_time, dist->x, dist->y, dist->z, dist->t, p_card_id/*CFunctions::c2wc(card->card_id.c_str())*/); writeErrorLog(_T("DIST_S"), strLog, true); //strLog = _T(""); strLog.ReleaseBuffer(strLog.GetLength()); strLog.Empty(); //此处和save_card_msg消息存在不一致 if(card->x != card->last_x || card->y != card->last_y){ card->last_x = card->x; card->last_y = card->y; card->last_z = card->z; strLog.Format(_T("cardid:%s, cx: %f, cy: %f, cz: %f, clx: %f, cly: %f, v: %f, ct: %d"), p_card_id /*CFunctions::c2wc(card->card_id.c_str())*/, card->x, card->y, card->z, card->last_locate.x, card->last_locate.y, card->v, card->time_stamp_cal); writeErrorLog(_T("DIST_S"), strLog, false); strLog.Empty(); strLog = _T(""); strLog.Format(_T("%d,%f,%f,%f,%f,f: %f,s: %f,ct: %d, ov: %f,cv: %f,av: %f, lsn: %d,cardid: %s"),card->m_nCalcSyncNum,card->origin_locate.x,card->origin_locate.y,card->x, card->y,card->m_dFirstDiff,card->m_dSecondDiff,card->time_stamp_cal,card->origin_locate.v,card->v,card->last_locate.acceleration,card->m_nSyncNumInList,p_card_id); writeErrorLog(_T("KALMAN_S"),strLog,false); }else{ if(card->is_deal_by_algo){ strLog = _T(""); strLog.Format(_T("%d,%f,%f,%f,%f,f: %f,s: %f,ct: %d, ov: %f,cv: %f,av: %f, lsn: %d,cardid: %s"),card->m_nCalcSyncNum,card->origin_locate.x,card->origin_locate.y,card->x, card->y,card->m_dFirstDiff,card->m_dSecondDiff,card->time_stamp_cal,card->origin_locate.v,card->v,card->last_locate.acceleration,card->m_nSyncNumInList,p_card_id); writeErrorLog(_T("KALMAN_S"),strLog,false); card->is_deal_by_algo = false; } } if(p_card_id){ free(p_card_id); p_card_id = NULL; } } } } if(LT_READER == theApp.locate_type){ //TRACE(_T("time memcpy 1\n")); time_t cur_time = time(NULL); time_t c_time = CFunctions::systime_to_timet(card->deal_time); //if(difftime(cur_time, card->deal_time) <30){ if(difftime(cur_time, c_time) <30){ return ; } } //TRACE(_T("time memcpy 2\n")); //card->deal_time = time(NULL); GetSystemTime(&card->deal_time); dw = ::GetTickCount(); save_card_postion(card); card_enter_map(card); // 切换地图 card_enter_area(card); //, card->deal_time); deal_card_state(card); card->isdealed = true; if(LT_READER != theApp.locate_type){ card->issent = false; } } afx_msg LRESULT CYAServerDlg::OnCardAddDist(WPARAM wParam, LPARAM lParam) { Card* card = (Card*)lParam; _coordinate* dist = (_coordinate*)wParam; HostServer::TagMsg tagMsg; tagMsg.ReceiveTime = card->flying_time; tagMsg.StationIdCode = HostServer::SyncHelper::parseId((unsigned long long)card->reader_id, (unsigned long long)(card->antenna_id + 1)); tagMsg.SyncNum = card->sync_num; if(card->p_reader->sync_level == 0){ dist->tt = card->flying_time; }else{ dist->tt = syncmanager.calTimeByLinar(tagMsg); } card->add_dist(dist); if(m_log_locate_data){ CString strLog = _T(""); wchar_t* p_card_id = CFunctions::c2wc(card->card_id.c_str()); if(card->x != card->last_x || card->y != card->last_y){ card->last_x = card->x; card->last_y = card->y; card->last_z = card->z; strLog.Format(_T("cardid:%s, cx: %f, cy: %f, cz: %f, clx: %f, cly: %f"), p_card_id/*CFunctions::c2wc(card->card_id.c_str())*/, card->x, card->y, card->z, card->last_x, card->last_y); writeErrorLog(_T("DIST_S"), strLog, false); //strLog = _T(""); strLog.Empty(); } strLog.Format(_T("r: %d-%d, t: %d, l:%d, tt: %I64u, ft: %I64u, x1: %f, y1: %f, z1: %f, ct: %d, cardid:%s"), dist->reader_id, dist->antenna_id + 1, card->sync_num, card->p_reader->sync_level, dist->tt, card->flying_time, dist->x, dist->y, dist->z,card->time_stamp, p_card_id /*CFunctions::c2wc(card->card_id.c_str())*/); writeErrorLog(_T("DIST_S"), strLog, true); //strLog = _T(""); strLog.Empty(); if(p_card_id){ free(p_card_id); p_card_id = NULL; } } return 0; } afx_msg LRESULT CYAServerDlg::OnRemoveSocket(WPARAM wParam, LPARAM lParam) { DWORD dwConnID = (DWORD)lParam; remove_socket(dwConnID); return 0; } void CYAServerDlg::writeErrorLogEx( const CString strFile, const CString strErr ,bool bTime /*= true*/ ) { EnterCriticalSection(&m_csWriteLog); if(openLogFile(strFile)){ CString strTempInfo; if(bTime){ COleDateTime t = COleDateTime::GetCurrentTime(); strTempInfo.Format(_T("%s\r\n%s\r\n"), t.Format(_T("%H:%M:%S")), strErr); }else{ strTempInfo.Format(_T("%s\r\n"), strErr); } TRY{ cfErrorLog.SeekToEnd(); char* old_locale = _strdup(setlocale(LC_CTYPE,NULL)); setlocale( LC_CTYPE, "chs" );//设定 cfErrorLog.WriteString(strTempInfo); setlocale( LC_CTYPE, old_locale ); free( old_locale );//还原区域设定 } CATCH(CFileException, e){ if(cfErrorLog.m_pStream) cfErrorLog.Close(); } END_CATCH } LeaveCriticalSection(&m_csWriteLog); } void CYAServerDlg::writeErrorLogEx( const char* strFile, const char* strErr ,bool bTime /*= true*/ ) { EnterCriticalSection(&m_csWriteLog); if(openLogFile(strFile)){ CString strTempInfo; if(bTime){ COleDateTime t = COleDateTime::GetCurrentTime(); strTempInfo.Format(_T("%s\r\n"), t.Format(_T("%H:%M:%S"))); USES_CONVERSION; CString tmp = A2T(strErr); strTempInfo += tmp + _T("\r\n"); }else{ //strTempInfo.Format(_T("%S\r\n"), strErr); USES_CONVERSION; strTempInfo = A2T(strErr); strTempInfo += _T("\r\n"); } TRY{ cfErrorLog.SeekToEnd(); char* old_locale = _strdup(setlocale(LC_CTYPE,NULL)); setlocale( LC_CTYPE, "chs" );//设定 cfErrorLog.WriteString(strTempInfo); setlocale( LC_CTYPE, old_locale ); free( old_locale );//还原区域设定 } CATCH(CFileException, e){ if(cfErrorLog.m_pStream) cfErrorLog.Close(); LeaveCriticalSection(&m_csWriteLog); } END_CATCH } LeaveCriticalSection(&m_csWriteLog); } void CYAServerDlg::init_queuestring() { m_qsmSQL = new QueueStrManager(50, 7500, _exec_sql); //m_qsmSQL = new QueueStrManager(2, 200, _exec_sql); } void CYAServerDlg::SendData( DWORD dwConnID, WORD wCharacterWord, int wLength, BYTE* DataBuffer ) { BYTE SendBuffer[LENGTH_MSG_2K]; WORD nlength = wLength + sizeof(WORD) + sizeof(WORD); //socket的数据长度 数据的长度(n) + 特征字(2) + 校验码(2) memset(SendBuffer, 0, LENGTH_MSG_2K); int nPos = 0; CFunctions::memcpyWord(SendBuffer, nlength, nPos);//长度 nPos += sizeof(WORD); CFunctions::memcpyWord(SendBuffer, wCharacterWord, nPos); nPos += sizeof(WORD); memcpy(&SendBuffer[nPos], &DataBuffer[0], wLength); nPos += wLength; WORD wCrc = CFunctions::getCRC(&SendBuffer[sizeof(WORD)], wLength + sizeof(WORD)); // 数据长度 + 特征字 CFunctions::memcpyWord(SendBuffer, wCrc, nPos); nPos += sizeof(WORD); _server.Send(dwConnID, &SendBuffer[0], nPos); Sleep(20); } void CYAServerDlg::parse_data_locate_card_his_tdoa( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime) { // 按时间分组解析 // 组长度 int nCurPos = 0; // 数据保存时间 7字节,年,月,周,日,时,分,秒 BYTE btSec = 0; memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btMin = 0; memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btHour = 0; memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btDay = 0; memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btWeek = 0; memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btMonth = 0; memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); BYTE btYear = 0; memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); CString strhistime; strhistime.Format(_T("20%.2d-%.2d-%.2d %.2d:%.2d:%.2d"), btYear%100, btMonth, btDay, btHour, btMin, btSec ); BYTE* bt = new BYTE[nLen]; while(nCurPos < nLen){ // 一组数据 // 一个数据包 WORD wPkgLen = 0; CFunctions::getWord(DataBuffer, &wPkgLen, nCurPos); nCurPos += sizeof(WORD); if(bt){ memset(bt, 0, nLen); memcpy(bt, &DataBuffer[nCurPos], wPkgLen); parse_data_locate_card_his_tdoa_package(bt, wPkgLen, reader_id, wTickCount, strTime, strhistime); } nCurPos += wPkgLen; } delete[] bt; } void CYAServerDlg::parse_data_locate_card_his_tdoa_package( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime ) { // 命令字 int nCurPos = 0; WORD wChr = 0; CFunctions::getWord(DataBuffer, &wChr, nCurPos); nCurPos += sizeof(WORD); BYTE* bt = new BYTE[LENGTH_RECORD_MAX]; if(NULL == bt){ return; } while(nCurPos < nLen){ switch (wChr) { case CHAR_LOCATEDATA: { memset(bt, 0, LENGTH_RECORD_MAX); memcpy(bt, &DataBuffer[nCurPos], LENGTH_TOF_VEHICLE); parse_data_locate_card_his_tof_card(bt, LENGTH_TOF_VEHICLE, reader_id, wTickCount, strTime, strHistTime); nCurPos += LENGTH_TOF_VEHICLE; break; } case CHAR_LOCATEDATA_TDOA: { memset(bt, 0, LENGTH_RECORD_MAX); memcpy(bt, &DataBuffer[nCurPos], LENGTH_TDOA_VEHICLE); parse_data_locate_card_his_tdoa_card(bt, LENGTH_TOF_VEHICLE, reader_id, wTickCount, strTime, strHistTime); nCurPos += LENGTH_TDOA_VEHICLE; break; } case CHAR_READER_SYNC_TIME: { memset(bt, 0, LENGTH_RECORD_MAX); memcpy(bt, &DataBuffer[nCurPos], LENGTH_SYNC_TIME); parse_data_locate_card_his_sync_time(bt, LENGTH_TOF_VEHICLE, strTime, strHistTime, CHAR_READER_SYNC_TIME); nCurPos += LENGTH_SYNC_TIME; break; } case CHAR_READER_SYNC_TIME_ROOT: { memset(bt, 0, LENGTH_RECORD_MAX); memcpy(bt, &DataBuffer[nCurPos], LENGTH_SYNC_TIME_ROOT); parse_data_locate_card_his_sync_time(bt, LENGTH_TOF_VEHICLE, strTime, strHistTime, CHAR_READER_SYNC_TIME_ROOT); nCurPos += LENGTH_SYNC_TIME; break; } default: break; } } delete[] bt; } void CYAServerDlg::parse_data_locate_card_his_tof_card( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime ) { int nCurPos = 0; BYTE btCardType = 0; memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwCardId = 0; CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos); nCurPos += sizeof(DWORD); string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10); char sql[LENGTH_SQL] = {0}; bool b_exec = false; switch(btCardType) { case CT_VEHICLE: { //报文时间 WORD wCardTickCount = 0; CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos); nCurPos += sizeof(WORD); BYTE btTypeAndPower = 0; memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //报文类型 BYTE btType = 0; btType = (btTypeAndPower >>4) & 0x0F; //电池电量 BYTE btPower = 0; btPower = btTypeAndPower & 0x0F; //保留 nCurPos += sizeof(BYTE); //加速度 BYTE btAcceleration = 0; memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //定位时间戳Tsp // 字序 LONG64 lTime1 = 0; BYTE btTemp = 0; int nRangingPos = nCurPos; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwTemp = 0; CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime1 = btTemp; lTime1 = lTime1 << 32; lTime1 |= dwTemp; double dbldist = CFunctions::getDistance(lTime1); BYTE btAntenna = 0; memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); btAntenna = btAntenna & 0xFF; b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_raw_data(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \ fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time ) \ VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s');", str_card_id.c_str(), reader_id, btAntenna, wTickCount, wCardTickCount, lTime1, dbldist, btType, btPower,btAcceleration, CFunctions::wc2c(strHistTime), CFunctions::wc2c(strTime)); //if(CHAR_LOCATEDATAHIS_TDOA == wChr ){ // // 分站时间同步序列号 // WORD wSyncNum = 0; // CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos); // nCurPos += sizeof(WORD); // // 信号强度 // WORD wStrength = 0; // CFunctions::getWord(DataBuffer, &wStrength, nCurPos); // nCurPos += sizeof(WORD); //} break; } case CT_PERSON: { break; } default: { break; } } try { if(b_exec){ execute_sql(sql); } } catch (...) { CString str; wchar_t* p = CFunctions::c2wc(sql); str.Format(_T("%s\n"), p); writeErrorLog(_T("SQL_S"), str); str.Empty(); if(p){ free(p); p = NULL; } } } void CYAServerDlg::parse_data_locate_card_his_tdoa_card( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime ) { int nCurPos = 0; BYTE btCardType = 0; memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwCardId = 0; CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos); nCurPos += sizeof(DWORD); string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10); char sql[LENGTH_SQL] = {0}; bool b_exec = false; switch(btCardType) { case CT_VEHICLE: { //报文时间 WORD wCardTickCount = 0; CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos); nCurPos += sizeof(WORD); BYTE btTypeAndPower = 0; memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //报文类型 BYTE btType = 0; btType = (btTypeAndPower >>4) & 0x0F; //电池电量 BYTE btPower = 0; btPower = btTypeAndPower & 0x0F; //保留 nCurPos += sizeof(BYTE); //加速度 BYTE btAcceleration = 0; memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); //定位时间戳Tsp // 字序 LONG64 lTime1 = 0; BYTE btTemp = 0; int nRangingPos = nCurPos; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwTemp = 0; CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime1 = btTemp; lTime1 = lTime1 << 32; lTime1 |= dwTemp; double dbldist = 0; BYTE btAntenna = 0; memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); btAntenna = btAntenna & 0xFF; // 分站时间同步序列号 WORD wSyncNum = 0; CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos); nCurPos += sizeof(WORD); // 信号强度 WORD wStrength = 0; CFunctions::getWord(DataBuffer, &wStrength, nCurPos); nCurPos += sizeof(WORD); double dblaccx, dblaccy, dblaccz; dblaccx = dblaccy = dblaccz = 0; b_exec = true; sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_raw_data_tdoa(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \ fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time, sync_num, strength, acc_x, acc_y, acc_z) \ VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s', %d, %d, %4.f, %4.f, %4.f);", str_card_id.c_str(), reader_id, btAntenna, wTickCount, wCardTickCount, lTime1, dbldist, btType, btPower,btAcceleration, CFunctions::wc2c(strHistTime), CFunctions::wc2c(strTime), wSyncNum, wStrength, dblaccx, dblaccy, dblaccz); break; } case CT_PERSON: { break; } default: { break; } } try { if(b_exec){ execute_sql(sql); } } catch (...) { CString str; wchar_t* p = CFunctions::c2wc(sql); str.Format(_T("%s\n"), p); writeErrorLog(_T("SQL_S"), str); str.Empty(); if(p){ free(p); p = NULL; } } } void CYAServerDlg::parse_data_locate_card_his_sync_time( BYTE* DataBuffer, int nLen, CString strTime, CString strHistTime, WORD wChr ) { char sql[LENGTH_SQL] = {0}; bool b_exec = false; int nCurPos = 0; DWORD dwReaderID = 0; // 本机分站号 CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos); nCurPos += sizeof(DWORD); BYTE btAnt = 0; // 本机发送天线 memcpy(&btAnt, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwUpperReaderID = 0; // root分站号 CFunctions::getDWord(DataBuffer, &dwUpperReaderID, nCurPos); nCurPos += sizeof(DWORD); BYTE btUpperAnt = 0; // root天线 memcpy(&btUpperAnt, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); WORD wSyncNum = 0; // 序列号 CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos); nCurPos += sizeof(WORD); WORD wSyncLevel = 0; // 同步等级 CFunctions::getWord(DataBuffer, &wSyncLevel, nCurPos); nCurPos += sizeof(WORD); LONG64 lTime1 = 0, lTime2 = 0; BYTE btTemp = 0; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); DWORD dwTemp = 0; CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime1 = btTemp; // 本机发送时间戳 lTime1 = lTime1 << 32; lTime1 |= dwTemp; btTemp = 0; dwTemp = 0; memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos); nCurPos += sizeof(DWORD); lTime2 = btTemp; // 本机接收时间戳 lTime2 = lTime2 << 32; lTime2 |= dwTemp; DWORD dwRootReaderID = 0; // root分站号 BYTE btRootAnt = 0; // root天线 if(CHAR_READER_SYNC_TIME_ROOT == wChr){ CFunctions::getDWord(DataBuffer, &dwRootReaderID, nCurPos); nCurPos += sizeof(DWORD); memcpy(&btRootAnt, &DataBuffer[nCurPos], sizeof(BYTE)); nCurPos += sizeof(BYTE); } sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_raw_data_tdoa(reader_id, ant_id, parent_reader_id, parent_ant_id, sync_num, sync_level,\ send_timestamp, rec_timestamp, his_time, rec_time, root_reader_id, root_ant_id) \ VALUES(%d, %d, %d, %d, %d, %d, %lld, %lld, '%s', '%s', %d, %d);", dwReaderID, btAnt, dwUpperReaderID, btUpperAnt , wSyncNum, wSyncLevel, lTime1, lTime2, CFunctions::wc2c(strHistTime), CFunctions::wc2c(strTime), dwRootReaderID, btRootAnt); try { execute_sql(sql); } catch (...) { CString str; wchar_t* p = CFunctions::c2wc(sql); str.Format(_T("%s\n"), p); writeErrorLog(_T("SQL_S"), str); str.Empty(); if(p){ free(p); p = NULL; } } } void CYAServerDlg::OnEnUpdateEditReaderid() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); } void CYAServerDlg::parse_json_data_call_card_cancel(message::ptr const& data ) { EnterCriticalSection(&m_csCallInfo); CString strlog; string call_id, user_name, call_time; string cardid, readerid; int call_time_out, reader_count, card_count; map data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map(); /*if(m_log_recv_package){ string s_log = ""; AfxMessageBox(CFunctions::c2wc(s_log.c_str())); writeErrorLog(_T("JSON_R"),CFunctions::c2wc(s_log.c_str()),false); } */ call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string(); user_name = data_map[JSON_KEY_CALL_CARD_USER_NAME]->get_string(); call_time = data_map[JSON_KEY_CALL_CARD_CALL_TIME]->get_string(); vector reader_vec = data_map[JSON_KEY_CALL_CARD_STATIONS]->get_vector(); vector card_vec = data_map[JSON_KEY_CALL_CARD_CARDS]->get_vector(); if(reader_vec.size() == 0 && card_vec.size() == 0) { return; } int reader_id, npos; SocketMap::iterator it_sock; BYTE buf[LENGTH_SEND_BUF]; _call_info_reader* call_reader; _call_info_card* call_card; //取消呼叫有两种: //从分站取消呼叫,即取消全员呼叫 //对指定卡取消呼叫 vector::const_iterator it_reader = reader_vec.begin(); if(reader_vec.size() > 0){ for(; it_reader != reader_vec.end(); ++it_reader){ string s_reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_string(); reader_id = atoi(s_reader_id.c_str()); CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id); if(it_call_reader != mp_call_info.end()){ call_reader = it_call_reader->second; call_reader->is_start_call = false; call_reader->is_call_all = false; vector::const_iterator it_card = card_vec.begin(); if(card_vec.size() == 0 || "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){ if(call_reader->cards_count){ CallInfoCardMap::iterator it_reader_card = call_reader->mpCard.begin(); for(; it_reader_card != call_reader->mpCard.end();){ call_reader->mpCard.erase(++it_reader_card); } } call_reader->mpCard.clear(); mp_call_info.erase(it_call_reader); call_reader->cards_count = 0; }else{ BYTE card_type = 0; for(; it_card != card_vec.end(); ++it_card){ string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string(); string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string(); CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id); if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表 call_reader->mpCard.erase(it_call_card); } } if(call_reader->mpCard.size() == 0){ call_reader->mpCard.clear(); mp_call_info.erase(it_call_reader); } } call_reader->cards_count = 0; } } } it_reader = reader_vec.begin(); if(it_reader == reader_vec.end() && card_vec.size() > 0){ vector::const_iterator it_card = card_vec.begin(); BYTE card_type = 0; for(; it_card != card_vec.end(); ++it_card){ string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string(); string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string(); int reader_id = mp_card_list_down_adhoc.find(s_card_id)->second->reader_id; call_reader = mp_call_info.find(reader_id)->second; call_reader->is_start_call = false; CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id); if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表 call_reader->mpCard.erase(it_call_card); } } } LeaveCriticalSection(&m_csCallInfo); strlog.Format(_T("%s%s"), _T(LOG_CANCEL_CALL_CARD), _T(LOG_SUCCESS)); show_log(strlog); } void CYAServerDlg::OnAbout() { // TODO: 在此添加命令处理程序代码 CAboutDlg dlg; dlg.DoModal(); }