IntervalToSendDlg.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. // IntervalToSendDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "IntervalToSend.h"
  5. #include "IntervalToSendDlg.h"
  6. #include "afxdialogex.h"
  7. #include "define.h"
  8. #include <fstream>
  9. #include <iostream>
  10. #include <yyjson.h>
  11. #include <map>
  12. #include <string>
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #endif
  16. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  17. class CAboutDlg : public CDialogEx
  18. {
  19. public:
  20. CAboutDlg();
  21. // 对话框数据
  22. enum { IDD = IDD_ABOUTBOX };
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  25. // 实现
  26. protected:
  27. DECLARE_MESSAGE_MAP()
  28. };
  29. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  30. {
  31. }
  32. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  33. {
  34. CDialogEx::DoDataExchange(pDX);
  35. }
  36. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  37. END_MESSAGE_MAP()
  38. // CIntervalToSendDlg 对话框
  39. CIntervalToSendDlg::CIntervalToSendDlg(CWnd* pParent /*=NULL*/)
  40. : CDialogEx(CIntervalToSendDlg::IDD, pParent)
  41. {
  42. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  43. }
  44. void CIntervalToSendDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialogEx::DoDataExchange(pDX);
  47. DDX_Text(pDX, IDC_EDT_DATA, m_data);
  48. DDX_Text(pDX, IDC_NET_ADDR, m_ip);
  49. DDX_Text(pDX, IDC_EDT_PORT, m_port);
  50. DDX_Control(pDX, IDC_CMB_TYPE, m_cmbType);
  51. DDX_Check(pDX, IDC_CHK_CYCLE, m_bCycle);
  52. DDX_Check(pDX, IDC_CHK_MODIFY, m_bModify);
  53. DDX_Check(pDX, IDC_CHK_HEX, m_bHex);
  54. }
  55. BEGIN_MESSAGE_MAP(CIntervalToSendDlg, CDialogEx)
  56. ON_WM_SYSCOMMAND()
  57. ON_WM_PAINT()
  58. ON_WM_QUERYDRAGICON()
  59. ON_BN_CLICKED(IDC_BTN_START, &CIntervalToSendDlg::OnBnClickedBtnStart)
  60. ON_BN_CLICKED(IDC_BTN_CLEAR, &CIntervalToSendDlg::OnBnClickedBtnClear)
  61. ON_BN_CLICKED(IDC_BTN_IMPORT, &CIntervalToSendDlg::OnBnClickedBtnImport)
  62. ON_MESSAGE(WM_THREAD_STOP, &CIntervalToSendDlg::OnThreadStop)
  63. ON_MESSAGE(WM_THREAD_UPDATE_DATA, &CIntervalToSendDlg::OnUpdateData)
  64. END_MESSAGE_MAP()
  65. // CIntervalToSendDlg 消息处理程序
  66. BOOL CIntervalToSendDlg::OnInitDialog()
  67. {
  68. CDialogEx::OnInitDialog();
  69. // 将“关于...”菜单项添加到系统菜单中。
  70. // IDM_ABOUTBOX 必须在系统命令范围内。
  71. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  72. ASSERT(IDM_ABOUTBOX < 0xF000);
  73. CMenu* pSysMenu = GetSystemMenu(FALSE);
  74. if (pSysMenu != NULL)
  75. {
  76. BOOL bNameValid;
  77. CString strAboutMenu;
  78. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  79. ASSERT(bNameValid);
  80. if (!strAboutMenu.IsEmpty())
  81. {
  82. pSysMenu->AppendMenu(MF_SEPARATOR);
  83. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  84. }
  85. }
  86. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
  87. // 执行此操作
  88. SetIcon(m_hIcon, TRUE); // 设置大图标
  89. SetIcon(m_hIcon, FALSE); // 设置小图标
  90. UpdateData(FALSE);
  91. m_cmbType.InsertString((int)eSendType::ST_ONE_SECOND, "每秒发送一次");
  92. m_cmbType.InsertString((int)eSendType::ST_TEN_SECOND, "每十秒发送一次");
  93. m_cmbType.InsertString((int)eSendType::ST_ONE_MINITUE, "每分钟发送一次");
  94. m_cmbType.InsertString((int)eSendType::ST_ONE_HOUR, "每小时发送一次");
  95. m_cmbType.InsertString((int)eSendType::ST_ONE_100MILLI, "每100毫秒发送一次");
  96. m_cmbType.InsertString((int)eSendType::ST_ACTUAL, "模拟实际发送");
  97. m_cmbType.InsertString((int)eSendType::ST_ONE_10MILLI, "每10毫秒发送一次");
  98. auto nPos = GetPrivateProfileInt("INFO", "sendtype",(int)eSendType::ST_ONE_SECOND, "IntervalToSend.ini");
  99. m_cmbType.SetCurSel(nPos);
  100. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  101. }
  102. void CIntervalToSendDlg::OnSysCommand(UINT nID, LPARAM lParam)
  103. {
  104. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  105. {
  106. CAboutDlg dlgAbout;
  107. dlgAbout.DoModal();
  108. }
  109. else
  110. {
  111. CDialogEx::OnSysCommand(nID, lParam);
  112. }
  113. }
  114. // 如果向对话框添加最小化按钮,则需要下面的代码
  115. // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
  116. // 这将由框架自动完成。
  117. void CIntervalToSendDlg::OnPaint()
  118. {
  119. if (IsIconic())
  120. {
  121. CPaintDC dc(this); // 用于绘制的设备上下文
  122. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  123. // 使图标在工作区矩形中居中
  124. int cxIcon = GetSystemMetrics(SM_CXICON);
  125. int cyIcon = GetSystemMetrics(SM_CYICON);
  126. CRect rect;
  127. GetClientRect(&rect);
  128. int x = (rect.Width() - cxIcon + 1) / 2;
  129. int y = (rect.Height() - cyIcon + 1) / 2;
  130. // 绘制图标
  131. dc.DrawIcon(x, y, m_hIcon);
  132. }
  133. else
  134. {
  135. CDialogEx::OnPaint();
  136. }
  137. }
  138. //当用户拖动最小化窗口时系统调用此函数取得光标
  139. //显示。
  140. HCURSOR CIntervalToSendDlg::OnQueryDragIcon()
  141. {
  142. return static_cast<HCURSOR>(m_hIcon);
  143. }
  144. void CIntervalToSendDlg::OnBnClickedBtnStart()
  145. {
  146. UpdateData(TRUE);
  147. if (m_data.IsEmpty())
  148. {
  149. MessageBox("数据不能为空", "提示", MB_ICONWARNING);
  150. return;
  151. }
  152. if (m_thread)
  153. {
  154. m_bwork = false;
  155. m_thread->join();
  156. delete m_thread;
  157. m_thread = nullptr;
  158. GetDlgItem(IDC_BTN_START)->SetWindowText("开始");
  159. GetDlgItem(IDC_BTN_IMPORT)->EnableWindow(TRUE);
  160. GetDlgItem(IDC_BTN_CLEAR)->EnableWindow(TRUE);
  161. GetDlgItem(IDC_EDT_DATA)->EnableWindow(TRUE);
  162. }
  163. else
  164. {
  165. //AfxMessageBox("解析需要一点时间, 请多一点点耐心等待结束...");
  166. auto lst = new list<SEND_DATA>;
  167. if (m_bHex)
  168. {
  169. if (checkData() == false) return;
  170. BYTE* pData = new BYTE[m_data.GetLength() / 2];
  171. int nPos = 0;
  172. int nLen = m_data.GetLength();
  173. char* p = m_data.GetBuffer();
  174. for (int i = 0; i < nLen - 1; i += 2)
  175. {
  176. char a[3] = { m_data.GetAt(i), m_data.GetAt(i + 1), 0 };
  177. pData[nPos++] = strtol(a, NULL, 16);
  178. }
  179. CLNBuffer buffer;
  180. buffer.AddData(pData, nPos);
  181. while (true)
  182. {
  183. int nPackLen = buffer.HasPack();
  184. if (nPackLen == 0)
  185. break;
  186. SEND_DATA data;
  187. data.pData = new uint8_t[nPackLen];
  188. memcpy(data.pData, buffer.GetBuffer(), nPackLen);
  189. buffer.Remove(nPackLen);
  190. data.nLen = nPackLen;
  191. lst->push_back(data);
  192. }
  193. buffer.Empty();
  194. delete[] pData;
  195. pData = NULL;
  196. }
  197. else
  198. {
  199. CLNBuffer buffer;
  200. buffer.AddData((LPBYTE)(LPCSTR)m_data, m_data.GetLength());
  201. while (true)
  202. {
  203. int nPackLen = buffer.HasPack();
  204. if (nPackLen == 0)
  205. break;
  206. SEND_DATA data;
  207. data.pData = new uint8_t[nPackLen];
  208. memcpy(data.pData, buffer.GetBuffer(), nPackLen);
  209. buffer.Remove(nPackLen);
  210. data.nLen = nPackLen;
  211. lst->push_back(data);
  212. }
  213. }
  214. if (lst->size() == 0)
  215. {
  216. MessageBox("未解析到数据包", "提示", MB_ICONWARNING);
  217. delete lst;
  218. return;
  219. }
  220. CString strLog;
  221. strLog.Format("解析完毕,一共解析 %d 道下载命令.开始发送.", lst->size());
  222. AfxMessageBox(strLog);
  223. m_bwork = true;
  224. m_thread = new std::thread(ThreadProc, (DWORD_PTR)this, (DWORD_PTR)lst, (DWORD_PTR)0);
  225. GetDlgItem(IDC_BTN_START)->SetWindowText("停止");
  226. GetDlgItem(IDC_BTN_IMPORT)->EnableWindow(FALSE);
  227. GetDlgItem(IDC_BTN_CLEAR)->EnableWindow(FALSE);
  228. GetDlgItem(IDC_EDT_DATA)->EnableWindow(FALSE);
  229. }
  230. }
  231. void CIntervalToSendDlg::OnBnClickedBtnClear()
  232. {
  233. m_data.Empty();
  234. UpdateData(FALSE);
  235. }
  236. void CIntervalToSendDlg::OnBnClickedBtnImport()
  237. {
  238. CString strFilter = _T("文件(*.txt)|*.txt||");
  239. CFileDialog dlg(TRUE, _T(".txt"), NULL, NULL, strFilter);
  240. if (dlg.DoModal() == IDOK)
  241. {
  242. CString strOpenFile = dlg.GetPathName();
  243. //AfxMessageBox("解析需要一点时间, 请多一点点耐心等待结束...");
  244. auto lst = new list<SEND_DATA>;
  245. auto mapData = new map<time_t, list<SEND_DATA>>;
  246. CFile file;
  247. if (file.Open(strOpenFile, CFile::modeRead) == FALSE) return ;
  248. int len = file.GetLength();
  249. auto file_data = new uint8_t[len];
  250. int l = file.Read(file_data, len);
  251. file.Close();
  252. CLNBuffer buffer;
  253. buffer.AddData(file_data, len);
  254. while (true)
  255. {
  256. int nPackLen = buffer.HasPack();
  257. if (nPackLen == 0)
  258. break;
  259. SEND_DATA data;
  260. data.pData = new uint8_t[nPackLen];
  261. memcpy(data.pData, buffer.GetBuffer(), nPackLen);
  262. buffer.Remove(nPackLen);
  263. data.nLen = nPackLen;
  264. auto doc = yyjson_read((char*)data.pData, data.nLen, 0);
  265. if (doc)
  266. {
  267. auto root = yyjson_doc_get_root(doc);
  268. if (yyjson_is_obj(root) && yyjson_obj_get(root, "IMEI"))
  269. {
  270. lst->emplace_back(data);
  271. auto t = yyjson_get_str(yyjson_obj_get(root, "time"));
  272. if (t)
  273. {
  274. int year, month, day, hour, minute, second;
  275. TRACE("%s\r\n", t);
  276. auto n = sscanf_s(t, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
  277. if (n == 6)
  278. {
  279. (*mapData)[hour * 3600 + minute * 60 + second].emplace_back(data);
  280. }
  281. else
  282. {
  283. int ii = 0;
  284. }
  285. }
  286. }
  287. else
  288. {
  289. delete[] data.pData;
  290. }
  291. yyjson_doc_free(doc);
  292. }
  293. else
  294. {
  295. delete[] data.pData;
  296. }
  297. }
  298. if (lst->size() == 0)
  299. {
  300. MessageBox("未解析到数据包", "提示", MB_ICONWARNING);
  301. delete lst;
  302. return;
  303. }
  304. CString strLog;
  305. strLog.Format("解析完毕,一共解析 %d 道下载命令.开始发送.", lst->size());
  306. AfxMessageBox(strLog);
  307. delete[] file_data;
  308. file_data = nullptr;
  309. UpdateData(TRUE);
  310. //m_cmbType.SetCurSel((int)eSendType::ST_ONE_100MILLI);
  311. WritePrivateProfileString("INFO", "sendtype", std::to_string(m_cmbType.GetCurSel()).c_str(), "IntervalToSend.ini");
  312. m_bwork = true;
  313. m_thread = new std::thread(ThreadProc, (DWORD_PTR)this, (DWORD_PTR)lst, (DWORD_PTR)mapData);
  314. GetDlgItem(IDC_BTN_START)->SetWindowText("停止");
  315. GetDlgItem(IDC_BTN_IMPORT)->EnableWindow(FALSE);
  316. GetDlgItem(IDC_BTN_CLEAR)->EnableWindow(FALSE);
  317. GetDlgItem(IDC_EDT_DATA)->EnableWindow(FALSE);
  318. }
  319. }
  320. HRESULT CIntervalToSendDlg::OnThreadStop(WPARAM w, LPARAM l)
  321. {
  322. if (m_thread)
  323. {
  324. m_thread->join();
  325. delete m_thread;
  326. }
  327. m_thread = nullptr;
  328. m_bwork = false;
  329. GetDlgItem(IDC_BTN_START)->SetWindowText("开始");
  330. GetDlgItem(IDC_BTN_IMPORT)->EnableWindow(TRUE);
  331. GetDlgItem(IDC_BTN_CLEAR)->EnableWindow(TRUE);
  332. GetDlgItem(IDC_EDT_DATA)->EnableWindow(TRUE);
  333. MessageBox("发送结束", "提示", MB_ICONINFORMATION);
  334. return 0;
  335. }
  336. HRESULT CIntervalToSendDlg::OnUpdateData(WPARAM w, LPARAM l)
  337. {
  338. time_t tmNow = (time_t)w;
  339. if (w < m_tmLast) return 0;
  340. UpdateData(FALSE);
  341. return 0;
  342. }
  343. void CIntervalToSendDlg::ThreadProc(DWORD_PTR pThis, DWORD_PTR data, DWORD_PTR m)
  344. {
  345. CIntervalToSendDlg* pDlg = (CIntervalToSendDlg*)pThis;
  346. auto lst = (list<SEND_DATA>*)data;
  347. auto mapData = (map<time_t, list<SEND_DATA>>*)m;
  348. time_t lastSend = 0;
  349. eSendType type = (eSendType)pDlg->m_cmbType.GetCurSel();
  350. auto it = lst->cbegin();
  351. g_udpSocket.SendTo(pDlg->m_strInfo, pDlg->m_strInfo.GetLength(), pDlg->m_port, pDlg->m_ip);
  352. int nSleepTime = 100;
  353. do
  354. {
  355. Sleep(nSleepTime);
  356. time_t tmNow;
  357. time(&tmNow);
  358. pDlg->PostMessage(WM_THREAD_UPDATE_DATA, (DWORD_PTR)tmNow, 0);
  359. if (type == eSendType::ST_ONE_100MILLI)
  360. {
  361. if (nSleepTime != 100) nSleepTime = 100;
  362. if (it == lst->cend()) break;
  363. auto doc = yyjson_read((char*)it->pData, it->nLen, 0);
  364. do
  365. {
  366. auto d_doc = yyjson_doc_mut_copy(doc, 0);
  367. auto root = yyjson_mut_doc_get_root(d_doc);
  368. if (yyjson_mut_is_obj(root))
  369. {
  370. //yyjson_mut_obj_remove_str(root, "time");
  371. //yyjson_mut_obj_add_strcpy(d_doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  372. yyjson_mut_obj_add_int(d_doc, root, "make_up", 1); //补传标记
  373. }
  374. size_t len = 0;
  375. auto json = yyjson_mut_write(d_doc, 0, &len);
  376. if (json)
  377. {
  378. g_udpSocket.SendTo(json, len, pDlg->m_port, pDlg->m_ip);
  379. lastSend = tmNow;
  380. ++it;
  381. free((void*)json);
  382. }
  383. yyjson_mut_doc_free(d_doc);
  384. } while (false);
  385. yyjson_doc_free(doc);
  386. }
  387. else if (type == eSendType::ST_ONE_10MILLI)
  388. {
  389. if (nSleepTime != 10) nSleepTime = 10;
  390. if (it == lst->cend()) break;
  391. auto doc = yyjson_read((char*)it->pData, it->nLen, 0);
  392. do
  393. {
  394. auto d_doc = yyjson_doc_mut_copy(doc, 0);
  395. auto root = yyjson_mut_doc_get_root(d_doc);
  396. if (yyjson_mut_is_obj(root))
  397. {
  398. //yyjson_mut_obj_remove_str(root, "time");
  399. //yyjson_mut_obj_add_strcpy(d_doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  400. yyjson_mut_obj_add_int(d_doc, root, "make_up", 1); //补传标记
  401. }
  402. size_t len = 0;
  403. auto json = yyjson_mut_write(d_doc, 0, &len);
  404. if (json)
  405. {
  406. g_udpSocket.SendTo(json, len, pDlg->m_port, pDlg->m_ip);
  407. lastSend = tmNow;
  408. ++it;
  409. free((void*)json);
  410. }
  411. yyjson_mut_doc_free(d_doc);
  412. } while (false);
  413. }
  414. else if (type == eSendType::ST_ONE_SECOND)
  415. {
  416. if (nSleepTime != 100) nSleepTime = 100;
  417. if (tmNow > lastSend)
  418. {
  419. if (pDlg->m_bCycle) //循环发送
  420. {
  421. if (it == lst->cend()) it = lst->cbegin();
  422. }
  423. else
  424. {
  425. if (it == lst->cend()) break;
  426. }
  427. if (pDlg->m_bModify) //修正时间
  428. {
  429. auto doc = yyjson_read((char*)it->pData, it->nLen, 0);
  430. do
  431. {
  432. COleDateTime dt(tmNow);
  433. auto d_doc = yyjson_doc_mut_copy(doc, 0);
  434. auto root = yyjson_mut_doc_get_root(d_doc);
  435. if (yyjson_mut_is_obj(root))
  436. {
  437. yyjson_mut_obj_remove_str(root, "time");
  438. yyjson_mut_obj_add_strcpy(d_doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  439. }
  440. size_t len = 0;
  441. auto json = yyjson_mut_write(d_doc, 0, &len);
  442. if (json)
  443. {
  444. g_udpSocket.SendTo(json, len, pDlg->m_port, pDlg->m_ip);
  445. lastSend = tmNow;
  446. ++it;
  447. free((void*)json);
  448. }
  449. yyjson_mut_doc_free(d_doc);
  450. } while (false);
  451. yyjson_doc_free(doc);
  452. }
  453. else
  454. {
  455. g_udpSocket.SendTo(it->pData, it->nLen, pDlg->m_port, pDlg->m_ip);
  456. lastSend = tmNow;
  457. ++it;
  458. }
  459. }
  460. }
  461. else if (type == eSendType::ST_TEN_SECOND)
  462. {
  463. if (nSleepTime != 100) nSleepTime = 100;
  464. if (tmNow > lastSend && (tmNow - lastSend) % 10 == 0)
  465. {
  466. if (pDlg->m_bCycle) //循环发送
  467. {
  468. if (it == lst->cend()) it = lst->cbegin();
  469. }
  470. else
  471. {
  472. if (it == lst->cend()) break;
  473. }
  474. if (pDlg->m_bModify) //修正时间
  475. {
  476. auto doc = yyjson_read((char*)it->pData, it->nLen, 0);
  477. do
  478. {
  479. COleDateTime dt(tmNow);
  480. auto d_doc = yyjson_doc_mut_copy(doc, 0);
  481. auto root = yyjson_mut_doc_get_root(d_doc);
  482. if (yyjson_mut_is_obj(root))
  483. {
  484. yyjson_mut_obj_remove_str(root, "time");
  485. yyjson_mut_obj_add_strcpy(d_doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  486. }
  487. size_t len = 0;
  488. auto json = yyjson_mut_write(d_doc, 0, &len);
  489. if (json)
  490. {
  491. g_udpSocket.SendTo(json, len, pDlg->m_port, pDlg->m_ip);
  492. lastSend = tmNow;
  493. ++it;
  494. free((void*)json);
  495. }
  496. yyjson_mut_doc_free(d_doc);
  497. } while (false);
  498. yyjson_doc_free(doc);
  499. }
  500. else
  501. {
  502. g_udpSocket.SendTo(it->pData, it->nLen, pDlg->m_port, pDlg->m_ip);
  503. lastSend = tmNow;
  504. ++it;
  505. }
  506. }
  507. }
  508. else if (type == eSendType::ST_ONE_MINITUE)
  509. {
  510. if (nSleepTime != 100) nSleepTime = 100;
  511. if (tmNow != lastSend && (tmNow - lastSend) % 60 == 0)
  512. {
  513. if (pDlg->m_bCycle) //循环发送
  514. {
  515. if (it == lst->cend()) it = lst->cbegin();
  516. }
  517. else
  518. {
  519. if (it == lst->cend()) break;
  520. }
  521. if (pDlg->m_bModify) //修正时间
  522. {
  523. auto doc = yyjson_read((char*)it->pData, it->nLen, 0);
  524. do
  525. {
  526. COleDateTime dt(tmNow);
  527. auto d_doc = yyjson_doc_mut_copy(doc, 0);
  528. auto root = yyjson_mut_doc_get_root(d_doc);
  529. if (yyjson_mut_is_obj(root))
  530. {
  531. yyjson_mut_obj_remove_str(root, "time");
  532. yyjson_mut_obj_add_strcpy(d_doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  533. }
  534. size_t len = 0;
  535. auto json = yyjson_mut_write(d_doc, 0, &len);
  536. if (json)
  537. {
  538. g_udpSocket.SendTo(json, len, pDlg->m_port, pDlg->m_ip);
  539. lastSend = tmNow;
  540. ++it;
  541. free((void*)json);
  542. }
  543. yyjson_mut_doc_free(d_doc);
  544. } while (false);
  545. yyjson_doc_free(doc);
  546. }
  547. else
  548. {
  549. g_udpSocket.SendTo(it->pData, it->nLen, pDlg->m_port, pDlg->m_ip);
  550. lastSend = tmNow;
  551. ++it;
  552. }
  553. }
  554. }
  555. else if (type == eSendType::ST_ACTUAL)
  556. {
  557. if (nSleepTime != 100) nSleepTime = 100;
  558. if (mapData == nullptr) break;
  559. if (tmNow > lastSend)
  560. {
  561. COleDateTime dt(tmNow);
  562. auto tt = dt.GetHour() * 3600 + dt.GetMinute() * 60 + dt.GetSecond();
  563. TRACE("%d:%d:%d %d\t\r", dt.GetHour(), dt.GetMinute(), dt.GetSecond(), tt);
  564. auto ik = mapData->find(tt);
  565. if (ik == mapData->end())
  566. {
  567. lastSend = tmNow;
  568. continue;
  569. }
  570. for (auto& im : ik->second)
  571. {
  572. auto doc = yyjson_read((char*)im.pData, im.nLen, 0);
  573. do
  574. {
  575. auto d_doc = yyjson_doc_mut_copy(doc, 0);
  576. auto root = yyjson_mut_doc_get_root(d_doc);
  577. if (yyjson_mut_is_obj(root))
  578. {
  579. yyjson_mut_obj_remove_str(root, "time");
  580. yyjson_mut_obj_add_strcpy(d_doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  581. }
  582. size_t len = 0;
  583. auto json = yyjson_mut_write(d_doc, 0, &len);
  584. if (json)
  585. {
  586. g_udpSocket.SendTo(json, len, pDlg->m_port, pDlg->m_ip);
  587. TRACE("%s %d:%d:%d", pDlg->m_ip, dt.GetHour(), dt.GetMinute(), dt.GetSecond());
  588. free((void*)json);
  589. }
  590. yyjson_mut_doc_free(d_doc);
  591. } while (false);
  592. yyjson_doc_free(doc);
  593. }
  594. lastSend = tmNow;
  595. }
  596. else if (lastSend > tmNow)
  597. lastSend = tmNow - 1; //系统修改了时间
  598. }
  599. } while (pDlg->m_bwork);
  600. for (auto it = lst->begin(); it != lst->end(); it++)
  601. {
  602. delete it->pData;
  603. }
  604. lst->clear();
  605. pDlg->PostMessage(WM_THREAD_STOP, 0, 0);
  606. }
  607. bool CIntervalToSendDlg::checkData()
  608. {
  609. UpdateData(TRUE);
  610. if (m_data.GetLength() > 50000)
  611. {
  612. MessageBox("长度请勿超过5W");
  613. m_data = CString();
  614. UpdateData(FALSE);
  615. return false;
  616. }
  617. static BYTE data[50000] = { 0 };
  618. int nLen = 0;
  619. int nDataLen = m_data.GetLength();
  620. for (int i = 0; i < nDataLen; i++)
  621. {
  622. char c = ((LPCSTR)m_data)[i];
  623. if (c == ' ')
  624. {
  625. }
  626. else if (c == 0x0d)
  627. {
  628. }
  629. else if (c == 0x0a)
  630. {
  631. }
  632. else if (!(((c >= '0') && (c <= '9')) || ((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F'))))
  633. {
  634. MessageBox("请输入HEX数据");
  635. m_data = CString();
  636. UpdateData(FALSE);
  637. return false;
  638. }
  639. else
  640. {
  641. data[nLen++] = c;
  642. }
  643. }
  644. ASSERT(nLen % 2 == 0);
  645. if (nLen % 2 == 1)
  646. nLen--;
  647. m_data = CString((char*)data, nLen);
  648. UpdateData(FALSE);
  649. return true;
  650. }