SimulatorDlg.cpp 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516
  1. 
  2. // SimulatorDlg.cpp: 实现文件
  3. //
  4. #include "stdafx.h"
  5. #include "Simulator.h"
  6. #include "SimulatorDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // CSimulatorDlg 对话框
  11. //#define JHD_DISCONNECTED WM_USER + 1
  12. typedef struct
  13. {
  14. CSimulatorDlg* pThis;
  15. LPVOID pBuf;
  16. DWORD nLen;
  17. }ThreadData, * PThreadData;
  18. CSimulatorDlg::CSimulatorDlg(CWnd* pParent /*=nullptr*/)
  19. : CDialogEx(IDD_SIMULATOR_DIALOG, pParent)
  20. {
  21. m_pDlgRecord = NULL;
  22. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  23. }
  24. void CSimulatorDlg::DoDataExchange(CDataExchange* pDX)
  25. {
  26. CDialogEx::DoDataExchange(pDX);
  27. DDX_Control(pDX, IDC_LIST_CLIENTS, m_lstClients);
  28. DDX_Control(pDX, IDC_LIST_EQP, m_lstEqps);
  29. DDX_Control(pDX, IDC_DATETIMEPICKER_START, m_dtBegin);
  30. DDX_Control(pDX, IDC_DATETIMEPICKER_END, m_dtEnd);
  31. }
  32. BEGIN_MESSAGE_MAP(CSimulatorDlg, CDialogEx)
  33. ON_WM_PAINT()
  34. ON_WM_QUERYDRAGICON()
  35. //ON_MESSAGE(JHD_DISCONNECTED, &CSimulatorDlg::OnJhdDisconnect)
  36. ON_BN_CLICKED(IDC_BUTTON_LISTEN, &CSimulatorDlg::OnBnClickedButtonListen)
  37. ON_BN_CLICKED(IDC_BUTTON_GAPCFG, &CSimulatorDlg::OnBnClickedButtonGapcfg)
  38. ON_BN_CLICKED(IDC_BUTTON_NEWVALUE, &CSimulatorDlg::OnBnClickedButtonNewvalue)
  39. ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_CLIENTS, &CSimulatorDlg::OnLvnItemchangedListClients)
  40. ON_BN_CLICKED(IDC_CHECK_ALL_ALARM, &CSimulatorDlg::OnBnClickedCheckAllAlarm)
  41. ON_BN_CLICKED(IDC_BUTTON_ALARM, &CSimulatorDlg::OnBnClickedButtonAlarm)
  42. ON_BN_CLICKED(IDC_BUTTON_0x55, &CSimulatorDlg::OnBnClickedButton0x55)
  43. ON_BN_CLICKED(IDC_BUTTON_0x56, &CSimulatorDlg::OnBnClickedButton0x56)
  44. ON_BN_CLICKED(IDC_BUTTON_0x57, &CSimulatorDlg::OnBnClickedButton0x57)
  45. ON_BN_CLICKED(IDC_BUTTON_RECORD, &CSimulatorDlg::OnBnClickedButtonRecord)
  46. ON_BN_CLICKED(IDC_BUTTON_PARSE, &CSimulatorDlg::OnBnClickedButtonParse)
  47. END_MESSAGE_MAP()
  48. // CSimulatorDlg 消息处理程序
  49. BOOL CSimulatorDlg::OnInitDialog()
  50. {
  51. CDialogEx::OnInitDialog();
  52. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
  53. // 执行此操作
  54. SetIcon(m_hIcon, TRUE); // 设置大图标
  55. SetIcon(m_hIcon, FALSE); // 设置小图标
  56. //ShowWindow(SW_MAXIMIZE);
  57. SetDlgItemInt(IDC_EDIT_PORT, 9000);
  58. //ShowWindow(SW_MINIMIZE);
  59. CenterWindow();
  60. m_pDlgRecord = new CDlgRecord();
  61. m_pDlgRecord->Create(CDlgRecord::IDD, this);
  62. m_pDlgRecord->ShowWindow(SW_SHOW);
  63. m_dtBegin.SetFormat(_T("yyyy/MM/dd HH:mm:ss"));
  64. m_dtEnd.SetFormat(_T("yyyy/MM/dd HH:mm:ss"));
  65. SYSTEMTIME st;
  66. GetLocalTime(&st);
  67. st.wHour = 0; st.wMinute = 0; st.wSecond = 0; st.wMilliseconds = 0;
  68. m_dtBegin.SetTime(st);
  69. st.wHour = 23; st.wMinute = 59; st.wSecond = 59; st.wMilliseconds = 0;
  70. m_dtEnd.SetTime(st);
  71. m_lstClients.SetExtendedStyle(m_lstClients.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
  72. m_lstClients.InsertColumn(0, _T("编号"), LVCFMT_LEFT, 50);
  73. m_lstClients.InsertColumn(1, _T("地址"), LVCFMT_LEFT, 120);
  74. m_lstClients.InsertColumn(2, _T("端口号"), LVCFMT_LEFT, 80);
  75. m_lstClients.InsertColumn(3, _T("连接时间"), LVCFMT_LEFT, 100);
  76. m_lstClients.InsertColumn(4, _T("接收次数"), LVCFMT_LEFT, 80);
  77. m_lstClients.InsertColumn(5, _T("发送次数"), LVCFMT_LEFT, 80);
  78. m_lstEqps.SetExtendedStyle(m_lstEqps.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
  79. m_lstEqps.InsertColumn(0, _T("牵引ID"), LVCFMT_LEFT, 50);
  80. m_lstEqps.InsertColumn(1, _T("名称"), LVCFMT_LEFT, 100);
  81. m_lstEqps.InsertColumn(2, _T("采集类型"), LVCFMT_LEFT, 200);
  82. OnInitSocket();
  83. // TODO: 在此添加额外的初始化代码
  84. //AllocConsole();//为当前的窗口程序申请一个Console窗口
  85. //freopen("CONOUT$", "a+", stdout);
  86. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  87. }
  88. void CSimulatorDlg::OnInitSocket()
  89. {
  90. //tcp记录
  91. m_tcpServer_315.m_callBackTcpLog = [this](int nType, CString strIP, int nPort, const void* pData, int nDataSize, int nSendSize, int nError)
  92. {
  93. //错误日志,强制写入
  94. if (/*g_pProjectConf->m_bLogTcpIocpLog || */nError != 0)
  95. {
  96. std::string strbuf = "";
  97. char szTitle[100];
  98. switch (nType)
  99. {
  100. case 0:
  101. _snprintf(szTitle, 100, "(315TCP记录[%s:%d][包Size:%d, 发送:%d, 错误码:%d])", strIP.GetBuffer(), nPort, nDataSize, nSendSize, nError);
  102. //正确时,最多写入50字节
  103. if (nError == 0 && nDataSize > 50)
  104. {
  105. strbuf = CCSM315Protocol::GetStrFromData((BYTE*)pData, 50) + "...";
  106. }
  107. else
  108. {
  109. strbuf = CCSM315Protocol::GetStrFromData((BYTE*)pData, nDataSize);
  110. }
  111. break;
  112. case 1:
  113. _snprintf(szTitle, 100, "(315TCP记录[%s:%d][连接])", strIP.GetBuffer(), nPort);
  114. strbuf = std::string((char*)pData);
  115. break;
  116. case 2:
  117. _snprintf(szTitle, 100, "(315TCP记录[%s:%d][断开])", strIP.GetBuffer(), nPort);
  118. strbuf = std::string((char*)pData);
  119. break;
  120. case 3:
  121. _snprintf(szTitle, 100, "(315TCP记录[%s:%d][异常])", strIP.GetBuffer(), nPort);
  122. strbuf = std::string((char*)pData);
  123. break;
  124. }
  125. //m_lpManageFrame->writelog((BYTE*)strbuf.c_str(), strbuf.length(), FALSE, szTitle);
  126. }
  127. };
  128. }
  129. // 如果向对话框添加最小化按钮,则需要下面的代码
  130. // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
  131. // 这将由框架自动完成。
  132. void CSimulatorDlg::OnPaint()
  133. {
  134. if (IsIconic())
  135. {
  136. CPaintDC dc(this); // 用于绘制的设备上下文
  137. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  138. // 使图标在工作区矩形中居中
  139. int cxIcon = GetSystemMetrics(SM_CXICON);
  140. int cyIcon = GetSystemMetrics(SM_CYICON);
  141. CRect rect;
  142. GetClientRect(&rect);
  143. int x = (rect.Width() - cxIcon + 1) / 2;
  144. int y = (rect.Height() - cyIcon + 1) / 2;
  145. // 绘制图标
  146. dc.DrawIcon(x, y, m_hIcon);
  147. }
  148. else
  149. {
  150. CDialogEx::OnPaint();
  151. }
  152. }
  153. //当用户拖动最小化窗口时系统调用此函数取得光标
  154. //显示。
  155. HCURSOR CSimulatorDlg::OnQueryDragIcon()
  156. {
  157. return static_cast<HCURSOR>(m_hIcon);
  158. }
  159. void CSimulatorDlg::ConnStatusChange(ClientInfo* pCltInfo, BOOL bIsConn)
  160. {
  161. if (!bIsConn)
  162. {
  163. m_cs315CltList.Lock();
  164. delete m_map315CltInfo[pCltInfo];
  165. m_map315CltInfo.erase(pCltInfo);
  166. m_cs315CltList.Unlock();
  167. DeleteClient(pCltInfo);
  168. }
  169. else
  170. {
  171. m_cs315CltList.Lock();
  172. Clt315_Info* appLayer = new Clt315_Info();
  173. appLayer->pTcpClt = pCltInfo;
  174. pCltInfo->pAppLayerClt = appLayer;
  175. m_map315CltInfo[pCltInfo] = appLayer;
  176. m_cs315CltList.Unlock();
  177. InsertClient(pCltInfo);
  178. C315CommData CommData;
  179. GetGapConfig(CommData);
  180. m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), pCltInfo->sock);
  181. }
  182. }
  183. void CSimulatorDlg::InsertClient(const ClientInfo* pCltInfo)
  184. {
  185. UINT uItem = m_lstClients.GetItemCount();
  186. m_lstClients.InsertItem(uItem, std::to_string(uItem + 1).c_str());
  187. SYSTEMTIME st;
  188. GetLocalTime(&st);
  189. CString strTime;
  190. strTime.Format("%02d:%02d:%02d.%03d", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
  191. //m_lstRecord.SetItemText(uItem, 1, strTime);
  192. m_lstClients.SetItemText(uItem, 1, pCltInfo->strIP);
  193. m_lstClients.SetItemText(uItem, 2, std::to_string(pCltInfo->iPort).c_str());
  194. //m_lstRecord.SetItemText(uItem, 2, std::to_string(nPort).c_str());
  195. m_lstClients.SetItemText(uItem, 3, strTime);
  196. m_lstClients.SetItemText(uItem, 4, "0");
  197. m_lstClients.SetItemText(uItem, 5, "0");
  198. m_lstClients.SetItemData(uItem, pCltInfo->sock);
  199. }
  200. void CSimulatorDlg::UpdateClient(const ClientInfo* pCltInfo)
  201. {
  202. for (int i = 0; i < m_lstClients.GetItemCount(); i++)
  203. {
  204. if (m_lstClients.GetItemText(i, 1) == pCltInfo->strIP && m_lstClients.GetItemText(i, 2) == to_string(pCltInfo->iPort).c_str())
  205. {
  206. m_lstClients.SetItemText(i, 4, std::to_string(pCltInfo->iRecvCount).c_str());
  207. m_lstClients.SetItemText(i, 5, std::to_string(pCltInfo->iSendSucCount).c_str());
  208. break;
  209. }
  210. }
  211. }
  212. void CSimulatorDlg::DeleteClient(const ClientInfo* pCltInfo)
  213. {
  214. for (int i = 0; i < m_lstClients.GetItemCount(); i++)
  215. {
  216. if (m_lstClients.GetItemText(i, 1) == pCltInfo->strIP && m_lstClients.GetItemText(i, 2) == to_string(pCltInfo->iPort).c_str())
  217. {
  218. m_lstClients.DeleteItem(i);
  219. break;
  220. }
  221. }
  222. }
  223. void CSimulatorDlg::OnRecvData_TCPServer(BYTE* pData, int iLen, ClientInfo* pCltInfo)
  224. {
  225. EQP_COMM_ADDR addr;
  226. addr.strIP = pCltInfo->strIP;
  227. addr.id = "";
  228. //从通信层客户端信息获得应用层客户端信息
  229. Clt315_Info* cltALInfo = m_map315CltInfo[pCltInfo];
  230. PktAssembleBuff* pab = &cltALInfo->pktAssembleBuff;
  231. pab->PushStream(pData, iLen);
  232. while (pab->PopPkt())
  233. {
  234. PKT_DATA* ppd = new PKT_DATA(pab->pkt, pab->iPktLen);
  235. ppd->addr = addr;
  236. ppd->proto = pab->m_protocolType;
  237. //if (NULL != m_pMonitorView) {
  238. // m_pMonitorView->StatisOnRecv(ppd->m_DataBuf, ppd->m_iDataBufLen, pCltInfo->strIP);
  239. //}
  240. OnRecvPkt(ppd, cltALInfo);
  241. }
  242. }
  243. //心跳和道岔信号0x22直接处理,其余放入异步队列线程中
  244. void CSimulatorDlg::OnRecvPkt(PKT_DATA* ppd, Clt315_Info* pCltInfo)
  245. {
  246. PKT_DATA* pData = ppd;
  247. PBYTE pBuf = (PBYTE)pData->m_DataBuf;
  248. int ipos = 7;
  249. BYTE frmtype = *(BYTE*)(pBuf + ipos);
  250. ipos += 1;
  251. DWORD frmlen = *(DWORD*)(pBuf + ipos);
  252. ipos += 4;
  253. if (frmtype == FRAME_TYPE_HEARTBEAT)//心跳
  254. {
  255. //WI_CALLBACK callBkPara;
  256. //ZeroMemory(&callBkPara, sizeof(callBkPara));
  257. //callBkPara.wiCallBack.dwLen = sizeof(callBkPara);
  258. //callBkPara.wiCallBack.dwVersion = 0x01000000;
  259. //DWORD ltm = *(DWORD*)(pBuf + ipos);
  260. //ipos += 4;
  261. //callBkPara.wiCallBack.dwOperationType = 4;
  262. //callBkPara.wiCallBack.sDataTime = timeOpt::Time_tToSystemTime(ltm);;
  263. //callBkPara.wiCallBack.dwUser = 0;
  264. //callBkPara.wiCallBack.CltInfo = pCltInfo->pTcpClt;
  265. ////log
  266. //if (g_pProjectConf->m_bEnableDetailLog)
  267. //{
  268. // CString strLog;
  269. // strLog.Format("收到心跳时间:%04d-%02d-%02d %02d:%02d:%02d TimeSyncLimit:%d", callBkPara.wiCallBack.sDataTime.wYear, callBkPara.wiCallBack.sDataTime.wMonth, callBkPara.wiCallBack.sDataTime.wDay,
  270. // callBkPara.wiCallBack.sDataTime.wHour, callBkPara.wiCallBack.sDataTime.wMinute, callBkPara.wiCallBack.sDataTime.wSecond, g_pProjectConf->m_iTimeSyncLimit);
  271. // m_lpManageFrame->writelog((LPBYTE)(LPCSTR)strLog, strLog.GetLength(), TRUE, "(心跳5min)", pCltInfo->pTcpClt);
  272. //}
  273. //CmdCallBack(&callBkPara);
  274. m_pDlgRecord->InsertData(pCltInfo->pTcpClt->strIP, pCltInfo->pTcpClt->iPort, pBuf, pData->m_iDataBufLen);
  275. delete pData;
  276. return;
  277. }
  278. //else if (frmtype == FRAME_TYPE_DATA)//道岔信号直接处理
  279. //{
  280. // BYTE cmd = *(BYTE*)(pBuf + 5 + 1 + 1 + 1 + 4);
  281. // //if (cmd == 0x22)
  282. // //{
  283. // // try
  284. // // {
  285. // // DealRequestPkt(pBuf, pData->m_iDataBufLen, pCltInfo->pTcpClt);
  286. // // }
  287. // // catch (CException* e)
  288. // // {
  289. // // //g_pLogForRun->LogStaticAcq(fmt::format("[315]捕获到DealRequestPkt异常{}{}", __FUNCTION__, __LINE__).c_str());
  290. // // }
  291. // // delete pData;
  292. // // return;
  293. // //}
  294. //}
  295. //else
  296. //{
  297. // return;
  298. //}
  299. pCltInfo->AysnPktQueue.Push(pData);
  300. }
  301. DWORD WINAPI CSimulatorDlg::Thread_DealRecv(LPVOID pParam)
  302. {
  303. CSimulatorDlg* pThis = (CSimulatorDlg*)(pParam);
  304. return pThis->DealRecv();
  305. }
  306. DWORD CSimulatorDlg::DealRecv()
  307. {
  308. while (m_bWIFRunning)
  309. {
  310. Sleep(1);
  311. //DWORD hr;
  312. //hr = WaitForSingleObject(m_hRecvSema1, 50);//等待处理数据的信号量
  313. //取出一包处理
  314. PKT_DATA* pData = NULL;
  315. ClientInfo* pClt = NULL;
  316. m_cs315CltList.Lock();
  317. std::map<ClientInfo*, Clt315_Info*>::iterator i = m_map315CltInfo.begin();
  318. for (; i != m_map315CltInfo.end(); i++)
  319. {
  320. pData = i->second->AysnPktQueue.Pop();
  321. if (pData)
  322. {
  323. pClt = i->second->pTcpClt;
  324. break;
  325. }
  326. }
  327. m_cs315CltList.Unlock();
  328. if (pData == NULL)
  329. {
  330. continue;
  331. }
  332. PBYTE pBuf = (PBYTE)pData->m_DataBuf;
  333. int ipos = 0;
  334. ipos += 7;
  335. BYTE frmType = *(BYTE*)(pBuf + ipos);
  336. ipos += 1;
  337. if (frmType == 0x0f)//心跳帧
  338. {
  339. int len = *(DWORD*)(pBuf + ipos);
  340. ipos += 4;
  341. long ltm = *(long*)(pBuf + ipos);
  342. ipos += 4;
  343. }
  344. try
  345. {
  346. DealRequestPkt(pBuf, pData->m_iDataBufLen, pClt);
  347. }
  348. catch (CException* e)
  349. {
  350. // g_pLogForRun->LogStaticAcq(fmt::format("[315]捕获到DealRequestPkt异常{}{}", __FUNCTION__, __LINE__).c_str());
  351. }
  352. delete pData;
  353. }
  354. return 0;
  355. }
  356. BOOL CSimulatorDlg::DealRequestPkt(PBYTE pBuf, int nBufLen, ClientInfo* pClt)
  357. {
  358. int ipos = 7;
  359. BYTE frmtype = *(BYTE*)(pBuf + ipos);
  360. ipos += 1;
  361. DWORD frmlen = *(DWORD*)(pBuf + ipos);
  362. ipos += 4;
  363. BYTE cmdCode = *(BYTE*)(pBuf + ipos);
  364. E_315_PROTOCOL_TYPE eProtocolType = (E_315_PROTOCOL_TYPE)cmdCode;
  365. ipos += 1;
  366. m_pDlgRecord->InsertData(pClt->strIP, pClt->iPort, pBuf, nBufLen);
  367. if (eProtocolType == E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50)
  368. {
  369. m_lstEqps.DeleteAllItems();
  370. string key = (LPCSTR)pClt->strIP;
  371. key += ":" + to_string(pClt->iPort);
  372. m_strClientIP = pClt->strIP;
  373. m_uPort = pClt->iPort;
  374. SetWindowText("当前站点:" + m_strClientIP);
  375. m_mapNodes[key].clear();
  376. WORD size = *(WORD*)(pBuf + ipos); ipos += 2;
  377. //string strMsg = "[0x50配置]个数:" + to_string(size) + "\r\n";
  378. for (WORD i = 0; i < size; i++)
  379. {
  380. stNodeItem it;
  381. BYTE len = *(BYTE*)(pBuf + ipos); ipos += 1;
  382. CString strText((char*)pBuf + ipos, len); ipos += len;
  383. //strMsg += "名称:";
  384. //strMsg += (LPCSTR)strText;
  385. it.wNodeID = *(WORD*)(pBuf + ipos); ipos += 2;
  386. //strMsg += ", ID:" + to_string(id);
  387. UINT uItem = m_lstEqps.GetItemCount();
  388. m_lstEqps.InsertItem(uItem, to_string(it.wNodeID).c_str());
  389. m_lstEqps.SetItemText(uItem, 1, strText);
  390. BYTE cnt = *(BYTE*)(pBuf + ipos); ipos += 1;
  391. ZeroMemory(it.szName, sizeof(it.szName));
  392. CopyMemory(it.szName, (LPCSTR)strText, min(strText.GetLength(), sizeof(it.szName)));
  393. strText = "";
  394. for (BYTE j = 0; j < cnt; j++)
  395. {
  396. WORD acqtype = *(WORD*)(pBuf + ipos); ipos += 2;
  397. it.vctAcqID.push_back(acqtype);
  398. strText.AppendFormat("%s,", CCSM315ProtocolEx::GetAcqTypeDesc(acqtype).c_str());
  399. }
  400. m_lstEqps.SetItemText(uItem, 2, strText);
  401. m_lstEqps.SetItemData(uItem, it.wNodeID);
  402. m_mapNodes[key][it.wNodeID] = it;
  403. }
  404. }
  405. //自动回复
  406. else if (eProtocolType == E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51)
  407. {
  408. BYTE byPush = *(BYTE*)(pBuf + ipos);
  409. ipos += 1;
  410. if (byPush == 0)
  411. {
  412. C315CommData CommData;
  413. //开始组装,清空数据
  414. CommData.Clear_Data();
  415. //插入帧头
  416. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  417. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52);
  418. CommData.Push_Data(*(WORD*)(pBuf + ipos));
  419. //插入帧尾
  420. CommData.Push_Tail();
  421. //组装结束,更新帧长度
  422. CommData.Update_FrameLen();
  423. m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), pClt->sock);
  424. }
  425. }
  426. //自动回复
  427. else if (eProtocolType == E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53)
  428. {
  429. BYTE byPush = *(BYTE*)(pBuf + ipos);
  430. ipos += 1;
  431. if (byPush == 0)
  432. {
  433. C315CommData CommData;
  434. //开始组装,清空数据
  435. CommData.Clear_Data();
  436. //插入帧头
  437. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  438. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54);
  439. CommData.Push_Data(*(BYTE*)(pBuf + ipos));
  440. //插入帧尾
  441. CommData.Push_Tail();
  442. //组装结束,更新帧长度
  443. CommData.Update_FrameLen();
  444. m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), pClt->sock);
  445. }
  446. }
  447. //自动回复
  448. else if (eProtocolType == E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57)
  449. {
  450. BYTE byPush = *(BYTE*)(pBuf + ipos);
  451. ipos += 1;
  452. if (byPush == 0)
  453. {
  454. C315CommData CommData;
  455. //开始组装,清空数据
  456. CommData.Clear_Data();
  457. //插入帧头
  458. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  459. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58);
  460. BYTE no = *(BYTE*)(pBuf + ipos); ipos += 1;
  461. WORD wNodeID = *(WORD*)(pBuf + ipos); ipos += 2;
  462. CommData.Push_Data(wNodeID);
  463. CommData.Push_Data(no);
  464. //插入帧尾
  465. CommData.Push_Tail();
  466. //组装结束,更新帧长度
  467. CommData.Update_FrameLen();
  468. m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), pClt->sock);
  469. }
  470. }
  471. return TRUE;
  472. //switch (eProtocolType)
  473. //{
  474. //case E_315_PROTOCOL_TYPE::ACTIVE_KEEP:
  475. // break;
  476. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x23:
  477. // break;
  478. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x26:
  479. // break;
  480. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x27:
  481. // break;
  482. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x29:
  483. // break;
  484. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x32:
  485. // break;
  486. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2A:
  487. // break;
  488. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2E:
  489. // break;
  490. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2F:
  491. // break;
  492. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x22:
  493. // break;
  494. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x25:
  495. // break;
  496. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x24:
  497. // break;
  498. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x30:
  499. // break;
  500. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x31:
  501. // break;
  502. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50:
  503. // break;
  504. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51:
  505. // break;
  506. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52:
  507. // break;
  508. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53:
  509. // break;
  510. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54:
  511. // break;
  512. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55:
  513. // break;
  514. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56:
  515. // break;
  516. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57:
  517. // break;
  518. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58:
  519. // break;
  520. //default:
  521. // break;
  522. //}
  523. }
  524. //
  525. //
  526. //LRESULT CSimulatorDlg::OnJhdDisconnect(WPARAM wParam, LPARAM)
  527. //{
  528. // if (m_bJHDConnected)
  529. // {
  530. // WriteLog("断开jhd服务器");
  531. //
  532. // m_jhdSock.Disconnect(wParam);
  533. //
  534. // WriteLog("sock:", wParam);
  535. //
  536. // m_bJHDConnected = false;
  537. // }
  538. //
  539. // return 0;
  540. //}
  541. //
  542. //
  543. //
  544. //DWORD CSimulatorDlg::HeartbeatThreadProc(LPVOID lpParam)
  545. //{
  546. // CSimulatorDlg* pThis = (CSimulatorDlg*)(lpParam);
  547. // return pThis->HeartbeatThread();
  548. //}
  549. //
  550. //int CSimulatorDlg::HeartbeatThread()
  551. //{
  552. // SendHeartbeat();
  553. //
  554. // DWORD dwTick = GetTickCount();
  555. //
  556. // while (m_bJHDConnected)
  557. // {
  558. // Sleep(50);
  559. //
  560. // if (!m_bJHDConnected)
  561. // break;
  562. //
  563. // if (GetTickCount() - dwTick < 5000)
  564. // continue;
  565. //
  566. // //发心跳
  567. // SendHeartbeat();
  568. //
  569. // dwTick = GetTickCount();
  570. //
  571. // }
  572. //
  573. // return 0;
  574. //}
  575. int CSimulatorDlg::SendHeartbeat()
  576. {
  577. BYTE pBuf[100];
  578. int ipos = 0;
  579. BYTE head[12];
  580. CCSM315Protocol::InitFrmHead12B(head, 0x0f, 0x2);
  581. memcpy(pBuf + ipos, head, 12);
  582. ipos += 12;
  583. long ltm = (long)time(NULL);
  584. *(long*)(pBuf + ipos) = ltm;
  585. ipos += 4;
  586. *(BYTE*)(pBuf + ipos) = 0xff;
  587. ipos += 1;
  588. *(BYTE*)(pBuf + ipos) = 0xff;
  589. ipos += 1;
  590. *(BYTE*)(pBuf + ipos) = 0xff;
  591. ipos += 1;
  592. *(DWORD*)(pBuf + ipos) = 0xffffffff;
  593. ipos += 4;
  594. //计算帧长度
  595. DWORD frmlen = ipos - 16;
  596. *(DWORD*)(pBuf + 8) = frmlen;
  597. //SendJHDData(INVALID_SOCKET, pBuf, ipos, false);
  598. return 0;
  599. }
  600. void CSimulatorDlg::GetGapConfig(C315CommData& CommData)
  601. {
  602. //开始组装,清空数据
  603. CommData.Clear_Data();
  604. //插入帧头
  605. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  606. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50);
  607. //插入帧尾
  608. CommData.Push_Tail();
  609. //组装结束,更新帧长度
  610. CommData.Update_FrameLen();
  611. }
  612. //DWORD CSimulatorDlg::SendJHDDataProc(LPVOID lpParam)
  613. //{
  614. // PThreadData pData = (PThreadData)lpParam;
  615. // CSimulatorDlg* pThis = pData->pThis;
  616. //
  617. // pThis->SendJHDData(pData->pBuf, pData->nLen);
  618. //
  619. // delete pData;
  620. //
  621. // return 0;
  622. //}
  623. //
  624. //int CSimulatorDlg::SendJHDData(SOCKET sock, LPVOID pBuf, DWORD nLen, bool bDelete/* = true*/)
  625. //{
  626. // //m_dlgDataView.AddSendData(pBuf, nLen);
  627. //
  628. // if (m_bJHDConnected)
  629. // {
  630. // if (sock == INVALID_SOCKET)
  631. // {
  632. // for (auto& it : m_mapClients)
  633. // {
  634. // int rst = m_jhdSock.Send(it.second.sock, (char*)pBuf, nLen);
  635. // if (rst == SOCKET_ERROR)
  636. // {
  637. // if (m_bJHDConnected)
  638. // SendMessage(JHD_DISCONNECTED, it.second.sock, 0);
  639. // }
  640. // }
  641. // }
  642. // else
  643. // {
  644. // int rst = m_jhdSock.Send(sock, (char*)pBuf, nLen);
  645. // if (rst == SOCKET_ERROR)
  646. // {
  647. // if (m_bJHDConnected)
  648. // SendMessage(JHD_DISCONNECTED, sock, 0);
  649. // }
  650. // }
  651. //
  652. // }
  653. //
  654. // if (bDelete && pBuf)
  655. // delete[] pBuf;
  656. //
  657. // return 0;
  658. //}
  659. //
  660. //int CSimulatorDlg::DealJHDData(LPVOID lpParam)
  661. //{
  662. // StFrame* pData = (StFrame*)lpParam;
  663. //
  664. ////#ifdef _DEBUG
  665. //// OutputDebugString(Parse315Protocol::ToString(*pData, 1).c_str());
  666. ////#endif
  667. //
  668. // switch (pData->ftype)
  669. // {
  670. // case FRAME_TYPE_HEARTBEAT:
  671. // {
  672. // break;
  673. // }
  674. // case FRAME_TYPE_DATA:
  675. // {
  676. // StDataBasic* basic = (StDataBasic*)pData->lpdata;
  677. // auto protol = (E_315_PROTOCOL_TYPE)basic->cmdid;
  678. // switch (protol)
  679. // {
  680. // case E_315_PROTOCOL_TYPE::ACTIVE_KEEP:
  681. // break;
  682. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x23:
  683. // break;
  684. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x26:
  685. // break;
  686. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x27:
  687. // break;
  688. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x29:
  689. // break;
  690. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x32:
  691. // break;
  692. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2A:
  693. // break;
  694. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2E:
  695. // break;
  696. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2F:
  697. // break;
  698. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x22:
  699. // break;
  700. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x25:
  701. // break;
  702. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x24:
  703. // break;
  704. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x30:
  705. // break;
  706. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x31:
  707. // break;
  708. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50:
  709. // break;
  710. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51:
  711. // break;
  712. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52:
  713. // break;
  714. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53:
  715. // break;
  716. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54:
  717. // break;
  718. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55:
  719. // break;
  720. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56:
  721. // break;
  722. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57:
  723. // break;
  724. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58:
  725. // break;
  726. // default:
  727. // break;
  728. // }
  729. // }
  730. // }
  731. // return 0;
  732. //}
  733. //
  734. //int CSimulatorDlg::DealJHDRawData(LPVOID lpBuf, int len)
  735. //{
  736. // StFrame data;
  737. // ZeroMemory(&data, sizeof(StFrame));
  738. //
  739. // if (CCSM315ProtocolEx::Parse(data, lpBuf, len))
  740. // {
  741. // DealJHDData(&data);
  742. // }
  743. // else
  744. // {
  745. // delete[] lpBuf;
  746. // return -1;
  747. // }
  748. //
  749. // ////单独遇到 0x23命令 解析一下
  750. // //BYTE cmd = Parse315Protocol::GetCommandId(data);
  751. // //if (cmd == CMD_CODE_GAPCFG)
  752. // //{
  753. // // SetListCtrl(data.lpdata);
  754. // // m_dlgWholeTime.SetListCtrl(data.lpdata);
  755. // // m_dlgCombination.SetListCtrl(data.lpdata);
  756. // //}
  757. // ////0x27命令 回复 (简化处理,原始数据直接发送回去,实际回复命令不含图像/视频内容)
  758. // //else if (cmd == CMD_CODE_ALARM_AND_IMG && m_isReply0x27 == TRUE)
  759. // //{
  760. // // LPVOID buf = new BYTE[len];
  761. // // memcpy(buf, lpBuf, len);
  762. // // SendJHDData(buf, len);
  763. // //}
  764. //
  765. // //m_dlgDataView.AddRecvData(data, lpBuf, len);
  766. //
  767. // //Parse315Protocol::Release(data, 1);//JHD上送的必须注意释放内存
  768. // delete[] lpBuf;
  769. //
  770. // return 0;
  771. //}
  772. //
  773. //DWORD CSimulatorDlg::DealJHDDataProc(LPVOID lpParam)
  774. //{
  775. // PThreadData pData = (PThreadData)lpParam;
  776. // CSimulatorDlg* pThis = pData->pThis;
  777. // pThis->DealJHDRawData(pData->pBuf, pData->nLen);
  778. // delete pData;
  779. //
  780. // return 0;
  781. //}
  782. //
  783. //DWORD CSimulatorDlg::RecvThreadProc(LPVOID lpParam)
  784. //{
  785. // CSimulatorDlg* pThis = (CSimulatorDlg*)(lpParam);
  786. // return pThis->RecvThread();
  787. //}
  788. //
  789. //int CSimulatorDlg::RecvThread()
  790. //{
  791. // int nMaxSize = 1 * 1024 * 1024;
  792. // LPBYTE lpBuf = new BYTE[2 * nMaxSize];
  793. // int nLastPos = 0;
  794. // int nPacksCnt = 0; //分包数量
  795. // //bool bOverFlow = false;
  796. //
  797. // while (m_bJHDConnected)
  798. // {
  799. // //int hr = m_jhdSock.WaitRcvEvent(100);
  800. //
  801. // //if (hr > 0)
  802. // {
  803. // if (!m_bJHDConnected)
  804. // {
  805. // break;
  806. // }
  807. //
  808. // unsigned long len;
  809. // //hr = ioctlsocket(m_jhdSock.m_sock, FIONREAD, &len);
  810. // //if (hr == SOCKET_ERROR || len == 0)
  811. // //{
  812. // // if (m_bJHDConnected)
  813. // // {
  814. // // SendMessage(JHD_DISCONNECTED, 0, 0);
  815. // // WriteLog("jhd RecvThread 失败!");
  816. // // }
  817. // // break;
  818. // //}
  819. //
  820. // ////收到数据
  821. // //if (len > (unsigned long)nMaxSize)
  822. // //{
  823. // // len = (unsigned long)nMaxSize;
  824. // // bOverFlow = true;
  825. // //}
  826. // //else
  827. // //{
  828. // // bOverFlow = false;
  829. // //}
  830. //
  831. // LPBYTE pos = (LPBYTE)lpBuf + nLastPos;
  832. // ZeroMemory(pos, len);
  833. //
  834. // int rst = m_jhdSock.Recv((char*)pos, len);
  835. // if (rst == SOCKET_ERROR)
  836. // {
  837. // if (m_bJHDConnected)
  838. // {
  839. // SendMessage(JHD_DISCONNECTED, 0, 0);
  840. // WriteLog("jhd RecvThread 失败3!");
  841. // }
  842. // break;
  843. // }
  844. //
  845. //#ifdef _DEBUG
  846. // if (len > 0)
  847. // {
  848. // CString str;
  849. // str.Format(_T("接收数据,原位置:%d, 长度 %d\n"), nLastPos, len);
  850. // //OutputDebugString(str);
  851. // if (len > 10000)
  852. // {
  853. // TRACE(str);
  854. // }
  855. // }
  856. //#else
  857. // if (len > 0)
  858. // {
  859. // CString str;
  860. // str.Format(_T("接收数据,原位置:%d, 长度 %d\n"), nLastPos, len);
  861. // //OutputDebugString(str);
  862. // if (len > 3000)
  863. // {
  864. // printf(str);
  865. // }
  866. // }
  867. //#endif
  868. //
  869. // pos = lpBuf;
  870. // int bufsize = (int)len + nLastPos;
  871. // int datalen = 0;
  872. //
  873. // while (CCSM315Protocol::GetFrameData(pos, bufsize, datalen))
  874. // {
  875. // LPVOID lpBuf = new BYTE[datalen];
  876. // memcpy_s(lpBuf, datalen, pos, datalen);
  877. //
  878. // PThreadData pthdata = new ThreadData;
  879. // ZeroMemory(pthdata, sizeof(ThreadData));
  880. //
  881. // pthdata->pThis = this;
  882. // pthdata->pBuf = lpBuf;
  883. // pthdata->nLen = datalen;
  884. //
  885. // QueueUserWorkItem(CSimulatorDlg::DealJHDDataProc, pthdata, WT_EXECUTEDEFAULT);
  886. //
  887. // pos = (LPBYTE)pos + datalen;
  888. // bufsize -= datalen;
  889. // datalen = 0;
  890. //
  891. // nPacksCnt = 0;
  892. // }
  893. // ++nPacksCnt;
  894. //
  895. // if (bufsize > 0 && bufsize < nMaxSize && nPacksCnt < 20)
  896. // {
  897. // memmove_s(lpBuf, bufsize, pos, bufsize);
  898. // nLastPos = bufsize;
  899. //
  900. // if (!bOverFlow)
  901. // Sleep(100);
  902. // }
  903. // else
  904. // {
  905. //#ifdef _DEBUG
  906. // if (bufsize != 0)
  907. // {
  908. // CString str;
  909. // str.Format(_T("清空错误数据,数据长度 %d,失败次数 %d: %s"), bufsize, nPacksCnt, BufToString(pos, bufsize).c_str());
  910. // OutputDebugString(str);
  911. // }
  912. //#else
  913. // if (bufsize != 0)
  914. // {
  915. // CString str;
  916. // str.Format(_T("清空错误数据,数据长度 %d,失败次数 %d"), bufsize, nPacksCnt);
  917. // printf(str);
  918. // }
  919. //
  920. //#endif
  921. // nLastPos = 0;
  922. // nPacksCnt = 0;
  923. // }
  924. // }
  925. // }
  926. //
  927. // delete[] lpBuf;
  928. // return 0;
  929. //}
  930. //
  931. //
  932. //DWORD CSimulatorDlg::ListenThreadProc9999(LPVOID lpParam)
  933. //{
  934. // CSimulatorDlg* pThis = (CSimulatorDlg*)(lpParam);
  935. // return pThis->ListenThread9999();
  936. //}
  937. //
  938. //int CSimulatorDlg::ListenThread9999()
  939. //{
  940. // BOOL bRet = m_jhdSock.Init();
  941. // WriteLog("网络初始化:", bRet);
  942. // bRet = m_jhdSock.Listen(GetDlgItemInt(IDC_EDIT_PORT), 1);
  943. // QueueUserWorkItem(CSimulatorDlg::HeartbeatThreadProc, this, WT_EXECUTEDEFAULT);
  944. // QueueUserWorkItem(CSimulatorDlg::RecvThreadProc, this, WT_EXECUTEDEFAULT);
  945. //
  946. // while (m_bJHDListenThread)
  947. // {
  948. // CString strTip = "jhd连接数量:0";
  949. //
  950. // SetDlgItemText(IDC_STATIC_SERVER, strTip);
  951. //
  952. // stClientItem it;
  953. // WriteLog("开始监听:", bRet);
  954. // it.sock = m_jhdSock.Accept(it.from);
  955. // GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(_T("JHD连接连接成功"));
  956. // char ip[INET_ADDRSTRLEN];
  957. // u_short port;
  958. // CTCPSocket::Convert(it.from, ip, port);
  959. // strTip.Format("JHD连接连接成功[%s:%d]", ip, port);
  960. // WriteLog((LPCSTR)strTip);
  961. // m_bJHDConnected = true;
  962. //
  963. // GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(_T("连接JHD服务器成功"));
  964. //
  965. // //启动后先获取配置信息
  966. // OnBnClickedButtonGapcfg();
  967. // strTip = "jhd连接数量:1";
  968. //
  969. // SetDlgItemText(IDC_STATIC_SERVER, strTip);
  970. //
  971. // //while (m_bJHDConnected)
  972. // //{
  973. // // //int hr = m_jhdSock.WaitRcvEvent(100);
  974. // // //if (hr == SOCKET_ERROR)
  975. // // //{
  976. // // // m_bJHDConnected = false;
  977. // // // GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(_T("JHD连接断开1"));
  978. // // // std::cout << "JHD连接断开1" << std::endl;
  979. // // // m_jhdSock.Disconnect();
  980. // // //}
  981. // // //else if (hr > 0)
  982. // // //{
  983. // // // unsigned long len;
  984. // // // hr = ioctlsocket(m_jhdSock.m_sock, FIONREAD, &len);
  985. // // // if (hr == SOCKET_ERROR || len == 0)
  986. // // // {
  987. // // // m_bJHDConnected = false;
  988. // // // m_jhdSock.Disconnect();
  989. // // // GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(_T("JHD连接断开2"));
  990. // // // std::cout << "JHD连接断开2" << std::endl;
  991. // // // }
  992. // // //}
  993. // // //else
  994. // // {
  995. // // Sleep(1000);
  996. // // }
  997. // //}
  998. // }
  999. //
  1000. // return 0;
  1001. //}
  1002. void CSimulatorDlg::OnBnClickedButtonListen()
  1003. {
  1004. m_strClientIP = "";
  1005. CString strText;
  1006. GetDlgItemText(IDC_BUTTON_LISTEN, strText);
  1007. if (strText == "监听")
  1008. {
  1009. //m_bJHDListenThread = true;
  1010. //QueueUserWorkItem(CSimulatorDlg::ListenThreadProc9999, this, WT_EXECUTEDEFAULT);
  1011. int iPort = GetDlgItemInt(IDC_EDIT_PORT);
  1012. m_tcpServer_315.iAutoClearDeadConnectionTime = 60;
  1013. if (!m_tcpServer_315.StartServer(this, iPort))
  1014. {
  1015. if (m_tcpServer_315.m_lastError == 10048)//通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  1016. {
  1017. CString strData;
  1018. strData.Format("[错误]端口%d 被占用,服务启动失败.", iPort);
  1019. AfxMessageBox((LPCSTR)strData);
  1020. }
  1021. }
  1022. else
  1023. {
  1024. GetDlgItem(IDC_BUTTON_LISTEN)->SetWindowText(_T("断开"));
  1025. GetDlgItem(IDC_EDIT_PORT)->EnableWindow(FALSE);
  1026. //m_hRecvSema1 = CreateSemaphore(NULL, 0, m_picFrmNum + m_packFrmNum, NULL);
  1027. m_bWIFRunning = true;
  1028. m_hRcvThread = CreateThread(NULL, 0, Thread_DealRecv, (LPVOID)this, 0, NULL);//通过异步队列异步处理上位机请求
  1029. m_hYWAndStatus = CreateThread(NULL, 0, Thread_SendStatusByInterval, (LPVOID)this, 0, NULL);//周期发送油位及缺口采集设备状态信息
  1030. }
  1031. }
  1032. else
  1033. {
  1034. GetDlgItem(IDC_BUTTON_LISTEN)->SetWindowText(_T("监听"));
  1035. GetDlgItem(IDC_EDIT_PORT)->EnableWindow(TRUE);
  1036. //m_bJHDListenThread = false;
  1037. //SendMessage(JHD_DISCONNECTED, 0, 0);
  1038. m_bWIFRunning = false;
  1039. if (m_tcpServer_315.m_bStarted)
  1040. {
  1041. m_tcpServer_315.StopServer();
  1042. }
  1043. //closesocket(m_jhdSock.m_sockServer);
  1044. }
  1045. }
  1046. DWORD WINAPI CSimulatorDlg::Thread_SendStatusByInterval(LPVOID pParam)
  1047. {
  1048. CSimulatorDlg* pThis = (CSimulatorDlg*)(pParam);
  1049. return pThis->SendStatusByInterval();
  1050. }
  1051. DWORD CSimulatorDlg::SendStatusByInterval()
  1052. {
  1053. SYSTEMTIME stLastHeartbeatTime = { 0 };
  1054. //CLinkNode* pnode = NULL;
  1055. while (m_bWIFRunning)
  1056. {
  1057. //if (m_enableHeartBeat)
  1058. {
  1059. auto heartDif = CCSM315ProtocolEx::CalcTimePassSecond(&stLastHeartbeatTime);
  1060. if (heartDif >= 5)
  1061. {
  1062. SendHeartbeat();
  1063. }
  1064. }
  1065. }
  1066. return 0;
  1067. }
  1068. void CSimulatorDlg::SendClients(const C315CommData& CommData)
  1069. {
  1070. for (int i = 0; i < m_lstClients.GetItemCount(); i++)
  1071. {
  1072. if (m_lstClients.GetCheck(i))
  1073. {
  1074. SOCKET s = (SOCKET)m_lstClients.GetItemData(i);
  1075. m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), s);
  1076. }
  1077. }
  1078. }
  1079. void CSimulatorDlg::SendClients(const C315CommData& CommData, const CString& strClientIP, UINT uPort)
  1080. {
  1081. CString strPort;
  1082. strPort.Format("%u", uPort);
  1083. for (int i = 0; i < m_lstClients.GetItemCount(); i++)
  1084. {
  1085. if (m_lstClients.GetItemText(i, 1) == strClientIP && m_lstClients.GetItemText(i, 2) == strPort)
  1086. {
  1087. SOCKET s = (SOCKET)m_lstClients.GetItemData(i);
  1088. m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), s);
  1089. break;
  1090. }
  1091. }
  1092. }
  1093. void CSimulatorDlg::OnBnClickedButtonGapcfg()
  1094. {
  1095. C315CommData CommData;
  1096. GetGapConfig(CommData);
  1097. SendClients(CommData);
  1098. }
  1099. void CSimulatorDlg::OnBnClickedButtonNewvalue()
  1100. {
  1101. C315CommData CommData;
  1102. //开始组装,清空数据
  1103. CommData.Clear_Data();
  1104. //插入帧头
  1105. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  1106. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51);
  1107. //插入帧尾
  1108. CommData.Push_Tail();
  1109. //组装结束,更新帧长度
  1110. CommData.Update_FrameLen();
  1111. SendClients(CommData);
  1112. }
  1113. void CSimulatorDlg::OnLvnItemchangedListClients(NMHDR* pNMHDR, LRESULT* pResult)
  1114. {
  1115. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  1116. int nItem = pNMLV->iItem;
  1117. int nSubItem = pNMLV->iSubItem;
  1118. if (nItem != -1 && nSubItem != -1)
  1119. {
  1120. m_strClientIP = m_lstClients.GetItemText(nItem, 1);
  1121. m_uPort = atoi(m_lstClients.GetItemText(nItem, 2));
  1122. CString str = m_strClientIP + ":" + m_lstClients.GetItemText(nItem, 2);
  1123. SetWindowText("当前站点:" + m_strClientIP);
  1124. m_lstEqps.DeleteAllItems();
  1125. auto p = m_mapNodes.find((LPCSTR)str);
  1126. if (p != m_mapNodes.end())
  1127. {
  1128. for (auto &it : p->second)
  1129. {
  1130. UINT uItem = m_lstEqps.GetItemCount();
  1131. m_lstEqps.InsertItem(uItem, to_string(it.second.wNodeID).c_str());
  1132. m_lstEqps.SetItemText(uItem, 1, it.second.szName);
  1133. CString strText;
  1134. for (auto it1 : it.second.vctAcqID)
  1135. {
  1136. //strText.AppendFormat("0x%02x,", it1);
  1137. strText.AppendFormat("%s,", CCSM315ProtocolEx::GetAcqTypeDesc(it1).c_str());
  1138. }
  1139. m_lstEqps.SetItemText(uItem, 2, strText);
  1140. m_lstEqps.SetItemData(uItem, it.second.wNodeID);
  1141. }
  1142. }
  1143. }
  1144. *pResult = 0;
  1145. }
  1146. void CSimulatorDlg::OnBnClickedCheckAllAlarm()
  1147. {
  1148. if (IsDlgButtonChecked(IDC_CHECK_ALL_ALARM) == BST_CHECKED)
  1149. GetDlgItem(IDC_EDIT_ALARMID)->EnableWindow(FALSE);
  1150. else
  1151. GetDlgItem(IDC_EDIT_ALARMID)->EnableWindow(TRUE);
  1152. }
  1153. void CSimulatorDlg::OnBnClickedButtonAlarm()
  1154. {
  1155. WORD uAlarmID = GetDlgItemInt(IDC_EDIT_ALARMID);
  1156. if (uAlarmID == 0) uAlarmID = 0xFFFF;
  1157. CTime tmBegin;
  1158. m_dtBegin.GetTime(tmBegin);
  1159. CTime tmEnd;
  1160. m_dtEnd.GetTime(tmEnd);
  1161. if (IsDlgButtonChecked(IDC_CHECK_ALL_ALARM) == BST_CHECKED)
  1162. {
  1163. C315CommData CommData;
  1164. //开始组装,清空数据
  1165. CommData.Clear_Data();
  1166. //插入帧头
  1167. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  1168. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53);
  1169. CommData.Push_Data((DWORD)tmBegin.GetTime());
  1170. CommData.Push_Data((DWORD)tmEnd.GetTime());
  1171. CommData.Push_Data((WORD)0xFFFF);
  1172. CommData.Push_Data(uAlarmID);
  1173. //插入帧尾
  1174. CommData.Push_Tail();
  1175. //组装结束,更新帧长度
  1176. CommData.Update_FrameLen();
  1177. SendClients(CommData);
  1178. }
  1179. else if (!m_strClientIP.IsEmpty())
  1180. {
  1181. for (int i = 0; i < m_lstEqps.GetItemCount(); i++)
  1182. {
  1183. if (m_lstEqps.GetCheck(i))
  1184. {
  1185. WORD s = (WORD)m_lstEqps.GetItemData(i);
  1186. //m_tcpServer_315.SendData((const char*)CommData.GetData(), (int)CommData.GetDataSize(), s);
  1187. C315CommData CommData;
  1188. //开始组装,清空数据
  1189. CommData.Clear_Data();
  1190. //插入帧头
  1191. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  1192. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53);
  1193. CommData.Push_Data((DWORD)tmBegin.GetTime());
  1194. CommData.Push_Data((DWORD)tmEnd.GetTime());
  1195. CommData.Push_Data(s);
  1196. CommData.Push_Data(uAlarmID);
  1197. //插入帧尾
  1198. CommData.Push_Tail();
  1199. //组装结束,更新帧长度
  1200. CommData.Update_FrameLen();
  1201. SendClients(CommData, m_strClientIP, m_uPort);
  1202. }
  1203. }
  1204. }
  1205. }
  1206. void CSimulatorDlg::OnBnClickedButton0x55()
  1207. {
  1208. WORD cnt = 0;
  1209. CString strKey;
  1210. strKey.Format("%s:%u", (LPCSTR)m_strClientIP, m_uPort);
  1211. auto pStation = m_mapNodes.find((LPCSTR)strKey);
  1212. if (pStation == m_mapNodes.end())
  1213. {
  1214. AfxMessageBox("站点不存在!");
  1215. return;
  1216. }
  1217. C315CommData CommData;
  1218. //开始组装,清空数据
  1219. CommData.Clear_Data();
  1220. //插入帧头
  1221. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  1222. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55);
  1223. CTime tmBegin;
  1224. m_dtBegin.GetTime(tmBegin);
  1225. CTime tmEnd;
  1226. m_dtEnd.GetTime(tmEnd);
  1227. CommData.Push_Data((DWORD)tmBegin.GetTime());
  1228. CommData.Push_Data((DWORD)tmEnd.GetTime());
  1229. int nCountIdx = CommData.GetDataSize();//数目定位使用
  1230. CommData.Push_Data(cnt);
  1231. bool bAllEqps = IsDlgButtonChecked(IDC_CHECK_ALL_EQP) == BST_CHECKED;
  1232. for (int i = 0; i < m_lstEqps.GetItemCount(); i++)
  1233. {
  1234. if (bAllEqps || m_lstEqps.GetCheck(i))
  1235. {
  1236. WORD wNodeID = (WORD)m_lstEqps.GetItemData(i);
  1237. auto pNode = pStation->second.find(wNodeID);
  1238. if (pNode != pStation->second.end())
  1239. {
  1240. cnt += pNode->second.vctAcqID.size();
  1241. for (auto &it : pNode->second.vctAcqID)
  1242. {
  1243. CommData.Push_Data(wNodeID);
  1244. CommData.Push_Data(it);
  1245. }
  1246. }
  1247. }
  1248. }
  1249. if (cnt == 0)
  1250. {
  1251. AfxMessageBox("没有勾选设备, 或者设备没有采集点!");
  1252. return;
  1253. }
  1254. //更新数目
  1255. CommData.Update_Data(nCountIdx, &cnt, sizeof(cnt));
  1256. //插入帧尾
  1257. CommData.Push_Tail();
  1258. //组装结束,更新帧长度
  1259. CommData.Update_FrameLen();
  1260. SendClients(CommData, m_strClientIP, m_uPort);
  1261. }
  1262. void CSimulatorDlg::OnBnClickedButton0x56()
  1263. {
  1264. WORD cnt = 0;
  1265. CString strKey;
  1266. strKey.Format("%s:%u", (LPCSTR)m_strClientIP, m_uPort);
  1267. auto pStation = m_mapNodes.find((LPCSTR)strKey);
  1268. if (pStation == m_mapNodes.end())
  1269. {
  1270. AfxMessageBox("站点不存在!");
  1271. return;
  1272. }
  1273. C315CommData CommData;
  1274. //开始组装,清空数据
  1275. CommData.Clear_Data();
  1276. //插入帧头
  1277. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  1278. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56);
  1279. CTime tmBegin;
  1280. m_dtBegin.GetTime(tmBegin);
  1281. CTime tmEnd;
  1282. m_dtEnd.GetTime(tmEnd);
  1283. CommData.Push_Data((DWORD)tmBegin.GetTime());
  1284. CommData.Push_Data((DWORD)tmEnd.GetTime());
  1285. int nCountIdx = CommData.GetDataSize();//数目定位使用
  1286. CommData.Push_Data(cnt);
  1287. bool bAllEqps = IsDlgButtonChecked(IDC_CHECK_ALL_EQP) == BST_CHECKED;
  1288. for (int i = 0; i < m_lstEqps.GetItemCount(); i++)
  1289. {
  1290. if (bAllEqps || m_lstEqps.GetCheck(i))
  1291. {
  1292. cnt++;
  1293. WORD wNodeID = (WORD)m_lstEqps.GetItemData(i);
  1294. CommData.Push_Data(wNodeID);
  1295. }
  1296. }
  1297. if (cnt == 0)
  1298. {
  1299. AfxMessageBox("没有勾选设备!");
  1300. return;
  1301. }
  1302. //更新数目
  1303. CommData.Update_Data(nCountIdx, &cnt, sizeof(cnt));
  1304. //插入帧尾
  1305. CommData.Push_Tail();
  1306. //组装结束,更新帧长度
  1307. CommData.Update_FrameLen();
  1308. SendClients(CommData, m_strClientIP, m_uPort);
  1309. }
  1310. void CSimulatorDlg::OnBnClickedButton0x57()
  1311. {
  1312. CString strKey;
  1313. strKey.Format("%s:%u", (LPCSTR)m_strClientIP, m_uPort);
  1314. auto pStation = m_mapNodes.find((LPCSTR)strKey);
  1315. if (pStation == m_mapNodes.end())
  1316. {
  1317. AfxMessageBox("站点不存在!");
  1318. return;
  1319. }
  1320. CTime tmBegin;
  1321. m_dtBegin.GetTime(tmBegin);
  1322. bool bAllEqps = IsDlgButtonChecked(IDC_CHECK_ALL_EQP) == BST_CHECKED;
  1323. for (int i = 0; i < m_lstEqps.GetItemCount(); i++)
  1324. {
  1325. if (bAllEqps || m_lstEqps.GetCheck(i))
  1326. {
  1327. C315CommData CommData;
  1328. //开始组装,清空数据
  1329. CommData.Clear_Data();
  1330. //插入帧头
  1331. CCSM315ProtocolEx::InitFrmHead12B(CommData, FRAME_TYPE_DATA, 0x02);
  1332. CommData.Push_Data((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57);
  1333. WORD wNodeID = (WORD)m_lstEqps.GetItemData(i);
  1334. CommData.Push_Data(wNodeID);
  1335. CommData.Push_Data((DWORD)tmBegin.GetTime());
  1336. //插入帧尾
  1337. CommData.Push_Tail();
  1338. //组装结束,更新帧长度
  1339. CommData.Update_FrameLen();
  1340. SendClients(CommData, m_strClientIP, m_uPort);
  1341. }
  1342. }
  1343. }
  1344. void CSimulatorDlg::OnBnClickedButtonRecord()
  1345. {
  1346. m_pDlgRecord->ShowWindow(SW_SHOW);
  1347. }
  1348. #include "DlgParse.h"
  1349. void CSimulatorDlg::OnBnClickedButtonParse()
  1350. {
  1351. CDlgParse *dlg = new CDlgParse();
  1352. dlg->Create(IDD_DIALOG_PARSE, this);
  1353. dlg->ShowWindow(SW_SHOW);
  1354. }