LWSServer.cpp 83 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912
  1. #include "stdafx.h"
  2. #include "LWSServer.h"
  3. #include "AppService.h"
  4. #include <Simplelog.h>
  5. #include <common/HighWay.h>
  6. #include "JDSPBuffer.h"
  7. #include <sstream>
  8. #include "MonitorObject.h"
  9. #include "Device.h"
  10. #include "ResistAlarm.h"
  11. #include <gbk2utf8.h>
  12. #ifdef _DEBUG
  13. #pragma comment(lib, "hjwebsockets40d.lib")
  14. #else
  15. #pragma comment(lib, "hjwebsockets40.lib")
  16. #endif // _DEBUG
  17. #define MAX_SEND_LENGHT (5242880 + LWS_PRE)
  18. time_t g_stStart; //程序启动的时间
  19. static int ws_protocol_callback(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {
  20. switch (reason) {
  21. case LWS_CALLBACK_ESTABLISHED: // 当服务器和客户端完成握手后
  22. {
  23. TRACE("Client connect!\n");
  24. auto pService = CAppService::Instance()->GetLwsServer();
  25. if (pService) pService->Establishe(wsi);
  26. }
  27. break;
  28. case LWS_CALLBACK_CLOSED:
  29. TRACE("LWS closed!\n");
  30. {
  31. auto pService = CAppService::Instance()->GetLwsServer();
  32. if (pService) pService->Close(wsi);
  33. }
  34. break;
  35. case LWS_CALLBACK_WSI_DESTROY:
  36. /*
  37. 含义:正在销毁ws连接对象
  38. 备注:表示libwebsockets框架即将销毁wsi对象。此时如果用户自定义对象中存在动态分配的空间,则需要在此时进行释放。
  39. 回调函数的参数含义:
  40. context: 全局上下文
  41. wsi: ws连接对象
  42. user: 用户自定义数据
  43.   in: 空指针
  44.   len: 0
  45. */
  46. TRACE("LWS DESTROY!\n");
  47. {
  48. auto pService = CAppService::Instance()->GetLwsServer();
  49. if (pService) pService->Destroy(wsi);
  50. }
  51. break;
  52. case LWS_CALLBACK_RECEIVE: // 当接收到客户端发来的帧以后
  53. {
  54. auto pService = CAppService::Instance()->GetLwsServer();
  55. ASSERT(pService);
  56. if (pService)
  57. {
  58. auto pBuffer = pService->GetBuffer();
  59. ASSERT(pBuffer);
  60. auto fin = lws_is_final_fragment(wsi);
  61. if (fin && pBuffer->IsEmpty())
  62. {
  63. pService->Recv(wsi, in, len);
  64. }
  65. else if (fin)
  66. {
  67. pBuffer->AddData((LPBYTE)in, len);
  68. auto packlen = pBuffer->HasPack();
  69. assert(packlen);
  70. if (packlen)
  71. {
  72. pService->Recv(wsi, pBuffer->GetBuffer(), packlen);
  73. pBuffer->Remove(packlen);
  74. }
  75. }
  76. else
  77. {
  78. pBuffer->AddData((LPBYTE)in, len);
  79. }
  80. }
  81. }
  82. /*
  83. // 判断是否最后一帧
  84. data->fin = lws_is_final_fragment(wsi);
  85. // 判断是否二进制消息
  86. data->bin = lws_frame_is_binary(wsi);
  87. // 对服务器的接收端进行流量控制,如果来不及处理,可以控制之
  88. // 下面的调用禁止在此连接上接收数据
  89. lws_rx_flow_control(wsi, 0);
  90. // 业务处理部分,为了实现Echo服务器,把客户端数据保存起来
  91. memcpy(&data->buf[LWS_PRE], in, len);
  92. data->len = len;
  93. memset(g_buf, 0, MAX_PAYLOAD_SIZE);
  94. //printf("recvied message:%s\n", (char*)data->buf + LWS_PRE);
  95. {
  96. //test printf
  97. //auto ret = utf82gbk(g_buf, MAX_PAYLOAD_SIZE, (char*)data->buf + LWS_PRE);
  98. //if (ret >= 0) TRACE("recv message(gbk):%s\n", g_buf);
  99. }
  100. // 需要给客户端应答时,触发一次写回调
  101. lws_callback_on_writable(wsi);
  102. */
  103. break;
  104. case LWS_CALLBACK_SERVER_WRITEABLE: // 当此连接可写时
  105. // //lws_write(wsi, &data->buf[LWS_PRE], data->len, LWS_WRITE_TEXT);
  106. ////test
  107. //{
  108. // sprintf_s(g_buf, MAX_PAYLOAD_SIZE, "%s",
  109. // "{\"cmd\":\"new_data_notify\",\"tag\":\"addr\",\"1122011356\":\"G3.K1322+270_古钱岭至狮岭互通门架.plate_detect\",\"data_fmt\":\"plate_info\",\"data\":[{\"time\":\"2020-03-24 17:27:22.362\",\"url\":\"24172722362-粤AVD463-蓝_plate.jpg\",\"license\":\"粤AVD463\",\"lane\":0,\"color\":\"蓝\",\"width\":\"195px\",\"confidence\":\"89%\"},{\"time\":\"2020-03-24 17:27:51.646\",\"url\":\"24172751646-粤LK828Y-蓝_plate.jpg\",\"license\":\"粤LK828Y\",\"lane\":1,\"color\":\"蓝\",\"width\":\"194px\",\"confidence\":\"85%\"}]}");
  110. // TRACE("send message(gbk):%s\n", g_buf);
  111. // //auto ret = gbk2utf8(g_buf, MAX_PAYLOAD_SIZE,
  112. // // "{\"cmd\":\"new_data_notify\",\"tag\":\"addr\",\"1122011356\":\"G3.K1322+270_古钱岭至狮岭互通门架.plate_detect\",\"data_fmt\":\"plate_info\",\"data\":[{\"time\":\"2020-03-24 17:27:22.362\",\"url\":\"24172722362-粤AVD463-蓝_plate.jpg\",\"license\":\"粤AVD463\",\"lane\":0,\"color\":\"蓝\",\"width\":\"195px\",\"confidence\":\"89%\"},{\"time\":\"2020-03-24 17:27:51.646\",\"url\":\"24172751646-粤LK828Y-蓝_plate.jpg\",\"license\":\"粤LK828Y\",\"lane\":1,\"color\":\"蓝\",\"width\":\"194px\",\"confidence\":\"85%\"}]}"
  113. // // );
  114. // //lws_write(wsi, (uint8_t*)g_buf, ret - 1, LWS_WRITE_TEXT);
  115. //}
  116. // 下面的调用允许在此连接上接收数据
  117. lws_rx_flow_control(wsi, 1);
  118. break;
  119. }
  120. // 回调函数最终要返回0,否则无法创建服务器
  121. return 0;
  122. }
  123. /**
  124. * 支持的WebSocket子协议数组
  125. * 子协议即JavaScript客户端WebSocket(url, protocols)第2参数数组的元素
  126. * 你需要为每种协议提供回调函数
  127. */
  128. struct lws_protocols ws_protocols[] = {
  129. {
  130. //协议名称,协议回调,接收缓冲区大小
  131. "ws", ws_protocol_callback, 0, MAX_PAYLOAD_SIZE,
  132. },
  133. {
  134. NULL, NULL, 0 // 最后一个元素固定为此格式
  135. }
  136. };
  137. //struct lws_protocols {
  138. /*协议名称*/
  139. //const char* name;
  140. /*服务回调,协议事件处理*/
  141. //lws_callback_function* callback;
  142. /*服务建立和断开时申请内存大小,也是callback中user的内存*/
  143. //size_t per_session_data_size;
  144. /*接收缓存区大小*/
  145. //size_t rx_buffer_size;
  146. /*协议id,可以用来区分协议*/
  147. //unsigned int id;
  148. /*自定义数据*/
  149. //void* user;
  150. /*发送缓存大小,为0则与rx_buffer_size相同*/
  151. //size_t tx_packet_size;
  152. int per_session_data::SendHistResist(lws* wsi, string mo_mp, time_t start, time_t end, std::map<time_t, int>& data0, std::map<time_t, int>& data1, std::map<time_t, int>& data2)
  153. {
  154. char sz_utf_first[100];
  155. char sz_utf_second[100];
  156. char sz_utf_three[100];
  157. string name1, name2, name3;
  158. CMonitorObjectMng::Instance()->GetNameByMoMp(mo_mp, name1, name2, name3);
  159. if (name1[0x00] == 0x00)
  160. gbk2utf8(sz_utf_first, 100, "1号测力曲线");
  161. else
  162. gbk2utf8(sz_utf_first, 100, name1.c_str());
  163. if (name2[0x00] == 0x00)
  164. gbk2utf8(sz_utf_second, 100, "2号测力曲线");
  165. else
  166. gbk2utf8(sz_utf_second, 100, name2.c_str());
  167. if (name3[0x00] == 0x00)
  168. gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
  169. else
  170. gbk2utf8(sz_utf_three, 100, name3.c_str());
  171. int offset = 0; int limit = 10000;
  172. auto it_data0 = data0.begin();
  173. auto it_data1 = data1.begin();
  174. auto it_data2 = data2.begin();
  175. uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
  176. bBlock = false;
  177. do
  178. {
  179. static int n = 600;
  180. for (int i = 0; i < n; i++)
  181. {
  182. if (bWork == false) break;
  183. if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
  184. else break;
  185. }
  186. #ifndef _DEBUG
  187. if (bBlock) ////5秒未返回确认包,结束
  188. break;;
  189. #endif // _DEBUG
  190. //10000 一次
  191. using namespace rapidjson;
  192. rapidjson::StringBuffer strBuf;
  193. Writer<StringBuffer> writer(strBuf);
  194. writer.StartObject();
  195. writer.Key("cmd");
  196. writer.String("query_hist");
  197. writer.Key("tag");
  198. writer.String((mo_mp + ".resist").c_str());
  199. writer.Key("time");
  200. writer.String("");
  201. writer.Key("data_fmt");
  202. writer.String("curve");
  203. writer.Key("unit");
  204. writer.String("N");
  205. writer.Key("data");
  206. writer.StartArray();
  207. //1号测力点
  208. writer.StartObject();
  209. writer.Key("name");
  210. writer.String(sz_utf_first);
  211. writer.Key("points");
  212. writer.StartArray();
  213. for (int i = 0; i < limit && it_data0 != data0.end(); ++it_data0)
  214. {
  215. if (it_data0->first < start)
  216. continue;
  217. if (it_data0->first >= end)
  218. break;
  219. writer.StartObject();
  220. writer.Key("x");
  221. writer.Uint64(it_data0->first);
  222. writer.Key("y");
  223. writer.Int(it_data0->second);
  224. writer.EndObject();
  225. ++i;
  226. }
  227. writer.EndArray();
  228. writer.EndObject();
  229. //2号测力点
  230. writer.StartObject();
  231. writer.Key("name");
  232. writer.String(sz_utf_second);
  233. writer.Key("points");
  234. writer.StartArray();
  235. for (int i = 0; i < limit && it_data1 != data1.end(); ++it_data1)
  236. {
  237. if (it_data1->first < start)
  238. continue;
  239. if (it_data1->first >= end)
  240. break;
  241. writer.StartObject();
  242. writer.Key("x");
  243. writer.Uint64(it_data1->first);
  244. writer.Key("y");
  245. writer.Int(it_data1->second);
  246. writer.EndObject();
  247. ++i;
  248. }
  249. writer.EndArray();
  250. writer.EndObject();
  251. //3号测力点
  252. writer.StartObject();
  253. writer.Key("name");
  254. writer.String(sz_utf_three);
  255. writer.Key("points");
  256. writer.StartArray();
  257. for (int i = 0; i < limit && it_data2 != data2.end(); ++it_data2)
  258. {
  259. if (it_data2->first < start)
  260. continue;
  261. if (it_data2->first >= end)
  262. break;
  263. writer.StartObject();
  264. writer.Key("x");
  265. writer.Uint64(it_data2->first);
  266. writer.Key("y");
  267. writer.Int(it_data2->second);
  268. writer.EndObject();
  269. ++i;
  270. }
  271. writer.EndArray();
  272. writer.EndObject();
  273. writer.EndArray();
  274. writer.EndObject();
  275. auto pData = strBuf.GetString();
  276. int len = strBuf.GetLength();
  277. if (bWork == false) break;
  278. memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
  279. auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
  280. bBlock = true;
  281. if (ret < 0) break;
  282. if (bWork == false) break;
  283. } while (!((it_data0 == data0.end() || it_data0->first >= end) && (it_data1 == data1.end() || it_data1->first >= end) && (it_data2 == data2.end() || it_data2->first >= end)));
  284. delete[] pSend;
  285. pSend = nullptr;
  286. return 0;
  287. }
  288. int per_session_data::SendHistResistForEcharts(lws* wsi, string mo_mp, time_t start, time_t end, std::map<time_t, int>& data0, std::map<time_t, int>& data1, std::map<time_t, int>& data2)
  289. {
  290. char sz_utf_first[100];
  291. char sz_utf_second[100];
  292. char sz_utf_three[100];
  293. string name1, name2, name3;
  294. CMonitorObjectMng::Instance()->GetNameByMoMp(mo_mp, name1, name2, name3);
  295. if (name1[0x00] == 0x00)
  296. gbk2utf8(sz_utf_first, 100, "1号测力曲线");
  297. else
  298. gbk2utf8(sz_utf_first, 100, name1.c_str());
  299. if (name2[0x00] == 0x00)
  300. gbk2utf8(sz_utf_second, 100, "2号测力曲线");
  301. else
  302. gbk2utf8(sz_utf_second, 100, name2.c_str());
  303. if (name3[0x00] == 0x00)
  304. gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
  305. else
  306. gbk2utf8(sz_utf_three, 100, name3.c_str());
  307. int offset = 0; int limit = 5000;
  308. auto it_data0 = data0.begin();
  309. auto it_data1 = data1.begin();
  310. auto it_data2 = data2.begin();
  311. uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
  312. bBlock = false;
  313. do
  314. {
  315. static int n = 600;
  316. for (int i = 0; i < n; i++)
  317. {
  318. if (bWork == false) break;
  319. if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
  320. else break;
  321. }
  322. #ifndef _DEBUG
  323. if (bBlock) ////5秒未返回确认包,结束
  324. break;;
  325. #endif // _DEBUG
  326. //10000 一次
  327. using namespace rapidjson;
  328. rapidjson::StringBuffer strBuf;
  329. Writer<StringBuffer> writer(strBuf);
  330. writer.StartObject();
  331. writer.Key("cmd");
  332. writer.String("query_hist");
  333. writer.Key("tag");
  334. writer.String((mo_mp + ".resist").c_str());
  335. writer.Key("time");
  336. writer.String("");
  337. writer.Key("data_fmt");
  338. writer.String("curve");
  339. writer.Key("unit");
  340. writer.String("N");
  341. writer.Key("data");
  342. writer.StartArray();
  343. //1号测力点
  344. writer.StartObject();
  345. writer.Key("name");
  346. writer.String(sz_utf_first);
  347. writer.Key("points");
  348. writer.StartArray();
  349. for (int i = 0; i < limit && it_data0 != data0.end(); ++it_data0)
  350. {
  351. if (it_data0->first < start)
  352. continue;
  353. if (it_data0->first >= end)
  354. break;
  355. if (it_data0->second == INVALID_RESIST)
  356. continue;
  357. writer.StartArray();
  358. writer.Uint64(it_data0->first);
  359. writer.Int(it_data0->second);
  360. writer.EndArray();
  361. ++i;
  362. }
  363. writer.EndArray();
  364. writer.EndObject();
  365. //2号测力点
  366. writer.StartObject();
  367. writer.Key("name");
  368. writer.String(sz_utf_second);
  369. writer.Key("points");
  370. writer.StartArray();
  371. for (int i = 0; i < limit && it_data1 != data1.end(); ++it_data1)
  372. {
  373. if (it_data1->first < start)
  374. continue;
  375. if (it_data1->first >= end)
  376. break;
  377. if (it_data1->second == INVALID_RESIST)
  378. continue;
  379. writer.StartArray();
  380. writer.Uint64(it_data1->first);
  381. writer.Int(it_data1->second);
  382. writer.EndArray();
  383. ++i;
  384. }
  385. writer.EndArray();
  386. writer.EndObject();
  387. //3号测力点
  388. writer.StartObject();
  389. writer.Key("name");
  390. writer.String(sz_utf_three);
  391. writer.Key("points");
  392. writer.StartArray();
  393. for (int i = 0; i < limit && it_data2 != data2.end(); ++it_data2)
  394. {
  395. if (it_data2->first < start)
  396. continue;
  397. if (it_data2->first >= end)
  398. break;
  399. if (it_data2->second == INVALID_RESIST)
  400. continue;
  401. writer.StartArray();
  402. writer.Uint64(it_data2->first);
  403. writer.Int(it_data2->second);
  404. writer.EndArray();
  405. ++i;
  406. }
  407. writer.EndArray();
  408. writer.EndObject();
  409. writer.EndArray();
  410. writer.EndObject();
  411. auto pData = strBuf.GetString();
  412. int len = strBuf.GetLength();
  413. if (bWork == false) break;
  414. memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
  415. auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
  416. bBlock = true;
  417. if (ret < 0) break;
  418. if (bWork == false) break;
  419. } while (!((it_data0 == data0.end() || it_data0->first >= end) && (it_data1 == data1.end() || it_data1->first >= end) && (it_data2 == data2.end() || it_data2->first >= end)));
  420. delete[] pSend;
  421. pSend = nullptr;
  422. return 0;
  423. }
  424. //暂时不调用
  425. int per_session_data::SendHistResistDB(LPHISTORY_QUERY history_query)
  426. {
  427. char sz_utf_first[100];
  428. char sz_utf_second[100];
  429. char sz_utf_three[100];
  430. string name1, name2, name3;
  431. CMonitorObjectMng::Instance()->GetNameByMoMp(history_query->mo_mp, name1, name2, name3);
  432. if (name1[0x00] == 0x00)
  433. gbk2utf8(sz_utf_first, 100, "1号测力曲线");
  434. else
  435. gbk2utf8(sz_utf_first, 100, name1.c_str());
  436. if (name2[0x00] == 0x00)
  437. gbk2utf8(sz_utf_second, 100, "2号测力曲线");
  438. else
  439. gbk2utf8(sz_utf_second, 100, name2.c_str());
  440. if (name3[0x00] == 0x00)
  441. gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
  442. else
  443. gbk2utf8(sz_utf_three, 100, name3.c_str());
  444. int offset = 0; int limit = 5000; //每次取出20000
  445. CTime ctStart(history_query->tmStart / 1000);
  446. CTime ctEnd(history_query->tmEnd / 1000);
  447. char tablename[50];
  448. SYSTEMTIME st;
  449. ctStart.GetAsSystemTime(st);
  450. sprintf_s(tablename, 50, "rm_resistance_%04d%02d%02d", st.wYear, st.wMonth, st.wDay);
  451. string strStartTime = ctStart.Format("%Y-%m-%d %H:%M:%S");
  452. string strEndTime = ctEnd.Format("%Y-%m-%d %H:%M:%S");
  453. uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
  454. bBlock = false;
  455. CString sql;
  456. do
  457. {
  458. static int n = 600;
  459. for (int i = 0; i < n; i++)
  460. {
  461. if (bWork == false) break;
  462. if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
  463. else break;
  464. }
  465. #ifndef _DEBUG
  466. if (bBlock) ////5秒未返回确认包,结束
  467. break;;
  468. #endif // _DEBUG
  469. auto cost_start = chrono::steady_clock::now();
  470. sql.Format("SELECT [acquisitiontime],[data0],[data1],[data2] "\
  471. "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
  472. "ORDER BY acquisitiontime ASC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
  473. tablename, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx, offset, limit);
  474. TRACE("%s\r\n", sql);
  475. int no = 0;
  476. TIMESTAMP_STRUCT ts;
  477. int sdata0, sdata1, sdata2;
  478. COdbcStatement stmt;
  479. if (CDBConnectPool::Instance()->DBQuery(stmt, sql) == FALSE)
  480. {
  481. CSimpleLog::Error("查询语句出错:" + sql);
  482. break;
  483. }
  484. int nCol = 1;
  485. stmt.BindTimeStampCol(nCol++, &ts);
  486. stmt.BindIntCol(nCol++, &sdata0);
  487. stmt.BindIntCol(nCol++, &sdata1);
  488. stmt.BindIntCol(nCol++, &sdata2);
  489. std::map<time_t, int> data0, data1, data2;
  490. do
  491. {
  492. if (stmt.FetchNext() != 0)
  493. break;
  494. no++;
  495. CTime ctTime;
  496. try
  497. {
  498. ctTime = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
  499. }
  500. catch (...)
  501. {
  502. continue;
  503. }
  504. time_t tm = ctTime.GetTime() * 1000 + ts.fraction / 1000000;
  505. data0[tm] = sdata0;
  506. data1[tm] = sdata1;
  507. data2[tm] = sdata2;
  508. } while (true);
  509. //10000 一次
  510. using namespace rapidjson;
  511. rapidjson::StringBuffer strBuf;
  512. Writer<StringBuffer> writer(strBuf);
  513. writer.StartObject();
  514. writer.Key("cmd");
  515. writer.String("query_hist");
  516. writer.Key("tag");
  517. writer.String((history_query->mo_mp + ".resist").c_str());
  518. writer.Key("time");
  519. writer.String("");
  520. writer.Key("data_fmt");
  521. writer.String("curve");
  522. writer.Key("unit");
  523. writer.String("N");
  524. writer.Key("data");
  525. writer.StartArray();
  526. //1号测力点
  527. writer.StartObject();
  528. writer.Key("name");
  529. writer.String(sz_utf_first);
  530. writer.Key("points");
  531. writer.StartArray();
  532. for (const auto& it : data0)
  533. {
  534. writer.StartObject();
  535. writer.Key("x");
  536. writer.Uint64(it.first);
  537. writer.Key("y");
  538. writer.Int(it.second);
  539. writer.EndObject();
  540. }
  541. writer.EndArray();
  542. writer.EndObject();
  543. //2号测力点
  544. writer.StartObject();
  545. writer.Key("name");
  546. writer.String(sz_utf_second);
  547. writer.Key("points");
  548. writer.StartArray();
  549. for (const auto& it : data1)
  550. {
  551. writer.StartObject();
  552. writer.Key("x");
  553. writer.Uint64(it.first);
  554. writer.Key("y");
  555. writer.Int(it.second);
  556. writer.EndObject();
  557. }
  558. writer.EndArray();
  559. writer.EndObject();
  560. //3号测力点
  561. writer.StartObject();
  562. writer.Key("name");
  563. writer.String(sz_utf_three);
  564. writer.Key("points");
  565. writer.StartArray();
  566. for (const auto& it : data2)
  567. {
  568. writer.StartObject();
  569. writer.Key("x");
  570. writer.Uint64(it.first);
  571. writer.Key("y");
  572. writer.Int(it.second);
  573. writer.EndObject();
  574. }
  575. writer.EndArray();
  576. writer.EndObject();
  577. writer.EndArray();
  578. auto cost_end = chrono::steady_clock::now();
  579. auto cost_dif = chrono::duration_cast<chrono::milliseconds>(cost_end - cost_start).count();
  580. writer.Key("cost");
  581. writer.String((to_string(cost_dif) + "ms").c_str());
  582. writer.EndObject();
  583. auto pData = strBuf.GetString();
  584. int len = strBuf.GetLength();
  585. if (bWork == false) break;
  586. memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
  587. auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
  588. auto cost_send_dif = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - cost_end).count();
  589. CSimpleLog::Info(("send " + history_query->mo_mp + ".resist hist data. read cost " + to_string(cost_dif) + "ms. send cost " + to_string(cost_send_dif) + "ms. send len :" + to_string(len)).c_str());
  590. //len 455214
  591. bBlock = true;
  592. if (ret < 0) break;
  593. if (bWork == false) break;
  594. offset += no;
  595. if (no != limit)
  596. {
  597. break;
  598. }
  599. } while (true);
  600. delete[] pSend;
  601. pSend = nullptr;
  602. return 0;
  603. }
  604. int per_session_data::SendHistResistDBForEcharts(LPHISTORY_QUERY history_query)
  605. {
  606. char sz_utf_first[100];
  607. char sz_utf_second[100];
  608. char sz_utf_three[100];
  609. string name1, name2, name3;
  610. CMonitorObjectMng::Instance()->GetNameByMoMp(history_query->mo_mp, name1, name2, name3);
  611. if (name1[0x00] == 0x00)
  612. gbk2utf8(sz_utf_first, 100, "1号测力曲线");
  613. else
  614. gbk2utf8(sz_utf_first, 100, name1.c_str());
  615. if (name2[0x00] == 0x00)
  616. gbk2utf8(sz_utf_second, 100, "2号测力曲线");
  617. else
  618. gbk2utf8(sz_utf_second, 100, name2.c_str());
  619. if (name3[0x00] == 0x00)
  620. gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
  621. else
  622. gbk2utf8(sz_utf_three, 100, name3.c_str());
  623. int offset = 0; int limit = 5000; //每次取出10000
  624. CTime ctStart(history_query->tmStart / 1000);
  625. CTime ctEnd(history_query->tmEnd / 1000);
  626. char tablename[50];
  627. char tablenameTom[50];
  628. SYSTEMTIME stStart;
  629. ctStart.GetAsSystemTime(stStart);
  630. sprintf_s(tablename, 50, "rm_resistance_%04d%02d%02d", stStart.wYear, stStart.wMonth, stStart.wDay);
  631. SYSTEMTIME stEnd;
  632. ctEnd.GetAsSystemTime(stEnd);
  633. sprintf_s(tablenameTom, 50, "rm_resistance_%04d%02d%02d", stEnd.wYear, stEnd.wMonth, stEnd.wDay);
  634. string strStartTime = ctStart.Format("%Y-%m-%d %H:%M:%S");
  635. string strEndTime = ctEnd.Format("%Y-%m-%d %H:%M:%S");
  636. uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
  637. bBlock = false;
  638. CString sql;
  639. do
  640. {
  641. static int n = 600;
  642. for (int i = 0; i < n; i++)
  643. {
  644. if (bWork == false) break;
  645. if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
  646. else break;
  647. }
  648. #ifndef _DEBUG
  649. if (bBlock) ////5秒未返回确认包,结束
  650. break;;
  651. #endif // _DEBUG
  652. auto cost_start = chrono::steady_clock::now();
  653. if (stStart.wDay == stEnd.wDay)
  654. {
  655. sql.Format("SELECT [acquisitiontime],[data0],[data1],[data2] "\
  656. "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
  657. "ORDER BY acquisitiontime ASC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
  658. tablename, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx, offset, limit);
  659. }
  660. else
  661. {
  662. sql.Format("SELECT [acquisitiontime],[data0],[data1],[data2] "\
  663. "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
  664. "UNION ALL "\
  665. "SELECT [acquisitiontime],[data0],[data1],[data2] "\
  666. "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
  667. "ORDER BY acquisitiontime ASC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
  668. tablename, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx,
  669. tablenameTom, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx,
  670. offset, limit);
  671. }
  672. TRACE("%s\r\n", sql);
  673. int no = 0;
  674. TIMESTAMP_STRUCT ts;
  675. int sdata0, sdata1, sdata2;
  676. COdbcStatement stmt;
  677. if (CDBConnectPool::Instance()->DBQuery(stmt, sql) == FALSE)
  678. {
  679. CSimpleLog::Error("查询语句出错:" + sql);
  680. break;
  681. }
  682. int nCol = 1;
  683. stmt.BindTimeStampCol(nCol++, &ts);
  684. stmt.BindIntCol(nCol++, &sdata0);
  685. stmt.BindIntCol(nCol++, &sdata1);
  686. stmt.BindIntCol(nCol++, &sdata2);
  687. std::map<time_t, int> data0, data1, data2;
  688. do
  689. {
  690. if (stmt.FetchNext() != 0)
  691. break;
  692. no++;
  693. CTime ctTime;
  694. try
  695. {
  696. ctTime = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
  697. }
  698. catch (...)
  699. {
  700. continue;
  701. }
  702. time_t tm = ctTime.GetTime() * 1000 + ts.fraction / 1000000;
  703. data0[tm] = sdata0;
  704. data1[tm] = sdata1;
  705. data2[tm] = sdata2;
  706. } while (true);
  707. //10000 一次
  708. using namespace rapidjson;
  709. rapidjson::StringBuffer strBuf;
  710. Writer<StringBuffer> writer(strBuf);
  711. writer.StartObject();
  712. writer.Key("cmd");
  713. writer.String("query_hist");
  714. writer.Key("tag");
  715. writer.String((history_query->mo_mp + ".resist").c_str());
  716. writer.Key("time");
  717. writer.String("");
  718. writer.Key("data_fmt");
  719. writer.String("curve");
  720. writer.Key("unit");
  721. writer.String("N");
  722. writer.Key("data");
  723. writer.StartArray();
  724. //1号测力点
  725. writer.StartObject();
  726. writer.Key("name");
  727. writer.String(sz_utf_first);
  728. writer.Key("points");
  729. writer.StartArray();
  730. for (const auto& it : data0)
  731. {
  732. if (INVALID_RESIST == it.second)
  733. continue;
  734. writer.StartArray();
  735. writer.Uint64(it.first);
  736. writer.Int(it.second);
  737. writer.EndArray();
  738. }
  739. writer.EndArray();
  740. writer.EndObject();
  741. //2号测力点
  742. writer.StartObject();
  743. writer.Key("name");
  744. writer.String(sz_utf_second);
  745. writer.Key("points");
  746. writer.StartArray();
  747. for (const auto& it : data1)
  748. {
  749. if (INVALID_RESIST == it.second)
  750. continue;
  751. writer.StartArray();
  752. writer.Uint64(it.first);
  753. writer.Int(it.second);
  754. writer.EndArray();
  755. }
  756. writer.EndArray();
  757. writer.EndObject();
  758. //3号测力点
  759. writer.StartObject();
  760. writer.Key("name");
  761. writer.String(sz_utf_three);
  762. writer.Key("points");
  763. writer.StartArray();
  764. for (const auto& it : data2)
  765. {
  766. if (INVALID_RESIST == it.second)
  767. continue;
  768. writer.StartArray();
  769. writer.Uint64(it.first);
  770. writer.Int(it.second);
  771. writer.EndArray();
  772. }
  773. writer.EndArray();
  774. writer.EndObject();
  775. writer.EndArray();
  776. auto cost_end = chrono::steady_clock::now();
  777. auto cost_dif = chrono::duration_cast<chrono::milliseconds>(cost_end - cost_start).count();
  778. writer.Key("cost");
  779. writer.String((to_string(cost_dif) + "ms").c_str());
  780. writer.EndObject();
  781. auto pData = strBuf.GetString();
  782. int len = strBuf.GetLength();
  783. if (bWork == false) break;
  784. memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
  785. auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
  786. auto cost_send_dif = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - cost_end).count();
  787. CSimpleLog::Info(("send " + history_query->mo_mp + ".resist hist data. read cost " + to_string(cost_dif) + "ms. send cost " + to_string(cost_send_dif) + "ms. send num :" + to_string(data0.size())).c_str());
  788. //len 335214
  789. bBlock = true;
  790. if (ret < 0) break;
  791. if (bWork == false) break;
  792. offset += no;
  793. if (no != limit)
  794. {
  795. break;
  796. }
  797. } while (true);
  798. delete[] pSend;
  799. pSend = nullptr;
  800. return 0;
  801. }
  802. //实时
  803. void CLWSServer::ThreadProcForQueryHist(LPHISTORY_QUERY history_query)
  804. {
  805. auto pDevice = CDeviceMng::Instance()->Find(history_query->imei);
  806. if (pDevice == nullptr) return;
  807. assert(pDevice);
  808. auto pService = CAppService::Instance()->GetLwsServer();
  809. if (pService == nullptr) return;
  810. //lock_guard<mutex> lock(pService->m_mtxSession);
  811. auto it = pService->m_mapLwsSession.find(history_query->wsi);
  812. if (it == pService->m_mapLwsSession.end()) return;
  813. if (history_query->idx == 0)
  814. it->second.SendHistResistForEcharts(history_query->wsi, history_query->mo_mp, history_query->tmStart, history_query->tmEnd, pDevice->map_resist_idx00, pDevice->map_resist_idx01, pDevice->map_resist_idx02);
  815. else if (history_query->idx == 1)
  816. it->second.SendHistResistForEcharts(history_query->wsi, history_query->mo_mp, history_query->tmStart, history_query->tmEnd, pDevice->map_resist_idx10, pDevice->map_resist_idx11, pDevice->map_resist_idx12);
  817. else if (history_query->idx == 2)
  818. it->second.SendHistResistForEcharts(history_query->wsi, history_query->mo_mp, history_query->tmStart, history_query->tmEnd, pDevice->map_resist_idx20, pDevice->map_resist_idx21, pDevice->map_resist_idx22);
  819. delete history_query;
  820. history_query = nullptr;
  821. }
  822. //历史
  823. void CLWSServer::ThreadProcForQueryHistDB(LPHISTORY_QUERY history_query)
  824. {
  825. auto pService = CAppService::Instance()->GetLwsServer();
  826. if (pService == nullptr) return;
  827. auto it = pService->m_mapLwsSession.find(history_query->wsi);
  828. if (it == pService->m_mapLwsSession.end()) return;
  829. it->second.SendHistResistDBForEcharts(history_query);
  830. delete history_query;
  831. history_query = nullptr;
  832. }
  833. void CLWSServer::ThreadProc(DWORD_PTR wparam, uint16_t port)
  834. {
  835. CLWSServer* pThis = (CLWSServer*)wparam;
  836. if (!pThis->m_work) return;
  837. ws_protocols[0].user = pThis;
  838. struct lws_context_creation_info ctx_info = { 0 };
  839. ctx_info.port = port;
  840. ctx_info.iface = NULL; // 在所有网络接口上监听
  841. ctx_info.protocols = ws_protocols;
  842. ctx_info.gid = -1;
  843. ctx_info.uid = -1;
  844. ctx_info.options = LWS_SERVER_OPTION_VALIDATE_UTF8;
  845. //SSL CA证书
  846. //ctx_info.ssl_ca_filepath = "../ca/ca-cert.pem";
  847. //ctx_info.ssl_cert_filepath = "./server-cert.pem";
  848. //ctx_info.ssl_private_key_filepath = "./server-key.pem";
  849. //ctx_info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
  850. //ctx_info.options |= LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT;
  851. struct lws_context* context = lws_create_context(&ctx_info);
  852. while (pThis->m_work) {
  853. lws_service(context, 100);
  854. this_thread::sleep_for(chrono::milliseconds(0));
  855. }
  856. lws_context_destroy(context);
  857. }
  858. CLWSServer::CLWSServer()
  859. {
  860. }
  861. CLWSServer::~CLWSServer()
  862. {
  863. }
  864. BOOL CLWSServer::Start(uint16_t port)
  865. {
  866. Stop();
  867. m_work = true;
  868. pBuffer = new CJDSPBuffer(10 * 1024 * 1024);
  869. if (pBuffer == nullptr) return false;
  870. m_pThread = new std::thread(ThreadProc, (DWORD_PTR)this, port);
  871. if (m_pThread == nullptr) return FALSE;
  872. return TRUE;
  873. }
  874. void CLWSServer::Stop()
  875. {
  876. m_work = false;
  877. if (m_pThread)
  878. {
  879. m_pThread->join();
  880. delete m_pThread;
  881. m_pThread = nullptr;
  882. }
  883. if (pBuffer)
  884. {
  885. delete (CJDSPBuffer*)pBuffer;
  886. pBuffer = nullptr;
  887. }
  888. }
  889. uint8_t g_send_buf[LWS_PRE + MAX_PAYLOAD_SIZE];
  890. uint8_t g_recv_buf[LWS_PRE + MAX_PAYLOAD_SIZE];
  891. BOOL CLWSServer::SendPackToALLClient(const uint8_t* data, int len, LWS_SEND_PACK_TYPE type /*= LWS_SEND_PACK_TYPE::LSPT_UNKOWN*/, lws_write_protocol protocol)
  892. {
  893. if (m_mapLwsSession.size() == 0) return TRUE;
  894. //filter
  895. {
  896. TRACE("send message:%s\n", (char*)data);
  897. CSimpleLog::Info((char*)data);
  898. lock_guard<mutex> lock(m_mtxSend);
  899. auto pSend = g_send_buf + LWS_PRE;
  900. uint8_t* pNew = nullptr;
  901. if (protocol == lws_write_protocol::LWS_WRITE_BINARY)
  902. {
  903. if (len > MAX_PAYLOAD_SIZE)
  904. {
  905. pNew = new uint8_t[len + LWS_PRE];
  906. pSend = pNew + LWS_PRE;
  907. }
  908. memcpy(pSend, data, len);
  909. lock_guard<mutex> lock(m_mtxSession);
  910. for (auto& it : m_mapLwsSession)
  911. {
  912. //订阅
  913. //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
  914. //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
  915. //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
  916. //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
  917. if (it.second.refer > 0)
  918. {
  919. int ret = lws_write(it.first, pSend, len - (int)1, protocol);
  920. if (ret <= 0)
  921. {
  922. it.second.send_fail_count++;
  923. }
  924. else
  925. {
  926. it.second.send_size += ret;
  927. it.second.send_count++;
  928. }
  929. }
  930. }
  931. }
  932. else if (protocol == lws_write_protocol::LWS_WRITE_TEXT)
  933. {
  934. assert(len * 2 < MAX_PAYLOAD_SIZE);
  935. if (len * 2 > MAX_PAYLOAD_SIZE)
  936. {
  937. pNew = new uint8_t[len * 2 + LWS_PRE];
  938. pSend = pNew + LWS_PRE;
  939. }
  940. int new_len = gbk2utf8((char*)pSend, len * 2, (const char*)data);
  941. lock_guard<mutex> lock(m_mtxSession);
  942. for (auto& it : m_mapLwsSession)
  943. {
  944. //订阅
  945. //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
  946. //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
  947. //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
  948. //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
  949. if (it.second.refer > 0)
  950. {
  951. int ret = lws_write(it.first, pSend, new_len - (int)1, protocol);
  952. if (ret <= 0)
  953. {
  954. it.second.send_fail_count++;
  955. }
  956. else
  957. {
  958. it.second.send_size += ret;
  959. it.second.send_count++;
  960. }
  961. }
  962. }
  963. }
  964. else
  965. {
  966. assert(0);
  967. }
  968. if (pNew)
  969. {
  970. delete[] pNew;
  971. pNew = nullptr;
  972. }
  973. }
  974. return FALSE;
  975. }
  976. BOOL CLWSServer::SendPackToALLClient_with_noEncode(const uint8_t* data, int len, LWS_SEND_PACK_TYPE type /*= LWS_SEND_PACK_TYPE::LSPT_UNKOWN*/, lws_write_protocol protocol /*= lws_write_protocol::LWS_WRITE_TEXT*/)
  977. {
  978. if (m_mapLwsSession.size() == 0) return TRUE;
  979. //filter
  980. {
  981. TRACE("send message:%s\n", (char*)data);
  982. CSimpleLog::Info((char*)data);
  983. lock_guard<mutex> lock(m_mtxSend);
  984. auto pSend = g_send_buf + LWS_PRE;
  985. uint8_t* pNew = nullptr;
  986. if (protocol == lws_write_protocol::LWS_WRITE_BINARY)
  987. {
  988. if (len > MAX_PAYLOAD_SIZE)
  989. {
  990. pNew = new uint8_t[len + LWS_PRE];
  991. pSend = pNew + LWS_PRE;
  992. }
  993. memcpy(pSend, data, len);
  994. lock_guard<mutex> lock(m_mtxSession);
  995. for (auto& it : m_mapLwsSession)
  996. {
  997. //订阅
  998. //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
  999. //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
  1000. //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
  1001. //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
  1002. if (it.second.refer > 0)
  1003. {
  1004. int ret = lws_write(it.first, pSend, len - (int)1, protocol);
  1005. if (ret <= 0)
  1006. {
  1007. it.second.send_fail_count++;
  1008. }
  1009. else
  1010. {
  1011. it.second.send_size += ret;
  1012. it.second.send_count++;
  1013. }
  1014. }
  1015. }
  1016. }
  1017. else if (protocol == lws_write_protocol::LWS_WRITE_TEXT)
  1018. {
  1019. assert(len <= MAX_PAYLOAD_SIZE);
  1020. if (len >= MAX_PAYLOAD_SIZE)
  1021. {
  1022. pNew = new uint8_t[len + LWS_PRE];
  1023. pSend = pNew + LWS_PRE;
  1024. }
  1025. memcpy(pSend, data, len);
  1026. lock_guard<mutex> lock(m_mtxSession);
  1027. for (auto& it : m_mapLwsSession)
  1028. {
  1029. //订阅
  1030. //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
  1031. //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
  1032. //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
  1033. //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
  1034. if (it.second.refer > 0)
  1035. {
  1036. int ret = lws_write(it.first, pSend, len, protocol);
  1037. if (ret <= 0)
  1038. {
  1039. it.second.send_fail_count++;
  1040. }
  1041. else
  1042. {
  1043. it.second.send_size += ret;
  1044. it.second.send_count++;
  1045. }
  1046. }
  1047. }
  1048. }
  1049. else
  1050. {
  1051. assert(0);
  1052. }
  1053. if (pNew)
  1054. {
  1055. delete[] pNew;
  1056. pNew = nullptr;
  1057. }
  1058. }
  1059. return FALSE;
  1060. }
  1061. int CLWSServer::GetLwsSessionNum()
  1062. {
  1063. return m_mapLwsSession.size();
  1064. }
  1065. void CLWSServer::Establishe(lws* wsi)
  1066. {
  1067. char ip[32];
  1068. lws_get_peer_simple(wsi, ip, 32);
  1069. char log[100];
  1070. sprintf_s(log, 100, "[前端]有新链接:%s", ip);
  1071. CSimpleLog::Info(log);
  1072. lock_guard<mutex> lock(m_mtxSession);
  1073. per_session_data& session_data = m_mapLwsSession[wsi];
  1074. session_data.refer++;
  1075. time(&session_data.tmConnect);
  1076. session_data.wsi = wsi;
  1077. session_data.context = lws_get_context(wsi);
  1078. memcpy(session_data.ip, ip, 32);
  1079. }
  1080. void CLWSServer::Close(lws* wsi)
  1081. {
  1082. m_mapLwsSession[wsi].refer--;
  1083. }
  1084. void CLWSServer::Destroy(lws* wsi)
  1085. {
  1086. char log[100] = { 0 };
  1087. {
  1088. lock_guard<mutex> lock(m_mtxSession);
  1089. auto it = m_mapLwsSession.find(wsi);
  1090. if (it != m_mapLwsSession.end())
  1091. {
  1092. sprintf_s(log, 100, "[前端]链接断开:%s", it->second.ip);
  1093. m_mapLwsSession.erase(it);
  1094. }
  1095. }
  1096. if (log[0] != 0x00) CSimpleLog::Info(log);
  1097. }
  1098. #include <rapidjson/document.h>
  1099. void CLWSServer::Recv(lws* wsi, void* in, size_t len)
  1100. {
  1101. // 判断是否二进制消息
  1102. char ip[32];
  1103. lws_get_peer_simple(wsi, ip, 32);
  1104. TRACE("%s\r\n", ip);
  1105. int bin = lws_frame_is_binary(wsi);
  1106. if (bin)
  1107. {
  1108. CSimpleLog::Info("[前端]收到二进制数据");
  1109. return;
  1110. }
  1111. if (len < 5) return;
  1112. if (((char*)in)[0x00] != '{') return;
  1113. using namespace rapidjson;
  1114. Document doc;
  1115. {
  1116. lock_guard<mutex> lock(m_mtxRecv);
  1117. int newjsonlen = utf82gbk((char*)g_recv_buf + LWS_PRE, MAX_PAYLOAD_SIZE, (char*)in, len) - 1;
  1118. TRACE("recv message : %s\n", (char*)g_recv_buf + LWS_PRE);
  1119. CSimpleLog::Info("recv:\r\n" + CString(g_recv_buf + LWS_PRE));
  1120. if (doc.Parse((char*)g_recv_buf + LWS_PRE, newjsonlen).HasParseError() || doc.HasMember("cmd") == false || doc["cmd"].IsString() == false)
  1121. {
  1122. //string result = "{ \"cmd\":\"error\",\"code\":400,\"msg\":\"400 JSON parse error.\"}";
  1123. //lock_guard<mutex> lock(m_mtxSend);
  1124. //memcpy(g_send_buf + LWS_PRE, result.c_str(), result.length() + 1);
  1125. //lws_write(wsi, g_send_buf + LWS_PRE, result.length(), LWS_WRITE_TEXT);
  1126. //CSimpleLog::Error("[前端]数据解析出错:" + CString((char*)g_recv_buf + LWS_PRE, newjsonlen) + ".");
  1127. return;
  1128. }
  1129. }
  1130. auto pTemp = new uint8_t[500]; //准备回包的数据
  1131. auto pData = pTemp + LWS_PRE;
  1132. auto cmd = doc["cmd"].GetString();
  1133. if (strcmp("heartbeat.ping", cmd) == 0)
  1134. {
  1135. SYSTEMTIME tm;
  1136. GetLocalTime(&tm);
  1137. sprintf_s((char*)pData, 200, "{\"cmd\":\"heartbeat.pong\",\"time\":\"%04d-%02d-%02d %02d:%02d:%02d.%03d\"}",
  1138. tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds);
  1139. lws_write(wsi, pData, strlen((char*)pData), LWS_WRITE_TEXT);
  1140. }
  1141. else if (strcmp("sub_notify", cmd) == 0)
  1142. {
  1143. string imei_idx;
  1144. auto code = HandleSubNotify(wsi, doc, imei_idx);
  1145. doc.AddMember("code", code, doc.GetAllocator());
  1146. StringBuffer buffer;
  1147. Writer<StringBuffer> writer(buffer);
  1148. doc.Accept(writer);
  1149. const char* output = buffer.GetString();
  1150. int len = buffer.GetLength();
  1151. memcpy(pData, output, len);
  1152. lws_write(wsi, pData, len, LWS_WRITE_TEXT);
  1153. }
  1154. else if (strcmp("unsub_notify", cmd) == 0)
  1155. {
  1156. auto code = HanldeUnsubNotify(wsi, doc);
  1157. doc.AddMember("code", code, doc.GetAllocator());
  1158. StringBuffer buffer;
  1159. Writer<StringBuffer> writer(buffer);
  1160. doc.Accept(writer);
  1161. const char* output = buffer.GetString();
  1162. int len = buffer.GetLength();
  1163. memcpy(pData, output, len);
  1164. lws_write(wsi, pData, len, LWS_WRITE_TEXT);
  1165. }
  1166. else if (strcmp("login", cmd) == 0)
  1167. {
  1168. auto code = HandleLogin(wsi, doc);
  1169. doc.AddMember("code", code, doc.GetAllocator());
  1170. StringBuffer buffer;
  1171. Writer<StringBuffer> writer(buffer);
  1172. doc.Accept(writer);
  1173. const char* output = buffer.GetString();
  1174. int len = buffer.GetLength();
  1175. memcpy(pData, output, len);
  1176. lws_write(wsi, pData, len, LWS_WRITE_TEXT);
  1177. //主动发送未处理报警
  1178. if (code == 200) SendUnAckAlarm(wsi);
  1179. }
  1180. else if (strcmp("query_alm_unack", cmd) == 0)
  1181. {
  1182. auto code = SendUnAckAlarm(wsi);
  1183. if (code != 200)
  1184. {
  1185. doc.AddMember("code", code, doc.GetAllocator());
  1186. StringBuffer buffer;
  1187. Writer<StringBuffer> writer(buffer);
  1188. doc.Accept(writer);
  1189. const char* output = buffer.GetString();
  1190. int len = buffer.GetLength();
  1191. memcpy(pData, output, len);
  1192. lws_write(wsi, pData, len, LWS_WRITE_TEXT);
  1193. }
  1194. }
  1195. else if (strcmp("query_hist", cmd) == 0)
  1196. {
  1197. //历史数据
  1198. auto code = HandleQueryHist(wsi, doc);
  1199. doc.AddMember("code", code, doc.GetAllocator());
  1200. StringBuffer buffer;
  1201. Writer<StringBuffer> writer(buffer);
  1202. doc.Accept(writer);
  1203. const char* output = buffer.GetString();
  1204. int len = buffer.GetLength();
  1205. memcpy(pData, output, len);
  1206. lws_write(wsi, pData, len, LWS_WRITE_TEXT);
  1207. }
  1208. else if (strcmp("query_hist_confirm", cmd) == 0)
  1209. {
  1210. auto code = HandleQueryHistConfirm(wsi, doc);
  1211. //string result = "{\"cmd\":\"query_hist_confirm\",\"code\":" + to_string(code) + ",\"msg\":\"\"}";
  1212. //memcpy(g_send_buf + LWS_PRE, result.c_str(), result.length() + 1);
  1213. //lws_write(wsi, g_send_buf + LWS_PRE, result.length(), LWS_WRITE_TEXT);
  1214. }
  1215. else if (strcmp("conf_read", cmd) == 0)//配置读取
  1216. {
  1217. auto code = HandleConfRead(wsi, doc);
  1218. if (code != 200)
  1219. {
  1220. string result = "{\"cmd\":\"conf_read\",\"code\":" + to_string(code) + ",\"msg\":\"\"}";
  1221. memcpy(pData, result.c_str(), result.length() + 1);
  1222. lws_write(wsi, pData, result.length(), LWS_WRITE_TEXT);
  1223. }
  1224. }
  1225. else if (strcmp("conf_write", cmd) == 0)
  1226. {
  1227. auto code = HandleConfWrite(wsi, doc);
  1228. rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
  1229. if (doc.HasMember("conf")) doc.RemoveMember("conf");
  1230. doc.AddMember("code", code, allocator);
  1231. StringBuffer buffer;
  1232. Writer<StringBuffer> writer(buffer);
  1233. doc.Accept(writer);
  1234. memcpy(pData, buffer.GetString(), buffer.GetLength());
  1235. lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
  1236. }
  1237. else if (strcmp("alm_ack", cmd) == 0)
  1238. {//报警受理
  1239. string ack_time, ack_name;
  1240. auto code = HandleAlarmAck(wsi, doc, ack_time, ack_name);
  1241. rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //获取分配器
  1242. if (code == 200 && ack_time.length())
  1243. {
  1244. {
  1245. Value str_value(kStringType);
  1246. str_value.SetString(ack_time.c_str(), ack_time.length());
  1247. doc.AddMember("ack_time", str_value, allocator);
  1248. }
  1249. {
  1250. Value str_value(kStringType);
  1251. char utf[50] = { 0 };
  1252. int len = gbk2utf8(utf, 50, ack_name.c_str()) - 1;
  1253. str_value.SetString(utf, len);
  1254. doc.AddMember("ack_name", str_value, allocator);
  1255. }
  1256. }
  1257. doc.AddMember("code", code, allocator);
  1258. StringBuffer buffer;
  1259. Writer<StringBuffer> writer(buffer);
  1260. doc.Accept(writer);
  1261. if (code == 200)
  1262. {
  1263. SendPackToALLClient_with_noEncode((uint8_t*)buffer.GetString(), buffer.GetLength());
  1264. }
  1265. else
  1266. {
  1267. memcpy(pData, buffer.GetString(), buffer.GetLength());
  1268. lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
  1269. }
  1270. }
  1271. else if (strcmp("alm_handle", cmd) == 0)
  1272. {
  1273. //报警受理
  1274. string handle_time, hanlde_info, handle_name;
  1275. auto code = HandleAlarmHandle(wsi, doc, handle_time, handle_name, hanlde_info);
  1276. rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //获取分配器
  1277. doc.RemoveMember("hanlde_info");
  1278. if (code == 200 && handle_time.length())
  1279. {
  1280. {
  1281. Value str_value(kStringType);
  1282. str_value.SetString(handle_time.c_str(), handle_time.length());
  1283. doc.AddMember("handle_time", str_value, allocator);
  1284. }
  1285. {
  1286. Value str_value(kStringType);
  1287. char utf[50] = { 0 };
  1288. int len = gbk2utf8(utf, 50, handle_name.c_str()) - 1;
  1289. str_value.SetString(utf, len);
  1290. doc.AddMember("handle_name", str_value, allocator);
  1291. }
  1292. {
  1293. Value str_value(kStringType);
  1294. char utf[250] = { 0 };
  1295. int len = gbk2utf8(utf, 250, hanlde_info.c_str()) - 1;
  1296. str_value.SetString(utf, len);
  1297. doc.AddMember("hanlde_info", str_value, allocator);
  1298. }
  1299. }
  1300. doc.AddMember("code", code, allocator);
  1301. StringBuffer buffer;
  1302. Writer<StringBuffer> writer(buffer);
  1303. doc.Accept(writer);
  1304. if (code == 200)
  1305. {
  1306. SendPackToALLClient_with_noEncode((uint8_t*)buffer.GetString(), buffer.GetLength());
  1307. }
  1308. else
  1309. {
  1310. memcpy(pData, buffer.GetString(), buffer.GetLength());
  1311. lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
  1312. }
  1313. }
  1314. else if (strcmp("sync", cmd) == 0)
  1315. {
  1316. int code = 200;
  1317. rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //获取分配器
  1318. {
  1319. lock_guard<mutex> lock(m_mtxSession);
  1320. per_session_data& session_data = m_mapLwsSession[wsi];
  1321. if (strstr(session_data.token, "AAAAAAAA") == nullptr)
  1322. {
  1323. code = 403;
  1324. doc.AddMember("code", code, allocator);
  1325. doc.AddMember("msg", "Forbidden ! Without Permission !", allocator);
  1326. }
  1327. }
  1328. //同步数据库数据
  1329. if (code == 200)
  1330. {
  1331. auto ret = CMonitorObjectMng::Instance()->LoadMonitorTree();
  1332. ret &= CMonitorObjectMng::Instance()->LoadHistoryData();
  1333. if (ret)
  1334. {
  1335. doc.AddMember("code", 200, allocator);
  1336. }
  1337. else
  1338. {
  1339. doc.AddMember("code", 500, allocator);
  1340. }
  1341. }
  1342. StringBuffer buffer;
  1343. Writer<StringBuffer> writer(buffer);
  1344. doc.Accept(writer);
  1345. memcpy(pData, buffer.GetString(), buffer.GetLength());
  1346. lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
  1347. }
  1348. else if (strcmp("new_data", cmd) == 0)
  1349. {
  1350. }
  1351. else
  1352. {
  1353. string result = "{ \"cmd\":\"unkonw_cmd\",\"msg\":\"403 not realizes .\"}";
  1354. memcpy(pData, result.c_str(), result.length() + 1);
  1355. lws_write(wsi, pData, result.length(), LWS_WRITE_TEXT);
  1356. CSimpleLog::Error(CString("[前端]数据解析未实现:"));
  1357. }
  1358. delete[] pTemp;
  1359. }
  1360. void CLWSServer::GetSessionDesc(std::map<DWORD_PTR, CString>& session_desc)
  1361. {
  1362. //for (auto& it : m_mapLwsSession)
  1363. //{
  1364. // session_desc[(DWORD_PTR)it.first].Format("%s[上线时间:%s]%s[已发送:%.3f MB]", it.second.ip,
  1365. // COleDateTime(it.second.tmConnect).Format("%Y-%m-%d %H:%M:%S"),
  1366. // (it.second.bSubBoltDetect & it.second.bSubRailGapDetect) ?
  1367. // "[已订阅所有]" :(
  1368. // (!it.second.bSubBoltDetect & !it.second.bSubRailGapDetect) ?
  1369. // "[未订阅]" :
  1370. // (it.second.bSubBoltDetect ? CString("[已订阅报警事件]") : CString("")) +
  1371. // (it.second.bSubRailGapDetect ? CString("[已订阅车牌检测]") : CString(""))
  1372. // ), it.second.send_size / 1024.0 / 1024.0);
  1373. //}
  1374. }
  1375. uint32_t CLWSServer::FindJsonPack(const char* CH, uint32_t len)
  1376. {
  1377. if (len <= 1 || CH[0] != '{') return 0;
  1378. uint32_t packlen = 0;
  1379. int first = 0, end = 0;
  1380. for (size_t i = 0; i < len; i++)
  1381. {
  1382. if (CH[i] == '{')
  1383. {
  1384. ++first;
  1385. }
  1386. else if (CH[i] == '}')
  1387. {
  1388. ++end;
  1389. if (first == end)
  1390. {
  1391. packlen = i + 1;
  1392. break;
  1393. }
  1394. }
  1395. }
  1396. return packlen;
  1397. }
  1398. int CLWSServer::HandleLogin(lws* wsi, rapidjson::Document& doc)
  1399. {
  1400. if (doc.HasMember("token") && doc["token"].IsString())
  1401. {
  1402. string token = doc["token"].GetString();
  1403. if (token.compare("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA") == 0)
  1404. {
  1405. lock_guard<mutex> lock(m_mtxSession);
  1406. auto it = m_mapLwsSession.find(wsi);
  1407. if (it == m_mapLwsSession.end()) return 500;
  1408. strncpy_s(it->second.token, 37, token.c_str(), token.length());
  1409. strncpy_s(it->second.username, sizeof(it->second.username), "系统管理员", strlen("系统管理员"));
  1410. strncpy_s(it->second.node, sizeof(it->second.node), "100000", strlen("100000"));
  1411. it->second.isLogin = true;
  1412. return 200;
  1413. }
  1414. CString sql;
  1415. sql.Format("SELECT username,node FROM rm_user WHERE token = '%s';", token.c_str());
  1416. COdbcStatement stmt;
  1417. if (FALSE == CDBConnectPool::Instance()->DBQuery(stmt, sql))
  1418. {
  1419. CSimpleLog::Error("[前端]查询语句出错:" + sql);
  1420. return 404;
  1421. }
  1422. char username[50];
  1423. char node[50];
  1424. int nCol = 1;
  1425. stmt.BindCharCol(nCol++, username, sizeof(username));
  1426. stmt.BindCharCol(nCol++, node, sizeof(node));
  1427. if (stmt.FetchNext() != 0) return 401;
  1428. lock_guard<mutex> lock(m_mtxSession);
  1429. auto it = m_mapLwsSession.find(wsi);
  1430. if (it == m_mapLwsSession.end()) return 500;
  1431. strncpy_s(it->second.token, 37, token.c_str(), token.length());
  1432. strncpy_s(it->second.username, sizeof(it->second.username), username, strlen(username));
  1433. strncpy_s(it->second.node, sizeof(it->second.node), node, strlen(node));
  1434. it->second.isLogin = true;
  1435. return 200;
  1436. }
  1437. else
  1438. {
  1439. return 400;
  1440. }
  1441. }
  1442. int CLWSServer::HandleSubNotify(lws* wsi, rapidjson::Document& doc, std::string& imei_idx)
  1443. {
  1444. if (doc.HasMember("tag") && doc["tag"].IsString())
  1445. {
  1446. string tag = doc["tag"].GetString();
  1447. int npos = tag.rfind('.');
  1448. string momp = tag.substr(0, npos);
  1449. string type = tag.substr(npos + 1);
  1450. if (type.compare("resist") == 0)
  1451. {
  1452. lock_guard<mutex> lock(m_mtxSession);
  1453. auto it = m_mapLwsSession.find(wsi);
  1454. if (it == m_mapLwsSession.end()) return 500;
  1455. //if (it->second.isLogin == FALSE) return 401;
  1456. if (!CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei_idx)) return 404;
  1457. it->second.m_lstSubReal.push_back(imei_idx);
  1458. return 200;
  1459. }
  1460. return 400;
  1461. }
  1462. else
  1463. {
  1464. return 400;
  1465. }
  1466. }
  1467. int CLWSServer::HanldeUnsubNotify(lws* wsi, rapidjson::Document& doc)
  1468. {
  1469. if (doc.HasMember("tag") && doc["tag"].IsString())
  1470. {
  1471. string tag = doc["tag"].GetString();
  1472. int npos = tag.rfind('.');
  1473. string momp = tag.substr(0, npos);
  1474. string type = tag.substr(npos + 1);
  1475. if (type.compare("resist") == 0)
  1476. {
  1477. lock_guard<mutex> lock(m_mtxSession);
  1478. auto it = m_mapLwsSession.find(wsi);
  1479. if (it == m_mapLwsSession.end()) return 500;
  1480. string imei_idx;
  1481. if (!CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei_idx)) return 404;
  1482. for (auto i = it->second.m_lstSubReal.begin(); i != it->second.m_lstSubReal.end();)
  1483. {
  1484. if ((*i).compare(imei_idx) == 0)
  1485. {
  1486. i = it->second.m_lstSubReal.erase(i);
  1487. continue;
  1488. }
  1489. i++;
  1490. }
  1491. return 200;
  1492. }
  1493. return 500;
  1494. }
  1495. else
  1496. {
  1497. return 400;
  1498. }
  1499. }
  1500. int CLWSServer::HandleQueryHist(lws* wsi, rapidjson::Document& doc)
  1501. {
  1502. if (doc.HasMember("tag") && doc["tag"].IsString())
  1503. {
  1504. string tag = doc["tag"].GetString();
  1505. int npos = tag.rfind('.');
  1506. string mo_mp = tag.substr(0, npos);
  1507. string type = tag.substr(npos + 1);
  1508. if (mo_mp.compare("undefined") == 0)
  1509. {
  1510. CSimpleLog::Error("[前端]收到未定义的请求");
  1511. return 401;
  1512. }
  1513. if (type.compare("resist") == 0) //阻力数据
  1514. {
  1515. CTime ctStart, ctEnd;
  1516. if (doc.HasMember("time") && doc["time"].IsString())
  1517. {
  1518. string query_time = doc["time"].GetString();
  1519. int pos = query_time.find('~');
  1520. if (pos == -1) return 400;
  1521. string start = query_time.substr(0, pos);
  1522. string end = query_time.substr(pos + 1);
  1523. try
  1524. {
  1525. int year, month, day, hour, minute, second;
  1526. sscanf_s(start.c_str(), "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
  1527. ctStart = CTime(year, month, day, hour, minute, second);
  1528. sscanf_s(end.c_str(), "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
  1529. ctEnd = CTime(year, month, day, hour, minute, second);
  1530. }
  1531. catch (CException* )
  1532. {
  1533. return 400;
  1534. }
  1535. }
  1536. else
  1537. {
  1538. return 400;
  1539. }
  1540. string imei_idx;
  1541. if (!CMonitorObjectMng::Instance()->MOMP2IMEI(mo_mp, imei_idx)) return 404;
  1542. string imei, idx;
  1543. if (!CMonitorObjectMng::Instance()->spiltByPoint(imei_idx, imei, idx)) return 400;
  1544. int index = atoi(idx.c_str());
  1545. auto pDevice = CDeviceMng::Instance()->Find(imei);
  1546. if (pDevice == nullptr) return 404;
  1547. lock_guard<mutex> lock(m_mtxSession);
  1548. auto it = m_mapLwsSession.find(wsi);
  1549. if (it == m_mapLwsSession.end()) return 500;
  1550. //if (it->second.isLogin == FALSE) return 401;
  1551. it->second.bWork = false;
  1552. if (it->second.thread_hist)
  1553. {
  1554. it->second.thread_hist->join();
  1555. delete it->second.thread_hist;
  1556. it->second.thread_hist = nullptr;
  1557. }
  1558. LPHISTORY_QUERY query_hist = new HISTORY_QUERY;
  1559. query_hist->idx = index;
  1560. query_hist->imei = imei;
  1561. query_hist->mo_mp = mo_mp;
  1562. time_t tmStart = ctStart.GetTime();
  1563. query_hist->tmStart = tmStart * 1000;
  1564. query_hist->tmEnd = ctEnd.GetTime() * 1000;
  1565. query_hist->type = "resist";
  1566. query_hist->wsi = wsi;
  1567. it->second.bWork = true;
  1568. time_t tmNow;
  1569. time(&tmNow);
  1570. if (tmStart < g_stStart - 7200 || tmNow - tmStart > MAX_SAVE_TIME / 1000)
  1571. {
  1572. //超过当天,赋值当天 临时
  1573. //auto end = CTime(ctStart.GetYear(), ctStart.GetMonth(), ctStart.GetDay(), 23, 59, 59);
  1574. //改为限定24小时
  1575. auto end = ctStart + CTimeSpan(1, 0, 0, 0);
  1576. if (ctEnd > end) query_hist->tmEnd = end.GetTime() * 1000;
  1577. it->second.thread_hist = new thread(CLWSServer::ThreadProcForQueryHistDB, query_hist);
  1578. }
  1579. else
  1580. {
  1581. //实时也改为限定24小时
  1582. auto end = ctStart + CTimeSpan(1, 0, 0, 0);
  1583. if (ctEnd > end) query_hist->tmEnd = end.GetTime() * 1000;
  1584. it->second.thread_hist = new thread(CLWSServer::ThreadProcForQueryHist, query_hist);
  1585. }
  1586. return 200;
  1587. }
  1588. return 400;
  1589. }
  1590. else
  1591. {
  1592. return 400;
  1593. }
  1594. }
  1595. int CLWSServer::HandleQueryHistConfirm(lws* wsi, rapidjson::Document& doc)
  1596. {
  1597. if (doc.HasMember("tag") && doc["tag"].IsString())
  1598. {
  1599. string tag = doc["tag"].GetString();
  1600. int npos = tag.rfind('.');
  1601. string momp = tag.substr(0, npos);
  1602. string type = tag.substr(npos + 1);
  1603. if (type.compare("resist") == 0)
  1604. {
  1605. lock_guard<mutex> lock(m_mtxSession);
  1606. auto it = m_mapLwsSession.find(wsi);
  1607. if (it == m_mapLwsSession.end()) return 500;
  1608. it->second.bBlock = false;
  1609. //string imei_idx;
  1610. //if (!CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei_idx)) return 404;
  1611. //for (auto i = it->second.m_lstSubReal.begin(); i != it->second.m_lstSubReal.end();)
  1612. //{
  1613. // if ((*i).compare(imei_idx) == 0)
  1614. // {
  1615. // i = it->second.m_lstSubReal.erase(i);
  1616. // continue;
  1617. // }
  1618. // i++;
  1619. //}
  1620. return 200;
  1621. }
  1622. return 500;
  1623. }
  1624. else
  1625. {
  1626. return 400;
  1627. }
  1628. }
  1629. int CLWSServer::HandleConfRead(lws* wsi, rapidjson::Document& doc)
  1630. {
  1631. //读取类型
  1632. if (doc.HasMember("type") == false || doc["type"].IsString() == false)
  1633. return 400;
  1634. if (doc.HasMember("tag") == false || doc["tag"].IsString() == false)
  1635. return 400;
  1636. string type = doc["type"].GetString();
  1637. string tag = doc["tag"].GetString();
  1638. using namespace rapidjson;
  1639. rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
  1640. if (type.compare("monitor.alarm.max_over_limit") == 0) //最大值超限
  1641. {
  1642. int nPos = tag.find('.');
  1643. if (nPos != -1)
  1644. {
  1645. auto mo = tag.substr(0, nPos);
  1646. int nPos2 = tag.find('.', nPos + 1);
  1647. if (nPos2 != -1)
  1648. {
  1649. auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
  1650. int nPos3 = tag.find('.', nPos2 + 1);
  1651. if (nPos3 != -1)
  1652. {
  1653. auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
  1654. if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
  1655. {
  1656. int nNo = atoi(no.c_str()) - 1;
  1657. auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT);
  1658. if (pBase)
  1659. {
  1660. string name1, name2, name3;
  1661. CMonitorObjectMng::Instance()->GetNameByMoMp(mo + "." + mp, name1, name2, name3);
  1662. assert(pBase->type == eZL_ALARMTYPE::MAX_OVER_LIMIT);
  1663. auto pInfo = (MAX_OVER_LIMIT_INFO*)pBase;
  1664. Value confArray(kArrayType);
  1665. Value confName(kObjectType);
  1666. confName.AddMember("name", "enable", allocator);
  1667. string enable = pInfo->enable ? "true" : "false";
  1668. Value str_value(kStringType);
  1669. str_value.SetString(enable.c_str(), enable.length());
  1670. confName.AddMember("val", str_value, allocator);
  1671. confArray.PushBack(confName, allocator);
  1672. string alarm, warn, f_alarm, f_warn;
  1673. Value label_name, label_name2;
  1674. if (pInfo->alarm_high_limit != SHORT_MAX)
  1675. {
  1676. Value confAlarmHigh(kObjectType);
  1677. if (nNo == 2) confAlarmHigh.AddMember("name", "d_alarm_high_limit", allocator);
  1678. else
  1679. {
  1680. confAlarmHigh.AddMember("name", "lock_alarm_high_limit", allocator);
  1681. if (nNo == 0)
  1682. {
  1683. label_name.SetString(name1.c_str(), name1.size());
  1684. confAlarmHigh.AddMember("label", label_name, allocator);
  1685. }
  1686. else if (nNo == 1)
  1687. {
  1688. label_name.SetString(name2.c_str(), name2.size());
  1689. confAlarmHigh.AddMember("label", label_name, allocator);
  1690. }
  1691. }
  1692. alarm = to_string(pInfo->alarm_high_limit);
  1693. Value alarm_value;
  1694. alarm_value.SetString(alarm.c_str(), alarm.size());
  1695. confAlarmHigh.AddMember("val", alarm_value, allocator);
  1696. confArray.PushBack(confAlarmHigh, allocator);
  1697. }
  1698. if (pInfo->warn_high_limit != SHORT_MAX)
  1699. {
  1700. Value confWarnHigh(kObjectType);
  1701. if (nNo == 2) confWarnHigh.AddMember("name", "d_warn_high_limit", allocator);
  1702. else
  1703. {
  1704. confWarnHigh.AddMember("name", "lock_warn_high_limit", allocator);
  1705. if (nNo == 0)
  1706. {
  1707. label_name2.SetString(name1.c_str(), name1.size());
  1708. confWarnHigh.AddMember("label", label_name2, allocator);
  1709. }
  1710. else if (nNo == 1)
  1711. {
  1712. label_name2.SetString(name2.c_str(), name2.size());
  1713. confWarnHigh.AddMember("label", label_name2, allocator);
  1714. }
  1715. }
  1716. warn = to_string(pInfo->warn_high_limit);
  1717. str_value.SetString(warn.c_str(), warn.length());
  1718. confWarnHigh.AddMember("val", str_value, allocator);
  1719. confArray.PushBack(confWarnHigh, allocator);
  1720. }
  1721. if (pInfo->f_alarm_high_limit != SHORT_MAX)
  1722. {
  1723. Value f_confAlarmHigh(kObjectType);
  1724. if (nNo == 2)f_confAlarmHigh.AddMember("name", "f_alarm_high_limit", allocator);
  1725. else f_confAlarmHigh.AddMember("name", "keep_alarm_high_limit", allocator);
  1726. f_alarm = to_string(pInfo->f_alarm_high_limit);
  1727. str_value.SetString(f_alarm.c_str(), f_alarm.length());
  1728. f_confAlarmHigh.AddMember("val", str_value, allocator);
  1729. confArray.PushBack(f_confAlarmHigh, allocator);
  1730. }
  1731. if (pInfo->f_warn_high_limit != SHORT_MAX)
  1732. {
  1733. Value f_confWarnHigh(kObjectType);
  1734. if (nNo == 2) f_confWarnHigh.AddMember("name", "f_warn_high_limit", allocator);
  1735. else f_confWarnHigh.AddMember("name", "keep_warn_high_limit", allocator);
  1736. f_warn = to_string(pInfo->f_warn_high_limit);
  1737. str_value.SetString(f_warn.c_str(), f_warn.length());
  1738. f_confWarnHigh.AddMember("val", str_value, allocator);
  1739. confArray.PushBack(f_confWarnHigh, allocator);
  1740. }
  1741. doc.AddMember("conf", confArray, allocator);
  1742. //生成字符串
  1743. StringBuffer buffer;
  1744. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  1745. doc.Accept(writer);
  1746. string str/* = ANSItoUTF8(buffer.GetString())*/;
  1747. //int len = str.GetLength();
  1748. //auto pData = buffer.GetString();
  1749. uint8_t* pSend = new uint8_t[LWS_PRE + str.length()];
  1750. memcpy(pSend + LWS_PRE, str.c_str(), str.length());
  1751. lws_write(wsi, pSend + LWS_PRE, str.length(), LWS_WRITE_TEXT);
  1752. delete[] pSend;
  1753. pSend = nullptr;
  1754. }
  1755. else
  1756. {
  1757. Value confArray(kArrayType);
  1758. doc.AddMember("conf", confArray, allocator);
  1759. //生成字符串
  1760. StringBuffer buffer;
  1761. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  1762. doc.Accept(writer);
  1763. int len = buffer.GetLength();
  1764. uint8_t* pSend = new uint8_t[LWS_PRE + len];
  1765. memcpy(pSend + LWS_PRE, buffer.GetString(), len);
  1766. lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
  1767. delete[] pSend;
  1768. pSend = nullptr;
  1769. }
  1770. return 200;
  1771. }
  1772. }
  1773. }
  1774. }
  1775. return 400;
  1776. }
  1777. else if (type.compare("monitor.resist.rename") == 0) //设置曲线别名
  1778. {
  1779. string name1, name2, name3;
  1780. CMonitorObjectMng::Instance()->GetNameByMoMp(tag, name1, name2, name3);
  1781. Value conf(kArrayType);
  1782. Value value(kStringType);
  1783. char utf[200];
  1784. if (name1.length())
  1785. {
  1786. int str_len = gbk2utf8(utf, 200, name1.c_str());
  1787. value.SetString(utf, str_len - 1, allocator);
  1788. }
  1789. else
  1790. {
  1791. int str_len = gbk2utf8(utf, 200,"1号测力曲线");
  1792. value.SetString(utf, str_len - 1, allocator);
  1793. }
  1794. conf.PushBack(value, allocator);
  1795. if (name2.length())
  1796. {
  1797. int str_len = gbk2utf8(utf, 200, name2.c_str());
  1798. value.SetString(utf, str_len - 1, allocator);
  1799. }
  1800. else
  1801. {
  1802. int str_len = gbk2utf8(utf, 200, "2号测力曲线");
  1803. value.SetString(utf, str_len - 1, allocator);
  1804. }
  1805. conf.PushBack(value, allocator);
  1806. if (name3.length())
  1807. {
  1808. int str_len = gbk2utf8(utf, 200, name3.c_str());
  1809. value.SetString(utf, str_len - 1, allocator);
  1810. }
  1811. else
  1812. {
  1813. int str_len = gbk2utf8(utf, 200, "转换阻力曲线");
  1814. value.SetString(utf, str_len - 1, allocator);
  1815. }
  1816. conf.PushBack(value, allocator);
  1817. doc.AddMember("conf", conf, allocator);
  1818. //生成字符串
  1819. StringBuffer buffer;
  1820. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  1821. doc.Accept(writer);
  1822. int len = buffer.GetLength();
  1823. uint8_t* pSend = new uint8_t[LWS_PRE + len];
  1824. memcpy(pSend + LWS_PRE, buffer.GetString(), len);
  1825. lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
  1826. delete[] pSend;
  1827. pSend = nullptr;
  1828. return 200;
  1829. }
  1830. else if (type.compare("monitor.switch_direct.rename") == 0)
  1831. {
  1832. string direct1, direct2;
  1833. CMonitorObjectMng::Instance()->GetDirectByMoMp(tag, direct1, direct2);
  1834. Value conf(kArrayType);
  1835. Value value(kStringType);
  1836. char utf[200];
  1837. int str_len = gbk2utf8(utf, 200, direct1.c_str());
  1838. value.SetString(utf, str_len - 1, allocator);
  1839. conf.PushBack(value, allocator);
  1840. str_len = gbk2utf8(utf, 200, direct2.c_str());
  1841. value.SetString(utf, str_len - 1, allocator);
  1842. conf.PushBack(value, allocator);
  1843. doc.AddMember("conf", conf, allocator);
  1844. //生成字符串
  1845. StringBuffer buffer;
  1846. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  1847. doc.Accept(writer);
  1848. int len = buffer.GetLength();
  1849. uint8_t* pSend = new uint8_t[LWS_PRE + len];
  1850. memcpy(pSend + LWS_PRE, buffer.GetString(), len);
  1851. lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
  1852. delete[] pSend;
  1853. pSend = nullptr;
  1854. return 200;
  1855. }
  1856. else if (type.compare("monitor.alarm.friction_over_limit") == 0){
  1857. int nPos = tag.find('.');
  1858. if (nPos != -1)
  1859. {
  1860. auto mo = tag.substr(0, nPos);
  1861. int nPos2 = tag.find('.', nPos + 1);
  1862. if (nPos2 != -1)
  1863. {
  1864. auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
  1865. int nPos3 = tag.find('.', nPos2 + 1);
  1866. if (nPos3 != -1)
  1867. {
  1868. auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
  1869. if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
  1870. {
  1871. int nNo = atoi(no.c_str()) - 1;
  1872. if (nNo != 2) return 400;
  1873. auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eZL_ALARMTYPE::FRICTION_OVER_LIMIT);
  1874. if (pBase)
  1875. {
  1876. assert(pBase->type == eZL_ALARMTYPE::FRICTION_OVER_LIMIT);
  1877. auto pInfo = (FRICTION_OVER_LIMIT_INFO*)pBase;
  1878. //换成 yyjson
  1879. auto res_doc = yyjson_mut_doc_new(nullptr);
  1880. auto res_obj = yyjson_mut_obj(res_doc);
  1881. yyjson_mut_doc_set_root(res_doc, res_obj);
  1882. yyjson_mut_obj_add_str(res_doc, res_obj, "cmd", "conf_read");
  1883. yyjson_mut_obj_add_str(res_doc, res_obj, "type", type.c_str());
  1884. yyjson_mut_obj_add_str(res_doc, res_obj, "tag", tag.c_str());
  1885. //conf
  1886. auto res_arr = yyjson_mut_arr(res_doc);
  1887. yyjson_mut_obj_add_val(res_doc, res_obj, "conf", res_arr);
  1888. {
  1889. auto obj = yyjson_mut_obj(res_doc);
  1890. yyjson_mut_obj_add_str(res_doc, obj, "name", "enable");
  1891. yyjson_mut_obj_add_str(res_doc, obj, "val", pInfo->enable ? "true" : "false");
  1892. yyjson_mut_arr_add_val(res_arr, obj);
  1893. }
  1894. {
  1895. auto obj = yyjson_mut_obj(res_doc);
  1896. yyjson_mut_obj_add_str(res_doc, obj, "name", "up_alarm_low_limit");
  1897. yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->up_alarm_low_limit).c_str());
  1898. yyjson_mut_arr_add_val(res_arr, obj);
  1899. }
  1900. {
  1901. auto obj = yyjson_mut_obj(res_doc);
  1902. yyjson_mut_obj_add_str(res_doc, obj, "name", "up_warn_low_limit");
  1903. yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->up_warn_low_limit).c_str());
  1904. yyjson_mut_arr_add_val(res_arr, obj);
  1905. }
  1906. {
  1907. auto obj = yyjson_mut_obj(res_doc);
  1908. yyjson_mut_obj_add_str(res_doc, obj, "name", "dw_alarm_high_limit");
  1909. yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->dw_alarm_high_limit).c_str());
  1910. yyjson_mut_arr_add_val(res_arr, obj);
  1911. }
  1912. {
  1913. auto obj = yyjson_mut_obj(res_doc);
  1914. yyjson_mut_obj_add_str(res_doc, obj, "name", "dw_warn_high_limit");
  1915. yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->dw_warn_high_limit).c_str());
  1916. yyjson_mut_arr_add_val(res_arr, obj);
  1917. }
  1918. size_t len = 0;
  1919. auto res_json = yyjson_mut_write(res_doc, YYJSON_WRITE_NOFLAG, &len);
  1920. ASSERT(res_json);
  1921. uint8_t* pSend = new uint8_t[LWS_PRE + len];
  1922. memcpy(pSend + LWS_PRE, res_json, len);
  1923. lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
  1924. delete[] pSend;
  1925. pSend = nullptr;
  1926. free((void*)res_json);
  1927. yyjson_mut_doc_free(res_doc);
  1928. }
  1929. else
  1930. {
  1931. Value confArray(kArrayType);
  1932. doc.AddMember("conf", confArray, allocator);
  1933. //生成字符串
  1934. StringBuffer buffer;
  1935. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  1936. doc.Accept(writer);
  1937. int len = buffer.GetLength();
  1938. uint8_t* pSend = new uint8_t[LWS_PRE + len];
  1939. memcpy(pSend + LWS_PRE, buffer.GetString(), len);
  1940. lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
  1941. delete[] pSend;
  1942. pSend = nullptr;
  1943. }
  1944. return 200;
  1945. }
  1946. }
  1947. }
  1948. }
  1949. return 400;
  1950. }
  1951. else
  1952. {
  1953. return 500;
  1954. }
  1955. }
  1956. int CLWSServer::HandleConfWrite(lws* wsi, rapidjson::Document& jsondoc)
  1957. {
  1958. //读取类型
  1959. if (jsondoc.HasMember("type") == false || jsondoc["type"].IsString() == false)
  1960. return 400;
  1961. if (jsondoc.HasMember("tag") == false || jsondoc["tag"].IsString() == false)
  1962. return 400;
  1963. if (jsondoc.HasMember("conf") == false || jsondoc["conf"].IsArray() == false)
  1964. return 400;
  1965. string type = jsondoc["type"].GetString();
  1966. string tag = jsondoc["tag"].GetString();
  1967. auto conf = jsondoc["conf"].GetArray();
  1968. using namespace rapidjson;
  1969. rapidjson::Document::AllocatorType &allocator = jsondoc.GetAllocator(); //获取分配器
  1970. if (type.compare("monitor.alarm.max_over_limit") == 0)
  1971. {
  1972. int nPos = tag.find('.');
  1973. if (nPos != -1)
  1974. {
  1975. auto mo = tag.substr(0, nPos);
  1976. int nPos2 = tag.find('.', nPos + 1);
  1977. if (nPos2 != -1)
  1978. {
  1979. auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
  1980. int nPos3 = tag.find('.', nPos2 + 1);
  1981. if (nPos3 != -1)
  1982. {
  1983. auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
  1984. if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
  1985. {
  1986. int nNo = atoi(no.c_str()) - 1;
  1987. bool enable = false;
  1988. short alarm = MAXSHORT, warn = MAXSHORT, f_alarm = MAXSHORT, f_warn = MAXSHORT;
  1989. for (SizeType i = 0; i < conf.Size(); i++)
  1990. {
  1991. if (conf[i].HasMember("name") && conf[i]["name"].IsString() && conf[i].HasMember("val") && conf[i]["val"].IsString())
  1992. {
  1993. string name = conf[i]["name"].GetString();
  1994. string val = conf[i]["val"].GetString();
  1995. if (name.compare("enable") == 0)
  1996. {
  1997. if (val.compare("false") == 0)
  1998. {
  1999. enable = false;
  2000. }
  2001. else
  2002. {
  2003. enable = true;
  2004. }
  2005. }
  2006. else if (name.compare("lock_alarm_high_limit") == 0)
  2007. {
  2008. alarm = atoi(val.c_str());
  2009. }
  2010. else if (name.compare("lock_warn_high_limit") == 0)
  2011. {
  2012. warn = atoi(val.c_str());
  2013. }
  2014. else if (name.compare("d_alarm_high_limit") == 0)
  2015. {
  2016. alarm = atoi(val.c_str());
  2017. }
  2018. else if (name.compare("d_warn_high_limit") == 0)
  2019. {
  2020. warn = atoi(val.c_str());
  2021. }
  2022. else if (name.compare("keep_alarm_high_limit") == 0)
  2023. {
  2024. f_alarm = atoi(val.c_str());
  2025. }
  2026. else if (name.compare("keep_warn_high_limit") == 0)
  2027. {
  2028. f_warn = atoi(val.c_str());
  2029. }
  2030. else if (name.compare("f_alarm_high_limit") == 0)
  2031. {
  2032. f_alarm = atoi(val.c_str());
  2033. }
  2034. else if (name.compare("f_warn_high_limit") == 0)
  2035. {
  2036. f_warn = atoi(val.c_str());
  2037. }
  2038. }
  2039. }
  2040. auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT);
  2041. auto pInfo = (MAX_OVER_LIMIT_INFO*)pBase;
  2042. if (pBase == nullptr) pInfo = new MAX_OVER_LIMIT_INFO;
  2043. pInfo->enable = enable;
  2044. pInfo->no = nNo;
  2045. pInfo->type = eZL_ALARMTYPE::MAX_OVER_LIMIT;
  2046. pInfo->alarm_high_limit = alarm;
  2047. pInfo->warn_high_limit = warn;
  2048. pInfo->f_alarm_high_limit = f_alarm;
  2049. pInfo->f_warn_high_limit = f_warn;
  2050. //生成字符串
  2051. Document doc;
  2052. doc.SetArray();
  2053. for (SizeType i = 0; i < conf.Size(); i++)
  2054. doc.PushBack(conf[i], allocator);
  2055. StringBuffer buffer;
  2056. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  2057. doc.Accept(writer);
  2058. if (pBase == nullptr)
  2059. {
  2060. auto ret = CResistAlarmMng::Instance()->Insert(mo, mp, nNo, (int)eZL_ALARMTYPE::MAX_OVER_LIMIT, pInfo);
  2061. assert(ret);
  2062. if (ret == false)
  2063. {
  2064. delete pInfo;
  2065. return 500;
  2066. }
  2067. //add
  2068. CString sql;
  2069. sql.Format("INSERT INTO [rm_alarm_set]([mo],[mp],[no],[type],[conf],[time]) VALUES ('%s','%s',%d,%d,'%s','%I64u')",
  2070. mo.c_str(), mp.c_str(), nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT, buffer.GetString(), 0);
  2071. if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
  2072. {
  2073. assert(0);
  2074. CSimpleLog::Error("语句执行失败" + sql);
  2075. return 500;
  2076. }
  2077. }
  2078. else
  2079. {
  2080. //update
  2081. CString sql;
  2082. sql.Format("update rm_alarm_set SET conf = '%s' WHERE mo = '%s' and mp = '%s' and no = %d and type = %d",
  2083. buffer.GetString(), mo.c_str(), mp.c_str(), nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT);
  2084. if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
  2085. {
  2086. assert(0);
  2087. CSimpleLog::Error("语句执行失败" + sql);
  2088. return 500;
  2089. }
  2090. }
  2091. return 200;
  2092. }
  2093. }
  2094. }
  2095. }
  2096. return 400;
  2097. }
  2098. else if (type.compare("monitor.resist.rename") == 0)
  2099. {
  2100. if (conf.Size() != 3) return 400;
  2101. int nPos = tag.find('.');
  2102. if (nPos != -1)
  2103. {
  2104. auto mo = tag.substr(0, nPos);
  2105. auto mp = tag.substr(nPos + 1, tag.length() - nPos - 1);
  2106. string name1, name2, name3;
  2107. //update
  2108. name1 = conf[0].GetString();
  2109. name2 = conf[1].GetString();
  2110. name3 = conf[2].GetString();
  2111. CMonitorObjectMng::Instance()->SetNameByMoMp(tag, name1, name2, name3);
  2112. //save
  2113. CString sql;
  2114. sql.Format("update rm_map set name1='%s',name2='%s',name3='%s' where mo = '%s' and mp = '%s';",
  2115. name1.c_str(), name2.c_str(), name3.c_str(), mo.c_str(), mp.c_str());
  2116. auto ret = CDBConnectPool::Instance()->DBExecuteSQL(sql);
  2117. if (false == ret)
  2118. {
  2119. CSimpleLog::Error("语句执行错误." + sql);
  2120. return 500;
  2121. }
  2122. return 200;
  2123. }
  2124. return 400;
  2125. }
  2126. else if (type.compare("monitor.switch_direct.rename") == 0)
  2127. {
  2128. if (conf.Size() != 2) return 400;
  2129. int nPos = tag.find('.');
  2130. if (nPos != -1)
  2131. {
  2132. auto mo = tag.substr(0, nPos);
  2133. auto mp = tag.substr(nPos + 1, tag.length() - nPos - 1);
  2134. string direct1, direct2;
  2135. //update
  2136. direct1 = conf[0].GetString();
  2137. direct2 = conf[1].GetString();
  2138. CMonitorObjectMng::Instance()->SetDirectByMoMp(tag, direct1, direct2);
  2139. //save
  2140. CString sql;
  2141. sql.Format("update rm_map set direct1='%s',direct2='%s' where mo = '%s' and mp = '%s';",
  2142. direct1.c_str(), direct2.c_str(), mo.c_str(), mp.c_str());
  2143. auto ret = CDBConnectPool::Instance()->DBExecuteSQL(sql);
  2144. if (false == ret)
  2145. {
  2146. CSimpleLog::Error("语句执行错误." + sql);
  2147. return 500;
  2148. }
  2149. return 200;
  2150. }
  2151. return 400;
  2152. }
  2153. else if (type.compare("monitor.alarm.friction_over_limit") == 0)
  2154. {
  2155. auto eType = eZL_ALARMTYPE::FRICTION_OVER_LIMIT;
  2156. int nPos = tag.find('.');
  2157. if (nPos != -1)
  2158. {
  2159. auto mo = tag.substr(0, nPos);
  2160. int nPos2 = tag.find('.', nPos + 1);
  2161. if (nPos2 != -1)
  2162. {
  2163. auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
  2164. int nPos3 = tag.find('.', nPos2 + 1);
  2165. if (nPos3 != -1)
  2166. {
  2167. auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
  2168. if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
  2169. {
  2170. int nNo = atoi(no.c_str()) - 1;
  2171. if (nNo != 2) return 400;
  2172. bool enable = false;
  2173. int up_alarm_low_limit = INT_MAX;
  2174. int up_warn_low_limit = INT_MAX;
  2175. int dw_alarm_high_limit = INT_MIN;
  2176. int dw_warn_high_limit = INT_MIN;
  2177. for (SizeType i = 0; i < conf.Size(); i++)
  2178. {
  2179. if (conf[i].HasMember("name") && conf[i]["name"].IsString() && conf[i].HasMember("val") && conf[i]["val"].IsString())
  2180. {
  2181. string name = conf[i]["name"].GetString();
  2182. string val = conf[i]["val"].GetString();
  2183. if (name.compare("enable") == 0)
  2184. {
  2185. if (val.compare("false") == 0)
  2186. {
  2187. enable = false;
  2188. }
  2189. else
  2190. {
  2191. enable = true;
  2192. }
  2193. }
  2194. else if (name.compare("up_alarm_low_limit") == 0)
  2195. {
  2196. up_alarm_low_limit = atoi(val.c_str());
  2197. }
  2198. else if (name.compare("up_warn_low_limit") == 0)
  2199. {
  2200. up_warn_low_limit = atoi(val.c_str());
  2201. }
  2202. else if (name.compare("dw_alarm_high_limit") == 0)
  2203. {
  2204. dw_alarm_high_limit = atoi(val.c_str());
  2205. }
  2206. else if (name.compare("dw_warn_high_limit") == 0)
  2207. {
  2208. dw_warn_high_limit = atoi(val.c_str());
  2209. }
  2210. }
  2211. }
  2212. auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eType);
  2213. auto pInfo = (FRICTION_OVER_LIMIT_INFO*)pBase;
  2214. if (pBase == nullptr) pInfo = new FRICTION_OVER_LIMIT_INFO;
  2215. pInfo->enable = enable;
  2216. pInfo->no = nNo;
  2217. pInfo->type = eType;
  2218. pInfo->up_alarm_low_limit = up_alarm_low_limit;
  2219. pInfo->up_warn_low_limit = up_warn_low_limit;
  2220. pInfo->dw_alarm_high_limit = dw_alarm_high_limit;
  2221. pInfo->dw_warn_high_limit = dw_warn_high_limit;
  2222. //生成字符串
  2223. Document doc;
  2224. doc.SetArray();
  2225. for (SizeType i = 0; i < conf.Size(); i++)
  2226. doc.PushBack(conf[i], allocator);
  2227. StringBuffer buffer;
  2228. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  2229. doc.Accept(writer);
  2230. if (pBase == nullptr)
  2231. {
  2232. auto ret = CResistAlarmMng::Instance()->Insert(mo, mp, nNo, (int)eType, pInfo);
  2233. assert(ret);
  2234. if (ret == false)
  2235. {
  2236. delete pInfo;
  2237. return 500;
  2238. }
  2239. //add
  2240. CString sql;
  2241. sql.Format("INSERT INTO [rm_alarm_set]([mo],[mp],[no],[type],[conf],[time]) VALUES ('%s','%s',%d,%d,'%s','%I64u')",
  2242. mo.c_str(), mp.c_str(), nNo, eType, buffer.GetString(), 0);
  2243. if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
  2244. {
  2245. ASSERT(0);
  2246. CSimpleLog::Error("语句执行失败" + sql);
  2247. return 500;
  2248. }
  2249. }
  2250. else
  2251. {
  2252. //update
  2253. CString sql;
  2254. sql.Format("update rm_alarm_set SET conf = '%s' WHERE mo = '%s' and mp = '%s' and no = %d and type = %d",
  2255. buffer.GetString(), mo.c_str(), mp.c_str(), nNo, eType);
  2256. if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
  2257. {
  2258. ASSERT(0);
  2259. CSimpleLog::Error("语句执行失败" + sql);
  2260. return 500;
  2261. }
  2262. }
  2263. return 200;
  2264. }
  2265. }
  2266. }
  2267. }
  2268. return 400;
  2269. }
  2270. return 500;
  2271. }
  2272. int CLWSServer::HandleAlarmAck(lws* wsi, rapidjson::Document& jsondoc, std::string& ack_time, std::string& handle_name)
  2273. {
  2274. if (jsondoc.HasMember("alarm_id") == false || jsondoc["alarm_id"].IsNumber() == false)
  2275. return 400;
  2276. {
  2277. lock_guard<mutex> lock(m_mtxSession);
  2278. auto it = m_mapLwsSession.find(wsi);
  2279. if (it != m_mapLwsSession.end())
  2280. {
  2281. handle_name = it->second.username;
  2282. }
  2283. }
  2284. SYSTEMTIME stOccr_time;
  2285. int alarm_id = jsondoc["alarm_id"].GetInt();
  2286. {
  2287. CTime ctNow = CTime::GetCurrentTime();
  2288. //删除内存数据
  2289. bool ret = CResistAlarmMng::Instance()->AckAlarm(alarm_id, handle_name, ctNow);
  2290. //更新数据库
  2291. {
  2292. ack_time = ctNow.Format("%Y-%m-%d %H:%M:%S");
  2293. CString sql;
  2294. sql.Format("UPDATE [rm_alarm] SET ack_result = 1, ack_name='%s', ack_time='%s' WHERE ID = %d;",
  2295. handle_name.c_str(), ack_time.c_str(), alarm_id);
  2296. ret |= CDBConnectPool::Instance()->DBExecuteSQL(sql);
  2297. }
  2298. if (ret) return 200;
  2299. return 400;
  2300. }
  2301. return 500;
  2302. }
  2303. int CLWSServer::HandleAlarmHandle(lws* wsi, rapidjson::Document& jsondoc, std::string& ack_time, std::string& handle_name, std::string& hanlde_info)
  2304. {
  2305. //读取类型
  2306. //if (jsondoc.HasMember("type") == false || jsondoc["type"].IsString() == false)
  2307. // return 400;
  2308. //if (jsondoc.HasMember("tag") == false || jsondoc["tag"].IsString() == false)
  2309. // return 400;
  2310. if (jsondoc.HasMember("alarm_id") == false || jsondoc["alarm_id"].IsNumber() == false)
  2311. return 400;
  2312. SYSTEMTIME stOccr_time;
  2313. //string type = jsondoc["type"].GetString();
  2314. //string tag = jsondoc["tag"].GetString();
  2315. int alarm_id = jsondoc["alarm_id"].GetInt();
  2316. if (jsondoc.HasMember("hanlde_info") && jsondoc["hanlde_info"].IsString())
  2317. hanlde_info = UTF8toANSI(jsondoc["hanlde_info"].GetString());
  2318. {
  2319. lock_guard<mutex> lock(m_mtxSession);
  2320. auto it = m_mapLwsSession.find(wsi);
  2321. if (it != m_mapLwsSession.end())
  2322. {
  2323. handle_name = it->second.username;
  2324. }
  2325. }
  2326. //if (type.compare("monitor.alarm.max_over_limit") == 0)
  2327. {
  2328. CTime ctNow = CTime::GetCurrentTime();
  2329. //删除内存数据
  2330. bool ret = CResistAlarmMng::Instance()->HandleAlarm(alarm_id);
  2331. //更新数据库
  2332. {
  2333. ack_time = ctNow.Format("%Y-%m-%d %H:%M:%S");
  2334. CString sql;
  2335. sql.Format("UPDATE [rm_alarm] SET handle_result = 1, handle_name='%s', handle_time='%s', handle_info='%s' WHERE ID = %d;",
  2336. handle_name.c_str(), ack_time.c_str(), hanlde_info.c_str(), alarm_id);
  2337. ret |= CDBConnectPool::Instance()->DBExecuteSQL(sql);
  2338. }
  2339. if (ret) return 200;
  2340. return 400;
  2341. }
  2342. return 500;
  2343. }
  2344. void CLWSServer::SendRealResistData(const string& imei_idx, const int num,
  2345. const vector<int>& vctData0, const vector<int>& vctData1, const vector<int>& vctData2,
  2346. const vector<bool>& vctResult, const CTime& atime)
  2347. {
  2348. if (m_mapLwsSession.size() == 0) return;
  2349. bool bSub = false;
  2350. {
  2351. lock_guard<mutex> lock(m_mtxSession);
  2352. for (const auto& it :m_mapLwsSession)
  2353. {
  2354. if (strstr(it.second.token, "BBBBBBBB"))
  2355. {
  2356. bSub = true;
  2357. break;
  2358. }
  2359. //if (it.second.isLogin == false) continue;
  2360. for (const auto& ik : it.second.m_lstSubReal)
  2361. {
  2362. if (ik.compare(imei_idx) == 0)
  2363. {
  2364. bSub = true;
  2365. break;
  2366. }
  2367. }
  2368. if (bSub) break;
  2369. }
  2370. }
  2371. //所有客户端都未订阅
  2372. if (!bSub) return;
  2373. string mo_mp;
  2374. auto ret = CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp);
  2375. assert(ret);
  2376. if (false == ret)
  2377. {
  2378. CString strLog;
  2379. strLog.Format("imei(%s) 转换成 mo, mp 失败.请检测是否绑定.%s:%d", imei_idx.c_str(), __FUNCTION__, __LINE__);
  2380. CSimpleLog::Error(strLog);
  2381. }
  2382. rapidjson::StringBuffer strBuf;
  2383. GeneralResistData(mo_mp, num, 0, vctData0, vctData1, vctData2, vctResult, atime, strBuf);
  2384. string strSend = strBuf.GetString();
  2385. lock_guard<mutex> lock(m_mtxSend);
  2386. memcpy_s(g_send_buf + LWS_PRE, MAX_PAYLOAD_SIZE, strSend.c_str(), strSend.length());
  2387. lock_guard<mutex> lock2(m_mtxSession);
  2388. for (const auto& it : m_mapLwsSession)
  2389. {
  2390. bSub = false;
  2391. //if (it.second.isLogin == false) continue;
  2392. if (strstr(it.second.token, "BBBBBBBB"))
  2393. {
  2394. bSub = true;
  2395. }
  2396. else
  2397. {
  2398. for (const auto& ik : it.second.m_lstSubReal)
  2399. {
  2400. if (ik.compare(imei_idx) == 0)
  2401. {
  2402. bSub = true;
  2403. break;
  2404. }
  2405. }
  2406. }
  2407. if (bSub)
  2408. {
  2409. lws_write(it.first, g_send_buf + LWS_PRE, strSend.length(), LWS_WRITE_TEXT);
  2410. }
  2411. }
  2412. }
  2413. void CLWSServer::SendHumiTemp(const char* imei, const COleDateTime& dt, int humi, int temp)
  2414. {
  2415. if (m_mapLwsSession.size() == 0) return;
  2416. bool bSub = false;
  2417. {
  2418. lock_guard<mutex> lock(m_mtxSession);
  2419. for (const auto& it : m_mapLwsSession)
  2420. {
  2421. if (strstr(it.second.token, "BBBBBBBB"))
  2422. {
  2423. bSub = true;
  2424. break;
  2425. }
  2426. if (bSub) break;
  2427. }
  2428. }
  2429. //所有客户端都未订阅
  2430. if (!bSub) return;
  2431. auto doc = yyjson_mut_doc_new(nullptr);
  2432. auto root = yyjson_mut_obj(doc);
  2433. yyjson_mut_doc_set_root(doc, root);
  2434. yyjson_mut_obj_add_str(doc, root, "cmd", "new_data_notify");
  2435. yyjson_mut_obj_add_strcpy(doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
  2436. yyjson_mut_obj_add_int(doc, root, "humi", humi / 100);
  2437. yyjson_mut_obj_add_int(doc, root, "temp", temp);
  2438. string imei_idx = string(imei) + ".0";
  2439. string mo_mp;
  2440. if (CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp))
  2441. {
  2442. yyjson_mut_obj_add_strcpy(doc, root, "tag", (mo_mp + ".humi_temp").c_str());
  2443. size_t len;
  2444. auto json = yyjson_mut_write(doc, 0, &len);
  2445. if (json)
  2446. {
  2447. auto pTemp = new uint8_t[300];
  2448. auto pData = pTemp + LWS_PRE;
  2449. {
  2450. lock_guard<mutex> lock(m_mtxSession);
  2451. memcpy_s(pData, MAX_PAYLOAD_SIZE, json, len);
  2452. for (const auto& it : m_mapLwsSession)
  2453. {
  2454. if (strstr(it.second.token, "BBBBBBBB"))
  2455. {
  2456. lws_write(it.first, pData, len, LWS_WRITE_TEXT);
  2457. }
  2458. }
  2459. }
  2460. delete[] pTemp;
  2461. free((void*)json);
  2462. }
  2463. }
  2464. imei_idx = string(imei) + ".1";
  2465. if (CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp))
  2466. {
  2467. yyjson_mut_obj_remove_str(root, "tag");
  2468. yyjson_mut_obj_add_strcpy(doc, root, "tag", (mo_mp + ".humi_temp").c_str());
  2469. size_t len;
  2470. auto json = yyjson_mut_write(doc, 0, &len);
  2471. if (json)
  2472. {
  2473. auto pTemp = new uint8_t[200];
  2474. auto pData = pTemp + LWS_PRE;
  2475. memcpy_s(pData, 200 - LWS_PRE, json, len);
  2476. {
  2477. lock_guard<mutex> lock(m_mtxSession);
  2478. for (const auto& it : m_mapLwsSession)
  2479. {
  2480. if (strstr(it.second.token, "BBBBBBBB"))
  2481. {
  2482. lws_write(it.first, pData, len, LWS_WRITE_TEXT);
  2483. }
  2484. }
  2485. }
  2486. delete[] pTemp;
  2487. free((void*)json);
  2488. }
  2489. }
  2490. imei_idx = string(imei) + ".2";
  2491. if (CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp))
  2492. {
  2493. yyjson_mut_obj_remove_str(root, "tag");
  2494. yyjson_mut_obj_add_strcpy(doc, root, "tag", (mo_mp + ".humi_temp").c_str());
  2495. size_t len;
  2496. auto json = yyjson_mut_write(doc, 0, &len);
  2497. if (json)
  2498. {
  2499. auto pTemp = new uint8_t[200];
  2500. auto pData = pTemp + LWS_PRE;
  2501. {
  2502. memcpy_s(pData, MAX_PAYLOAD_SIZE, json, len);
  2503. lock_guard<mutex> lock(m_mtxSession);
  2504. for (const auto& it : m_mapLwsSession)
  2505. {
  2506. if (strstr(it.second.token, "BBBBBBBB"))
  2507. {
  2508. lws_write(it.first, pData, len, LWS_WRITE_TEXT);
  2509. }
  2510. }
  2511. }
  2512. delete[] pTemp;
  2513. free((void*)json);
  2514. }
  2515. }
  2516. yyjson_mut_doc_free(doc);
  2517. }
  2518. int CLWSServer::SendUnAckAlarm(lws* wsi)
  2519. {
  2520. {
  2521. lock_guard<mutex> lock(m_mtxSession);
  2522. auto ik = m_mapLwsSession.find(wsi);
  2523. if (ik == m_mapLwsSession.end()) return 500;
  2524. if (ik->second.isLogin == false) return 401;
  2525. }{
  2526. uint8_t data[4096 + LWS_PRE];
  2527. lock_guard<mutex> lock(CResistAlarmMng::Instance()->m_mtxAlarm);
  2528. auto it = CResistAlarmMng::Instance()->m_lstUnConfirmAlarm.crbegin();
  2529. for (int i = 0; i < 10 && it != CResistAlarmMng::Instance()->m_lstUnConfirmAlarm.crend(); i++, it++)
  2530. {
  2531. auto& pAlarmInfo = *it;
  2532. //TODO 根据用户过滤
  2533. rapidjson::StringBuffer buffer;
  2534. auto ret = CResistAlarmMng::AlarmInfo2Pack(pAlarmInfo, buffer);
  2535. const char* output = buffer.GetString();
  2536. int len = buffer.GetLength();
  2537. memcpy_s(data + LWS_PRE, 4096, output, len);
  2538. auto sendlen = lws_write(wsi, data + LWS_PRE, len, LWS_WRITE_TEXT);
  2539. if (sendlen <= 0) return 500;
  2540. }
  2541. }
  2542. return 200;
  2543. }
  2544. bool CLWSServer::GeneralResistData(const string mo_mp, const int num, const int index, const std::vector<int>& vctData0,
  2545. const std::vector<int>& vctData1, const std::vector<int>& vctData2, const vector<bool>& vctResult, const CTime& atime, rapidjson::StringBuffer& strBuf)
  2546. {
  2547. char sz_utf_first[100];
  2548. char sz_utf_second[100];
  2549. char sz_utf_three[100];
  2550. string name1, name2, name3;
  2551. CMonitorObjectMng::Instance()->GetNameByMoMp(mo_mp, name1, name2, name3);
  2552. if (name1[0x00] == 0x00)
  2553. gbk2utf8(sz_utf_first, 100, "1号测力曲线");
  2554. else
  2555. gbk2utf8(sz_utf_first, 100, name1.c_str());
  2556. if (name2[0x00] == 0x00)
  2557. gbk2utf8(sz_utf_second, 100, "2号测力曲线");
  2558. else
  2559. gbk2utf8(sz_utf_second, 100, name2.c_str());
  2560. if (name3[0x00] == 0x00)
  2561. gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
  2562. else
  2563. gbk2utf8(sz_utf_three, 100, name3.c_str());
  2564. int step = 1000 / num;
  2565. uint64_t utime_t = atime.GetTime() * 1000;
  2566. string up, momp_name;
  2567. CMonitorObjectMng::Instance()->GetStationNameByMomP(mo_mp, up, momp_name);
  2568. using namespace rapidjson;
  2569. Writer<StringBuffer> writer(strBuf);
  2570. writer.StartObject();
  2571. writer.Key("cmd");
  2572. writer.String("new_data_notify");
  2573. writer.Key("tag");
  2574. //sprintf_s(szInfo, 256, "%s.resist", mo_mp.c_str());
  2575. //gbk2utf8(sz_utf, 412, szInfo);
  2576. writer.String((mo_mp + ".resist").c_str());
  2577. writer.Key("up");
  2578. writer.String(ANSItoUTF8(up).c_str());
  2579. writer.Key("tag_name");
  2580. writer.String(ANSItoUTF8(momp_name).c_str());
  2581. writer.Key("time");
  2582. writer.String("");
  2583. writer.Key("data_fmt");
  2584. writer.String("curve");
  2585. writer.Key("unit");
  2586. writer.String("N");
  2587. writer.Key("data");
  2588. writer.StartArray();
  2589. //1号测力点
  2590. writer.StartObject();
  2591. writer.Key("name");
  2592. writer.String(sz_utf_first);
  2593. writer.Key("points");
  2594. writer.StartArray();
  2595. for (int i = 0; i < num; i++)
  2596. {
  2597. if (vctResult[i] == false) continue;
  2598. if (vctData0[i] == INVALID_RESIST) continue;
  2599. writer.StartArray();
  2600. writer.Uint64(utime_t + step* i);
  2601. writer.Int(vctData0[i]);
  2602. writer.EndArray();
  2603. }
  2604. writer.EndArray();
  2605. writer.EndObject();
  2606. //2号测力点
  2607. writer.StartObject();
  2608. writer.Key("name");
  2609. writer.String(sz_utf_second);
  2610. writer.Key("points");
  2611. writer.StartArray();
  2612. for (int i = 0; i < num; i++)
  2613. {
  2614. if (vctResult[i] == false) continue;
  2615. if (vctData1[i] == INVALID_RESIST) continue;
  2616. writer.StartArray();
  2617. writer.Uint64(utime_t + step* i);
  2618. writer.Int(vctData1[i]);
  2619. writer.EndArray();
  2620. }
  2621. writer.EndArray();
  2622. writer.EndObject();
  2623. //3号测力点
  2624. writer.StartObject();
  2625. writer.Key("name");
  2626. writer.String(sz_utf_three);
  2627. writer.Key("points");
  2628. writer.StartArray();
  2629. for (int i = 0; i < num; i++)
  2630. {
  2631. if (vctResult[i] == false) continue;
  2632. if (vctData2[i] == false) continue;
  2633. writer.StartArray();
  2634. writer.Uint64(utime_t + step* i);
  2635. writer.Int(vctData2[i]);
  2636. writer.EndArray();
  2637. }
  2638. writer.EndArray();
  2639. writer.EndObject();
  2640. writer.EndArray();
  2641. writer.EndObject();
  2642. return true;
  2643. }