| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912 |
- #include "stdafx.h"
- #include "LWSServer.h"
- #include "AppService.h"
- #include <Simplelog.h>
- #include <common/HighWay.h>
- #include "JDSPBuffer.h"
- #include <sstream>
- #include "MonitorObject.h"
- #include "Device.h"
- #include "ResistAlarm.h"
- #include <gbk2utf8.h>
- #ifdef _DEBUG
- #pragma comment(lib, "hjwebsockets40d.lib")
- #else
- #pragma comment(lib, "hjwebsockets40.lib")
- #endif // _DEBUG
- #define MAX_SEND_LENGHT (5242880 + LWS_PRE)
- time_t g_stStart; //程序启动的时间
- static int ws_protocol_callback(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {
- switch (reason) {
- case LWS_CALLBACK_ESTABLISHED: // 当服务器和客户端完成握手后
- {
- TRACE("Client connect!\n");
- auto pService = CAppService::Instance()->GetLwsServer();
- if (pService) pService->Establishe(wsi);
- }
- break;
- case LWS_CALLBACK_CLOSED:
- TRACE("LWS closed!\n");
- {
- auto pService = CAppService::Instance()->GetLwsServer();
- if (pService) pService->Close(wsi);
- }
- break;
- case LWS_CALLBACK_WSI_DESTROY:
- /*
- 含义:正在销毁ws连接对象
- 备注:表示libwebsockets框架即将销毁wsi对象。此时如果用户自定义对象中存在动态分配的空间,则需要在此时进行释放。
- 回调函数的参数含义:
- context: 全局上下文
- wsi: ws连接对象
- user: 用户自定义数据
- in: 空指针
- len: 0
- */
- TRACE("LWS DESTROY!\n");
- {
- auto pService = CAppService::Instance()->GetLwsServer();
- if (pService) pService->Destroy(wsi);
- }
- break;
- case LWS_CALLBACK_RECEIVE: // 当接收到客户端发来的帧以后
- {
- auto pService = CAppService::Instance()->GetLwsServer();
- ASSERT(pService);
- if (pService)
- {
- auto pBuffer = pService->GetBuffer();
- ASSERT(pBuffer);
- auto fin = lws_is_final_fragment(wsi);
- if (fin && pBuffer->IsEmpty())
- {
- pService->Recv(wsi, in, len);
- }
- else if (fin)
- {
- pBuffer->AddData((LPBYTE)in, len);
- auto packlen = pBuffer->HasPack();
- assert(packlen);
- if (packlen)
- {
- pService->Recv(wsi, pBuffer->GetBuffer(), packlen);
- pBuffer->Remove(packlen);
- }
- }
- else
- {
- pBuffer->AddData((LPBYTE)in, len);
- }
- }
- }
- /*
- // 判断是否最后一帧
- data->fin = lws_is_final_fragment(wsi);
- // 判断是否二进制消息
- data->bin = lws_frame_is_binary(wsi);
- // 对服务器的接收端进行流量控制,如果来不及处理,可以控制之
- // 下面的调用禁止在此连接上接收数据
- lws_rx_flow_control(wsi, 0);
- // 业务处理部分,为了实现Echo服务器,把客户端数据保存起来
- memcpy(&data->buf[LWS_PRE], in, len);
- data->len = len;
- memset(g_buf, 0, MAX_PAYLOAD_SIZE);
- //printf("recvied message:%s\n", (char*)data->buf + LWS_PRE);
- {
- //test printf
- //auto ret = utf82gbk(g_buf, MAX_PAYLOAD_SIZE, (char*)data->buf + LWS_PRE);
- //if (ret >= 0) TRACE("recv message(gbk):%s\n", g_buf);
- }
- // 需要给客户端应答时,触发一次写回调
- lws_callback_on_writable(wsi);
- */
- break;
- case LWS_CALLBACK_SERVER_WRITEABLE: // 当此连接可写时
- // //lws_write(wsi, &data->buf[LWS_PRE], data->len, LWS_WRITE_TEXT);
- ////test
- //{
- // sprintf_s(g_buf, MAX_PAYLOAD_SIZE, "%s",
- // "{\"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%\"}]}");
- // TRACE("send message(gbk):%s\n", g_buf);
- // //auto ret = gbk2utf8(g_buf, MAX_PAYLOAD_SIZE,
- // // "{\"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%\"}]}"
- // // );
- // //lws_write(wsi, (uint8_t*)g_buf, ret - 1, LWS_WRITE_TEXT);
- //}
- // 下面的调用允许在此连接上接收数据
- lws_rx_flow_control(wsi, 1);
- break;
- }
- // 回调函数最终要返回0,否则无法创建服务器
- return 0;
- }
- /**
- * 支持的WebSocket子协议数组
- * 子协议即JavaScript客户端WebSocket(url, protocols)第2参数数组的元素
- * 你需要为每种协议提供回调函数
- */
- struct lws_protocols ws_protocols[] = {
- {
- //协议名称,协议回调,接收缓冲区大小
- "ws", ws_protocol_callback, 0, MAX_PAYLOAD_SIZE,
- },
- {
- NULL, NULL, 0 // 最后一个元素固定为此格式
- }
- };
- //struct lws_protocols {
- /*协议名称*/
- //const char* name;
- /*服务回调,协议事件处理*/
- //lws_callback_function* callback;
- /*服务建立和断开时申请内存大小,也是callback中user的内存*/
- //size_t per_session_data_size;
- /*接收缓存区大小*/
- //size_t rx_buffer_size;
- /*协议id,可以用来区分协议*/
- //unsigned int id;
- /*自定义数据*/
- //void* user;
- /*发送缓存大小,为0则与rx_buffer_size相同*/
- //size_t tx_packet_size;
- 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)
- {
- char sz_utf_first[100];
- char sz_utf_second[100];
- char sz_utf_three[100];
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(mo_mp, name1, name2, name3);
- if (name1[0x00] == 0x00)
- gbk2utf8(sz_utf_first, 100, "1号测力曲线");
- else
- gbk2utf8(sz_utf_first, 100, name1.c_str());
- if (name2[0x00] == 0x00)
- gbk2utf8(sz_utf_second, 100, "2号测力曲线");
- else
- gbk2utf8(sz_utf_second, 100, name2.c_str());
- if (name3[0x00] == 0x00)
- gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
- else
- gbk2utf8(sz_utf_three, 100, name3.c_str());
- int offset = 0; int limit = 10000;
- auto it_data0 = data0.begin();
- auto it_data1 = data1.begin();
- auto it_data2 = data2.begin();
- uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
- bBlock = false;
- do
- {
- static int n = 600;
- for (int i = 0; i < n; i++)
- {
- if (bWork == false) break;
- if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
- else break;
- }
- #ifndef _DEBUG
- if (bBlock) ////5秒未返回确认包,结束
- break;;
- #endif // _DEBUG
- //10000 一次
- using namespace rapidjson;
- rapidjson::StringBuffer strBuf;
- Writer<StringBuffer> writer(strBuf);
- writer.StartObject();
- writer.Key("cmd");
- writer.String("query_hist");
- writer.Key("tag");
- writer.String((mo_mp + ".resist").c_str());
- writer.Key("time");
- writer.String("");
- writer.Key("data_fmt");
- writer.String("curve");
- writer.Key("unit");
- writer.String("N");
- writer.Key("data");
- writer.StartArray();
- //1号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_first);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < limit && it_data0 != data0.end(); ++it_data0)
- {
- if (it_data0->first < start)
- continue;
- if (it_data0->first >= end)
- break;
- writer.StartObject();
- writer.Key("x");
- writer.Uint64(it_data0->first);
- writer.Key("y");
- writer.Int(it_data0->second);
- writer.EndObject();
- ++i;
- }
- writer.EndArray();
- writer.EndObject();
- //2号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_second);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < limit && it_data1 != data1.end(); ++it_data1)
- {
- if (it_data1->first < start)
- continue;
- if (it_data1->first >= end)
- break;
- writer.StartObject();
- writer.Key("x");
- writer.Uint64(it_data1->first);
- writer.Key("y");
- writer.Int(it_data1->second);
- writer.EndObject();
- ++i;
- }
- writer.EndArray();
- writer.EndObject();
- //3号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_three);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < limit && it_data2 != data2.end(); ++it_data2)
- {
- if (it_data2->first < start)
- continue;
- if (it_data2->first >= end)
- break;
- writer.StartObject();
- writer.Key("x");
- writer.Uint64(it_data2->first);
- writer.Key("y");
- writer.Int(it_data2->second);
- writer.EndObject();
- ++i;
- }
- writer.EndArray();
- writer.EndObject();
- writer.EndArray();
- writer.EndObject();
- auto pData = strBuf.GetString();
- int len = strBuf.GetLength();
- if (bWork == false) break;
- memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
- auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
- bBlock = true;
- if (ret < 0) break;
- if (bWork == false) break;
- } 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)));
- delete[] pSend;
- pSend = nullptr;
- return 0;
- }
- 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)
- {
- char sz_utf_first[100];
- char sz_utf_second[100];
- char sz_utf_three[100];
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(mo_mp, name1, name2, name3);
- if (name1[0x00] == 0x00)
- gbk2utf8(sz_utf_first, 100, "1号测力曲线");
- else
- gbk2utf8(sz_utf_first, 100, name1.c_str());
- if (name2[0x00] == 0x00)
- gbk2utf8(sz_utf_second, 100, "2号测力曲线");
- else
- gbk2utf8(sz_utf_second, 100, name2.c_str());
- if (name3[0x00] == 0x00)
- gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
- else
- gbk2utf8(sz_utf_three, 100, name3.c_str());
- int offset = 0; int limit = 5000;
- auto it_data0 = data0.begin();
- auto it_data1 = data1.begin();
- auto it_data2 = data2.begin();
- uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
- bBlock = false;
- do
- {
- static int n = 600;
- for (int i = 0; i < n; i++)
- {
- if (bWork == false) break;
- if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
- else break;
- }
- #ifndef _DEBUG
- if (bBlock) ////5秒未返回确认包,结束
- break;;
- #endif // _DEBUG
- //10000 一次
- using namespace rapidjson;
- rapidjson::StringBuffer strBuf;
- Writer<StringBuffer> writer(strBuf);
- writer.StartObject();
- writer.Key("cmd");
- writer.String("query_hist");
- writer.Key("tag");
- writer.String((mo_mp + ".resist").c_str());
- writer.Key("time");
- writer.String("");
- writer.Key("data_fmt");
- writer.String("curve");
- writer.Key("unit");
- writer.String("N");
- writer.Key("data");
- writer.StartArray();
- //1号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_first);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < limit && it_data0 != data0.end(); ++it_data0)
- {
- if (it_data0->first < start)
- continue;
- if (it_data0->first >= end)
- break;
- if (it_data0->second == INVALID_RESIST)
- continue;
- writer.StartArray();
- writer.Uint64(it_data0->first);
- writer.Int(it_data0->second);
- writer.EndArray();
- ++i;
- }
- writer.EndArray();
- writer.EndObject();
- //2号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_second);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < limit && it_data1 != data1.end(); ++it_data1)
- {
- if (it_data1->first < start)
- continue;
- if (it_data1->first >= end)
- break;
- if (it_data1->second == INVALID_RESIST)
- continue;
- writer.StartArray();
- writer.Uint64(it_data1->first);
- writer.Int(it_data1->second);
- writer.EndArray();
- ++i;
- }
- writer.EndArray();
- writer.EndObject();
- //3号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_three);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < limit && it_data2 != data2.end(); ++it_data2)
- {
- if (it_data2->first < start)
- continue;
- if (it_data2->first >= end)
- break;
- if (it_data2->second == INVALID_RESIST)
- continue;
- writer.StartArray();
- writer.Uint64(it_data2->first);
- writer.Int(it_data2->second);
- writer.EndArray();
- ++i;
- }
- writer.EndArray();
- writer.EndObject();
- writer.EndArray();
- writer.EndObject();
- auto pData = strBuf.GetString();
- int len = strBuf.GetLength();
- if (bWork == false) break;
- memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
- auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
- bBlock = true;
- if (ret < 0) break;
- if (bWork == false) break;
- } 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)));
- delete[] pSend;
- pSend = nullptr;
- return 0;
- }
- //暂时不调用
- int per_session_data::SendHistResistDB(LPHISTORY_QUERY history_query)
- {
- char sz_utf_first[100];
- char sz_utf_second[100];
- char sz_utf_three[100];
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(history_query->mo_mp, name1, name2, name3);
- if (name1[0x00] == 0x00)
- gbk2utf8(sz_utf_first, 100, "1号测力曲线");
- else
- gbk2utf8(sz_utf_first, 100, name1.c_str());
- if (name2[0x00] == 0x00)
- gbk2utf8(sz_utf_second, 100, "2号测力曲线");
- else
- gbk2utf8(sz_utf_second, 100, name2.c_str());
- if (name3[0x00] == 0x00)
- gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
- else
- gbk2utf8(sz_utf_three, 100, name3.c_str());
- int offset = 0; int limit = 5000; //每次取出20000
- CTime ctStart(history_query->tmStart / 1000);
- CTime ctEnd(history_query->tmEnd / 1000);
- char tablename[50];
- SYSTEMTIME st;
- ctStart.GetAsSystemTime(st);
- sprintf_s(tablename, 50, "rm_resistance_%04d%02d%02d", st.wYear, st.wMonth, st.wDay);
- string strStartTime = ctStart.Format("%Y-%m-%d %H:%M:%S");
- string strEndTime = ctEnd.Format("%Y-%m-%d %H:%M:%S");
- uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
- bBlock = false;
- CString sql;
- do
- {
- static int n = 600;
- for (int i = 0; i < n; i++)
- {
- if (bWork == false) break;
- if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
- else break;
- }
- #ifndef _DEBUG
- if (bBlock) ////5秒未返回确认包,结束
- break;;
- #endif // _DEBUG
- auto cost_start = chrono::steady_clock::now();
- sql.Format("SELECT [acquisitiontime],[data0],[data1],[data2] "\
- "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
- "ORDER BY acquisitiontime ASC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
- tablename, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx, offset, limit);
- TRACE("%s\r\n", sql);
- int no = 0;
-
- TIMESTAMP_STRUCT ts;
- int sdata0, sdata1, sdata2;
- COdbcStatement stmt;
- if (CDBConnectPool::Instance()->DBQuery(stmt, sql) == FALSE)
- {
- CSimpleLog::Error("查询语句出错:" + sql);
- break;
- }
- int nCol = 1;
- stmt.BindTimeStampCol(nCol++, &ts);
- stmt.BindIntCol(nCol++, &sdata0);
- stmt.BindIntCol(nCol++, &sdata1);
- stmt.BindIntCol(nCol++, &sdata2);
- std::map<time_t, int> data0, data1, data2;
- do
- {
- if (stmt.FetchNext() != 0)
- break;
- no++;
- CTime ctTime;
- try
- {
- ctTime = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
- }
- catch (...)
- {
- continue;
- }
- time_t tm = ctTime.GetTime() * 1000 + ts.fraction / 1000000;
- data0[tm] = sdata0;
- data1[tm] = sdata1;
- data2[tm] = sdata2;
- } while (true);
- //10000 一次
- using namespace rapidjson;
- rapidjson::StringBuffer strBuf;
- Writer<StringBuffer> writer(strBuf);
- writer.StartObject();
- writer.Key("cmd");
- writer.String("query_hist");
- writer.Key("tag");
- writer.String((history_query->mo_mp + ".resist").c_str());
- writer.Key("time");
- writer.String("");
- writer.Key("data_fmt");
- writer.String("curve");
- writer.Key("unit");
- writer.String("N");
- writer.Key("data");
- writer.StartArray();
- //1号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_first);
- writer.Key("points");
- writer.StartArray();
- for (const auto& it : data0)
- {
- writer.StartObject();
- writer.Key("x");
- writer.Uint64(it.first);
- writer.Key("y");
- writer.Int(it.second);
- writer.EndObject();
- }
- writer.EndArray();
- writer.EndObject();
- //2号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_second);
- writer.Key("points");
- writer.StartArray();
- for (const auto& it : data1)
- {
- writer.StartObject();
- writer.Key("x");
- writer.Uint64(it.first);
- writer.Key("y");
- writer.Int(it.second);
- writer.EndObject();
- }
- writer.EndArray();
- writer.EndObject();
- //3号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_three);
- writer.Key("points");
- writer.StartArray();
- for (const auto& it : data2)
- {
- writer.StartObject();
- writer.Key("x");
- writer.Uint64(it.first);
- writer.Key("y");
- writer.Int(it.second);
- writer.EndObject();
- }
- writer.EndArray();
- writer.EndObject();
- writer.EndArray();
- auto cost_end = chrono::steady_clock::now();
- auto cost_dif = chrono::duration_cast<chrono::milliseconds>(cost_end - cost_start).count();
- writer.Key("cost");
- writer.String((to_string(cost_dif) + "ms").c_str());
- writer.EndObject();
- auto pData = strBuf.GetString();
- int len = strBuf.GetLength();
- if (bWork == false) break;
- memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
- auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
- auto cost_send_dif = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - cost_end).count();
- 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());
- //len 455214
- bBlock = true;
- if (ret < 0) break;
- if (bWork == false) break;
- offset += no;
- if (no != limit)
- {
- break;
- }
- } while (true);
- delete[] pSend;
- pSend = nullptr;
- return 0;
- }
- int per_session_data::SendHistResistDBForEcharts(LPHISTORY_QUERY history_query)
- {
- char sz_utf_first[100];
- char sz_utf_second[100];
- char sz_utf_three[100];
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(history_query->mo_mp, name1, name2, name3);
- if (name1[0x00] == 0x00)
- gbk2utf8(sz_utf_first, 100, "1号测力曲线");
- else
- gbk2utf8(sz_utf_first, 100, name1.c_str());
- if (name2[0x00] == 0x00)
- gbk2utf8(sz_utf_second, 100, "2号测力曲线");
- else
- gbk2utf8(sz_utf_second, 100, name2.c_str());
- if (name3[0x00] == 0x00)
- gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
- else
- gbk2utf8(sz_utf_three, 100, name3.c_str());
- int offset = 0; int limit = 5000; //每次取出10000
- CTime ctStart(history_query->tmStart / 1000);
- CTime ctEnd(history_query->tmEnd / 1000);
- char tablename[50];
- char tablenameTom[50];
- SYSTEMTIME stStart;
- ctStart.GetAsSystemTime(stStart);
- sprintf_s(tablename, 50, "rm_resistance_%04d%02d%02d", stStart.wYear, stStart.wMonth, stStart.wDay);
- SYSTEMTIME stEnd;
- ctEnd.GetAsSystemTime(stEnd);
- sprintf_s(tablenameTom, 50, "rm_resistance_%04d%02d%02d", stEnd.wYear, stEnd.wMonth, stEnd.wDay);
- string strStartTime = ctStart.Format("%Y-%m-%d %H:%M:%S");
- string strEndTime = ctEnd.Format("%Y-%m-%d %H:%M:%S");
- uint8_t *pSend = new uint8_t[MAX_SEND_LENGHT];
- bBlock = false;
- CString sql;
- do
- {
- static int n = 600;
- for (int i = 0; i < n; i++)
- {
- if (bWork == false) break;
- if (bBlock) this_thread::sleep_for(chrono::milliseconds(100));
- else break;
- }
- #ifndef _DEBUG
- if (bBlock) ////5秒未返回确认包,结束
- break;;
- #endif // _DEBUG
- auto cost_start = chrono::steady_clock::now();
- if (stStart.wDay == stEnd.wDay)
- {
- sql.Format("SELECT [acquisitiontime],[data0],[data1],[data2] "\
- "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
- "ORDER BY acquisitiontime ASC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
- tablename, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx, offset, limit);
- }
- else
- {
- sql.Format("SELECT [acquisitiontime],[data0],[data1],[data2] "\
- "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
- "UNION ALL "\
- "SELECT [acquisitiontime],[data0],[data1],[data2] "\
- "FROM %s WHERE IMEI = '%s' AND acquisitiontime >= '%s' and acquisitiontime < '%s' AND idx = %d "\
- "ORDER BY acquisitiontime ASC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
- tablename, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx,
- tablenameTom, history_query->imei.c_str(), strStartTime.c_str(), strEndTime.c_str(), history_query->idx,
- offset, limit);
- }
- TRACE("%s\r\n", sql);
- int no = 0;
- TIMESTAMP_STRUCT ts;
- int sdata0, sdata1, sdata2;
- COdbcStatement stmt;
- if (CDBConnectPool::Instance()->DBQuery(stmt, sql) == FALSE)
- {
- CSimpleLog::Error("查询语句出错:" + sql);
- break;
- }
- int nCol = 1;
- stmt.BindTimeStampCol(nCol++, &ts);
- stmt.BindIntCol(nCol++, &sdata0);
- stmt.BindIntCol(nCol++, &sdata1);
- stmt.BindIntCol(nCol++, &sdata2);
- std::map<time_t, int> data0, data1, data2;
- do
- {
- if (stmt.FetchNext() != 0)
- break;
- no++;
- CTime ctTime;
- try
- {
- ctTime = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
- }
- catch (...)
- {
- continue;
- }
- time_t tm = ctTime.GetTime() * 1000 + ts.fraction / 1000000;
- data0[tm] = sdata0;
- data1[tm] = sdata1;
- data2[tm] = sdata2;
- } while (true);
- //10000 一次
- using namespace rapidjson;
- rapidjson::StringBuffer strBuf;
- Writer<StringBuffer> writer(strBuf);
- writer.StartObject();
- writer.Key("cmd");
- writer.String("query_hist");
- writer.Key("tag");
- writer.String((history_query->mo_mp + ".resist").c_str());
- writer.Key("time");
- writer.String("");
- writer.Key("data_fmt");
- writer.String("curve");
- writer.Key("unit");
- writer.String("N");
- writer.Key("data");
- writer.StartArray();
- //1号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_first);
- writer.Key("points");
- writer.StartArray();
- for (const auto& it : data0)
- {
- if (INVALID_RESIST == it.second)
- continue;
- writer.StartArray();
- writer.Uint64(it.first);
- writer.Int(it.second);
- writer.EndArray();
- }
- writer.EndArray();
- writer.EndObject();
- //2号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_second);
- writer.Key("points");
- writer.StartArray();
- for (const auto& it : data1)
- {
- if (INVALID_RESIST == it.second)
- continue;
- writer.StartArray();
- writer.Uint64(it.first);
- writer.Int(it.second);
- writer.EndArray();
- }
- writer.EndArray();
- writer.EndObject();
- //3号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_three);
- writer.Key("points");
- writer.StartArray();
- for (const auto& it : data2)
- {
- if (INVALID_RESIST == it.second)
- continue;
- writer.StartArray();
- writer.Uint64(it.first);
- writer.Int(it.second);
- writer.EndArray();
- }
- writer.EndArray();
- writer.EndObject();
- writer.EndArray();
- auto cost_end = chrono::steady_clock::now();
- auto cost_dif = chrono::duration_cast<chrono::milliseconds>(cost_end - cost_start).count();
- writer.Key("cost");
- writer.String((to_string(cost_dif) + "ms").c_str());
- writer.EndObject();
- auto pData = strBuf.GetString();
- int len = strBuf.GetLength();
- if (bWork == false) break;
- memcpy_s(pSend + LWS_PRE, MAX_SEND_LENGHT, (uint8_t*)pData, len);
- auto ret = lws_write(wsi, pSend + LWS_PRE, len, lws_write_protocol::LWS_WRITE_TEXT);
- auto cost_send_dif = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - cost_end).count();
- 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());
- //len 335214
- bBlock = true;
- if (ret < 0) break;
- if (bWork == false) break;
- offset += no;
- if (no != limit)
- {
- break;
- }
- } while (true);
- delete[] pSend;
- pSend = nullptr;
- return 0;
- }
- //实时
- void CLWSServer::ThreadProcForQueryHist(LPHISTORY_QUERY history_query)
- {
- auto pDevice = CDeviceMng::Instance()->Find(history_query->imei);
- if (pDevice == nullptr) return;
- assert(pDevice);
- auto pService = CAppService::Instance()->GetLwsServer();
- if (pService == nullptr) return;
- //lock_guard<mutex> lock(pService->m_mtxSession);
- auto it = pService->m_mapLwsSession.find(history_query->wsi);
- if (it == pService->m_mapLwsSession.end()) return;
- if (history_query->idx == 0)
- 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);
- else if (history_query->idx == 1)
- 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);
- else if (history_query->idx == 2)
- 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);
- delete history_query;
- history_query = nullptr;
- }
- //历史
- void CLWSServer::ThreadProcForQueryHistDB(LPHISTORY_QUERY history_query)
- {
- auto pService = CAppService::Instance()->GetLwsServer();
- if (pService == nullptr) return;
- auto it = pService->m_mapLwsSession.find(history_query->wsi);
- if (it == pService->m_mapLwsSession.end()) return;
- it->second.SendHistResistDBForEcharts(history_query);
- delete history_query;
- history_query = nullptr;
- }
- void CLWSServer::ThreadProc(DWORD_PTR wparam, uint16_t port)
- {
- CLWSServer* pThis = (CLWSServer*)wparam;
- if (!pThis->m_work) return;
- ws_protocols[0].user = pThis;
- struct lws_context_creation_info ctx_info = { 0 };
- ctx_info.port = port;
- ctx_info.iface = NULL; // 在所有网络接口上监听
- ctx_info.protocols = ws_protocols;
- ctx_info.gid = -1;
- ctx_info.uid = -1;
- ctx_info.options = LWS_SERVER_OPTION_VALIDATE_UTF8;
- //SSL CA证书
- //ctx_info.ssl_ca_filepath = "../ca/ca-cert.pem";
- //ctx_info.ssl_cert_filepath = "./server-cert.pem";
- //ctx_info.ssl_private_key_filepath = "./server-key.pem";
- //ctx_info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
- //ctx_info.options |= LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT;
- struct lws_context* context = lws_create_context(&ctx_info);
- while (pThis->m_work) {
- lws_service(context, 100);
- this_thread::sleep_for(chrono::milliseconds(0));
- }
- lws_context_destroy(context);
- }
- CLWSServer::CLWSServer()
- {
- }
- CLWSServer::~CLWSServer()
- {
- }
- BOOL CLWSServer::Start(uint16_t port)
- {
- Stop();
- m_work = true;
- pBuffer = new CJDSPBuffer(10 * 1024 * 1024);
- if (pBuffer == nullptr) return false;
- m_pThread = new std::thread(ThreadProc, (DWORD_PTR)this, port);
- if (m_pThread == nullptr) return FALSE;
- return TRUE;
- }
- void CLWSServer::Stop()
- {
- m_work = false;
- if (m_pThread)
- {
- m_pThread->join();
- delete m_pThread;
- m_pThread = nullptr;
- }
- if (pBuffer)
- {
- delete (CJDSPBuffer*)pBuffer;
- pBuffer = nullptr;
- }
- }
- uint8_t g_send_buf[LWS_PRE + MAX_PAYLOAD_SIZE];
- uint8_t g_recv_buf[LWS_PRE + MAX_PAYLOAD_SIZE];
- BOOL CLWSServer::SendPackToALLClient(const uint8_t* data, int len, LWS_SEND_PACK_TYPE type /*= LWS_SEND_PACK_TYPE::LSPT_UNKOWN*/, lws_write_protocol protocol)
- {
- if (m_mapLwsSession.size() == 0) return TRUE;
- //filter
- {
- TRACE("send message:%s\n", (char*)data);
- CSimpleLog::Info((char*)data);
- lock_guard<mutex> lock(m_mtxSend);
- auto pSend = g_send_buf + LWS_PRE;
- uint8_t* pNew = nullptr;
- if (protocol == lws_write_protocol::LWS_WRITE_BINARY)
- {
- if (len > MAX_PAYLOAD_SIZE)
- {
- pNew = new uint8_t[len + LWS_PRE];
- pSend = pNew + LWS_PRE;
- }
- memcpy(pSend, data, len);
- lock_guard<mutex> lock(m_mtxSession);
- for (auto& it : m_mapLwsSession)
- {
- //订阅
- //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
- //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
- if (it.second.refer > 0)
- {
- int ret = lws_write(it.first, pSend, len - (int)1, protocol);
- if (ret <= 0)
- {
- it.second.send_fail_count++;
- }
- else
- {
- it.second.send_size += ret;
- it.second.send_count++;
- }
- }
- }
- }
- else if (protocol == lws_write_protocol::LWS_WRITE_TEXT)
- {
- assert(len * 2 < MAX_PAYLOAD_SIZE);
- if (len * 2 > MAX_PAYLOAD_SIZE)
- {
- pNew = new uint8_t[len * 2 + LWS_PRE];
- pSend = pNew + LWS_PRE;
- }
- int new_len = gbk2utf8((char*)pSend, len * 2, (const char*)data);
- lock_guard<mutex> lock(m_mtxSession);
- for (auto& it : m_mapLwsSession)
- {
- //订阅
- //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
- //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
- if (it.second.refer > 0)
- {
- int ret = lws_write(it.first, pSend, new_len - (int)1, protocol);
- if (ret <= 0)
- {
- it.second.send_fail_count++;
- }
- else
- {
- it.second.send_size += ret;
- it.second.send_count++;
- }
- }
- }
- }
- else
- {
- assert(0);
- }
- if (pNew)
- {
- delete[] pNew;
- pNew = nullptr;
- }
- }
- return FALSE;
- }
- 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*/)
- {
- if (m_mapLwsSession.size() == 0) return TRUE;
- //filter
- {
- TRACE("send message:%s\n", (char*)data);
- CSimpleLog::Info((char*)data);
- lock_guard<mutex> lock(m_mtxSend);
- auto pSend = g_send_buf + LWS_PRE;
- uint8_t* pNew = nullptr;
- if (protocol == lws_write_protocol::LWS_WRITE_BINARY)
- {
- if (len > MAX_PAYLOAD_SIZE)
- {
- pNew = new uint8_t[len + LWS_PRE];
- pSend = pNew + LWS_PRE;
- }
- memcpy(pSend, data, len);
- lock_guard<mutex> lock(m_mtxSession);
- for (auto& it : m_mapLwsSession)
- {
- //订阅
- //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
- //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
- if (it.second.refer > 0)
- {
- int ret = lws_write(it.first, pSend, len - (int)1, protocol);
- if (ret <= 0)
- {
- it.second.send_fail_count++;
- }
- else
- {
- it.second.send_size += ret;
- it.second.send_count++;
- }
- }
- }
- }
- else if (protocol == lws_write_protocol::LWS_WRITE_TEXT)
- {
- assert(len <= MAX_PAYLOAD_SIZE);
- if (len >= MAX_PAYLOAD_SIZE)
- {
- pNew = new uint8_t[len + LWS_PRE];
- pSend = pNew + LWS_PRE;
- }
- memcpy(pSend, data, len);
- lock_guard<mutex> lock(m_mtxSession);
- for (auto& it : m_mapLwsSession)
- {
- //订阅
- //if (type == LWS_SEND_PACK_TYPE::LSPT_PLATE_DETECT && it.second.bSubPlateDetect == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_ALARM_EVENT && it.second.bSubAlarmEvent == FALSE) continue;
- //else if (type == LWS_SEND_PACK_TYPE::LSPT_TRAFFIC_FLOW && it.second.bSubTrafficFlow == FALSE) continue;
- //if (type == LWS_SEND_PACK_TYPE::LSPT_BOLT_DETECT && it.second.bSubBoltDetect == FALSE) continue;
- if (it.second.refer > 0)
- {
- int ret = lws_write(it.first, pSend, len, protocol);
- if (ret <= 0)
- {
- it.second.send_fail_count++;
- }
- else
- {
- it.second.send_size += ret;
- it.second.send_count++;
- }
- }
- }
- }
- else
- {
- assert(0);
- }
- if (pNew)
- {
- delete[] pNew;
- pNew = nullptr;
- }
- }
- return FALSE;
- }
- int CLWSServer::GetLwsSessionNum()
- {
- return m_mapLwsSession.size();
- }
- void CLWSServer::Establishe(lws* wsi)
- {
- char ip[32];
- lws_get_peer_simple(wsi, ip, 32);
- char log[100];
- sprintf_s(log, 100, "[前端]有新链接:%s", ip);
- CSimpleLog::Info(log);
- lock_guard<mutex> lock(m_mtxSession);
- per_session_data& session_data = m_mapLwsSession[wsi];
- session_data.refer++;
- time(&session_data.tmConnect);
- session_data.wsi = wsi;
- session_data.context = lws_get_context(wsi);
- memcpy(session_data.ip, ip, 32);
- }
- void CLWSServer::Close(lws* wsi)
- {
- m_mapLwsSession[wsi].refer--;
- }
- void CLWSServer::Destroy(lws* wsi)
- {
- char log[100] = { 0 };
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it != m_mapLwsSession.end())
- {
- sprintf_s(log, 100, "[前端]链接断开:%s", it->second.ip);
- m_mapLwsSession.erase(it);
- }
- }
- if (log[0] != 0x00) CSimpleLog::Info(log);
- }
- #include <rapidjson/document.h>
- void CLWSServer::Recv(lws* wsi, void* in, size_t len)
- {
- // 判断是否二进制消息
- char ip[32];
- lws_get_peer_simple(wsi, ip, 32);
- TRACE("%s\r\n", ip);
- int bin = lws_frame_is_binary(wsi);
- if (bin)
- {
- CSimpleLog::Info("[前端]收到二进制数据");
- return;
- }
- if (len < 5) return;
- if (((char*)in)[0x00] != '{') return;
- using namespace rapidjson;
- Document doc;
- {
- lock_guard<mutex> lock(m_mtxRecv);
- int newjsonlen = utf82gbk((char*)g_recv_buf + LWS_PRE, MAX_PAYLOAD_SIZE, (char*)in, len) - 1;
- TRACE("recv message : %s\n", (char*)g_recv_buf + LWS_PRE);
- CSimpleLog::Info("recv:\r\n" + CString(g_recv_buf + LWS_PRE));
- if (doc.Parse((char*)g_recv_buf + LWS_PRE, newjsonlen).HasParseError() || doc.HasMember("cmd") == false || doc["cmd"].IsString() == false)
- {
- //string result = "{ \"cmd\":\"error\",\"code\":400,\"msg\":\"400 JSON parse error.\"}";
- //lock_guard<mutex> lock(m_mtxSend);
- //memcpy(g_send_buf + LWS_PRE, result.c_str(), result.length() + 1);
- //lws_write(wsi, g_send_buf + LWS_PRE, result.length(), LWS_WRITE_TEXT);
- //CSimpleLog::Error("[前端]数据解析出错:" + CString((char*)g_recv_buf + LWS_PRE, newjsonlen) + ".");
- return;
- }
- }
- auto pTemp = new uint8_t[500]; //准备回包的数据
- auto pData = pTemp + LWS_PRE;
- auto cmd = doc["cmd"].GetString();
- if (strcmp("heartbeat.ping", cmd) == 0)
- {
- SYSTEMTIME tm;
- GetLocalTime(&tm);
- sprintf_s((char*)pData, 200, "{\"cmd\":\"heartbeat.pong\",\"time\":\"%04d-%02d-%02d %02d:%02d:%02d.%03d\"}",
- tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds);
- lws_write(wsi, pData, strlen((char*)pData), LWS_WRITE_TEXT);
- }
- else if (strcmp("sub_notify", cmd) == 0)
- {
- string imei_idx;
- auto code = HandleSubNotify(wsi, doc, imei_idx);
-
- doc.AddMember("code", code, doc.GetAllocator());
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- const char* output = buffer.GetString();
- int len = buffer.GetLength();
- memcpy(pData, output, len);
- lws_write(wsi, pData, len, LWS_WRITE_TEXT);
- }
- else if (strcmp("unsub_notify", cmd) == 0)
- {
- auto code = HanldeUnsubNotify(wsi, doc);
-
- doc.AddMember("code", code, doc.GetAllocator());
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- const char* output = buffer.GetString();
- int len = buffer.GetLength();
- memcpy(pData, output, len);
- lws_write(wsi, pData, len, LWS_WRITE_TEXT);
- }
- else if (strcmp("login", cmd) == 0)
- {
- auto code = HandleLogin(wsi, doc);
-
- doc.AddMember("code", code, doc.GetAllocator());
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- const char* output = buffer.GetString();
- int len = buffer.GetLength();
- memcpy(pData, output, len);
- lws_write(wsi, pData, len, LWS_WRITE_TEXT);
- //主动发送未处理报警
- if (code == 200) SendUnAckAlarm(wsi);
- }
- else if (strcmp("query_alm_unack", cmd) == 0)
- {
- auto code = SendUnAckAlarm(wsi);
- if (code != 200)
- {
- doc.AddMember("code", code, doc.GetAllocator());
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- const char* output = buffer.GetString();
- int len = buffer.GetLength();
- memcpy(pData, output, len);
- lws_write(wsi, pData, len, LWS_WRITE_TEXT);
- }
- }
- else if (strcmp("query_hist", cmd) == 0)
- {
- //历史数据
- auto code = HandleQueryHist(wsi, doc);
- doc.AddMember("code", code, doc.GetAllocator());
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- const char* output = buffer.GetString();
- int len = buffer.GetLength();
- memcpy(pData, output, len);
- lws_write(wsi, pData, len, LWS_WRITE_TEXT);
- }
- else if (strcmp("query_hist_confirm", cmd) == 0)
- {
- auto code = HandleQueryHistConfirm(wsi, doc);
- //string result = "{\"cmd\":\"query_hist_confirm\",\"code\":" + to_string(code) + ",\"msg\":\"\"}";
- //memcpy(g_send_buf + LWS_PRE, result.c_str(), result.length() + 1);
- //lws_write(wsi, g_send_buf + LWS_PRE, result.length(), LWS_WRITE_TEXT);
- }
- else if (strcmp("conf_read", cmd) == 0)//配置读取
- {
- auto code = HandleConfRead(wsi, doc);
- if (code != 200)
- {
- string result = "{\"cmd\":\"conf_read\",\"code\":" + to_string(code) + ",\"msg\":\"\"}";
- memcpy(pData, result.c_str(), result.length() + 1);
- lws_write(wsi, pData, result.length(), LWS_WRITE_TEXT);
- }
- }
- else if (strcmp("conf_write", cmd) == 0)
- {
- auto code = HandleConfWrite(wsi, doc);
- rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
- if (doc.HasMember("conf")) doc.RemoveMember("conf");
- doc.AddMember("code", code, allocator);
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- memcpy(pData, buffer.GetString(), buffer.GetLength());
- lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
- }
- else if (strcmp("alm_ack", cmd) == 0)
- {//报警受理
- string ack_time, ack_name;
- auto code = HandleAlarmAck(wsi, doc, ack_time, ack_name);
- rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //获取分配器
- if (code == 200 && ack_time.length())
- {
- {
- Value str_value(kStringType);
- str_value.SetString(ack_time.c_str(), ack_time.length());
- doc.AddMember("ack_time", str_value, allocator);
- }
- {
- Value str_value(kStringType);
- char utf[50] = { 0 };
- int len = gbk2utf8(utf, 50, ack_name.c_str()) - 1;
- str_value.SetString(utf, len);
- doc.AddMember("ack_name", str_value, allocator);
- }
- }
- doc.AddMember("code", code, allocator);
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- if (code == 200)
- {
- SendPackToALLClient_with_noEncode((uint8_t*)buffer.GetString(), buffer.GetLength());
- }
- else
- {
- memcpy(pData, buffer.GetString(), buffer.GetLength());
- lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
- }
- }
- else if (strcmp("alm_handle", cmd) == 0)
- {
- //报警受理
- string handle_time, hanlde_info, handle_name;
- auto code = HandleAlarmHandle(wsi, doc, handle_time, handle_name, hanlde_info);
- rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //获取分配器
- doc.RemoveMember("hanlde_info");
- if (code == 200 && handle_time.length())
- {
- {
- Value str_value(kStringType);
- str_value.SetString(handle_time.c_str(), handle_time.length());
- doc.AddMember("handle_time", str_value, allocator);
- }
- {
- Value str_value(kStringType);
- char utf[50] = { 0 };
- int len = gbk2utf8(utf, 50, handle_name.c_str()) - 1;
- str_value.SetString(utf, len);
- doc.AddMember("handle_name", str_value, allocator);
- }
- {
- Value str_value(kStringType);
- char utf[250] = { 0 };
- int len = gbk2utf8(utf, 250, hanlde_info.c_str()) - 1;
- str_value.SetString(utf, len);
- doc.AddMember("hanlde_info", str_value, allocator);
- }
- }
- doc.AddMember("code", code, allocator);
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- if (code == 200)
- {
- SendPackToALLClient_with_noEncode((uint8_t*)buffer.GetString(), buffer.GetLength());
- }
- else
- {
- memcpy(pData, buffer.GetString(), buffer.GetLength());
- lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
- }
- }
- else if (strcmp("sync", cmd) == 0)
- {
- int code = 200;
- rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); //获取分配器
- {
- lock_guard<mutex> lock(m_mtxSession);
- per_session_data& session_data = m_mapLwsSession[wsi];
- if (strstr(session_data.token, "AAAAAAAA") == nullptr)
- {
- code = 403;
- doc.AddMember("code", code, allocator);
- doc.AddMember("msg", "Forbidden ! Without Permission !", allocator);
- }
- }
- //同步数据库数据
- if (code == 200)
- {
- auto ret = CMonitorObjectMng::Instance()->LoadMonitorTree();
- ret &= CMonitorObjectMng::Instance()->LoadHistoryData();
- if (ret)
- {
- doc.AddMember("code", 200, allocator);
- }
- else
- {
- doc.AddMember("code", 500, allocator);
- }
- }
- StringBuffer buffer;
- Writer<StringBuffer> writer(buffer);
- doc.Accept(writer);
- memcpy(pData, buffer.GetString(), buffer.GetLength());
- lws_write(wsi, pData, buffer.GetLength(), LWS_WRITE_TEXT);
- }
- else if (strcmp("new_data", cmd) == 0)
- {
- }
- else
- {
- string result = "{ \"cmd\":\"unkonw_cmd\",\"msg\":\"403 not realizes .\"}";
- memcpy(pData, result.c_str(), result.length() + 1);
- lws_write(wsi, pData, result.length(), LWS_WRITE_TEXT);
- CSimpleLog::Error(CString("[前端]数据解析未实现:"));
- }
-
- delete[] pTemp;
- }
- void CLWSServer::GetSessionDesc(std::map<DWORD_PTR, CString>& session_desc)
- {
- //for (auto& it : m_mapLwsSession)
- //{
- // session_desc[(DWORD_PTR)it.first].Format("%s[上线时间:%s]%s[已发送:%.3f MB]", it.second.ip,
- // COleDateTime(it.second.tmConnect).Format("%Y-%m-%d %H:%M:%S"),
- // (it.second.bSubBoltDetect & it.second.bSubRailGapDetect) ?
- // "[已订阅所有]" :(
- // (!it.second.bSubBoltDetect & !it.second.bSubRailGapDetect) ?
- // "[未订阅]" :
- // (it.second.bSubBoltDetect ? CString("[已订阅报警事件]") : CString("")) +
- // (it.second.bSubRailGapDetect ? CString("[已订阅车牌检测]") : CString(""))
- // ), it.second.send_size / 1024.0 / 1024.0);
- //}
- }
- uint32_t CLWSServer::FindJsonPack(const char* CH, uint32_t len)
- {
- if (len <= 1 || CH[0] != '{') return 0;
- uint32_t packlen = 0;
- int first = 0, end = 0;
- for (size_t i = 0; i < len; i++)
- {
- if (CH[i] == '{')
- {
- ++first;
- }
- else if (CH[i] == '}')
- {
- ++end;
- if (first == end)
- {
- packlen = i + 1;
- break;
- }
- }
- }
- return packlen;
- }
- int CLWSServer::HandleLogin(lws* wsi, rapidjson::Document& doc)
- {
- if (doc.HasMember("token") && doc["token"].IsString())
- {
- string token = doc["token"].GetString();
- if (token.compare("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA") == 0)
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it == m_mapLwsSession.end()) return 500;
- strncpy_s(it->second.token, 37, token.c_str(), token.length());
- strncpy_s(it->second.username, sizeof(it->second.username), "系统管理员", strlen("系统管理员"));
- strncpy_s(it->second.node, sizeof(it->second.node), "100000", strlen("100000"));
- it->second.isLogin = true;
-
- return 200;
- }
- CString sql;
- sql.Format("SELECT username,node FROM rm_user WHERE token = '%s';", token.c_str());
- COdbcStatement stmt;
- if (FALSE == CDBConnectPool::Instance()->DBQuery(stmt, sql))
- {
- CSimpleLog::Error("[前端]查询语句出错:" + sql);
- return 404;
- }
- char username[50];
- char node[50];
- int nCol = 1;
- stmt.BindCharCol(nCol++, username, sizeof(username));
- stmt.BindCharCol(nCol++, node, sizeof(node));
- if (stmt.FetchNext() != 0) return 401;
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it == m_mapLwsSession.end()) return 500;
- strncpy_s(it->second.token, 37, token.c_str(), token.length());
- strncpy_s(it->second.username, sizeof(it->second.username), username, strlen(username));
- strncpy_s(it->second.node, sizeof(it->second.node), node, strlen(node));
- it->second.isLogin = true;
- return 200;
- }
- else
- {
- return 400;
- }
- }
- int CLWSServer::HandleSubNotify(lws* wsi, rapidjson::Document& doc, std::string& imei_idx)
- {
- if (doc.HasMember("tag") && doc["tag"].IsString())
- {
- string tag = doc["tag"].GetString();
- int npos = tag.rfind('.');
- string momp = tag.substr(0, npos);
- string type = tag.substr(npos + 1);
- if (type.compare("resist") == 0)
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it == m_mapLwsSession.end()) return 500;
- //if (it->second.isLogin == FALSE) return 401;
- if (!CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei_idx)) return 404;
- it->second.m_lstSubReal.push_back(imei_idx);
- return 200;
- }
- return 400;
- }
- else
- {
- return 400;
- }
- }
- int CLWSServer::HanldeUnsubNotify(lws* wsi, rapidjson::Document& doc)
- {
- if (doc.HasMember("tag") && doc["tag"].IsString())
- {
- string tag = doc["tag"].GetString();
- int npos = tag.rfind('.');
- string momp = tag.substr(0, npos);
- string type = tag.substr(npos + 1);
- if (type.compare("resist") == 0)
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it == m_mapLwsSession.end()) return 500;
- string imei_idx;
- if (!CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei_idx)) return 404;
- for (auto i = it->second.m_lstSubReal.begin(); i != it->second.m_lstSubReal.end();)
- {
- if ((*i).compare(imei_idx) == 0)
- {
- i = it->second.m_lstSubReal.erase(i);
- continue;
- }
- i++;
- }
- return 200;
- }
- return 500;
- }
- else
- {
- return 400;
- }
- }
- int CLWSServer::HandleQueryHist(lws* wsi, rapidjson::Document& doc)
- {
- if (doc.HasMember("tag") && doc["tag"].IsString())
- {
- string tag = doc["tag"].GetString();
- int npos = tag.rfind('.');
- string mo_mp = tag.substr(0, npos);
- string type = tag.substr(npos + 1);
- if (mo_mp.compare("undefined") == 0)
- {
- CSimpleLog::Error("[前端]收到未定义的请求");
- return 401;
- }
- if (type.compare("resist") == 0) //阻力数据
- {
- CTime ctStart, ctEnd;
- if (doc.HasMember("time") && doc["time"].IsString())
- {
- string query_time = doc["time"].GetString();
- int pos = query_time.find('~');
- if (pos == -1) return 400;
- string start = query_time.substr(0, pos);
- string end = query_time.substr(pos + 1);
- try
- {
- int year, month, day, hour, minute, second;
- sscanf_s(start.c_str(), "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
- ctStart = CTime(year, month, day, hour, minute, second);
- sscanf_s(end.c_str(), "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
- ctEnd = CTime(year, month, day, hour, minute, second);
- }
- catch (CException* )
- {
- return 400;
- }
- }
- else
- {
- return 400;
- }
- string imei_idx;
- if (!CMonitorObjectMng::Instance()->MOMP2IMEI(mo_mp, imei_idx)) return 404;
- string imei, idx;
- if (!CMonitorObjectMng::Instance()->spiltByPoint(imei_idx, imei, idx)) return 400;
- int index = atoi(idx.c_str());
- auto pDevice = CDeviceMng::Instance()->Find(imei);
- if (pDevice == nullptr) return 404;
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it == m_mapLwsSession.end()) return 500;
- //if (it->second.isLogin == FALSE) return 401;
- it->second.bWork = false;
- if (it->second.thread_hist)
- {
- it->second.thread_hist->join();
- delete it->second.thread_hist;
- it->second.thread_hist = nullptr;
- }
- LPHISTORY_QUERY query_hist = new HISTORY_QUERY;
- query_hist->idx = index;
- query_hist->imei = imei;
- query_hist->mo_mp = mo_mp;
- time_t tmStart = ctStart.GetTime();
- query_hist->tmStart = tmStart * 1000;
- query_hist->tmEnd = ctEnd.GetTime() * 1000;
- query_hist->type = "resist";
- query_hist->wsi = wsi;
- it->second.bWork = true;
- time_t tmNow;
- time(&tmNow);
- if (tmStart < g_stStart - 7200 || tmNow - tmStart > MAX_SAVE_TIME / 1000)
- {
- //超过当天,赋值当天 临时
- //auto end = CTime(ctStart.GetYear(), ctStart.GetMonth(), ctStart.GetDay(), 23, 59, 59);
- //改为限定24小时
- auto end = ctStart + CTimeSpan(1, 0, 0, 0);
- if (ctEnd > end) query_hist->tmEnd = end.GetTime() * 1000;
- it->second.thread_hist = new thread(CLWSServer::ThreadProcForQueryHistDB, query_hist);
- }
- else
- {
- //实时也改为限定24小时
- auto end = ctStart + CTimeSpan(1, 0, 0, 0);
- if (ctEnd > end) query_hist->tmEnd = end.GetTime() * 1000;
- it->second.thread_hist = new thread(CLWSServer::ThreadProcForQueryHist, query_hist);
- }
- return 200;
- }
- return 400;
- }
- else
- {
- return 400;
- }
- }
- int CLWSServer::HandleQueryHistConfirm(lws* wsi, rapidjson::Document& doc)
- {
- if (doc.HasMember("tag") && doc["tag"].IsString())
- {
- string tag = doc["tag"].GetString();
- int npos = tag.rfind('.');
- string momp = tag.substr(0, npos);
- string type = tag.substr(npos + 1);
- if (type.compare("resist") == 0)
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it == m_mapLwsSession.end()) return 500;
- it->second.bBlock = false;
- //string imei_idx;
- //if (!CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei_idx)) return 404;
- //for (auto i = it->second.m_lstSubReal.begin(); i != it->second.m_lstSubReal.end();)
- //{
- // if ((*i).compare(imei_idx) == 0)
- // {
- // i = it->second.m_lstSubReal.erase(i);
- // continue;
- // }
- // i++;
- //}
- return 200;
- }
- return 500;
- }
- else
- {
- return 400;
- }
- }
- int CLWSServer::HandleConfRead(lws* wsi, rapidjson::Document& doc)
- {
- //读取类型
- if (doc.HasMember("type") == false || doc["type"].IsString() == false)
- return 400;
- if (doc.HasMember("tag") == false || doc["tag"].IsString() == false)
- return 400;
- string type = doc["type"].GetString();
- string tag = doc["tag"].GetString();
- using namespace rapidjson;
- rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
- if (type.compare("monitor.alarm.max_over_limit") == 0) //最大值超限
- {
- int nPos = tag.find('.');
- if (nPos != -1)
- {
- auto mo = tag.substr(0, nPos);
- int nPos2 = tag.find('.', nPos + 1);
- if (nPos2 != -1)
- {
- auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
- int nPos3 = tag.find('.', nPos2 + 1);
- if (nPos3 != -1)
- {
- auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
- if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
- {
- int nNo = atoi(no.c_str()) - 1;
- auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT);
- if (pBase)
- {
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(mo + "." + mp, name1, name2, name3);
- assert(pBase->type == eZL_ALARMTYPE::MAX_OVER_LIMIT);
- auto pInfo = (MAX_OVER_LIMIT_INFO*)pBase;
- Value confArray(kArrayType);
- Value confName(kObjectType);
- confName.AddMember("name", "enable", allocator);
- string enable = pInfo->enable ? "true" : "false";
- Value str_value(kStringType);
- str_value.SetString(enable.c_str(), enable.length());
- confName.AddMember("val", str_value, allocator);
- confArray.PushBack(confName, allocator);
- string alarm, warn, f_alarm, f_warn;
- Value label_name, label_name2;
- if (pInfo->alarm_high_limit != SHORT_MAX)
- {
- Value confAlarmHigh(kObjectType);
- if (nNo == 2) confAlarmHigh.AddMember("name", "d_alarm_high_limit", allocator);
- else
- {
- confAlarmHigh.AddMember("name", "lock_alarm_high_limit", allocator);
- if (nNo == 0)
- {
- label_name.SetString(name1.c_str(), name1.size());
- confAlarmHigh.AddMember("label", label_name, allocator);
- }
- else if (nNo == 1)
- {
- label_name.SetString(name2.c_str(), name2.size());
- confAlarmHigh.AddMember("label", label_name, allocator);
- }
- }
- alarm = to_string(pInfo->alarm_high_limit);
- Value alarm_value;
- alarm_value.SetString(alarm.c_str(), alarm.size());
- confAlarmHigh.AddMember("val", alarm_value, allocator);
- confArray.PushBack(confAlarmHigh, allocator);
- }
- if (pInfo->warn_high_limit != SHORT_MAX)
- {
- Value confWarnHigh(kObjectType);
- if (nNo == 2) confWarnHigh.AddMember("name", "d_warn_high_limit", allocator);
- else
- {
- confWarnHigh.AddMember("name", "lock_warn_high_limit", allocator);
- if (nNo == 0)
- {
- label_name2.SetString(name1.c_str(), name1.size());
- confWarnHigh.AddMember("label", label_name2, allocator);
- }
- else if (nNo == 1)
- {
- label_name2.SetString(name2.c_str(), name2.size());
- confWarnHigh.AddMember("label", label_name2, allocator);
- }
- }
- warn = to_string(pInfo->warn_high_limit);
- str_value.SetString(warn.c_str(), warn.length());
- confWarnHigh.AddMember("val", str_value, allocator);
- confArray.PushBack(confWarnHigh, allocator);
- }
- if (pInfo->f_alarm_high_limit != SHORT_MAX)
- {
- Value f_confAlarmHigh(kObjectType);
- if (nNo == 2)f_confAlarmHigh.AddMember("name", "f_alarm_high_limit", allocator);
- else f_confAlarmHigh.AddMember("name", "keep_alarm_high_limit", allocator);
- f_alarm = to_string(pInfo->f_alarm_high_limit);
- str_value.SetString(f_alarm.c_str(), f_alarm.length());
- f_confAlarmHigh.AddMember("val", str_value, allocator);
- confArray.PushBack(f_confAlarmHigh, allocator);
- }
- if (pInfo->f_warn_high_limit != SHORT_MAX)
- {
- Value f_confWarnHigh(kObjectType);
- if (nNo == 2) f_confWarnHigh.AddMember("name", "f_warn_high_limit", allocator);
- else f_confWarnHigh.AddMember("name", "keep_warn_high_limit", allocator);
- f_warn = to_string(pInfo->f_warn_high_limit);
- str_value.SetString(f_warn.c_str(), f_warn.length());
- f_confWarnHigh.AddMember("val", str_value, allocator);
- confArray.PushBack(f_confWarnHigh, allocator);
- }
- doc.AddMember("conf", confArray, allocator);
- //生成字符串
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- string str/* = ANSItoUTF8(buffer.GetString())*/;
- //int len = str.GetLength();
- //auto pData = buffer.GetString();
- uint8_t* pSend = new uint8_t[LWS_PRE + str.length()];
- memcpy(pSend + LWS_PRE, str.c_str(), str.length());
- lws_write(wsi, pSend + LWS_PRE, str.length(), LWS_WRITE_TEXT);
- delete[] pSend;
- pSend = nullptr;
- }
- else
- {
- Value confArray(kArrayType);
- doc.AddMember("conf", confArray, allocator);
- //生成字符串
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- int len = buffer.GetLength();
- uint8_t* pSend = new uint8_t[LWS_PRE + len];
- memcpy(pSend + LWS_PRE, buffer.GetString(), len);
- lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
- delete[] pSend;
- pSend = nullptr;
- }
- return 200;
- }
- }
- }
- }
- return 400;
- }
- else if (type.compare("monitor.resist.rename") == 0) //设置曲线别名
- {
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(tag, name1, name2, name3);
- Value conf(kArrayType);
- Value value(kStringType);
- char utf[200];
- if (name1.length())
- {
- int str_len = gbk2utf8(utf, 200, name1.c_str());
- value.SetString(utf, str_len - 1, allocator);
- }
- else
- {
- int str_len = gbk2utf8(utf, 200,"1号测力曲线");
- value.SetString(utf, str_len - 1, allocator);
- }
- conf.PushBack(value, allocator);
- if (name2.length())
- {
- int str_len = gbk2utf8(utf, 200, name2.c_str());
- value.SetString(utf, str_len - 1, allocator);
- }
- else
- {
- int str_len = gbk2utf8(utf, 200, "2号测力曲线");
- value.SetString(utf, str_len - 1, allocator);
- }
- conf.PushBack(value, allocator);
- if (name3.length())
- {
- int str_len = gbk2utf8(utf, 200, name3.c_str());
- value.SetString(utf, str_len - 1, allocator);
- }
- else
- {
- int str_len = gbk2utf8(utf, 200, "转换阻力曲线");
- value.SetString(utf, str_len - 1, allocator);
- }
- conf.PushBack(value, allocator);
- doc.AddMember("conf", conf, allocator);
- //生成字符串
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- int len = buffer.GetLength();
- uint8_t* pSend = new uint8_t[LWS_PRE + len];
- memcpy(pSend + LWS_PRE, buffer.GetString(), len);
- lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
- delete[] pSend;
- pSend = nullptr;
- return 200;
- }
- else if (type.compare("monitor.switch_direct.rename") == 0)
- {
- string direct1, direct2;
- CMonitorObjectMng::Instance()->GetDirectByMoMp(tag, direct1, direct2);
- Value conf(kArrayType);
- Value value(kStringType);
- char utf[200];
- int str_len = gbk2utf8(utf, 200, direct1.c_str());
- value.SetString(utf, str_len - 1, allocator);
- conf.PushBack(value, allocator);
- str_len = gbk2utf8(utf, 200, direct2.c_str());
- value.SetString(utf, str_len - 1, allocator);
- conf.PushBack(value, allocator);
- doc.AddMember("conf", conf, allocator);
- //生成字符串
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- int len = buffer.GetLength();
- uint8_t* pSend = new uint8_t[LWS_PRE + len];
- memcpy(pSend + LWS_PRE, buffer.GetString(), len);
- lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
- delete[] pSend;
- pSend = nullptr;
- return 200;
- }
- else if (type.compare("monitor.alarm.friction_over_limit") == 0){
- int nPos = tag.find('.');
- if (nPos != -1)
- {
- auto mo = tag.substr(0, nPos);
- int nPos2 = tag.find('.', nPos + 1);
- if (nPos2 != -1)
- {
- auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
- int nPos3 = tag.find('.', nPos2 + 1);
- if (nPos3 != -1)
- {
- auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
- if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
- {
- int nNo = atoi(no.c_str()) - 1;
- if (nNo != 2) return 400;
- auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eZL_ALARMTYPE::FRICTION_OVER_LIMIT);
- if (pBase)
- {
- assert(pBase->type == eZL_ALARMTYPE::FRICTION_OVER_LIMIT);
- auto pInfo = (FRICTION_OVER_LIMIT_INFO*)pBase;
- //换成 yyjson
- auto res_doc = yyjson_mut_doc_new(nullptr);
- auto res_obj = yyjson_mut_obj(res_doc);
- yyjson_mut_doc_set_root(res_doc, res_obj);
- yyjson_mut_obj_add_str(res_doc, res_obj, "cmd", "conf_read");
- yyjson_mut_obj_add_str(res_doc, res_obj, "type", type.c_str());
- yyjson_mut_obj_add_str(res_doc, res_obj, "tag", tag.c_str());
- //conf
- auto res_arr = yyjson_mut_arr(res_doc);
- yyjson_mut_obj_add_val(res_doc, res_obj, "conf", res_arr);
- {
- auto obj = yyjson_mut_obj(res_doc);
- yyjson_mut_obj_add_str(res_doc, obj, "name", "enable");
- yyjson_mut_obj_add_str(res_doc, obj, "val", pInfo->enable ? "true" : "false");
- yyjson_mut_arr_add_val(res_arr, obj);
- }
- {
- auto obj = yyjson_mut_obj(res_doc);
- yyjson_mut_obj_add_str(res_doc, obj, "name", "up_alarm_low_limit");
- yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->up_alarm_low_limit).c_str());
- yyjson_mut_arr_add_val(res_arr, obj);
- }
- {
- auto obj = yyjson_mut_obj(res_doc);
- yyjson_mut_obj_add_str(res_doc, obj, "name", "up_warn_low_limit");
- yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->up_warn_low_limit).c_str());
- yyjson_mut_arr_add_val(res_arr, obj);
- }
- {
- auto obj = yyjson_mut_obj(res_doc);
- yyjson_mut_obj_add_str(res_doc, obj, "name", "dw_alarm_high_limit");
- yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->dw_alarm_high_limit).c_str());
- yyjson_mut_arr_add_val(res_arr, obj);
- }
- {
- auto obj = yyjson_mut_obj(res_doc);
- yyjson_mut_obj_add_str(res_doc, obj, "name", "dw_warn_high_limit");
- yyjson_mut_obj_add_strcpy(res_doc, obj, "val", to_string(pInfo->dw_warn_high_limit).c_str());
- yyjson_mut_arr_add_val(res_arr, obj);
- }
- size_t len = 0;
- auto res_json = yyjson_mut_write(res_doc, YYJSON_WRITE_NOFLAG, &len);
- ASSERT(res_json);
- uint8_t* pSend = new uint8_t[LWS_PRE + len];
- memcpy(pSend + LWS_PRE, res_json, len);
- lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
- delete[] pSend;
- pSend = nullptr;
- free((void*)res_json);
- yyjson_mut_doc_free(res_doc);
- }
- else
- {
- Value confArray(kArrayType);
- doc.AddMember("conf", confArray, allocator);
- //生成字符串
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- int len = buffer.GetLength();
- uint8_t* pSend = new uint8_t[LWS_PRE + len];
- memcpy(pSend + LWS_PRE, buffer.GetString(), len);
- lws_write(wsi, pSend + LWS_PRE, len, LWS_WRITE_TEXT);
- delete[] pSend;
- pSend = nullptr;
- }
- return 200;
- }
- }
- }
- }
- return 400;
- }
- else
- {
- return 500;
- }
- }
- int CLWSServer::HandleConfWrite(lws* wsi, rapidjson::Document& jsondoc)
- {
- //读取类型
- if (jsondoc.HasMember("type") == false || jsondoc["type"].IsString() == false)
- return 400;
- if (jsondoc.HasMember("tag") == false || jsondoc["tag"].IsString() == false)
- return 400;
- if (jsondoc.HasMember("conf") == false || jsondoc["conf"].IsArray() == false)
- return 400;
- string type = jsondoc["type"].GetString();
- string tag = jsondoc["tag"].GetString();
- auto conf = jsondoc["conf"].GetArray();
- using namespace rapidjson;
- rapidjson::Document::AllocatorType &allocator = jsondoc.GetAllocator(); //获取分配器
- if (type.compare("monitor.alarm.max_over_limit") == 0)
- {
- int nPos = tag.find('.');
- if (nPos != -1)
- {
- auto mo = tag.substr(0, nPos);
- int nPos2 = tag.find('.', nPos + 1);
- if (nPos2 != -1)
- {
- auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
- int nPos3 = tag.find('.', nPos2 + 1);
- if (nPos3 != -1)
- {
- auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
- if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
- {
- int nNo = atoi(no.c_str()) - 1;
- bool enable = false;
- short alarm = MAXSHORT, warn = MAXSHORT, f_alarm = MAXSHORT, f_warn = MAXSHORT;
- for (SizeType i = 0; i < conf.Size(); i++)
- {
- if (conf[i].HasMember("name") && conf[i]["name"].IsString() && conf[i].HasMember("val") && conf[i]["val"].IsString())
- {
- string name = conf[i]["name"].GetString();
- string val = conf[i]["val"].GetString();
- if (name.compare("enable") == 0)
- {
- if (val.compare("false") == 0)
- {
- enable = false;
- }
- else
- {
- enable = true;
- }
- }
- else if (name.compare("lock_alarm_high_limit") == 0)
- {
- alarm = atoi(val.c_str());
- }
- else if (name.compare("lock_warn_high_limit") == 0)
- {
- warn = atoi(val.c_str());
- }
- else if (name.compare("d_alarm_high_limit") == 0)
- {
- alarm = atoi(val.c_str());
- }
- else if (name.compare("d_warn_high_limit") == 0)
- {
- warn = atoi(val.c_str());
- }
- else if (name.compare("keep_alarm_high_limit") == 0)
- {
- f_alarm = atoi(val.c_str());
- }
- else if (name.compare("keep_warn_high_limit") == 0)
- {
- f_warn = atoi(val.c_str());
- }
- else if (name.compare("f_alarm_high_limit") == 0)
- {
- f_alarm = atoi(val.c_str());
- }
- else if (name.compare("f_warn_high_limit") == 0)
- {
- f_warn = atoi(val.c_str());
- }
- }
- }
- auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT);
- auto pInfo = (MAX_OVER_LIMIT_INFO*)pBase;
- if (pBase == nullptr) pInfo = new MAX_OVER_LIMIT_INFO;
- pInfo->enable = enable;
- pInfo->no = nNo;
- pInfo->type = eZL_ALARMTYPE::MAX_OVER_LIMIT;
- pInfo->alarm_high_limit = alarm;
- pInfo->warn_high_limit = warn;
- pInfo->f_alarm_high_limit = f_alarm;
- pInfo->f_warn_high_limit = f_warn;
- //生成字符串
- Document doc;
- doc.SetArray();
- for (SizeType i = 0; i < conf.Size(); i++)
- doc.PushBack(conf[i], allocator);
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- if (pBase == nullptr)
- {
- auto ret = CResistAlarmMng::Instance()->Insert(mo, mp, nNo, (int)eZL_ALARMTYPE::MAX_OVER_LIMIT, pInfo);
- assert(ret);
- if (ret == false)
- {
- delete pInfo;
- return 500;
- }
- //add
- CString sql;
- sql.Format("INSERT INTO [rm_alarm_set]([mo],[mp],[no],[type],[conf],[time]) VALUES ('%s','%s',%d,%d,'%s','%I64u')",
- mo.c_str(), mp.c_str(), nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT, buffer.GetString(), 0);
- if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
- {
- assert(0);
- CSimpleLog::Error("语句执行失败" + sql);
- return 500;
- }
- }
- else
- {
- //update
- CString sql;
- sql.Format("update rm_alarm_set SET conf = '%s' WHERE mo = '%s' and mp = '%s' and no = %d and type = %d",
- buffer.GetString(), mo.c_str(), mp.c_str(), nNo, eZL_ALARMTYPE::MAX_OVER_LIMIT);
- if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
- {
- assert(0);
- CSimpleLog::Error("语句执行失败" + sql);
- return 500;
- }
- }
- return 200;
- }
- }
- }
- }
- return 400;
- }
- else if (type.compare("monitor.resist.rename") == 0)
- {
- if (conf.Size() != 3) return 400;
- int nPos = tag.find('.');
- if (nPos != -1)
- {
- auto mo = tag.substr(0, nPos);
- auto mp = tag.substr(nPos + 1, tag.length() - nPos - 1);
- string name1, name2, name3;
- //update
- name1 = conf[0].GetString();
- name2 = conf[1].GetString();
- name3 = conf[2].GetString();
- CMonitorObjectMng::Instance()->SetNameByMoMp(tag, name1, name2, name3);
- //save
- CString sql;
- sql.Format("update rm_map set name1='%s',name2='%s',name3='%s' where mo = '%s' and mp = '%s';",
- name1.c_str(), name2.c_str(), name3.c_str(), mo.c_str(), mp.c_str());
- auto ret = CDBConnectPool::Instance()->DBExecuteSQL(sql);
- if (false == ret)
- {
- CSimpleLog::Error("语句执行错误." + sql);
- return 500;
- }
- return 200;
- }
- return 400;
- }
- else if (type.compare("monitor.switch_direct.rename") == 0)
- {
- if (conf.Size() != 2) return 400;
- int nPos = tag.find('.');
- if (nPos != -1)
- {
- auto mo = tag.substr(0, nPos);
- auto mp = tag.substr(nPos + 1, tag.length() - nPos - 1);
- string direct1, direct2;
- //update
- direct1 = conf[0].GetString();
- direct2 = conf[1].GetString();
- CMonitorObjectMng::Instance()->SetDirectByMoMp(tag, direct1, direct2);
- //save
- CString sql;
- sql.Format("update rm_map set direct1='%s',direct2='%s' where mo = '%s' and mp = '%s';",
- direct1.c_str(), direct2.c_str(), mo.c_str(), mp.c_str());
- auto ret = CDBConnectPool::Instance()->DBExecuteSQL(sql);
- if (false == ret)
- {
- CSimpleLog::Error("语句执行错误." + sql);
- return 500;
- }
- return 200;
- }
- return 400;
- }
- else if (type.compare("monitor.alarm.friction_over_limit") == 0)
- {
- auto eType = eZL_ALARMTYPE::FRICTION_OVER_LIMIT;
- int nPos = tag.find('.');
- if (nPos != -1)
- {
- auto mo = tag.substr(0, nPos);
- int nPos2 = tag.find('.', nPos + 1);
- if (nPos2 != -1)
- {
- auto mp = tag.substr(nPos + 1, nPos2 - nPos - 1);
- int nPos3 = tag.find('.', nPos2 + 1);
- if (nPos3 != -1)
- {
- auto no = tag.substr(nPos2 + 1, nPos3 - nPos2 - 1);
- if (mo.length() > 0 && mp.length() > 0 && no.length() > 0)
- {
- int nNo = atoi(no.c_str()) - 1;
- if (nNo != 2) return 400;
- bool enable = false;
- int up_alarm_low_limit = INT_MAX;
- int up_warn_low_limit = INT_MAX;
- int dw_alarm_high_limit = INT_MIN;
- int dw_warn_high_limit = INT_MIN;
- for (SizeType i = 0; i < conf.Size(); i++)
- {
- if (conf[i].HasMember("name") && conf[i]["name"].IsString() && conf[i].HasMember("val") && conf[i]["val"].IsString())
- {
- string name = conf[i]["name"].GetString();
- string val = conf[i]["val"].GetString();
- if (name.compare("enable") == 0)
- {
- if (val.compare("false") == 0)
- {
- enable = false;
- }
- else
- {
- enable = true;
- }
- }
- else if (name.compare("up_alarm_low_limit") == 0)
- {
- up_alarm_low_limit = atoi(val.c_str());
- }
- else if (name.compare("up_warn_low_limit") == 0)
- {
- up_warn_low_limit = atoi(val.c_str());
- }
- else if (name.compare("dw_alarm_high_limit") == 0)
- {
- dw_alarm_high_limit = atoi(val.c_str());
- }
- else if (name.compare("dw_warn_high_limit") == 0)
- {
- dw_warn_high_limit = atoi(val.c_str());
- }
- }
- }
- auto pBase = CResistAlarmMng::Instance()->Find(mo, mp, nNo, eType);
- auto pInfo = (FRICTION_OVER_LIMIT_INFO*)pBase;
- if (pBase == nullptr) pInfo = new FRICTION_OVER_LIMIT_INFO;
- pInfo->enable = enable;
- pInfo->no = nNo;
- pInfo->type = eType;
- pInfo->up_alarm_low_limit = up_alarm_low_limit;
- pInfo->up_warn_low_limit = up_warn_low_limit;
- pInfo->dw_alarm_high_limit = dw_alarm_high_limit;
- pInfo->dw_warn_high_limit = dw_warn_high_limit;
- //生成字符串
- Document doc;
- doc.SetArray();
- for (SizeType i = 0; i < conf.Size(); i++)
- doc.PushBack(conf[i], allocator);
- StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- doc.Accept(writer);
- if (pBase == nullptr)
- {
- auto ret = CResistAlarmMng::Instance()->Insert(mo, mp, nNo, (int)eType, pInfo);
- assert(ret);
- if (ret == false)
- {
- delete pInfo;
- return 500;
- }
- //add
- CString sql;
- sql.Format("INSERT INTO [rm_alarm_set]([mo],[mp],[no],[type],[conf],[time]) VALUES ('%s','%s',%d,%d,'%s','%I64u')",
- mo.c_str(), mp.c_str(), nNo, eType, buffer.GetString(), 0);
- if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
- {
- ASSERT(0);
- CSimpleLog::Error("语句执行失败" + sql);
- return 500;
- }
- }
- else
- {
- //update
- CString sql;
- sql.Format("update rm_alarm_set SET conf = '%s' WHERE mo = '%s' and mp = '%s' and no = %d and type = %d",
- buffer.GetString(), mo.c_str(), mp.c_str(), nNo, eType);
- if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
- {
- ASSERT(0);
- CSimpleLog::Error("语句执行失败" + sql);
- return 500;
- }
- }
- return 200;
- }
- }
- }
- }
- return 400;
- }
- return 500;
- }
- int CLWSServer::HandleAlarmAck(lws* wsi, rapidjson::Document& jsondoc, std::string& ack_time, std::string& handle_name)
- {
- if (jsondoc.HasMember("alarm_id") == false || jsondoc["alarm_id"].IsNumber() == false)
- return 400;
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it != m_mapLwsSession.end())
- {
- handle_name = it->second.username;
- }
- }
- SYSTEMTIME stOccr_time;
- int alarm_id = jsondoc["alarm_id"].GetInt();
- {
- CTime ctNow = CTime::GetCurrentTime();
- //删除内存数据
- bool ret = CResistAlarmMng::Instance()->AckAlarm(alarm_id, handle_name, ctNow);
- //更新数据库
- {
- ack_time = ctNow.Format("%Y-%m-%d %H:%M:%S");
- CString sql;
- sql.Format("UPDATE [rm_alarm] SET ack_result = 1, ack_name='%s', ack_time='%s' WHERE ID = %d;",
- handle_name.c_str(), ack_time.c_str(), alarm_id);
- ret |= CDBConnectPool::Instance()->DBExecuteSQL(sql);
- }
- if (ret) return 200;
- return 400;
- }
- return 500;
- }
- int CLWSServer::HandleAlarmHandle(lws* wsi, rapidjson::Document& jsondoc, std::string& ack_time, std::string& handle_name, std::string& hanlde_info)
- {
- //读取类型
- //if (jsondoc.HasMember("type") == false || jsondoc["type"].IsString() == false)
- // return 400;
- //if (jsondoc.HasMember("tag") == false || jsondoc["tag"].IsString() == false)
- // return 400;
- if (jsondoc.HasMember("alarm_id") == false || jsondoc["alarm_id"].IsNumber() == false)
- return 400;
- SYSTEMTIME stOccr_time;
- //string type = jsondoc["type"].GetString();
- //string tag = jsondoc["tag"].GetString();
- int alarm_id = jsondoc["alarm_id"].GetInt();
- if (jsondoc.HasMember("hanlde_info") && jsondoc["hanlde_info"].IsString())
- hanlde_info = UTF8toANSI(jsondoc["hanlde_info"].GetString());
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto it = m_mapLwsSession.find(wsi);
- if (it != m_mapLwsSession.end())
- {
- handle_name = it->second.username;
- }
- }
- //if (type.compare("monitor.alarm.max_over_limit") == 0)
- {
- CTime ctNow = CTime::GetCurrentTime();
- //删除内存数据
- bool ret = CResistAlarmMng::Instance()->HandleAlarm(alarm_id);
- //更新数据库
- {
- ack_time = ctNow.Format("%Y-%m-%d %H:%M:%S");
- CString sql;
- sql.Format("UPDATE [rm_alarm] SET handle_result = 1, handle_name='%s', handle_time='%s', handle_info='%s' WHERE ID = %d;",
- handle_name.c_str(), ack_time.c_str(), hanlde_info.c_str(), alarm_id);
- ret |= CDBConnectPool::Instance()->DBExecuteSQL(sql);
- }
- if (ret) return 200;
- return 400;
- }
- return 500;
- }
- void CLWSServer::SendRealResistData(const string& imei_idx, const int num,
- const vector<int>& vctData0, const vector<int>& vctData1, const vector<int>& vctData2,
- const vector<bool>& vctResult, const CTime& atime)
- {
- if (m_mapLwsSession.size() == 0) return;
- bool bSub = false;
- {
- lock_guard<mutex> lock(m_mtxSession);
- for (const auto& it :m_mapLwsSession)
- {
- if (strstr(it.second.token, "BBBBBBBB"))
- {
- bSub = true;
- break;
- }
- //if (it.second.isLogin == false) continue;
- for (const auto& ik : it.second.m_lstSubReal)
- {
- if (ik.compare(imei_idx) == 0)
- {
- bSub = true;
- break;
- }
- }
- if (bSub) break;
- }
- }
- //所有客户端都未订阅
- if (!bSub) return;
- string mo_mp;
- auto ret = CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp);
- assert(ret);
- if (false == ret)
- {
- CString strLog;
- strLog.Format("imei(%s) 转换成 mo, mp 失败.请检测是否绑定.%s:%d", imei_idx.c_str(), __FUNCTION__, __LINE__);
- CSimpleLog::Error(strLog);
- }
- rapidjson::StringBuffer strBuf;
- GeneralResistData(mo_mp, num, 0, vctData0, vctData1, vctData2, vctResult, atime, strBuf);
- string strSend = strBuf.GetString();
- lock_guard<mutex> lock(m_mtxSend);
- memcpy_s(g_send_buf + LWS_PRE, MAX_PAYLOAD_SIZE, strSend.c_str(), strSend.length());
- lock_guard<mutex> lock2(m_mtxSession);
- for (const auto& it : m_mapLwsSession)
- {
- bSub = false;
- //if (it.second.isLogin == false) continue;
- if (strstr(it.second.token, "BBBBBBBB"))
- {
- bSub = true;
- }
- else
- {
- for (const auto& ik : it.second.m_lstSubReal)
- {
- if (ik.compare(imei_idx) == 0)
- {
- bSub = true;
- break;
- }
- }
- }
- if (bSub)
- {
- lws_write(it.first, g_send_buf + LWS_PRE, strSend.length(), LWS_WRITE_TEXT);
- }
- }
- }
- void CLWSServer::SendHumiTemp(const char* imei, const COleDateTime& dt, int humi, int temp)
- {
- if (m_mapLwsSession.size() == 0) return;
- bool bSub = false;
- {
- lock_guard<mutex> lock(m_mtxSession);
- for (const auto& it : m_mapLwsSession)
- {
- if (strstr(it.second.token, "BBBBBBBB"))
- {
- bSub = true;
- break;
- }
- if (bSub) break;
- }
- }
- //所有客户端都未订阅
- if (!bSub) return;
- auto doc = yyjson_mut_doc_new(nullptr);
- auto root = yyjson_mut_obj(doc);
- yyjson_mut_doc_set_root(doc, root);
- yyjson_mut_obj_add_str(doc, root, "cmd", "new_data_notify");
- yyjson_mut_obj_add_strcpy(doc, root, "time", dt.Format("%Y-%m-%d %H:%M:%S"));
- yyjson_mut_obj_add_int(doc, root, "humi", humi / 100);
- yyjson_mut_obj_add_int(doc, root, "temp", temp);
- string imei_idx = string(imei) + ".0";
- string mo_mp;
- if (CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp))
- {
- yyjson_mut_obj_add_strcpy(doc, root, "tag", (mo_mp + ".humi_temp").c_str());
- size_t len;
- auto json = yyjson_mut_write(doc, 0, &len);
- if (json)
- {
- auto pTemp = new uint8_t[300];
- auto pData = pTemp + LWS_PRE;
- {
- lock_guard<mutex> lock(m_mtxSession);
- memcpy_s(pData, MAX_PAYLOAD_SIZE, json, len);
- for (const auto& it : m_mapLwsSession)
- {
- if (strstr(it.second.token, "BBBBBBBB"))
- {
- lws_write(it.first, pData, len, LWS_WRITE_TEXT);
- }
- }
- }
- delete[] pTemp;
- free((void*)json);
- }
- }
- imei_idx = string(imei) + ".1";
- if (CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp))
- {
- yyjson_mut_obj_remove_str(root, "tag");
- yyjson_mut_obj_add_strcpy(doc, root, "tag", (mo_mp + ".humi_temp").c_str());
- size_t len;
- auto json = yyjson_mut_write(doc, 0, &len);
- if (json)
- {
- auto pTemp = new uint8_t[200];
- auto pData = pTemp + LWS_PRE;
- memcpy_s(pData, 200 - LWS_PRE, json, len);
- {
- lock_guard<mutex> lock(m_mtxSession);
- for (const auto& it : m_mapLwsSession)
- {
- if (strstr(it.second.token, "BBBBBBBB"))
- {
- lws_write(it.first, pData, len, LWS_WRITE_TEXT);
- }
- }
- }
- delete[] pTemp;
- free((void*)json);
- }
- }
- imei_idx = string(imei) + ".2";
- if (CMonitorObjectMng::Instance()->IMEI2MOMP(imei_idx, mo_mp))
- {
- yyjson_mut_obj_remove_str(root, "tag");
- yyjson_mut_obj_add_strcpy(doc, root, "tag", (mo_mp + ".humi_temp").c_str());
- size_t len;
- auto json = yyjson_mut_write(doc, 0, &len);
- if (json)
- {
- auto pTemp = new uint8_t[200];
- auto pData = pTemp + LWS_PRE;
- {
- memcpy_s(pData, MAX_PAYLOAD_SIZE, json, len);
- lock_guard<mutex> lock(m_mtxSession);
- for (const auto& it : m_mapLwsSession)
- {
- if (strstr(it.second.token, "BBBBBBBB"))
- {
- lws_write(it.first, pData, len, LWS_WRITE_TEXT);
- }
- }
- }
- delete[] pTemp;
- free((void*)json);
- }
- }
- yyjson_mut_doc_free(doc);
- }
- int CLWSServer::SendUnAckAlarm(lws* wsi)
- {
- {
- lock_guard<mutex> lock(m_mtxSession);
- auto ik = m_mapLwsSession.find(wsi);
- if (ik == m_mapLwsSession.end()) return 500;
- if (ik->second.isLogin == false) return 401;
- }{
- uint8_t data[4096 + LWS_PRE];
- lock_guard<mutex> lock(CResistAlarmMng::Instance()->m_mtxAlarm);
- auto it = CResistAlarmMng::Instance()->m_lstUnConfirmAlarm.crbegin();
- for (int i = 0; i < 10 && it != CResistAlarmMng::Instance()->m_lstUnConfirmAlarm.crend(); i++, it++)
- {
- auto& pAlarmInfo = *it;
- //TODO 根据用户过滤
- rapidjson::StringBuffer buffer;
- auto ret = CResistAlarmMng::AlarmInfo2Pack(pAlarmInfo, buffer);
- const char* output = buffer.GetString();
- int len = buffer.GetLength();
- memcpy_s(data + LWS_PRE, 4096, output, len);
- auto sendlen = lws_write(wsi, data + LWS_PRE, len, LWS_WRITE_TEXT);
- if (sendlen <= 0) return 500;
- }
- }
- return 200;
- }
- bool CLWSServer::GeneralResistData(const string mo_mp, const int num, const int index, const std::vector<int>& vctData0,
- const std::vector<int>& vctData1, const std::vector<int>& vctData2, const vector<bool>& vctResult, const CTime& atime, rapidjson::StringBuffer& strBuf)
- {
- char sz_utf_first[100];
- char sz_utf_second[100];
- char sz_utf_three[100];
- string name1, name2, name3;
- CMonitorObjectMng::Instance()->GetNameByMoMp(mo_mp, name1, name2, name3);
- if (name1[0x00] == 0x00)
- gbk2utf8(sz_utf_first, 100, "1号测力曲线");
- else
- gbk2utf8(sz_utf_first, 100, name1.c_str());
- if (name2[0x00] == 0x00)
- gbk2utf8(sz_utf_second, 100, "2号测力曲线");
- else
- gbk2utf8(sz_utf_second, 100, name2.c_str());
- if (name3[0x00] == 0x00)
- gbk2utf8(sz_utf_three, 100, "转换阻力曲线");
- else
- gbk2utf8(sz_utf_three, 100, name3.c_str());
- int step = 1000 / num;
- uint64_t utime_t = atime.GetTime() * 1000;
- string up, momp_name;
- CMonitorObjectMng::Instance()->GetStationNameByMomP(mo_mp, up, momp_name);
- using namespace rapidjson;
- Writer<StringBuffer> writer(strBuf);
- writer.StartObject();
- writer.Key("cmd");
- writer.String("new_data_notify");
- writer.Key("tag");
- //sprintf_s(szInfo, 256, "%s.resist", mo_mp.c_str());
- //gbk2utf8(sz_utf, 412, szInfo);
- writer.String((mo_mp + ".resist").c_str());
- writer.Key("up");
- writer.String(ANSItoUTF8(up).c_str());
- writer.Key("tag_name");
- writer.String(ANSItoUTF8(momp_name).c_str());
- writer.Key("time");
- writer.String("");
- writer.Key("data_fmt");
- writer.String("curve");
- writer.Key("unit");
- writer.String("N");
- writer.Key("data");
- writer.StartArray();
- //1号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_first);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < num; i++)
- {
- if (vctResult[i] == false) continue;
- if (vctData0[i] == INVALID_RESIST) continue;
- writer.StartArray();
- writer.Uint64(utime_t + step* i);
- writer.Int(vctData0[i]);
- writer.EndArray();
- }
- writer.EndArray();
- writer.EndObject();
- //2号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_second);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < num; i++)
- {
- if (vctResult[i] == false) continue;
- if (vctData1[i] == INVALID_RESIST) continue;
- writer.StartArray();
- writer.Uint64(utime_t + step* i);
- writer.Int(vctData1[i]);
- writer.EndArray();
- }
- writer.EndArray();
- writer.EndObject();
- //3号测力点
- writer.StartObject();
- writer.Key("name");
- writer.String(sz_utf_three);
- writer.Key("points");
- writer.StartArray();
- for (int i = 0; i < num; i++)
- {
- if (vctResult[i] == false) continue;
- if (vctData2[i] == false) continue;
- writer.StartArray();
- writer.Uint64(utime_t + step* i);
- writer.Int(vctData2[i]);
- writer.EndArray();
- }
- writer.EndArray();
- writer.EndObject();
- writer.EndArray();
- writer.EndObject();
- return true;
- }
|