YAServerDlg.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. // YAServerDlg.h : 头文件
  2. //
  3. #pragma once
  4. #include "afxwin.h"
  5. #include "resource.h"
  6. #include "structdef.h"
  7. #include "constdef.h"
  8. #include "def_msg.h"
  9. #include "socketdef.h"
  10. #include "ReportCtrl/ReportCtrl.h"
  11. #include <sio_client.h>
  12. #include "../thirdparty/include/iocp/Src/TcpServer.h"
  13. #include "../thirdparty/include/iocp/Global/helper.h"
  14. #include "afxcmn.h"
  15. #include "./SyncTime/SyncManager.h"
  16. #include "classdef.h"
  17. #include "QueueStrManager.h"
  18. using namespace sio;
  19. using namespace std;
  20. using namespace HostServer;
  21. struct _SLS // system_limit_setting
  22. {
  23. unsigned int over_count_person;
  24. unsigned int over_count_vehicle;
  25. unsigned int over_time_person;
  26. unsigned int over_time_vehicle;
  27. double over_speed;
  28. };
  29. struct _DBS // db setting
  30. {
  31. string host;
  32. string user;
  33. string password;
  34. string dbname;
  35. string encoding;
  36. int port;
  37. };
  38. struct _SOCK
  39. {
  40. CString sip;
  41. DWORD dwConnID;
  42. int state; // 0 连接
  43. DWORD reader_id; // 分站号
  44. };
  45. struct _SOCKET_BUFFER
  46. {
  47. DWORD dwConnID;
  48. BYTE pData[LENGTH_MSG_1M];
  49. WORD wLen;
  50. WORD wReadLen;
  51. };
  52. // CYAServerDlg 对话框
  53. class CYAServerDlg : public CDialogEx, public CTcpServerListener
  54. {
  55. typedef map<string, Card*> CardMap;
  56. typedef map<CString, _SOCK*> SocketMap;
  57. typedef map<DWORD, _SOCKET_BUFFER*> SocketBufferMap;
  58. struct LogMsg
  59. {
  60. CString strFile;
  61. CString strLog;
  62. bool isNeedTime;
  63. };
  64. struct DataMsg
  65. {
  66. CONNID dwConnID;
  67. int iLength;
  68. BYTE* pData;
  69. };
  70. // 构造
  71. public:
  72. CYAServerDlg(CWnd* pParent = NULL); // 标准构造函数
  73. ~CYAServerDlg();
  74. // 对话框数据
  75. enum { IDD = IDD_YASERVER_DIALOG };
  76. protected:
  77. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  78. private:
  79. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
  80. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, SOCKET soClient);
  81. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  82. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  83. virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
  84. virtual EnHandleResult OnShutdown(ITcpServer* pSender);
  85. // 实现
  86. protected:
  87. HICON m_hIcon;
  88. // 生成的消息映射函数
  89. virtual BOOL OnInitDialog();
  90. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  91. afx_msg void OnPaint();
  92. afx_msg HCURSOR OnQueryDragIcon();
  93. DECLARE_MESSAGE_MAP()
  94. public:
  95. CButton m_btStart;
  96. CButton m_btStop;
  97. CMenu m_mnMain;
  98. afx_msg LRESULT on_monitor(WPARAM wParam, LPARAM lParam);
  99. afx_msg void OnBnStop();
  100. afx_msg void OnBnStart();
  101. afx_msg void OnBnExit();
  102. afx_msg void OnBnSyncTime();
  103. afx_msg void OnMenuDb();
  104. afx_msg void OnMenuLog();
  105. afx_msg void OnMenuParam();
  106. afx_msg void OnBnCallHisData();
  107. public:
  108. // ui operation
  109. CTcpServer _server;
  110. HostServer::SyncManager syncmanager;
  111. EnAppState m_enState;
  112. CStdioFile cfErrorLog;
  113. CRITICAL_SECTION m_csWriteLog;
  114. CRITICAL_SECTION m_csRemoveSocket;
  115. CRITICAL_SECTION m_csRefreshList;
  116. CRITICAL_SECTION m_csParseDataServer;
  117. CRITICAL_SECTION m_csSyncTime;
  118. CRITICAL_SECTION m_csAddDist;
  119. CRITICAL_SECTION m_csCallInfo;
  120. QueueStrManager* m_qsmSQL;
  121. bool is_start_tcp;
  122. void set_app_state(EnAppState eas);
  123. void start_tcp_server();
  124. void stop_tcp_server();
  125. public:
  126. CString m_strConncetion; // 数据库连接字符串
  127. int m_nPort; // 启动端口
  128. int m_nCountClick;
  129. CWinThread* m_thread_monitor; // 与监控程序通信线程
  130. CWinThread* m_thread_timer; // timer的线程,脱离UI线程,不使用ontimer
  131. unsigned int m_uint_state; // 采集状态
  132. // bit 0, 服务状态,运行或者关闭
  133. // bit 1, 采集状态,正常或异常
  134. // bit 2, 分站状态,有中断或没有
  135. // bit 3, websocket状态,连接未连接
  136. // bit 4, 数据库状态,连接未连接
  137. time_t m_time_last_rec; // 最后接收到分站数据的时间
  138. bool is_websocket_ok; //
  139. bool is_websocket_login;
  140. bool is_server_ok; //
  141. bool is_database_ok; //
  142. BOOL m_bUseFilter;
  143. int m_nFilterType;
  144. int m_nMallocTimes;
  145. BOOL m_log_sys_status;
  146. BOOL m_log_raw_data;
  147. BOOL m_log_parse_data;
  148. BOOL m_log_send_package;
  149. BOOL m_log_recv_package;
  150. BOOL m_log_locate_data;
  151. time_t time_over_count_vehicle;
  152. time_t time_over_count_person;
  153. BOOL m_bListen;
  154. SocketMap mp_socket_list;
  155. SocketBufferMap mp_socket_buffer_list;
  156. CardMap mp_card_list_all; // 所有卡
  157. ReaderMap mp_reader_list; // 所有分站
  158. AreaMap mp_area_list; // 所有区域
  159. MapInfoMap mp_map_list; // 所有地图
  160. DeptMap mp_dept_list; // 所有部门
  161. AlarmTypeMap mp_alarm_type_list;
  162. ReaderPathMap mp_reader_path_list; //当前地图的所有分站的覆盖范围
  163. TDOAReaderPathMap mp_reader_path_list_tdoa;
  164. CardMap mp_card_list_down_vehicle; // 井下车辆
  165. CardMap mp_card_list_down_person; // 井下人员
  166. CardMap mp_card_list_down_adhoc; //井下自组网卡
  167. CardMap mp_card_list_over_time_person; //
  168. CardMap mp_card_list_forbidden_person;
  169. CardMap mp_card_list_help;
  170. CardMap mp_card_list_area_over_time_person;
  171. CardMap mp_card_list_forbidden_vehicle;
  172. CardMap mp_card_list_over_time_vehicle;
  173. CardMap mp_card_list_over_speed_vehicle;
  174. CardMap mp_card_list_area_over_time_vehicle;
  175. AreaMap mp_area_over_count_person;
  176. AreaMap mp_area_over_time_person;
  177. AreaMap mp_area_forbidden_person;
  178. AreaMap mp_area_over_count_vehicle;
  179. AreaMap mp_area_over_time_vehicle;
  180. AreaMap mp_area_forbidden_vehicle;
  181. unordered_map<DWORD, WORD> umpRootSyncNum;
  182. CallInfoReaderMap mp_call_info;
  183. _SLS sls_setting;
  184. _DBS m_db_setting;
  185. string m_ws_url;
  186. CString m_tcp_host;
  187. double m_reader_interval_time;
  188. public:
  189. void init_ui();
  190. void init_param();
  191. void init_queuestring();
  192. void load_param_from_ini();
  193. void database_connect();
  194. void stop_and_exit();
  195. void set_run_state();
  196. // 从数据库中初始化数据
  197. void init_base_data();
  198. int init_setting(); // 系统配置
  199. int init_alarm_type(); // 报警类型
  200. int init_dept(); // 部门列表
  201. int init_card(string card_id = "");
  202. int init_staffer(string staff_id = "", bool is_card = false); // 人员
  203. int init_vehicle(string vehicle_id = "", bool is_card = false); // 车辆
  204. int init_adhoc(string adhoc_id = "",bool is_card = false); // 自组网卡
  205. int init_map(int map_id = 0); // 地图
  206. int init_area(int area_id = 0); // 区域
  207. int init_reader(int reader_id = 0); // 分站
  208. int init_antenna(int reader_id = 0); // 天线
  209. int init_dev_adhoc(int reader_id = 0); // 自组网坐标
  210. int init_antenna_sync();
  211. int init_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  212. int init_tdoa_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  213. int get_help_card_nums();
  214. // 载入历史数据
  215. void load_his_data();
  216. void load_his_down(); // 入井状态
  217. void load_his_area(); // 所在区域
  218. void load_his_reader(); // 分站状态
  219. void load_his_card_postion(); // 所在位置
  220. void load_his_card_state();
  221. // 载入报警数据
  222. void load_alarm_reader();
  223. //void load_alarm_area();
  224. //void load_alarm_mine();
  225. // 接口数据解析
  226. void parse_edit_map(int map_id);
  227. void parse_edit_area(int area_id);
  228. void parse_edit_reader(int reader_id);
  229. void parse_edit_card(string card_id);
  230. void parse_edit_staffer(string staffer_id);
  231. void parse_edit_vehicle(string vehicle_id);
  232. void parse_edit_path(int path_id);
  233. void parse_set_limit_value();
  234. void parse_call_card();
  235. void parse_clear_card();
  236. void parse_deal_help();
  237. // 初始化websocket
  238. void ws_init();
  239. void ws_open();
  240. void ws_close();
  241. void ws_login();
  242. void ws_logout();
  243. void clear_listener();
  244. void clear_all_list();
  245. // socket接收数据
  246. void parse_data_server(const BYTE * pData, int nLen, DWORD dwConnId); // 处理服务器端粘包
  247. void parse_data(BYTE *pData, int nLen, DWORD dwConnID);
  248. void parse_data_receive_package(BYTE *pData, int nLen, DWORD dwConnID); // 处理大数据包粘包
  249. void parse_data_receive(BYTE *pData, int nLen, DWORD dwConnID);
  250. void parse_package_data(BYTE* DataBuffer, int nLen, DWORD dwConnID); // 处理客户端粘包
  251. // 解析定位数据
  252. void parse_data_locate_reader(BYTE * DataBuffer, int& nCurPos, int nLen, DWORD dwConnID, int& reader_id);
  253. void parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr);
  254. void parse_data_locate_card_vehicle(BYTE* DataBuffer, int& nCurPos, Card* card, unsigned short wChr);
  255. void parse_data_locate_reader_his(BYTE * DataBuffer, int nLen, int& nCurPos, int& reader_id, int& nTick, CString& strtime, unsigned short wChr);
  256. void parse_data_locate_card_his(BYTE* DataBuffer, int& nCurPos, int reader_id, DWORD wTickCount, CString strTime, unsigned short wChr);
  257. void parse_data_locate_card_his_tdoa(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime);
  258. void parse_data_locate_card_his_tdoa_package(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  259. void parse_data_locate_card_his_tof_card(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  260. void parse_data_locate_card_his_tdoa_card(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  261. void parse_data_locate_card_his_sync_time(BYTE* DataBuffer, int nLen, CString strTime, CString strHistTime);
  262. // 解析自组网数据
  263. void parse_data_adhoc(BYTE* DataBuffer, int& nCurPos, int reader_id);
  264. // 解析分站时间同步
  265. void parse_data_reader_synctime(BYTE *DataBuffer, int nLen, int& nCurPos);
  266. _SOCK* get_socket_by_count(DWORD dwConnID);
  267. void add_socket_to_list(DWORD dwConnID, DWORD reader_id);
  268. void remove_socket(DWORD dwConnID);
  269. // 发送数据
  270. void SendData(DWORD dwConnID, WORD wCharacterWord, int wLength, BYTE* DataBuffer);
  271. // 获取json串
  272. string get_json_login();
  273. string get_json_logout();
  274. //string get_json_down_mine();
  275. //string get_json_up_mine();
  276. string get_json_down_and_up(Card* card);
  277. string get_json_counting();
  278. string get_json_position();
  279. string get_json_position_all();
  280. string get_json_device_state();
  281. string get_json_alarm();
  282. string get_json_call_test();
  283. string get_json_help(); //求救json
  284. // string get_json_postion_test();
  285. // void send_json_data(string url, string cmd, string data, string ver, string user);
  286. void send_json_data(string cmd, string data, bool is_login = false);
  287. // 业务处理
  288. void deal_readers();
  289. void deal_areas();
  290. void deal_card_msg(Card* card, bool is_hist = false);
  291. void deal_hist_card_postion();
  292. void deal_hist_card_alarm();
  293. void deal_hist_area();
  294. void card_enter_mine(Card* card);
  295. void card_down_mine(Card* card);
  296. void card_up_mine(Card* card);
  297. void card_enter_park(Card* card);
  298. void card_enter_map(Card* card);
  299. void card_enter_area(Card* card);
  300. void card_leave_area(Card* card, Area* area);
  301. void deal_card_state(Card* card);
  302. void deal_alarm_card(Card* card, CardMap* dest_card_list, bool is_alarm, ALARM_FLAG tag);
  303. void deal_alarm_area(Area* area, AreaMap* dest_area_list, bool is_alarm, ALARM_FLAG tag);
  304. void reset_map_card();
  305. //void reset_area_card();
  306. bool is_in_rectangle(_point p, double dblleft, double dbltop, double dblright, double dblbottom);
  307. bool is_in_circle(_point p1, _point p2, double r, double scale);
  308. // save to database
  309. void execute_sql(const char* sql); // 保存到数据库
  310. void save_card_postion(Card* card);
  311. void store_data_card(Card* card, int tag);
  312. void store_data_area(Area* area, time_t cur_time, time_t start_time, int tag);
  313. void store_data_reader(Reader* reader, int tag);
  314. void store_data_mine(int tag);
  315. //void store_data_system();
  316. // 打包数据
  317. void package_data();
  318. void package_data_test();
  319. // 通用方法
  320. int API_TimeToString(string &strDateStr,const time_t &timeData);
  321. int API_StringToTime(const string &strDateStr,time_t &timeData);
  322. void formatByteArray(CString &strBuf, BYTE * buf, int nLen);
  323. void writeErrorLog(const CString strFile, const CString strErr ,bool bTime = true);
  324. void writeErrorLogEx(const CString strFile, const CString strErr ,bool bTime = true);
  325. void writeErrorLogEx(const char* strFile, const char* strErr ,bool bTime = true);
  326. BOOL openLogFile(const CString strFile);
  327. BOOL openLogFile(const char* strFile);
  328. void show_log( LPCTSTR szlog, BOOL bSave = true);
  329. void AddItem(CString strvalue, int readerid, BOOL is_closed = false);
  330. // 响应接口
  331. void parse_json_data_set_limit_value(const char* sz);
  332. void parse_json_data_call_card_cancel(message::ptr const& data);
  333. void parse_json_data_call_card(message::ptr const& data);//(const char* sz);
  334. void parse_json_data_clear_card(const char* sz);
  335. void parse_json_data_deal_help(const char* sz);
  336. //void parse_json_data_edit_map(const char* sz);
  337. //void parse_json_data_edit_area(const char* sz);
  338. //void parse_json_data_edit_reader(const char* sz);
  339. ////void parse_json_data_edit_path(const char* sz);
  340. //void parse_json_data_edit_card(const char* sz);
  341. //void parse_json_data_edit_staffer(const char* sz);
  342. //void parse_json_data_edit_vehicle(const char* sz);
  343. void deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id);
  344. void deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id);
  345. void deal_call_edit_reader(int id, EDIT_TYPE_ID edit_type_id);
  346. void deal_call_edit_card(string id, EDIT_TYPE_ID edit_type_id);
  347. void deal_call_edit_staff(string id, EDIT_TYPE_ID edit_type_id);
  348. void deal_call_edit_vehicle(string id, EDIT_TYPE_ID edit_type_id);
  349. void deal_call_edit_adhoc(string id, EDIT_TYPE_ID edit_type_id);
  350. void remove_card(string card_id);
  351. void send_call_info();
  352. void send_call_his_data();
  353. void send_sync_reader();
  354. void clear_call_info();
  355. int get_card_id_len(int card_type);
  356. void release_memory();
  357. void release_area_memory();
  358. void release_map_memory();
  359. void release_card_memory();
  360. void release_reader_memory();
  361. void release_dept_memory();
  362. void Test();
  363. public:
  364. std::unique_ptr<client> _io;
  365. CListBox m_list_log;
  366. CReportCtrl m_listctrl_reader;
  367. void OnPushMessage();
  368. void OnCallMessage(string const& name, message::ptr const& data, bool isAck,message::list &ack_resp);
  369. //void OnCallMessage(string const& name, message::ptr const& data, bool isAck = false,message::list &ack_resp = nullptr);
  370. void OnLoginCallBack(message::list const& msglist = nullptr);
  371. void OnLogin(string const& name, message::ptr const& data, bool isAck, message::list &ack_resp);
  372. void OnConnected();
  373. void OnClosed(client::close_reason const& reason);
  374. void OnFailed();
  375. protected:
  376. afx_msg LRESULT OnRemoveSocket(WPARAM wParam, LPARAM lParam);
  377. afx_msg LRESULT OnMsgRefreshIpList(WPARAM wParam, LPARAM lParam);
  378. afx_msg LRESULT OnWriteErrorLog(WPARAM wParam, LPARAM lParam);
  379. afx_msg LRESULT OnCardAddDist(WPARAM wParam, LPARAM lParam);
  380. public:
  381. UINT m_reader_id_hist;
  382. afx_msg void OnEnUpdateEditReaderid();
  383. afx_msg void OnAbout();
  384. };