2 Commits

Author SHA1 Message Date
lnk
98adfd3870 fix compile problem in otherplace 2025-06-24 17:55:34 +08:00
lnk
22c6b92af2 add front demo in this project 2025-06-20 16:20:59 +08:00
29 changed files with 555 additions and 4099 deletions

71
.vscode/settings.json vendored
View File

@@ -57,76 +57,9 @@
"C_Cpp_Runner.useLinkTimeOptimization": false,
"C_Cpp_Runner.msvcSecureNoWarnings": false,
"files.associations": {
"any": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"cctype": "cpp",
"charconv": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"compare": "cpp",
"concepts": "cpp",
"condition_variable": "cpp",
"csignal": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"forward_list": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"ratio": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"format": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"numbers": "cpp",
"mutex": "cpp",
"ostream": "cpp",
"ranges": "cpp",
"semaphore": "cpp",
"span": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"stop_token": "cpp",
"streambuf": "cpp",
"text_encoding": "cpp",
"thread": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
"valarray": "cpp",
"variant": "cpp"
"thread": "cpp"
}
}

View File

@@ -1,60 +0,0 @@
// Microsoft Visual C++ <20><><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD>Դ<EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// <20><> TEXTINCLUDE 2 <20><>Դ<EFBFBD><D4B4><EFBFBD>ɡ<EFBFBD>
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>й<EFBFBD>) <20><>Դ
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 4, 2
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>й<EFBFBD>) <20><>Դ
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// <20><> TEXTINCLUDE 3 <20><>Դ<EFBFBD><D4B4><EFBFBD>ɡ<EFBFBD>
//
/////////////////////////////////////////////////////////////////////////////
#endif // <20><><EFBFBD><EFBFBD> APSTUDIO_INVOKED

View File

@@ -77,245 +77,23 @@
<PropertyGroup Label="UserMacros" />
<ItemGroup>
<ClCompile Include="client2.cpp" />
<ClCompile Include="cloudfront\code\cfg_parser.cpp" />
<ClCompile Include="cloudfront\code\interface.cpp" />
<ClCompile Include="cloudfront\code\log4.cpp" />
<ClCompile Include="cloudfront\code\main.cpp" />
<ClCompile Include="cloudfront\code\rocketmq.cpp" />
<ClCompile Include="cloudfront\code\tinyxml2.cpp" />
<ClCompile Include="cloudfront\code\worker.cpp" />
<ClCompile Include="dealMsg.cpp" />
<ClCompile Include="main_thread.cpp" />
<ClCompile Include="PQSMsg.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="client2.h" />
<ClInclude Include="cloudfront\code\curl\curl.h" />
<ClInclude Include="cloudfront\code\curl\curlver.h" />
<ClInclude Include="cloudfront\code\curl\easy.h" />
<ClInclude Include="cloudfront\code\curl\header.h" />
<ClInclude Include="cloudfront\code\curl\mprintf.h" />
<ClInclude Include="cloudfront\code\curl\multi.h" />
<ClInclude Include="cloudfront\code\curl\options.h" />
<ClInclude Include="cloudfront\code\curl\stdcheaders.h" />
<ClInclude Include="cloudfront\code\curl\system.h" />
<ClInclude Include="cloudfront\code\curl\typecheck-gcc.h" />
<ClInclude Include="cloudfront\code\curl\urlapi.h" />
<ClInclude Include="cloudfront\code\curl\websockets.h" />
<ClInclude Include="cloudfront\code\front.h" />
<ClInclude Include="cloudfront\code\interface.h" />
<ClInclude Include="cloudfront\code\log4.h" />
<ClInclude Include="cloudfront\code\log4cplus\appender.h" />
<ClInclude Include="cloudfront\code\log4cplus\asyncappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\boost\deviceappender.hxx" />
<ClInclude Include="cloudfront\code\log4cplus\callbackappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\clfsappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\clogger.h" />
<ClInclude Include="cloudfront\code\log4cplus\config.h" />
<ClInclude Include="cloudfront\code\log4cplus\config.hxx" />
<ClInclude Include="cloudfront\code\log4cplus\configurator.h" />
<ClInclude Include="cloudfront\code\log4cplus\config\defines.hxx" />
<ClInclude Include="cloudfront\code\log4cplus\config\macosx.h" />
<ClInclude Include="cloudfront\code\log4cplus\config\win32.h" />
<ClInclude Include="cloudfront\code\log4cplus\config\windowsh-inc-full.h" />
<ClInclude Include="cloudfront\code\log4cplus\config\windowsh-inc.h" />
<ClInclude Include="cloudfront\code\log4cplus\consoleappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\exception.h" />
<ClInclude Include="cloudfront\code\log4cplus\fileappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\fstreams.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\appenderattachableimpl.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\connectorthread.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\eventcounter.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\fileinfo.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\lockfile.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\loglog.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\pointer.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\property.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\queue.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\snprintf.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\socket.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\socketbuffer.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\stringhelper.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\thread-config.h" />
<ClInclude Include="cloudfront\code\log4cplus\helpers\timehelper.h" />
<ClInclude Include="cloudfront\code\log4cplus\hierarchy.h" />
<ClInclude Include="cloudfront\code\log4cplus\hierarchylocker.h" />
<ClInclude Include="cloudfront\code\log4cplus\initializer.h" />
<ClInclude Include="cloudfront\code\log4cplus\internal\customloglevelmanager.h" />
<ClInclude Include="cloudfront\code\log4cplus\internal\cygwin-win32.h" />
<ClInclude Include="cloudfront\code\log4cplus\internal\env.h" />
<ClInclude Include="cloudfront\code\log4cplus\internal\internal.h" />
<ClInclude Include="cloudfront\code\log4cplus\internal\socket.h" />
<ClInclude Include="cloudfront\code\log4cplus\layout.h" />
<ClInclude Include="cloudfront\code\log4cplus\log4.h" />
<ClInclude Include="cloudfront\code\log4cplus\log4cplus.h" />
<ClInclude Include="cloudfront\code\log4cplus\log4judpappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\logger.h" />
<ClInclude Include="cloudfront\code\log4cplus\loggingmacros.h" />
<ClInclude Include="cloudfront\code\log4cplus\loglevel.h" />
<ClInclude Include="cloudfront\code\log4cplus\mdc.h" />
<ClInclude Include="cloudfront\code\log4cplus\msttsappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\ndc.h" />
<ClInclude Include="cloudfront\code\log4cplus\nteventlogappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\nullappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\qt4debugappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\qt5debugappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\socketappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\appenderattachable.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\factory.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\filter.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\loggerfactory.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\loggerimpl.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\loggingevent.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\objectregistry.h" />
<ClInclude Include="cloudfront\code\log4cplus\spi\rootlogger.h" />
<ClInclude Include="cloudfront\code\log4cplus\streams.h" />
<ClInclude Include="cloudfront\code\log4cplus\syslogappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\tchar.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\syncprims-cxx11.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\syncprims-impl.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\syncprims-pmsm.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\threads-impl.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\tls.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\syncprims-pub-impl.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\syncprims.h" />
<ClInclude Include="cloudfront\code\log4cplus\thread\threads.h" />
<ClInclude Include="cloudfront\code\log4cplus\tracelogger.h" />
<ClInclude Include="cloudfront\code\log4cplus\tstring.h" />
<ClInclude Include="cloudfront\code\log4cplus\version.h" />
<ClInclude Include="cloudfront\code\log4cplus\win32consoleappender.h" />
<ClInclude Include="cloudfront\code\log4cplus\win32debugappender.h" />
<ClInclude Include="cloudfront\code\nlohmann\adl_serializer.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\byte_container_with_subtype.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\abi_macros.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\conversions\from_json.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\conversions\to_chars.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\conversions\to_json.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\exceptions.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\hash.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\input\binary_reader.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\input\input_adapters.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\input\json_sax.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\input\lexer.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\input\parser.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\input\position_t.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\internal_iterator.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\iteration_proxy.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\iterator_traits.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\iter_impl.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\json_reverse_iterator.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\primitive_iterator.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\json_custom_base_class.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\json_pointer.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\json_ref.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\macro_scope.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\macro_unscope.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\call_std\begin.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\call_std\end.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\cpp_future.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\detected.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\identity_tag.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\is_sax.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\std_fs.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\type_traits.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\void_t.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\output\binary_writer.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\output\output_adapters.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\output\serializer.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\string_concat.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\string_escape.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\detail\value_t.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\json.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\json_fwd.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\ordered_map.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\thirdparty\hedley\hedley.hpp" />
<ClInclude Include="cloudfront\code\nlohmann\thirdparty\hedley\hedley_undef.hpp" />
<ClInclude Include="cloudfront\code\rocketmq.h" />
<ClInclude Include="cloudfront\code\rocketmq\Arg_helper.h" />
<ClInclude Include="cloudfront\code\rocketmq\AsyncCallback.h" />
<ClInclude Include="cloudfront\code\rocketmq\CBatchMessage.h" />
<ClInclude Include="cloudfront\code\rocketmq\CCommon.h" />
<ClInclude Include="cloudfront\code\rocketmq\CErrorMessage.h" />
<ClInclude Include="cloudfront\code\rocketmq\CMessage.h" />
<ClInclude Include="cloudfront\code\rocketmq\CMessageExt.h" />
<ClInclude Include="cloudfront\code\rocketmq\CMessageQueue.h" />
<ClInclude Include="cloudfront\code\rocketmq\CMQException.h" />
<ClInclude Include="cloudfront\code\rocketmq\ConsumeType.h" />
<ClInclude Include="cloudfront\code\rocketmq\CProducer.h" />
<ClInclude Include="cloudfront\code\rocketmq\CPullConsumer.h" />
<ClInclude Include="cloudfront\code\rocketmq\CPullResult.h" />
<ClInclude Include="cloudfront\code\rocketmq\CPushConsumer.h" />
<ClInclude Include="cloudfront\code\rocketmq\CSendResult.h" />
<ClInclude Include="cloudfront\code\rocketmq\CTransactionStatus.h" />
<ClInclude Include="cloudfront\code\rocketmq\DefaultMQProducer.h" />
<ClInclude Include="cloudfront\code\rocketmq\DefaultMQPullConsumer.h" />
<ClInclude Include="cloudfront\code\rocketmq\DefaultMQPushConsumer.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQClient.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQClientException.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQMessage.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQMessageExt.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQMessageListener.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQMessageQueue.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQSelector.h" />
<ClInclude Include="cloudfront\code\rocketmq\MQueueListener.h" />
<ClInclude Include="cloudfront\code\rocketmq\PullResult.h" />
<ClInclude Include="cloudfront\code\rocketmq\RocketMQClient.h" />
<ClInclude Include="cloudfront\code\rocketmq\SendResult.h" />
<ClInclude Include="cloudfront\code\rocketmq\SessionCredentials.h" />
<ClInclude Include="cloudfront\code\rocketmq\TransactionListener.h" />
<ClInclude Include="cloudfront\code\rocketmq\TransactionMQProducer.h" />
<ClInclude Include="cloudfront\code\rocketmq\TransactionSendResult.h" />
<ClInclude Include="cloudfront\code\tinyxml2.h" />
<ClInclude Include="cloudfront\code\worker.h" />
<ClInclude Include="dealMsg.h" />
<ClInclude Include="PQSMsg.h" />
</ItemGroup>
<ItemGroup>
<None Include="build.sh" />
<None Include="cloudfront\code\curl\Makefile" />
<None Include="cloudfront\code\curl\Makefile.am" />
<None Include="cloudfront\code\curl\Makefile.in" />
<None Include="cloudfront\code\log4cplus\config.h.cmake.in" />
<None Include="cloudfront\code\log4cplus\config.h.in" />
<None Include="cloudfront\code\log4cplus\config\defines.hxx.in" />
<None Include="cloudfront\code\log4cplus\config\stamp-h2" />
<None Include="cloudfront\code\log4cplus\stamp-h1" />
<None Include="cloudfront\lib\libcrypto.so.1.0.0" />
<None Include="cloudfront\lib\libcrypto.so.1.1" />
<None Include="cloudfront\lib\libcurl.la" />
<None Include="cloudfront\lib\libcurl.so.4" />
<None Include="cloudfront\lib\libcurl.so.4.3.0" />
<None Include="cloudfront\lib\libcurl.so.4.7.0" />
<None Include="cloudfront\lib\liblog4cplus.so.9" />
<None Include="cloudfront\lib\libssl.so.1.0.0" />
<None Include="cloudfront\lib\libssl.so.1.1" />
</ItemGroup>
<ItemGroup>
<Library Include="cloudfront\lib\libcrypto.so" />
<Library Include="cloudfront\lib\libcurl.a" />
<Library Include="cloudfront\lib\libcurl.so" />
<Library Include="cloudfront\lib\liblog4cplus.so" />
<Library Include="cloudfront\lib\liblog4cplusS.a" />
<Library Include="cloudfront\lib\librocketmq.a" />
<Library Include="cloudfront\lib\librocketmq.so" />
<Library Include="cloudfront\lib\libssl.so" />
<Library Include="libuv.a" />
</ItemGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>$(RemoteRootDir)/cloudfront/code;$(RemoteRootDir)/cloudfront/code/nlohmann;$(RemoteRootDir)/cloudfront/code/curl;$(RemoteRootDir)/cloudfront/code/log4cplus;$(RemoteRootDir)/cloudfront/code/rocketmq;$(RemoteRootDir)/lib/libuv-v1.51.0/include;$(RemoteRootDir);D:\Git代码\frontlinux\LFtid1056\cloudfront\code;D:\Git代码\frontlinux\LFtid1056;D:\Git代码\frontlinux\LFtid1056\lib\libuv-v1.51.0\include;D:\Git代码\frontlinux\LFtid1056\cloudfront\code\curl;D:\Git代码\frontlinux\LFtid1056\cloudfront\code\log4cplus;D:\Git代码\frontlinux\LFtid1056\cloudfront\code\nlohmann;D:\Git代码\frontlinux\LFtid1056\cloudfront\code\rocketmq;./cloudfront/code;./cloudfront/code/nlohmann;./cloudfront/code/curl;./cloudfront/code/log4cplus;./cloudfront/code/rocketmq;./lib/libuv-v1.51.0/include;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>-std=c++11 -O2 -static-libstdc++ -static-libgcc -pthread %(AdditionalOptions)</AdditionalOptions>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>D:\Git代码\frontlinux;D:\Git代码\frontlinux\LFtid1056\cloudfront\lib;$(RemoteRootDir)/cloudfront/lib;$(RemoteRootDir);/usr/lib64;/usr/local/lib;D:\Git代码\frontlinux\LFtid1056;./cloudfront/lib;./usr/lib64;./usr/local/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<LibraryDependencies>uv;pthread;dl;rt;stdc++fs;z;%(LibraryDependencies)</LibraryDependencies>
<AdditionalDependencies>/root/projects/LFtid1056/cloudfront/lib/librocketmq.a;/root/projects/LFtid1056/cloudfront/lib/libcurl.so;/root/projects/LFtid1056/cloudfront/lib/libssl.so;/root/projects/LFtid1056/cloudfront/lib/libcrypto.so;/root/projects/LFtid1056/cloudfront/lib/liblog4cplus.so;/root/projects/LFtid1056/libuv.a;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>-Wl,-rpath=/root/projects/LFtid1056/cloudfront/lib %(AdditionalOptions)</AdditionalOptions>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<LibraryDependencies>uv;pthread;%(LibraryDependencies)</LibraryDependencies>
</Link>
<PreLinkEvent>
<Command>
</Command>
</PreLinkEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" />

View File

@@ -1,721 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="client2.cpp" />
<ClCompile Include="dealMsg.cpp" />
<ClCompile Include="main_thread.cpp" />
<ClCompile Include="PQSMsg.cpp" />
<ClCompile Include="cloudfront\code\main.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
<ClCompile Include="cloudfront\code\cfg_parser.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
<ClCompile Include="cloudfront\code\interface.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
<ClCompile Include="cloudfront\code\log4.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
<ClCompile Include="cloudfront\code\rocketmq.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
<ClCompile Include="cloudfront\code\tinyxml2.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
<ClCompile Include="cloudfront\code\worker.cpp">
<Filter>cloudfront\code</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="client2.h" />
<ClInclude Include="dealMsg.h" />
<ClInclude Include="PQSMsg.h" />
<ClInclude Include="cloudfront\code\interface.h">
<Filter>cloudfront\code</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\json.hpp">
<Filter>cloudfront\code\nlohmann</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\adl_serializer.hpp">
<Filter>cloudfront\code\nlohmann</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\abi_macros.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\conversions\from_json.hpp">
<Filter>cloudfront\code\nlohmann\detail\conversions</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\exceptions.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\value_t.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\macro_scope.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\detected.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\void_t.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\thirdparty\hedley\hedley.hpp">
<Filter>cloudfront\code\nlohmann\thirdparty\hedley</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\string_escape.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\input\position_t.hpp">
<Filter>cloudfront\code\nlohmann\detail\input</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\cpp_future.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\type_traits.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\iterator_traits.hpp">
<Filter>cloudfront\code\nlohmann\detail\iterators</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\call_std\begin.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta\call_std</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\call_std\end.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta\call_std</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\json_fwd.hpp">
<Filter>cloudfront\code\nlohmann</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\string_concat.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\identity_tag.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\std_fs.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\conversions\to_json.hpp">
<Filter>cloudfront\code\nlohmann\detail\conversions</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\iteration_proxy.hpp">
<Filter>cloudfront\code\nlohmann\detail\iterators</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\byte_container_with_subtype.hpp">
<Filter>cloudfront\code\nlohmann</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\hash.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\input\binary_reader.hpp">
<Filter>cloudfront\code\nlohmann\detail\input</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\input\input_adapters.hpp">
<Filter>cloudfront\code\nlohmann\detail\input</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\input\lexer.hpp">
<Filter>cloudfront\code\nlohmann\detail\input</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\input\parser.hpp">
<Filter>cloudfront\code\nlohmann\detail\input</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\input\json_sax.hpp">
<Filter>cloudfront\code\nlohmann\detail\input</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\meta\is_sax.hpp">
<Filter>cloudfront\code\nlohmann\detail\meta</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\internal_iterator.hpp">
<Filter>cloudfront\code\nlohmann\detail\iterators</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\iter_impl.hpp">
<Filter>cloudfront\code\nlohmann\detail\iterators</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\json_reverse_iterator.hpp">
<Filter>cloudfront\code\nlohmann\detail\iterators</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\iterators\primitive_iterator.hpp">
<Filter>cloudfront\code\nlohmann\detail\iterators</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\json_custom_base_class.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\json_pointer.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\json_ref.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\output\binary_writer.hpp">
<Filter>cloudfront\code\nlohmann\detail\output</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\output\output_adapters.hpp">
<Filter>cloudfront\code\nlohmann\detail\output</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\output\serializer.hpp">
<Filter>cloudfront\code\nlohmann\detail\output</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\conversions\to_chars.hpp">
<Filter>cloudfront\code\nlohmann\detail\conversions</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\ordered_map.hpp">
<Filter>cloudfront\code\nlohmann</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\detail\macro_unscope.hpp">
<Filter>cloudfront\code\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\nlohmann\thirdparty\hedley\hedley_undef.hpp">
<Filter>cloudfront\code\nlohmann\thirdparty\hedley</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\log4.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\logger.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\loggingmacros.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\appender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\worker.h">
<Filter>cloudfront\code</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq.h">
<Filter>cloudfront\code</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\front.h">
<Filter>cloudfront\code</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\curl.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQClientException.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\curlver.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\system.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\easy.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\multi.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\urlapi.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\options.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\header.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\websockets.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\mprintf.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\DefaultMQPushConsumer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\DefaultMQProducer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQSelector.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQMessageExt.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQMessageListener.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQMessageQueue.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\SendResult.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\SessionCredentials.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\AsyncCallback.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\ConsumeType.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQClient.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\RocketMQClient.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\PullResult.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQMessage.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4.h">
<Filter>cloudfront\code</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\tinyxml2.h">
<Filter>cloudfront\code</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\stdcheaders.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\curl\typecheck-gcc.h">
<Filter>cloudfront\code\curl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\Arg_helper.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CBatchMessage.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CCommon.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CErrorMessage.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CMessage.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CMessageExt.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CMessageQueue.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CMQException.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CProducer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CPullConsumer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CPullResult.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CPushConsumer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CSendResult.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\CTransactionStatus.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\DefaultMQPullConsumer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\MQueueListener.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\TransactionListener.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\TransactionMQProducer.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\rocketmq\TransactionSendResult.h">
<Filter>cloudfront\code\rocketmq</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\asyncappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\callbackappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\clfsappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\clogger.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config.hxx">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\configurator.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\consoleappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\exception.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\fileappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\fstreams.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\hierarchy.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\hierarchylocker.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\initializer.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\layout.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\log4cplus.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\log4judpappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\loglevel.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\mdc.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\msttsappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\ndc.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\nteventlogappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\nullappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\qt4debugappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\qt5debugappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\socketappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\streams.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\syslogappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\tchar.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\tracelogger.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\tstring.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\version.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\win32consoleappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\win32debugappender.h">
<Filter>cloudfront\code\log4cplus</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\boost\deviceappender.hxx">
<Filter>cloudfront\code\log4cplus\boost</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config\defines.hxx">
<Filter>cloudfront\code\log4cplus\config</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config\macosx.h">
<Filter>cloudfront\code\log4cplus\config</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config\win32.h">
<Filter>cloudfront\code\log4cplus\config</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config\windowsh-inc.h">
<Filter>cloudfront\code\log4cplus\config</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\config\windowsh-inc-full.h">
<Filter>cloudfront\code\log4cplus\config</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\appenderattachableimpl.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\connectorthread.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\eventcounter.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\fileinfo.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\lockfile.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\loglog.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\pointer.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\property.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\queue.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\snprintf.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\socket.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\socketbuffer.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\stringhelper.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\thread-config.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\helpers\timehelper.h">
<Filter>cloudfront\code\log4cplus\helpers</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\internal\customloglevelmanager.h">
<Filter>cloudfront\code\log4cplus\internal</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\internal\cygwin-win32.h">
<Filter>cloudfront\code\log4cplus\internal</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\internal\env.h">
<Filter>cloudfront\code\log4cplus\internal</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\internal\internal.h">
<Filter>cloudfront\code\log4cplus\internal</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\internal\socket.h">
<Filter>cloudfront\code\log4cplus\internal</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\appenderattachable.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\factory.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\filter.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\loggerfactory.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\loggerimpl.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\loggingevent.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\objectregistry.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\spi\rootlogger.h">
<Filter>cloudfront\code\log4cplus\spi</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\syncprims.h">
<Filter>cloudfront\code\log4cplus\thread</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\syncprims-pub-impl.h">
<Filter>cloudfront\code\log4cplus\thread</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\threads.h">
<Filter>cloudfront\code\log4cplus\thread</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\syncprims-cxx11.h">
<Filter>cloudfront\code\log4cplus\thread\impl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\syncprims-impl.h">
<Filter>cloudfront\code\log4cplus\thread\impl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\syncprims-pmsm.h">
<Filter>cloudfront\code\log4cplus\thread\impl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\threads-impl.h">
<Filter>cloudfront\code\log4cplus\thread\impl</Filter>
</ClInclude>
<ClInclude Include="cloudfront\code\log4cplus\thread\impl\tls.h">
<Filter>cloudfront\code\log4cplus\thread\impl</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="cloudfront">
<UniqueIdentifier>{e569c345-343c-4c70-b52e-1188cb7eb2a0}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code">
<UniqueIdentifier>{3aa4794b-faf1-449a-b331-d701ebafc085}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\curl">
<UniqueIdentifier>{f67e6a10-2961-4892-8537-bd8ab15a5bd3}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus">
<UniqueIdentifier>{9d9e729c-19ee-46f3-97be-d46b4fc4bb9a}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\rocketmq">
<UniqueIdentifier>{17a8acb0-648d-4bb8-82f1-74a3c132e1ef}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann">
<UniqueIdentifier>{b22c4f25-4b96-48dc-bb52-7f642bc742d0}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail">
<UniqueIdentifier>{2b9bfc19-7f39-4a2f-80ad-f39e96a96b40}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\thirdparty">
<UniqueIdentifier>{a0f6b856-c407-420c-86ef-4c48a3c4df2e}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\thirdparty\hedley">
<UniqueIdentifier>{0cb06b60-69a9-4dd4-a963-4aedd6b4d7e3}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail\conversions">
<UniqueIdentifier>{73b4c759-6aba-40d3-8773-72a196af5a77}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail\input">
<UniqueIdentifier>{cb07968a-09c4-45ca-a73c-20d328df3216}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail\iterators">
<UniqueIdentifier>{3a75fc98-7cc2-4003-a060-73147b374fed}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail\meta">
<UniqueIdentifier>{100fee77-5ece-4d12-b55e-2183e5790d1b}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail\meta\call_std">
<UniqueIdentifier>{c10e4535-fe1d-4a33-a38f-29805e4e9b92}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\nlohmann\detail\output">
<UniqueIdentifier>{a147fc02-f373-49a8-a11f-a8914da54a7d}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\boost">
<UniqueIdentifier>{422223c2-2cfe-4998-b31d-7b59532b6d1f}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\config">
<UniqueIdentifier>{dc41a517-5a25-4d36-848d-8a21c9e35117}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\helpers">
<UniqueIdentifier>{f8ee7436-8072-4ba7-b219-3d33e410de0d}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\internal">
<UniqueIdentifier>{a66dc9bc-1acc-4048-adb2-7326395c7568}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\spi">
<UniqueIdentifier>{6039e9c3-2685-4a49-a08e-842dfc4d80d1}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\thread">
<UniqueIdentifier>{2f9e665b-d0f0-4de0-9b4d-23d002ec9990}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\log4cplus\thread\impl">
<UniqueIdentifier>{b40f40d0-492d-4fcf-8125-4db493497930}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\code\lib">
<UniqueIdentifier>{d64ce5f1-cb40-4da4-a7da-766e5a2d1656}</UniqueIdentifier>
</Filter>
<Filter Include="cloudfront\lib">
<UniqueIdentifier>{ca2cfaa3-ac76-42f8-a17f-67b4f693b719}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="cloudfront\code\curl\Makefile">
<Filter>cloudfront\code\curl</Filter>
</None>
<None Include="cloudfront\code\curl\Makefile.am">
<Filter>cloudfront\code\curl</Filter>
</None>
<None Include="cloudfront\code\curl\Makefile.in">
<Filter>cloudfront\code\curl</Filter>
</None>
<None Include="cloudfront\code\log4cplus\config.h.cmake.in">
<Filter>cloudfront\code\log4cplus</Filter>
</None>
<None Include="cloudfront\code\log4cplus\config.h.in">
<Filter>cloudfront\code\log4cplus</Filter>
</None>
<None Include="cloudfront\code\log4cplus\stamp-h1">
<Filter>cloudfront\code\log4cplus</Filter>
</None>
<None Include="cloudfront\code\log4cplus\config\defines.hxx.in">
<Filter>cloudfront\code\log4cplus\config</Filter>
</None>
<None Include="cloudfront\code\log4cplus\config\stamp-h2">
<Filter>cloudfront\code\log4cplus\config</Filter>
</None>
<None Include="build.sh" />
<None Include="cloudfront\lib\libcrypto.so.1.0.0">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libcrypto.so.1.1">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libcurl.la">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libcurl.so.4">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libcurl.so.4.3.0">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libcurl.so.4.7.0">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\liblog4cplus.so.9">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libssl.so.1.0.0">
<Filter>cloudfront\lib</Filter>
</None>
<None Include="cloudfront\lib\libssl.so.1.1">
<Filter>cloudfront\lib</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Library Include="cloudfront\lib\libcrypto.so">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\libcurl.a">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\libcurl.so">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\liblog4cplus.so">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\liblog4cplusS.a">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\librocketmq.a">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\librocketmq.so">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="cloudfront\lib\libssl.so">
<Filter>cloudfront\lib</Filter>
</Library>
<Library Include="libuv.a" />
</ItemGroup>
</Project>

View File

@@ -7,22 +7,8 @@
#include <cctype>
#include <cstdlib>
#include "client2.h"
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float IntToFloat(int num) {
return static_cast<float>(num) / 65536.0f;
}
#include "PQSMsg.h"
float ShorToFloat100(short num) {
return static_cast<float>(num) / 100.0f;
}
float ShorToFloat1000(short num) {
return static_cast<float>(num) / 1000.0f;
}
float ShorToFloat10000(short num) {
return static_cast<float>(num) / 10000.0f;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void GetMAC(const std::string& strMAC, std::vector<unsigned char>& packet, size_t startIndex) {
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>пո<D0BF><D5B8>Ͷ̺<CDB6><CCBA><EFBFBD>
@@ -64,69 +50,6 @@ void GetMAC(const std::string& strMAC, std::vector<unsigned char>& packet, size_
}
}
// CRC<52><43><EFBFBD><EFBFBD><E3BAAF>
unsigned char GetCrcSum(const std::vector<unsigned char>& Check, int nOffset, int nLen) {
unsigned char reg_b = 0x00;
for (int i = 0; i < nLen; ++i) {
if (static_cast<size_t>(i + nOffset) >= Check.size()) {
throw std::out_of_range("Index out of range in GetCrcSum");
}
reg_b += Check[i + nOffset];
}
return reg_b;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
std::vector<unsigned char> GetMsg(const std::vector<unsigned char>& SrcData, unsigned char nType) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (SrcData.empty() ||
((nType < 0x01 || nType > 0xA4) && nType != 0xFF)) {
return {};
}
try {
// <20><><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ͷ(6) + <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>(2) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + CRC+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(2)
const size_t total_len = 6 + 2 + 1 + SrcData.size() + 2;
std::vector<unsigned char> msg(total_len);
// <20><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ͷ (6<>ֽ<EFBFBD>)
msg[0] = 0xEB; // <20><><EFBFBD><EFBFBD>ͷ
msg[1] = 0x90; // <20><><EFBFBD><EFBFBD>ͷ
msg[2] = 0x00; // <20><><EFBFBD><EFBFBD>
msg[3] = 0x00; // <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B3A4>+<2B><><EFBFBD><EFBFBD><EFBFBD>
uint16_t data_len = static_cast<uint16_t>(SrcData.size() + 1);
msg[4] = static_cast<unsigned char>(data_len >> 8); // <20><><EFBFBD>ȸ<EFBFBD><C8B8>ֽ<EFBFBD>
msg[5] = static_cast<unsigned char>(data_len & 0xFF); // <20><><EFBFBD>ȵ<EFBFBD><C8B5>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD> (2<>ֽ<EFBFBD>)
msg[6] = 0x00; // <20><><EFBFBD><EFBFBD>
msg[7] = 0xFF; // <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
msg[8] = nType;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!SrcData.empty()) {
std::copy(SrcData.begin(), SrcData.end(), msg.begin() + 9);
}
// <20><><EFBFBD><EFBFBD>CRC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><38>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD>
unsigned char crc = GetCrcSum(msg, 8, 1 + SrcData.size());
msg[msg.size() - 2] = crc;
msg[msg.size() - 1] = 0x16; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return msg;
}
catch (const std::exception& ex) {
throw std::runtime_error(std::string("Exception in GetMsg: ") + ex.what());
}
catch (...) {
throw std::runtime_error("Unknown exception in GetMsg");
}
}
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
std::vector<unsigned char> generate_frontlogin_message(const std::string& strMac)
{
@@ -166,42 +89,3 @@ std::vector<unsigned char> generate_frontlogin_message(const std::string& strMac
return packet;
}
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4B1A8>
std::vector<unsigned char> generate_statequerytime_message() {
// <20><><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30>
std::vector<unsigned char> DataBuf(2, 0x00);
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_StatTime));
}
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_t nDeviceNo, uint16_t nDataType) {
// <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С<EFBFBD><D0A1>3(<28><><EFBFBD><EFBFBD>) + 2(nDeviceNo) + 2(nDataType) + time<6D><EFBFBD><E1B9B9>С
const size_t totalSize = 3 + 2 * sizeof(uint16_t) + time.GetSize();
std::vector<unsigned char> DataBuf(totalSize, 0x00); // <20><>ʼ<EFBFBD><CABC>Ϊȫ0
size_t offset = 0;
// 1. <20><><EFBFBD><EFBFBD>3<EFBFBD>ֽڱ<D6BD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30>
offset += 3;
// 2. д<><D0B4>nDeviceNo<4E><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
uint16_t netDeviceNo = htons(nDeviceNo);
memcpy(DataBuf.data() + offset, &netDeviceNo, sizeof(uint16_t));
offset += sizeof(uint16_t);
// 3. д<><D0B4>nDataType<70><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
uint16_t netDataType = htons(nDataType);
memcpy(DataBuf.data() + offset, &netDataType, sizeof(uint16_t));
offset += sizeof(uint16_t);
// 4. д<><D0B4>time<6D><EFBFBD><E1B9B9><EFBFBD>ڲ<EFBFBD><DAB2>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
time.GetStructBuf(DataBuf.data(), DataBuf.size(), offset);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_Stat));
}

View File

@@ -6,791 +6,6 @@
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <ctime>
#include <arpa/inet.h> // <20>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA>
#include <array>
using namespace std;
float IntToFloat(int num);
float ShorToFloat100(short num);
float ShorToFloat1000(short num);
float ShorToFloat10000(short num);
// <20><><EFBFBD>ͱ<EFBFBD><CDB1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
enum class MsgRequestType : unsigned char {
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
Request_StatTime = 0x8b,
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Request_Stat = 0x8a
};
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
enum class MsgResponseType : unsigned char {
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
Response_StatTime = 0x27,
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Response_Stat = 0x26
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>
class MessageParser {
public:
// <20><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
uint8_t msgType; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<uint8_t> RecvData; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nMsgLen; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6A1><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nRecvDataLen; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B3A4>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD>bool<6F><6C><EFBFBD><EFBFBD>
bool SetMsg(const uint8_t* udata, size_t data_size) {
// 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
if (udata == nullptr) {
return false; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ʧ<EFBFBD><CAA7>
}
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ȣ<EFBFBD>6<EFBFBD>ֽ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
constexpr size_t MIN_HEADER_SIZE = 6;
if (data_size < MIN_HEADER_SIZE) {
return false; // ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>
}
// 3. <20><>ȡ<EFBFBD><C8A1><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nMsgLen = (static_cast<uint16_t>(udata[4]) << 8) | udata[5];
// 4. <20><>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD> (8 + nMsgLen)
if (data_size < 8 + nMsgLen) {
return false; // <20><><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>
}
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ɾ<><C9BE><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD>
nRecvDataLen = nMsgLen - 4;
// 6. CRCУ<43><EFBFBD><E9A3A8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>Ҫʵ<D2AA>֣<EFBFBD>
/*
if (!ValidateCRC(udata, 8 + nMsgLen)) {
return false; // CRCУ<43><D0A3>ʧ<EFBFBD><CAA7>
}
*/
// 7. <20><>ȡ<EFBFBD><C8A1>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> 6 + 2 = 8)
msgType = udata[8];
// 8. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>12<31><32>ʼ)
RecvData.clear();
if (nRecvDataLen > 0) {
// ȷ<><C8B7><EFBFBD><EFBFBD>Խ<EFBFBD>磨nRecvDataLen = nMsgLen - 4<><34>
RecvData.assign(udata + 12, udata + 12 + nRecvDataLen);
}
return true; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>ɹ<EFBFBD>
}
};
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class tagTime {
public:
uint16_t DeviceYear;
uint16_t DeviceMonth;
uint16_t DeviceDay;
uint16_t DeviceHour;
uint16_t DeviceMinute;
uint16_t DeviceSecond;
// <20><><EFBFBD>ؽṹ<D8BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>С
static constexpr size_t GetSize() {
return 6 * sizeof(uint16_t);
}
// Ĭ<>Ϲ<EFBFBD><CFB9><EFBFBD><ECBAAF>
tagTime() :
DeviceYear(1970),
DeviceMonth(1),
DeviceDay(1),
DeviceHour(0),
DeviceMinute(0),
DeviceSecond(0) {}
// <20><>std::tm<74><6D><EFBFBD><EFBFBD>
explicit tagTime(const std::tm& dt) :
DeviceYear(static_cast<uint16_t>(dt.tm_year + 1900)),
DeviceMonth(static_cast<uint16_t>(dt.tm_mon + 1)),
DeviceDay(static_cast<uint16_t>(dt.tm_mday)),
DeviceHour(static_cast<uint16_t>(dt.tm_hour)),
DeviceMinute(static_cast<uint16_t>(dt.tm_min)),
DeviceSecond(static_cast<uint16_t>(dt.tm_sec)) {}
// <20><><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>
void Clone(const tagTime& src) {
DeviceYear = src.DeviceYear;
DeviceMonth = src.DeviceMonth;
DeviceDay = src.DeviceDay;
DeviceHour = src.DeviceHour;
DeviceMinute = src.DeviceMinute;
DeviceSecond = src.DeviceSecond;
}
// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* bArray, size_t bufSize, size_t offset = 0) {
if (bufSize - offset < GetSize()) {
return false;
}
const uint8_t* ptr = bArray + offset;
DeviceYear = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceMonth = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceDay = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceHour = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceMinute = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceSecond = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
return true;
}
// <20><><EFBFBD>л<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
size_t GetStructBuf(uint8_t* bArray, size_t bufSize, size_t offset = 0) const {
if (bufSize - offset < GetSize()) {
return 0;
}
uint8_t* ptr = bArray + offset;
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceYear);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceMonth);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceDay);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceHour);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceMinute);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceSecond);
return GetSize();
}
};
//г<><D0B3><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD> Ĭ<><C4AC>50
constexpr int HARMNUM = 50;
// <20><>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>ݽṹ
struct tagInHarmData {
int32_t Val;
int32_t f;
static constexpr size_t GetSize() {
return sizeof(Val) + sizeof(f);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* ptr) {
Val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
f = ntohl(*reinterpret_cast<const int32_t*>(ptr));
return true;
}
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
struct tagPowerData {
int32_t P;
int32_t Q;
int32_t S;
static constexpr size_t GetSize() {
return sizeof(P) + sizeof(Q) + sizeof(S);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* ptr) {
P = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
Q = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
S = ntohl(*reinterpret_cast<const int32_t*>(ptr));
return true;
}
};
// <20><><EFBFBD><EFBFBD><EFBFBD>ݽṹ (ʹ<><CAB9>1<EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>)
#pragma pack(push, 1)
class tagPqData {
public:
int16_t name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t Data_Type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagTime time; // ʱ<><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int32_t, 9> Rms; // <20><>ѹ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ
std::array<int32_t, 6> UU_Deviation; // <20><>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<int32_t, 6> UL_Deviation; // <20><>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<int32_t, 2> F_Deviation; // Ƶ<><C6B5>ƫ<EFBFBD><C6AB>
std::array<std::array<int32_t, 4>, 2> UI_Seq; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<int32_t, HARMNUM>, 6> FuHarm; // <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3>
std::array<std::array<int32_t, HARMNUM>, 6> FuHarmPhase; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<tagInHarmData, HARMNUM>, 6> InHarm; // <20><>г<EFBFBD><D0B3>
std::array<std::array<int32_t, 3>, 4> Total_Power; // <20>ܹ<EFBFBD><DCB9><EFBFBD>
std::array<std::array<tagPowerData, HARMNUM>, 4> Harm_Power; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<int16_t, HARMNUM>, 6> Harm_Contain; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 6> Harm_Aberrance; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 4> Cos_PF; // <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 4> Cos_DF; // λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 3> U_Fluctuation; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
std::array<int16_t, 3> U_Flicker; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
std::array<int16_t, 3> UL_Flicker; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><ECBAAF>
tagPqData() : name(0), Data_Type(0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
Rms.fill(0);
UU_Deviation.fill(0);
UL_Deviation.fill(0);
F_Deviation.fill(0);
for (auto& arr : UI_Seq) arr.fill(0);
for (auto& arr : FuHarm) arr.fill(0);
for (auto& arr : FuHarmPhase) arr.fill(0);
for (auto& arr : Harm_Contain) arr.fill(0);
Harm_Aberrance.fill(0);
Cos_PF.fill(0);
Cos_DF.fill(0);
U_Fluctuation.fill(0);
U_Flicker.fill(0);
UL_Flicker.fill(0);
}
// <20><>ȡ<EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD>С
static constexpr size_t GetSize() {
return sizeof(name) + sizeof(Data_Type) +
tagTime::GetSize() +
sizeof(Rms) +
sizeof(UU_Deviation) +
sizeof(UL_Deviation) +
sizeof(F_Deviation) +
sizeof(UI_Seq) +
sizeof(FuHarm) +
sizeof(FuHarmPhase) +
sizeof(InHarm) +
sizeof(Total_Power) +
sizeof(Harm_Power) +
sizeof(Harm_Contain) +
sizeof(Harm_Aberrance) +
sizeof(Cos_PF) +
sizeof(Cos_DF) +
sizeof(U_Fluctuation) +
sizeof(U_Flicker) +
sizeof(UL_Flicker);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* bArray, size_t bufSize, size_t offset = 0) {
if (bufSize - offset < GetSize()) {
return false;
}
const uint8_t* ptr = bArray + offset;
size_t remaining = bufSize - offset;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
name = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(name);
remaining -= sizeof(name);
Data_Type = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(Data_Type);
remaining -= sizeof(Data_Type);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>
if (!time.SetStructBuf(ptr, remaining)) {
return false;
}
ptr += tagTime::GetSize();
remaining -= tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>һάint32<33><32><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& val : Rms) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
for (auto& val : UU_Deviation) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
for (auto& val : UL_Deviation) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
for (auto& val : F_Deviation) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>άint32<33><32><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& arr : UI_Seq) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
for (auto& arr : FuHarm) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
for (auto& arr : FuHarmPhase) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto& arr : InHarm) {
for (auto& item : arr) {
if (remaining < tagInHarmData::GetSize()) return false;
item.SetStructBuf(ptr);
ptr += tagInHarmData::GetSize();
remaining -= tagInHarmData::GetSize();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>
for (auto& arr : Total_Power) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
// <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto& arr : Harm_Power) {
for (auto& item : arr) {
if (remaining < tagPowerData::GetSize()) return false;
item.SetStructBuf(ptr);
ptr += tagPowerData::GetSize();
remaining -= tagPowerData::GetSize();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>άint16<31><36><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& arr : Harm_Contain) {
for (auto& val : arr) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
}
// <20><><EFBFBD><EFBFBD>һάint16<31><36><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& val : Harm_Aberrance) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : Cos_PF) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : Cos_DF) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : U_Fluctuation) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : U_Flicker) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : UL_Flicker) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
return true;
}
};
#pragma pack(pop)
// <20><>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct tagInHarmData_float {
float Val;
float f;
};
// <20><><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD>
struct tagPowerData_float {
float P;
float Q;
float S;
};
// PQ<50><51><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>
class tagPqData_Float {
public:
short name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
short Data_Type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagTime time; // ʱ<><CAB1>
// <20><><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 9> Rms;
std::array<float, 6> UU_Deviation;
std::array<float, 6> UL_Deviation;
std::array<float, 2> F_Deviation;
std::array<std::array<float, 4>, 2> UI_Seq;
std::array<std::array<float, HARMNUM>, 6> FuHarm;
std::array<std::array<float, HARMNUM>, 6> FuHarmPhase;
std::array<std::array<tagInHarmData_float, HARMNUM>, 6> InHarm;
std::array<std::array<float, 3>, 4> Total_Power;
std::array<std::array<tagPowerData_float, HARMNUM>, 4> Harm_Power;
std::array<std::array<float, HARMNUM>, 6> Harm_Contain;
std::array<float, 6> Harm_Aberrance; // ע<>⣺C#<23><><EFBFBD><EFBFBD><38><D4AA>
std::array<float, 4> Cos_PF;
std::array<float, 4> Cos_DF;
std::array<float, 3> U_Fluctuation;
std::array<float, 3> U_Flicker;
std::array<float, 3> UL_Flicker;
// <20><><EFBFBD><EFBFBD><ECBAAF><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagPqData_Float() {
Rms.fill(0.0f);
UU_Deviation.fill(0.0f);
UL_Deviation.fill(0.0f);
F_Deviation.fill(0.0f);
for (auto& arr : UI_Seq) arr.fill(0.0f);
for (auto& arr : FuHarm) arr.fill(0.0f);
for (auto& arr : FuHarmPhase) arr.fill(0.0f);
for (auto& arr : Harm_Contain) arr.fill(0.0f);
Harm_Aberrance.fill(0.0f);
Cos_PF.fill(0.0f);
Cos_DF.fill(0.0f);
U_Fluctuation.fill(0.0f);
U_Flicker.fill(0.0f);
UL_Flicker.fill(0.0f);
// <20><>ʼ<EFBFBD><CABC>Ƕ<EFBFBD>׽ṹ
for (auto& arr : InHarm) {
for (auto& item : arr) {
item = tagInHarmData_float{ 0.0f, 0.0f };
}
}
for (auto& arr : Harm_Power) {
for (auto& item : arr) {
item = tagPowerData_float{ 0.0f, 0.0f, 0.0f };
}
}
}
// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SetFloatValue(const tagPqData& SrcData, float fPT, float fCT) {
time.Clone(SrcData.time);
// F_Deviation
for (int i = 0; i < 2; i++) {
F_Deviation[i] = IntToFloat(SrcData.F_Deviation[i]);
}
// UI_Seq
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
if (i == 0) { // <20><>ѹ
if (j == 2) { // <20><><EFBFBD><EFBFBD>
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]) * fPT;
}
else if (j < 3) {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]) * fPT * 1000.0f;
}
else {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]);
}
}
else { // <20><><EFBFBD><EFBFBD>
if (j < 3) {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]) * fCT;
}
else {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]);
}
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; i++) {
U_Fluctuation[i] = ShorToFloat1000(SrcData.U_Fluctuation[i]);
U_Flicker[i] = ShorToFloat1000(SrcData.U_Flicker[i]);
UL_Flicker[i] = ShorToFloat1000(SrcData.UL_Flicker[i]);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; i++) {
Cos_PF[i] = ShorToFloat10000(SrcData.Cos_PF[i]);
Cos_DF[i] = ShorToFloat10000(SrcData.Cos_DF[i]);
}
// <20>ܹ<EFBFBD><DCB9><EFBFBD>
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
Total_Power[i][j] = IntToFloat(SrcData.Total_Power[i][j]) * fPT * fCT;
}
}
// г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; i++) {
for (int j = 0; j < HARMNUM; j++) {
Harm_Power[i][j].P = IntToFloat(SrcData.Harm_Power[i][j].P) * fPT * fCT;
Harm_Power[i][j].Q = IntToFloat(SrcData.Harm_Power[i][j].Q) * fPT * fCT;
Harm_Power[i][j].S = IntToFloat(SrcData.Harm_Power[i][j].S) * fPT * fCT;
}
}
// г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 6; i++) {
UU_Deviation[i] = IntToFloat(SrcData.UU_Deviation[i]);
UL_Deviation[i] = IntToFloat(SrcData.UL_Deviation[i]);
Harm_Aberrance[i] = ShorToFloat100(SrcData.Harm_Aberrance[i]);
for (int j = 0; j < HARMNUM; j++) {
if (i < 3) { // <20><>ѹг<D1B9><D0B3>
FuHarm[i][j] = IntToFloat(SrcData.FuHarm[i][j]) * fPT;
}
else { // <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3>
FuHarm[i][j] = IntToFloat(SrcData.FuHarm[i][j]) * fCT;
}
FuHarmPhase[i][j] = IntToFloat(SrcData.FuHarmPhase[i][j]);
InHarm[i][j].Val = IntToFloat(SrcData.InHarm[i][j].Val);
Harm_Contain[i][j] = ShorToFloat100(SrcData.Harm_Contain[i][j]);
}
}
// RMSֵ
for (int i = 0; i < 9; i++) {
if (i > 2 && i < 6) { // <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>3,4,5)
Rms[i] = IntToFloat(SrcData.Rms[i]) * fCT;
}
else { // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Rms[i] = IntToFloat(SrcData.Rms[i]) * fPT;
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>ת<EFBFBD><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
std::string ConvertToBase64() const {
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD><EFBFBD><EFBFBD>
const size_t total_floats = CalculateFloatCount();
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<float> float_buffer;
float_buffer.reserve(total_floats);
SerializeFloats(float_buffer);
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3BBBA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data =
reinterpret_cast<const unsigned char*>(float_buffer.data());
// 4. Base64<36><34><EFBFBD><EFBFBD>
return base64_encode(byte_data, byte_size);
}
// <20><><EFBFBD><EFBFBD><E3B8A1><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
size_t CalculateFloatCount() const {
size_t count = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
count += Rms.size();
count += UU_Deviation.size();
count += UL_Deviation.size();
count += F_Deviation.size();
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) count += arr.size();
for (const auto& arr : FuHarm) count += arr.size();
for (const auto& arr : FuHarmPhase) count += arr.size();
// Ƕ<>׽ṹ<D7BD><E1B9B9><EFBFBD><EFBFBD>
for (const auto& arr : InHarm) {
for (const auto& item : arr) {
count += 2; // ÿ<><C3BF>tagInHarmData_float<61><74><EFBFBD><EFBFBD>2<EFBFBD><32>float
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Total_Power) count += arr.size();
for (const auto& arr : Harm_Power) {
for (const auto& item : arr) {
count += 3; // ÿ<><C3BF>tagPowerData_float<61><74><EFBFBD><EFBFBD>3<EFBFBD><33>float
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Harm_Contain) count += arr.size();
count += Harm_Aberrance.size();
count += Cos_PF.size();
count += Cos_DF.size();
count += U_Fluctuation.size();
count += U_Flicker.size();
count += UL_Flicker.size();
return count;
}
private:
// <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SerializeFloats(std::vector<float>& buffer) const {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& val : Rms) buffer.push_back(val);
for (const auto& val : UU_Deviation) buffer.push_back(val);
for (const auto& val : UL_Deviation) buffer.push_back(val);
for (const auto& val : F_Deviation) buffer.push_back(val);
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& arr : FuHarm) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& arr : FuHarmPhase) {
for (const auto& val : arr) buffer.push_back(val);
}
// Ƕ<>׽ṹ<D7BD><E1B9B9><EFBFBD><EFBFBD>
for (const auto& arr : InHarm) {
for (const auto& item : arr) {
buffer.push_back(item.Val);
buffer.push_back(item.f);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Total_Power) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& arr : Harm_Power) {
for (const auto& item : arr) {
buffer.push_back(item.P);
buffer.push_back(item.Q);
buffer.push_back(item.S);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Harm_Contain) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& val : Harm_Aberrance) buffer.push_back(val);
for (const auto& val : Cos_PF) buffer.push_back(val);
for (const auto& val : Cos_DF) buffer.push_back(val);
for (const auto& val : U_Fluctuation) buffer.push_back(val);
for (const auto& val : U_Flicker) buffer.push_back(val);
for (const auto& val : UL_Flicker) buffer.push_back(val);
}
// Base64<36><34><EFBFBD><EFBFBD><EBBAAF>
static std::string base64_encode(const unsigned char* bytes_to_encode, size_t in_len) {
static const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; i < 4; i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}
if (i) {
for (j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; j < i + 1; j++)
ret += base64_chars[char_array_4[j]];
while (i++ < 3)
ret += '=';
}
return ret;
}
};
//<2F><><EFBFBD><EFBFBD><E3B1A8>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> 1֡1024Ϊ1K
constexpr int PqDataLen = tagPqData::GetSize();
constexpr int Stat_PacketNum = (PqDataLen / 1024 > 0) ? (PqDataLen / 1024 + 1) : (PqDataLen / 1024);
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
std::vector<unsigned char> generate_binary_message(
@@ -799,7 +14,3 @@ std::vector<unsigned char> generate_binary_message(
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
std::vector<unsigned char> generate_frontlogin_message(const std::string& strMac);
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4B1A8>
std::vector<unsigned char> generate_statequerytime_message();
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_t nDeviceNo, uint16_t nDataType);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,227 +1,33 @@
#ifndef CLIENT_H
#define CLIENT_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
#include <string>
#include <vector>
#include <memory>
#include <unordered_map>
#include <mutex>
#include <queue>
#include "dealMsg.h"
#include "PQSMsg.h"
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>
struct PointInfo {
std::string point_id; // <20><><EFBFBD><EFBFBD>ID
std::string name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string device_id; // <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ID
ushort nCpuNo; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-6
double PT1; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>1
double PT2; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>2
double CT1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
double CT2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
};
#include <pthread.h>
#include <unistd.h>
#include <math.h>
// װ<><D7B0><EFBFBD><EFBFBD>Ϣ<EFBFBD>
struct DeviceInfo {
std::string device_id; // װ<EFBFBD><EFBFBD>ID
std::string name; // װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string model; // װ<EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD>
std::string mac; // װ<><D7B0>MAC<41><43>ַ
int status; // <20><><EFBFBD><EFBFBD>״̬ (0: <20><><EFBFBD><EFBFBD>, 1: <20><><EFBFBD><EFBFBD>)
std::vector<PointInfo> points; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
enum class ConnectionState {
DISCONNECTED,
CONNECTING,
CONNECTED
};
// <20><><EFBFBD>ӵ<EFBFBD>״̬ö<CCAC><C3B6>
enum class DeviceState {
IDLE, // <20><><EFBFBD><EFBFBD>״̬
READING_STATS, // <20><>ȡͳ<C8A1><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
READING_STATS_TIME, // <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>
};
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>
struct StateAction {
DeviceState state;
std::vector<unsigned char> packet; // <20><>״̬<D7B4><CCAC>Ҫ<EFBFBD><D2AA><EFBFBD>͵ı<CDB5><C4B1><EFBFBD>
};
class ClientContext {
public:
uv_loop_t* loop;
uv_tcp_t client;
uv_timer_t timer;
uv_timer_t reconnect_timer;
ConnectionState state;
int reconnect_attempts;
volatile bool shutdown;
DeviceInfo device_info; // װ<><D7B0><EFBFBD><EFBFBD>Ϣ
int cloudstatus; // <20><>ǰ<EFBFBD>õ<EFBFBD>¼״̬<D7B4><CCAC>0<EFBFBD><30>δ<EFBFBD><CEB4>¼ 1<><31><EFBFBD>ѵ<EFBFBD>¼<EFBFBD><C2BC>
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
DeviceState current_state_; // <20><>ǰװ<C7B0><D7B0>״̬
uint64_t state_start_time_; // ״̬<D7B4><CCAC>ʼʱ<CABC><CAB1>(ms)
std::queue<StateAction> action_queue_; // ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::mutex state_mutex_; // ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<unsigned char> current_packet_; // <20><>ǰ״̬<D7B4><CCAC>Ҫ<EFBFBD><D2AA><EFBFBD>͵ı<CDB5><C4B1><EFBFBD>
ClientContext(uv_loop_t* loop, const DeviceInfo& device, int index);
~ClientContext();
void init_tcp();//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void start_timer();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧװ<D3A6>ü<EFBFBD>ʱ<EFBFBD><CAB1> 5<><35>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
void start_reconnect_timer(int delay);//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
void stop_timers();//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
void close_handles();//<2F>رտͻ<D5BF><CDBB>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>붨ʱ<EBB6A8><CAB1>
void append_and_process_data(const char* data, size_t len);//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EBBBBA>
void put_packet_into_queue(const std::vector<unsigned char>& packet);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void change_state(DeviceState new_state, const std::vector<unsigned char>& packet = {});//<2F>ı<EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4>͵<EFBFBD>ǰ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>
void add_action(DeviceState state, const std::vector<unsigned char>& packet = {});//<2F><><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void check_state_timeout();//װ<><D7B0>״̬<D7B4><CCAC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
void process_next_action();//װ<><D7B0>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
void send_current_packet();//<2F><><EFBFBD>͵<EFBFBD>ǰ״̬<D7B4>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
// <20><><EFBFBD><EFBFBD>: <20><>֡<EFBFBD><D6A1><EFBFBD>ݱ<EFBFBD><DDB1>Ļ<EFBFBD><C4BB><EFBFBD>
struct StatPacket {
int packet_index;
std::vector<unsigned char> data;
};
std::vector<StatPacket> stat_packets_cache_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
int expected_total_packets_ = 0; // Ԥ<><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
std::mutex stat_cache_mutex_; // <20><><EFBFBD><EFBFBD><E6BBA5><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<StatPacket> get_and_clear_stat_packets();//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
void clear_stat_cache();//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
// ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
struct PointFloatCache {
std::array<tagPqData_Float, 4> data; // <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0-3)
std::array<bool, 4> received = { false }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ѽ<EFBFBD><D1BD><EFBFBD>
};
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
std::unordered_map<ushort, PointFloatCache> point_float_cache_;
std::mutex float_cache_mutex_; // <20><><EFBFBD><EFBFBD><EFBFBD><E6BBA5><EFBFBD><EFBFBD>
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
bool add_float_data(ushort point_id, int data_type, const tagPqData_Float& float_data);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<tagPqData_Float, 4> get_and_clear_float_data(ushort point_id);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
void clear_float_cache();
private:
int index_;
private:
std::vector<unsigned char> recv_buffer_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
std::mutex buffer_mutex_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void process_buffer();
};
class ClientManager {
public:
static ClientManager& instance() {
static ClientManager inst;
return inst;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ѭ<EFBFBD><D1AD>
void set_loop(uv_loop_t* loop) {
std::lock_guard<std::mutex> lock(mutex_);
loop_ = loop;
}
void add_device(const DeviceInfo& device);//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void remove_device(const std::string& device_id);//ɾ<><C9BE>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool send_to_device(const std::string& identifier, const unsigned char* data, size_t size);//ѡ<><D1A1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>װ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void restart_device(const std::string& device_id);//<2F>ر<EFBFBD>ָ<EFBFBD><D6B8>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void stop_all();//ֹͣ<CDA3><D6B9><EFBFBD>пͻ<D0BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool set_cloud_status(const std::string& identifier, int status);//<2F>޸<EFBFBD><DEB8><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬
bool post_message_processing(const std::string& identifier);// <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ󴥷<C9BA>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
bool add_action_to_device(const std::string& identifier,
DeviceState state,
const std::vector<unsigned char>& packet = {});
// <20>ı<EFBFBD>װ<EFBFBD>õ<EFBFBD>ǰ״̬
bool change_device_state(const std::string& identifier,
DeviceState new_state,
const std::vector<unsigned char>& packet = {});
// <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool clear_action_queue(const std::string& identifier);
// <20><>ȡװ<C8A1>õ<EFBFBD>ǰ״̬
bool get_device_state(const std::string& identifier, DeviceState& out_state);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>ȡװ<C8A1>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool get_device_points(const std::string& identifier,std::vector<PointInfo>& out_points);
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ͻ<EFBFBD><CDBB>˵Ķ<CBB5>֡<EFBFBD><D6A1><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>
bool add_stat_packet_to_device(const std::string& identifier,
const std::vector<unsigned char>& packet,
int current_packet,
int total_packets);
//<2F><>ȡָ<C8A1><D6B8><EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
std::vector<ClientContext::StatPacket> get_and_clear_stat_packets(const std::string& identifier);
//<2F><><EFBFBD>ն<EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><E6BBBA><EFBFBD><EFBFBD>
bool clear_stat_cache(const std::string& identifier);
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PT<50><54>CT<43><54><EFBFBD><EFBFBD>ֵ
bool get_pt_ct_ratio(const std::string& identifier,
int16_t nCpuNo,
float& pt_ratio,
float& ct_ratio);
// <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
size_t client_count() {
std::lock_guard<std::mutex> lock(mutex_);
return clients_.size();
}
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
bool add_float_data_to_device(const std::string& identifier,
ushort point_id,
int data_type,
const tagPqData_Float& float_data);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<tagPqData_Float, 4> get_and_clear_float_data(
const std::string& identifier, ushort point_id);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><E3BBBA>
bool clear_float_cache(const std::string& identifier);
private:
ClientManager() : loop_(nullptr) {}
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
std::mutex mutex_;
uv_loop_t* loop_; // <20>¼<EFBFBD>ѭ<EFBFBD><D1AD>ָ<EFBFBD><D6B8>
};
/* <20><><EFBFBD><EFBFBD>״̬ö<CCAC><C3B6> */
typedef enum {
STATE_DISCONNECTED, // δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
STATE_CONNECTING, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
STATE_CONNECTED // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
} connection_state_t;
/* <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<C4BD><E1B9B9> */
typedef struct {
uv_loop_t* loop; // libuv<75>¼<EFBFBD>ѭ<EFBFBD><D1AD>
uv_tcp_t client; // TCP<43>ͻ<EFBFBD><CDBB>˾<EFBFBD><CBBE><EFBFBD>
int index; // <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uv_timer_t timer; // <20><><EFBFBD>ݷ<EFBFBD><DDB7>Ͷ<EFBFBD>ʱ<EFBFBD><CAB1>
uv_timer_t reconnect_timer;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
connection_state_t state; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>״̬
int reconnect_attempts; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
volatile int shutdown; // <20>رձ<D8B1>־ (<28><><EFBFBD><EFBFBD>)
} client_context_t;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void start_client_connect(const std::vector<DeviceInfo>& devices);
void send_binary_data(ClientContext* ctx, const unsigned char* data, size_t data_size);
void on_timer(uv_timer_t* handle);
void try_reconnect(uv_timer_t* timer);
void on_connect(uv_connect_t* req, int status);
void on_close(uv_handle_t* handle);
void init_clients(uv_loop_t* loop, const std::vector<DeviceInfo>& devices);
void stop_all_clients();
#endif
void try_reconnect(uv_timer_t* timer);//<2F>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
void on_connect(uv_connect_t* req, int status);//<2F>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻص<D3BB>
void on_close(uv_handle_t* handle);//<2F>ͻ<EFBFBD><CDBB>˶Ͽ<CBB6><CFBF>ص<EFBFBD>
void stop_all_clients(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ֹͣ<CDA3><D6B9><EFBFBD>пͻ<D0BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void start_client_connect();//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void send_binary_data(client_context_t* ctx, const unsigned char* data, size_t data_size);

View File

@@ -1,10 +1,5 @@
#!/bin/bash
if [ -z "$FEP_ENV" ]; then
echo "Error: FEP_ENV is not set. Please set it first."
exit 1
fi
case "$1" in
'start')
$FEP_ENV/boot/start_fe.sh

View File

@@ -1,9 +1,14 @@
#!/bin/bash
if [ -z "$FEP_ENV" ]; then
echo "Error: FEP_ENV is not set. Please set it first."
exit 1
fi
# @file: $RCSfile: ps_fe.sh,v $
# @brief: $ϵͳӦ<CDB3><D3A6><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>̽ű<CCBD>
# @version: $Revision: 1.2 $
# @date: $Date: 2017/02/23 03:42:58 $
# @author: $Author: zhanchengguo $
# @state: $State: Exp $
# @latest: $Id: ps_fe.sh,v 1.2 2017/02/23 03:42:58 zhanchengguo Exp $
echo ""
RUNTIME_CF_FILE="$FEP_ENV/etc/runtime.cf"
@@ -35,3 +40,5 @@ while read LINE ; do
fi
fi
done < $RUNTIME_CF_FILE
echo ""

View File

@@ -1,101 +1,106 @@
#!/bin/bash
# ========= 0. <20><>ȡ<EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD>Ϊ FEP_ENV =========
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
FEP_ENV="$(dirname "$SCRIPT_DIR")"
# @file: $RCSfile: start_fe.sh,v $
# @brief: $ϵͳӦ<CDB3><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>
# @version: $Revision: 1.1 $
# @date: $Date: 2018/12/26 07:19:31 $
# @author: $Author: lizhongming $
# @state: $State: Exp $
# @latest: $Id: start_fe.sh,v 1.1 2018/12/26 07:19:31 lizhongming Exp $
QTDIR=/qt-4.8.4
export QTDIR
FEP_ENV=/FeProject
export FEP_ENV
# ========= 1. <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> =========
TEMP_LINK_CREATED=0
# <20><>ȡ<EFBFBD><C8A1>ǰ·<C7B0><C2B7>
CURRENT_DIR=$(pwd)
if [ -L "/FeProject" ]; then
if [ "$CURRENT_DIR" = "/FeProject" ]; then
echo "Currently in /FeProject, skipping symlink replacement to avoid issues."
else
echo "/FeProject is an existing symlink. Replacing it..."
sudo rm -f /FeProject
sudo ln -s "$FEP_ENV" /FeProject
TEMP_LINK_CREATED=1
echo "Symlink /FeProject updated."
fi
elif [ ! -e "/FeProject" ]; then
echo "/FeProject does not exist. Creating new symlink..."
sudo ln -s "$FEP_ENV" /FeProject
TEMP_LINK_CREATED=1
echo "Symlink /FeProject created."
else
echo "/FeProject exists but is not a symlink. Please check manually."
fi
PATH=$FEP_ENV/bin:$QTDIR/bin:$PATH
export PATH
if [ -z "$FEP_ENV" ]; then
echo "Error: FEP_ENV is not set. Please set it first."
exit 1
fi
LD_LIBRARY_PATH=$FEP_ENV/lib:$FEP_ENV/lib3rd:$QTDIR/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
# ========= 2. <20><>־<EFBFBD><D6BE>ת<EFBFBD><D7AA><EFBFBD><EFBFBD> =========
check_log_file() {
check_log_file()
{
if [ -n "$1" ] ; then
FILE_SIZE=$(du "$1" | awk '{print $1}')
if [ "$FILE_SIZE" -ge 5120 ]; then
[ -f "$1.3" ] && rm -f "$1.3"
[ -f "$1.2" ] && mv "$1.2" "$1.3"
[ -f "$1.1" ] && mv "$1.1" "$1.2"
mv "$1" "$1.1"
FILE_SIZE=0
FILE_SIZE=`du $1 | awk '{print $1}'`
if [ $FILE_SIZE -ge 5120 ]
then
if [ -f "$1".3 ]; then
rm -f "$1".3
fi
if [ -f "$1".2 ]; then
mv "$1".2 "$1".3
fi
if [ -f "$1".1 ]; then
mv "$1".1 "$1".2
fi
mv "$1" "$1".1
fi
fi
}
LOGFILE="$FEP_ENV/dat/log/start_fe.log"
check_log_file "$LOGFILE"
check_log_file $LOGFILE
echo "" ; echo ""
echo "******* $(date "+%F %R:%S") Start Processes *******"
echo "******* `date "+%F %R:%S"` Start Processes *******"
echo "" >>"$LOGFILE"
echo "" >>"$LOGFILE"
echo "******* $(date "+%F %R:%S") Start Processes *******" >>"$LOGFILE"
echo "******* `date "+%F %R:%S"` Start Processes *******" >>"$LOGFILE"
#sysctl -w "kernel.core_pattern=/usr/local/sascore/%e.%p.%t.core" &> /dev/null
<>г<EFBFBD><D0B3><EFBFBD>·<EFBFBD><C2B7>^<5E><>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>^<5E>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>^<5E>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
# ========= 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> =========
RUNTIME_CF_FILE="$FEP_ENV/etc/runtime.cf"
echo "Using config file name: $RUNTIME_CF_FILE"
echo "Using config file name: $RUNTIME_CF_FILE">>"$LOGFILE"
CURDIR=`pwd`
while read LINE ; do
if [ -n "$LINE" ] ; then
if [ ${LINE:0:1} != "#" ]; then
BINPATH=`echo $LINE | awk -F '^' '{printf $1}'`
BINPATH=`echo "$BINPATH" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
# echo $BINPATH
BIN=`echo $LINE | awk -F '^' '{printf $2}'`
BIN=`echo "$BIN" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
# echo $BIN
SPECIAL=`echo $LINE | awk -F '^' '{printf $4}'`
SPECIAL=`echo "$SPECIAL" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
# echo $SPECIAL
cd "$FEP_ENV/boot" || exit 1
CURDIR=$(pwd)
SLEEPSEC=`echo $LINE | awk -F '^' '{printf $5}'`
SLEEPSEC=`echo "$SLEEPSEC" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
# echo $SLEEPSEC
STARTFLAG=`echo $LINE | awk -F '^' '{printf $7}'`
STARTFLAG=`echo "$STARTFLAG" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
# echo $STARTFLAG
while read -r LINE; do
if [ -n "$LINE" ] && [[ ${LINE:0:1} != "#" ]]; then
BINPATH=$(echo "$LINE" | awk -F '^' '{print $1}' | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "$BINPATH"
BIN=$(echo "$LINE" | awk -F '^' '{print $2}' | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "$BIN"
SPECIAL=$(echo "$LINE" | awk -F '^' '{print $4}' | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "$SPECIAL"
SLEEPSEC=$(echo "$LINE" | awk -F '^' '{print $5}' | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "$SLEEPSEC"
STARTFLAG=$(echo "$LINE" | awk -F '^' '{print $7}' | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "$STARTFLAG"
RESTARTFLAG=$(echo "$LINE" | awk -F '^' '{print $6}' | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "$RESTARTFLAG"
RESTARTFLAG=`echo $LINE | awk -F '^' '{printf $6}'`
RESTARTFLAG=`echo "$RESTARTFLAG" | grep -o "[^ ]\+\( \+[^ ]\+\)*"`
echo $RESTARTFLAG
if [ "$RESTARTFLAG" = "IGNORE_RESTART" ]; then
CMD_STR="sleep $SLEEPSEC"
# echo "" ;
CMD_STR=" sleep `echo $SLEEPSEC` "
echo "$CMD_STR"
echo "$CMD_STR" >>"$LOGFILE"
eval "$CMD_STR"
$CMD_STR
CMD_STR="$BINPATH$BIN $SPECIAL"
CMD_STR=" `echo $BINPATH``echo $BIN` `echo $SPECIAL` "
echo "$CMD_STR"
echo "$CMD_STR" >>"$LOGFILE"
eval "$CMD_STR" &>/dev/null
$CMD_STR &>/dev/null
fi
fi
done < "$RUNTIME_CF_FILE"
fi
done < $RUNTIME_CF_FILE
cd "$CURDIR"
cd $CURDIR
DT=$(date "+%F %R:%S.%N")
DT=`date "+%F %R:%S.%N"`
echo "******* ${DT:0:23} Start Processes Succcessfully *******"
echo "******* ${DT:0:23} Start Processes Succcessfully *******" >>"$LOGFILE"

View File

@@ -1,9 +1,12 @@
#!/bin/bash
if [ -z "$FEP_ENV" ]; then
echo "Error: FEP_ENV is not set. Please set it first."
exit 1
fi
# @file: $RCSfile: stop_fe.sh,v $
# @brief: $ϵͳӦ<CDB3><D3A6>ֹͣ<CDA3><D6B9><EFBFBD>̽ű<CCBD>
# @version: $Revision: 1.5 $
# @date: $Date: 2017/02/28 08:40:43 $
# @author: $Author: zhanchengguo $
# @state: $State: Exp $
# @latest: $Id: stop_fe.sh,v 1.5 2017/02/28 08:40:43 zhanchengguo Exp $
check_log_file()
{

View File

@@ -26,13 +26,11 @@
#include "nlohmann/json.hpp"
#include "curl/curl.h"
#include "log4cplus/log4.h" //关键上送日志
#include "log4.h" //关键上送日志
#include "interface.h" //台账结构
#include "tinyxml2.h"
#include "rocketmq.h"
/////////////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
@@ -60,6 +58,8 @@ extern std::list<queue_data_t> queue_data_list; //queue发送数据链表
extern int three_secs_enabled;
extern std::vector<terminal_dev> terminal_devlist;
extern std::map<std::string, Xmldata*> xmlinfo_list;//保存所有型号对应的icd映射文件解析数据
extern XmlConfig xmlcfg;//星形接线xml节点解析的数据-默认映射文件解析数据
extern std::list<CTopic *> topicList; //队列发送主题链表
@@ -527,7 +527,7 @@ void init_config() {
}
//测试进程端口
/*if (g_node_id == STAT_DATA_BASE_NODE_ID)//统计采集
if (g_node_id == STAT_DATA_BASE_NODE_ID)//统计采集
TEST_PORT = TEST_PORT + STAT_DATA_BASE_NODE_ID + g_front_seg_index;
else if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//补召
TEST_PORT = TEST_PORT + RECALL_HIS_DATA_BASE_NODE_ID + g_front_seg_index;
@@ -537,8 +537,8 @@ void init_config() {
}
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
TEST_PORT = TEST_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
}*/
TEST_PORT = TEST_PORT + g_front_seg_index;
}
}
////////////////////////////////////////////////////////////////////////////////////////////获取当前时间
@@ -817,7 +817,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, const std::string& id) {
DIR* dir = opendir(cfg_dir.c_str());
if (!dir) {
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程 无法解析补招文件补招文件路径FRONT_PATH + /etc/recall/不存在", g_front_seg_index);
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程 无法解析补招文件补招文件路径FRONT_PATH + /etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
return false;
}
@@ -829,7 +829,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, const std::string& id) {
std::string filepath = cfg_dir + "/" + filename;
tinyxml2::XMLDocument doc;
if (doc.LoadFile(filepath.c_str()) != tinyxml2::XML_SUCCESS) {
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程 无法解析补招文件%s,补招内容无效", g_front_seg_index, filepath.c_str());
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程 无法解析补招文件%s,补招内容无效", get_front_msg_from_subdir(), g_front_seg_index, filepath.c_str());
continue;
}
@@ -871,18 +871,20 @@ void process_recall_config(recall_xml_t* recall_xml)
//根据监测点id来获取补招数据补招时调用这个
void Check_Recall_Config(const std::string& id) {
/*if (g_node_id == HIS_DATA_BASE_NODE_ID ||
if (g_node_id == HIS_DATA_BASE_NODE_ID ||
g_node_id == NEW_HIS_DATA_BASE_NODE_ID ||
g_node_id == RECALL_HIS_DATA_BASE_NODE_ID ||
g_node_id == RECALL_ALL_DATA_BASE_NODE_ID) {*/
g_node_id == RECALL_ALL_DATA_BASE_NODE_ID) {
recall_xml_t recall_xml;
std::memset(&recall_xml, 0, sizeof(recall_xml_t));
// 解析补招文件
parse_recall_xml(&recall_xml, id);
// 将补招数据赋值到全局变量
process_recall_config(&recall_xml);
//}
}
}
//补招成功后删除补招文件,补招后调用这个
@@ -923,7 +925,7 @@ void DeletcRecallXml() {
DIR* dir = opendir(cfg_dir.c_str());
if (!dir) {
std::cerr << "folder does not exist!" << std::endl;
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程 删除旧的补招文件失败,补招文件路径FRONT_PATH + /etc/recall/不存在", g_front_seg_index);
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程 删除旧的补招文件失败,补招文件路径FRONT_PATH + /etc/recall/不存在",get_front_msg_from_subdir(), g_front_seg_index);
return;
}
@@ -942,7 +944,7 @@ void DeletcRecallXml() {
if (stat(fullpath.c_str(), &file_stat) == 0) {
if (file_stat.st_mtime < cutoff) {
if (remove(fullpath.c_str()) == 0) {
DIY_INFOLOG("process", "【NORMAL】前置的%d号进程 删除超过两天的补招文件", g_front_seg_index);
DIY_INFOLOG("process", "【NORMAL】前置的%s%d号进程 删除超过两天的补招文件",get_front_msg_from_subdir(), g_front_seg_index);
} else {
std::cerr << "Failed to remove file: " << fullpath << std::endl;
}
@@ -964,7 +966,7 @@ void CreateRecallXml() {
g_StatisticLackList_list_mutex.lock();
if (!g_StatisticLackList.empty()) {
DIY_INFOLOG("process", "【NORMAL】前置的%d号进程 开始写入补招文件", g_front_seg_index);
DIY_INFOLOG("process", "【NORMAL】前置的%s%d号进程 开始写入补招文件", get_front_msg_from_subdir(), g_front_seg_index);
std::map<std::string, std::list<JournalRecall>> id_map;
for (const auto& jr : g_StatisticLackList) {
@@ -1004,7 +1006,7 @@ void CreateRecallXml() {
tinyxml2::XMLError save_result = doc.SaveFile(path.str().c_str());
if (save_result != tinyxml2::XML_SUCCESS) {
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程 无法将补招文件写入路径: %s", g_front_seg_index, path.str().c_str());
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程 无法将补招文件写入路径: %s",get_front_msg_from_subdir(), g_front_seg_index, path.str().c_str());
continue;
}
}
@@ -1017,10 +1019,10 @@ void CreateRecallXml() {
//生成待补招xml文件
void create_recall_xml()
{
//if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
DeletcRecallXml();
CreateRecallXml();
//}
}
}
// 工具函数:将时间字符串转为 time_t秒级
@@ -1242,7 +1244,7 @@ void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev
std::cout << "Key: " << key
<< ", Terminal ID: " << dev.terminal_id
<< ", Terminal Code: " << dev.terminal_name
<< ", Terminal Code: " << dev.terminal_code
<< ", Organization Name: "<< dev.org_name
<< ", Maintenance Name: " << dev.maint_name
<< ", Station Name: " << dev.station_name
@@ -1256,9 +1258,6 @@ void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev
<< ", Address: " << dev.addr_str
<< ", Port: " << dev.port
<< ", Timestamp: " << dev.timestamp
<< ", mac: " << dev.mac
<< std::endl;
// 打印监测点信息
@@ -1266,19 +1265,13 @@ void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev
const auto& m = dev.line[i];
std::cout << " Monitor [" << i << "] "
<< "ID: " << m.monitor_id
<< ", Code: " << m.terminal_id
<< ", Code: " << m.terminal_code
<< ", Name: " << m.monitor_name
<< ", Seq: " << m.logical_device_seq
<< ", Voltage: "<< m.voltage_level
<< ", Connect: "<< m.terminal_connect
<< ", Timestamp:"<< m.timestamp
<< ", Status: " << m.status
<< ", CT1: " << m.CT1
<< ", CT2: " << m.CT2
<< ", PT1: " << m.PT1
<< ", PT2: " << m.PT2
<< std::endl;
}
}
@@ -1364,7 +1357,7 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
};
work_terminal.terminal_id = get_value("id");
work_terminal.terminal_name = get_value("terminalCode");
work_terminal.terminal_code = get_value("terminalCode");
work_terminal.org_name = get_value("orgName");
work_terminal.maint_name = get_value("maintName");
work_terminal.station_name = get_value("stationName");
@@ -1378,8 +1371,6 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
work_terminal.port = get_value("port");
work_terminal.timestamp = get_value("updateTime");
work_terminal.mac = get_value("mac");
for (tinyxml2::XMLElement* monitor = root->FirstChildElement("monitorData");
monitor;
monitor = monitor->NextSiblingElement("monitorData")) {
@@ -1390,18 +1381,9 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
mon.terminal_connect = monitor->FirstChildElement("ptType") ? monitor->FirstChildElement("ptType")->GetText() : "N/A";
mon.logical_device_seq = monitor->FirstChildElement("lineNo") ? monitor->FirstChildElement("lineNo")->GetText() : "N/A";
mon.timestamp = monitor->FirstChildElement("timestamp") ? monitor->FirstChildElement("timestamp")->GetText() : "N/A";
mon.terminal_id = monitor->FirstChildElement("terminal_id") ? monitor->FirstChildElement("terminal_name")->GetText() : "N/A";
mon.terminal_code = monitor->FirstChildElement("terminal_code") ? monitor->FirstChildElement("terminal_code")->GetText() : "N/A";
mon.status = monitor->FirstChildElement("status") ? monitor->FirstChildElement("status")->GetText() : "N/A";
mon.CT1 = monitor->FirstChildElement("CT1") && monitor->FirstChildElement("CT1")->GetText()
? atof(monitor->FirstChildElement("CT1")->GetText()) : 0.0;
mon.CT2 = monitor->FirstChildElement("CT2") && monitor->FirstChildElement("CT2")->GetText()
? atof(monitor->FirstChildElement("CT2")->GetText()) : 0.0;
mon.PT1 = monitor->FirstChildElement("PT1") && monitor->FirstChildElement("PT1")->GetText()
? atof(monitor->FirstChildElement("PT1")->GetText()) : 0.0;
mon.PT2 = monitor->FirstChildElement("PT2") && monitor->FirstChildElement("PT2")->GetText()
? atof(monitor->FirstChildElement("PT2")->GetText()) : 0.0;
work_terminal.line.push_back(mon);
}
@@ -1554,9 +1536,9 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
target_dev.terminal_id = update.terminal_id;
std::cout << "terminal_id: " << target_dev.terminal_id << std::endl;
}
if (!update.terminal_name.empty()) {
target_dev.terminal_name = update.terminal_name;
std::cout << "terminal_name: " << target_dev.terminal_name << std::endl;
if (!update.terminal_code.empty()) {
target_dev.terminal_code = update.terminal_code;
std::cout << "terminal_code: " << target_dev.terminal_code << std::endl;
}
if (!update.tmnl_factory.empty()) {
target_dev.tmnl_factory = update.tmnl_factory;
@@ -1592,11 +1574,6 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
std::cout << "port: " << target_dev.port << std::endl;
}
if (!update.mac.empty()) {
target_dev.mac = update.mac;
std::cout << "mac: " << target_dev.mac << std::endl;
}
if (!update.timestamp.empty()) {
struct tm timeinfo = {};
if (sscanf(update.timestamp.c_str(), "%4d-%2d-%2d %2d:%2d:%2d",
@@ -1632,14 +1609,9 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
m.voltage_level = mon.voltage_level;
m.terminal_connect = mon.terminal_connect;
m.status = mon.status;
m.terminal_id = mon.terminal_id;
m.terminal_code = mon.terminal_code;
m.timestamp = mon.timestamp;
m.CT1 = mon.CT1;
m.CT2 = mon.CT2;
m.PT1 = mon.PT1;
m.PT2 = mon.PT2;
if (m.terminal_connect != "0") {
isdelta_flag = 1;
std::cout << "monitor_id " << m.monitor_id << " uses delta wiring." << std::endl;
@@ -2132,18 +2104,13 @@ void print_monitor(const ledger_monitor& mon) {
auto safe = [](const std::string& s) { return s.empty() ? "N/A" : s; };
std::cout << "Monitor ID: " << safe(mon.monitor_id) << "\n";
std::cout << "Terminal ID: " << safe(mon.terminal_id) << "\n";
std::cout << "Terminal Code: " << safe(mon.terminal_code) << "\n";
std::cout << "Monitor Name: " << safe(mon.monitor_name) << "\n";
std::cout << "Logical Device Sequence: " << safe(mon.logical_device_seq) << "\n";
std::cout << "Voltage Level: " << safe(mon.voltage_level) << "\n";
std::cout << "Terminal Connect: " << safe(mon.terminal_connect) << "\n";
std::cout << "Timestamp: " << safe(mon.timestamp) << "\n";
std::cout << "Status: " << safe(mon.status) << "\n";
std::cout << "CT1: " << mon.CT1 << "\n";
std::cout << "CT2: " << mon.CT2 << "\n";
std::cout << "PT1: " << mon.PT1 << "\n";
std::cout << "PT2: " << mon.PT2 << "\n";
}
void print_terminal(const terminal_dev& tmnl) {
@@ -2151,7 +2118,7 @@ void print_terminal(const terminal_dev& tmnl) {
std::cout << "GUID: " << safe(tmnl.guid) << "\n";
std::cout << "Terminal ID: " << safe(tmnl.terminal_id) << "\n";
std::cout << "Terminal Code: " << safe(tmnl.terminal_name)<< "\n";
std::cout << "Terminal Code: " << safe(tmnl.terminal_code)<< "\n";
std::cout << "Organization Name: "<< safe(tmnl.org_name) << "\n";
std::cout << "Maintenance Name: " << safe(tmnl.maint_name) << "\n";
std::cout << "Station Name: " << safe(tmnl.station_name) << "\n";
@@ -2164,8 +2131,6 @@ void print_terminal(const terminal_dev& tmnl) {
std::cout << "Port: " << safe(tmnl.port) << "\n";
std::cout << "Timestamp: " << safe(tmnl.timestamp) << "\n";
std::cout << "mac: " << safe(tmnl.mac) << "\n";
for (size_t i = 0; i < 10 && !tmnl.line[i].monitor_id.empty(); ++i) {
std::cout << " Monitor " << (i + 1) << ":\n";
print_monitor(tmnl.line[i]);
@@ -2203,7 +2168,7 @@ void print_trigger_update_xml(const trigger_update_xml_t& trigger_update) {
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////解析模板文件
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////解析映射文件
//解析映射文件
bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, std::list<CTopic*> *ctopiclist, const std::string& path)
@@ -2650,114 +2615,3 @@ void Set_xml_nodeinfo()
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////数据转换函数
// DataArrayItem to_json
void to_json(nlohmann::json& j, const DataArrayItem& d) {
j = nlohmann::json{
{"DataAttr", d.DataAttr},
{"DataTimeSec", d.DataTimeSec},
{"DataTimeUSec", d.DataTimeUSec},
{"DataTag", d.DataTag},
{"Data", d.Data}
};
}
// MsgObj to_json
void to_json(nlohmann::json& j, const MsgObj& m) {
j = nlohmann::json{
{"Cldid", m.Cldid},
{"DataType", m.DataType},
{"DataAttr", m.DataAttr},
{"DsNameIdx", m.DsNameIdx},
{"DataArray", m.DataArray}
};
}
// FullObj to_json
void to_json(nlohmann::json& j, const FullObj& f) {
j = nlohmann::json{
{"Mid", f.Mid},
{"Did", f.Did},
{"Pri", f.Pri},
{"Type", f.Type},
{"Msg", f.Msg}
};
}
std::string generate_json(
int Mid, //需应答的报文订阅者收到后需以此ID应答无需应答填入“-1”
int Did, //设备唯一标识Ldid填入0代表Ndid。
int Pri, //报文处理的优先级
int Type, //消息类型
int Cldid, //逻辑子设备ID0-逻辑设备本身,无填-1
int DataType, //数据类型0-表示以数据集方式上送
int DataAttr, //数据属性无“0”、实时“1”、统计“2”等。
int DsNameIdx, //数据集序号(以数据集方式上送),无填-1
const std::vector<DataArrayItem>& dataArray //数据数组。
) {
FullObj fobj;
fobj.Mid = Mid;
fobj.Did = Did;
fobj.Pri = Pri;
fobj.Type = Type;
fobj.Msg.Cldid = Cldid;
fobj.Msg.DataType = DataType;
fobj.Msg.DataAttr = DataAttr;
fobj.Msg.DsNameIdx = DsNameIdx;
fobj.Msg.DataArray = dataArray;
nlohmann::json j = fobj;
return j.dump(); // 输出标准 json 字符串
}
void upload_data_test(){
std::vector<DataArrayItem> arr;
arr.push_back({1, 1725477660, 0, 1, "xxxx"}); //数据属性 -1-无, 0-“Rt”,1-“Max”,2-“Min”,3-“Avg”,4-“Cp95”
//数据时标相对1970年的秒无效填入“-1”
//数据时标,微秒钟,无效填入“-1”
//数据标识1-标识数据异常
//数据序列数据集上送时将二进制数据流转换成Base64字符串其他数据为object
arr.push_back({2, 1691741340, 0, 1, "yyyy"});
std::string js = generate_json(
-1, 2, 1, 4866, 1, 0, 2, 1, arr
);
std::cout << js << std::endl;
queue_data_t data;
data.monitor_no = 1;
data.strTopic = TOPIC_ALARM;
data.strText = js;
data.mp_id = "test";
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
queue_data_list.push_back(data);
}
//////////////////////////////////////////////////////////////////////////////////////////////////台账赋值给通信
std::vector<DeviceInfo> GenerateDeviceInfoFromLedger(const std::vector<terminal_dev>& terminal_devlist) {
std::vector<DeviceInfo> devices;
for (const auto& terminal : terminal_devlist) {
DeviceInfo device;
device.device_id = terminal.terminal_id;
device.name = terminal.terminal_name;
device.model = terminal.dev_series;
device.mac = terminal.mac;
for (const auto& monitor : terminal.line) {
PointInfo point;
point.point_id = monitor.monitor_id;
point.name = monitor.monitor_name;
point.device_id = terminal.terminal_id;
point.PT1 = monitor.PT1;
point.PT2 = monitor.PT2;
point.CT1 = monitor.CT1;
point.CT2 = monitor.CT2;
device.points.push_back(point);
}
devices.push_back(device);
}
return devices;
}

View File

@@ -25,7 +25,7 @@
#include "interface.h"
#include "rocketmq.h"
#include "nlohmann/json.hpp"
#include "log4cplus/log4.h"
#include "log4.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -133,6 +133,7 @@ void SendJsonAPI_web(const std::string& strUrl, //接口路径
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////上传文件接口
//处理文件上传响应
@@ -534,7 +535,7 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
{
if (inputstring.empty()) {
std::cerr << "Error: inputstring is empty\n";
DIY_ERRORLOG("process","【ERROR】前置的%d号进程调用web台账接口的入参为空", g_front_seg_index);
DIY_ERRORLOG("process","【ERROR】前置的%s%d号进程调用web台账接口的入参为空", get_front_msg_from_subdir(), g_front_seg_index);
return 1;
}
@@ -608,7 +609,7 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
};
dev.terminal_id = safe_str(item, "id");
dev.addr_str = safe_str(item, "ip");
dev.terminal_name = safe_str(item, "name");
dev.terminal_code = safe_str(item, "name");
dev.org_name = safe_str(item, "org_name");
dev.maint_name = safe_str(item, "maint_name");
dev.station_name = safe_str(item, "stationName");
@@ -622,26 +623,18 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
dev.processNo = safe_str(item, "processNo");
dev.maxProcessNum = safe_str(item, "maxProcessNum");
dev.mac = safe_str(item, "mac");//添加mac
if (item.contains("monitorData") && item["monitorData"].is_array()) {
for (auto& mon : item["monitorData"]) {
if (dev.line.size() >= 10) break;
ledger_monitor m;
m.monitor_id = safe_str(mon, "id");
m.terminal_id = safe_str(mon, "terminal_id");
m.terminal_code = safe_str(mon, "terminal_code");
m.monitor_name = safe_str(mon, "name");
m.logical_device_seq = safe_str(mon, "lineNo");
m.voltage_level = safe_str(mon, "voltageLevel");
m.terminal_connect = safe_str(mon, "ptType");
m.timestamp = safe_str(mon, "updateTime");
m.status = safe_str(mon, "status");
m.CT1 = mon.value("CT1", 0.0);
m.CT2 = mon.value("CT2", 0.0);
m.PT1 = mon.value("PT1", 0.0);
m.PT2 = mon.value("PT2", 0.0);
dev.line.push_back(m);
}
}
@@ -672,8 +665,7 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
}
// 5. 主进程保存台账
//if (g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1) {
if (g_front_seg_index == 1) {
if (g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1) {
save_ledger_json(responseStr);
}
@@ -692,7 +684,7 @@ int parse_device_cfg_web()
input_jstr += "}";
std::cout << "input_jstr: " << input_jstr << std::endl;
DIY_DEBUGLOG("process","【DEBUG】前置的%d号进程调用web接口获取台账使用的请求输入为:%s", g_front_seg_index, input_jstr.c_str());
DIY_DEBUGLOG("process","【DEBUG】前置的%s%d号进程调用web接口获取台账使用的请求输入为:%s",get_front_msg_from_subdir(), g_front_seg_index, input_jstr.c_str());
// 2. 调用接口
std::map<std::string, terminal_dev> terminal_dev_map;
@@ -703,9 +695,8 @@ int parse_device_cfg_web()
// 3. 调试打印
printTerminalDevMap(terminal_dev_map);
// 4. 看门狗配置校验(仅主进程)
//if (g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1) {
if (g_front_seg_index == 1) {
// 4. 看门狗配置校验(仅主进程稳态
if (g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1) {
int max_index = get_max_stat_data_index(FRONT_PATH + "/etc/runtime.cf");
std::cout << "max_index = " << max_index << std::endl;
@@ -732,13 +723,13 @@ int parse_device_cfg_web()
// 5. 台账数量与配置比对
int count_cfg = static_cast<int>(terminal_dev_map.size());
std::cout << "terminal_ledger_num: " << count_cfg << std::endl;
DIY_DEBUGLOG("process", "【DEBUG】前置的%d号进程调用获取到的台账的数量为:%d", g_front_seg_index, count_cfg);
DIY_DEBUGLOG("process", "【DEBUG】前置的%s%d号进程调用获取到的台账的数量为:%d",get_front_msg_from_subdir(), g_front_seg_index, count_cfg);
if (IED_COUNT < count_cfg) {
std::cout << "!!!!!!!!!!single process can not add any ledger unless reboot!!!!!!!" << std::endl;
DIY_WARNLOG("process","【WARN】前置的%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账", g_front_seg_index, IED_COUNT);
DIY_WARNLOG("process","【WARN】前置的%s%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账",get_front_msg_from_subdir(), g_front_seg_index, IED_COUNT);
} else {
DIY_INFOLOG("process","【NORMAL】前置的%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间", g_front_seg_index, IED_COUNT);
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间",get_front_msg_from_subdir(), g_front_seg_index, IED_COUNT);
}
///////////////////////////////////////////////////////////////////////////////用例这里将局部的map拷贝到全局map后续根据协议台账修改
@@ -885,7 +876,7 @@ int parse_model_cfg_web()
// 3. 调用接口
std::map<std::string, icd_model*> icd_model_map;
if (parse_model_web(&icd_model_map, input_jstr)) {
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置", g_front_seg_index);
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置",get_front_msg_from_subdir(), g_front_seg_index);
// 确保释放 map
for (auto& kv : icd_model_map) delete kv.second;
return 0;
@@ -939,7 +930,7 @@ std::string parse_model_cfg_web_one(const std::string& terminal_type)
// 2. 拉取并解析
if (parse_model_web(&icd_model_map, input_jstr) != 0) {
std::cerr << "parse_model_web failed for type: " << terminal_type << std::endl;
DIY_ERRORLOG("process","【ERROR】前置的%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置", g_front_seg_index);
DIY_ERRORLOG("process","【ERROR】前置的%s%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置",get_front_msg_from_subdir(), g_front_seg_index);
// 清理(即使 map 为空,也安全)
for (auto& kv : icd_model_map) delete kv.second;
return "";

View File

@@ -6,13 +6,6 @@
#include <list>
#include <array>
#include <map>
#include <mutex>
///////////////////////////////////////////////////////////////////////////////////////////
#include "nlohmann/json.hpp"
#include "../../client2.h"
///////////////////////////////////////////////////////////////////////////////////////////
@@ -20,13 +13,13 @@ class Front;
///////////////////////////////////////////////////////////////////////////////////////////
/*#define STAT_DATA_BASE_NODE_ID 100
#define STAT_DATA_BASE_NODE_ID 100
#define THREE_SECS_DATA_BASE_NODE_ID 200
#define SOE_COMTRADE_BASE_NODE_ID 300
#define HIS_DATA_BASE_NODE_ID 400
#define NEW_HIS_DATA_BASE_NODE_ID 500
#define RECALL_HIS_DATA_BASE_NODE_ID 600
#define RECALL_ALL_DATA_BASE_NODE_ID 700*/
#define RECALL_ALL_DATA_BASE_NODE_ID 700
///////////////////////////////////////////////////////////////////////////////////////////
@@ -54,28 +47,23 @@ class ledger_monitor
{
public:
std::string monitor_id; //监测点id
std::string terminal_id; //监测点
std::string terminal_code; //监测点
std::string monitor_name; //监测点名
std::string logical_device_seq; //监测点序号
std::string voltage_level; //监测点电压等级
std::string terminal_connect; //监测点接线方式
std::string timestamp; //更新时间
std::string status; //监测点状态
double PT1; // 电压变比1
double PT2; // 电压变比2
double CT1; // 电流变比1
double CT2; // 电流变比2
};
//终端台账
class terminal_dev
{
public:
std::string guid; //台账更新回复用
std::string guid;
std::string terminal_id;
std::string terminal_name;
std::string terminal_code;
std::string org_name;
std::string maint_name;
std::string station_name;
@@ -90,8 +78,6 @@ public:
std::string processNo;
std::string maxProcessNum;
std::string mac; // 装置MAC地址
std::vector<ledger_monitor> line;
};
@@ -310,9 +296,6 @@ int parse_model_cfg_web();
void qvvr_test();
void Fileupload_test();
extern std::vector<terminal_dev> terminal_devlist;
extern std::mutex ledgermtx;
//////////////////////////////////////////////////////////////////////////////////cfg_parse的函数声明
void init_config();
@@ -331,23 +314,17 @@ bool is_blank(const std::string& str);
void print_terminal(const terminal_dev& tmnl);
void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev_map);
void upload_data_test();
////////////////////////////////////////////////////////////////////////////////mq
extern std::mutex queue_data_list_mutex;
extern std::list<queue_data_t> queue_data_list;
/////////////////////////////////////////////////////////////////////////////////主函数类声明
//std::string get_front_msg_from_subdir();
std::string get_front_msg_from_subdir();
extern std::string FRONT_PATH;
extern int g_front_seg_index;
extern int g_front_seg_num;
void* cloudfrontthread(void* arg);
bool parse_param(int argc, char* argv[]);
struct ThreadArgs {
int argc;
@@ -376,57 +353,6 @@ typedef struct {
pthread_mutex_t lock; // 线程专用互斥锁
} thread_info_t;
///////////////////////////////////////////////////////////////////////////////////////上送数据的json格式
// 单条 DataArray 数据
struct DataArrayItem {
int DataAttr;
int DataTimeSec;
int DataTimeUSec;
int DataTag;
std::string Data;
};
// Msg 对象
struct MsgObj {
int Cldid;
int DataType;
int DataAttr;
int DsNameIdx;
std::vector<DataArrayItem> DataArray;
};
// 整体
struct FullObj {
int Mid;
int Did;
int Pri;
int Type;
MsgObj Msg;
};
// nlohmann序列化接口
void to_json(nlohmann::json& j, const DataArrayItem& d);
void to_json(nlohmann::json& j, const MsgObj& m);
void to_json(nlohmann::json& j, const FullObj& f);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////提供给通讯部分调用的函数
std::vector<DeviceInfo> GenerateDeviceInfoFromLedger(const std::vector<terminal_dev>& terminal_devlist);//接口读取台账后,再调用这个将台账拷贝过来
std::string generate_json( //构造装置主动上送数据的报文
int Mid, //需应答的报文订阅者收到后需以此ID应答无需应答填入“-1”
int Did, //设备唯一标识Ldid填入0代表Ndid。
int Pri, //报文处理的优先级
int Type, //消息类型
int Cldid, //逻辑子设备ID0-逻辑设备本身,无填-1
int DataType, //数据类型0-表示以数据集方式上送
int DataAttr, //数据属性无“0”、实时“1”、统计“2”等。
int DsNameIdx, //数据集序号(以数据集方式上送),无填-1
const std::vector<DataArrayItem>& dataArray //数据数组。
);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -24,12 +24,12 @@
#include "log4cplus/fileappender.h"
#include "log4cplus/layout.h"
#include "log4cplus/ndc.h"
#include "log4cplus/log4.h"
#include "log4.h"
#include "log4cplus/spi/loggingevent.h"
#include "rocketmq.h"
#include "interface.h"
#include "log4cplus/log4.h"
#include "log4.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//log4命名空间
@@ -47,11 +47,17 @@ extern int g_front_seg_index;
extern std::string FRONT_INST;
extern std::string subdir;
//mq
extern std::mutex queue_data_list_mutex; //queue发送数据锁
extern std::list<queue_data_t> queue_data_list; //queue发送数据链表
//日志主题
extern std::string G_LOG_TOPIC;
extern std::vector<terminal_dev> terminal_devlist;
////////////////////////////////////////////////////////辅助函数
/*std::string get_front_type_from_subdir() {
std::string get_front_type_from_subdir() {
if (subdir == "cfg_3s_data")
return "realTime";
else if (subdir == "cfg_soe_comtrade")
@@ -62,7 +68,7 @@ extern std::string G_LOG_TOPIC;
return "stat";
else
return "unknown";
}*/
}
// 递归创建目录
bool create_directory_recursive(const std::string& path) {
@@ -153,7 +159,7 @@ protected:
<< "\",\"level\":\"" << level_str
<< "\",\"grade\":\"" << get_level_str(level)
<< "\",\"logtype\":\"" << (logtype == LOGTYPE_COM ? "com" : "data")
<< "\",\"frontType\":\"" << "cloudfront"
<< "\",\"frontType\":\"" << get_front_type_from_subdir()
<< "\",\"log\":\"" << escape_json(msg) << "\"}";
std::string jsonString = oss.str();

View File

@@ -54,7 +54,7 @@ extern DebugSwitch g_debug_switch;
extern void send_reply_to_queue(const std::string& guid, const std::string& step, const std::string& result);
//std::string get_front_type_from_subdir();
std::string get_front_type_from_subdir();
// 不带 Appender 的版本

View File

@@ -1,111 +0,0 @@
#ifndef LOG4_H
#define LOG4_H
#ifdef __cplusplus
#include <string>
#include <map>
//防止#include <log4cplus/logger.h>里的冲突
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
//防止#include <log4cplus/logger.h>里的冲突
#include "logger.h"
#include <set>
#include "loggingmacros.h"
#include "appender.h"
#define LOGTYPE_COM 1
#define LOGTYPE_DATA 2
struct TypedLogger {
log4cplus::Logger logger;
int logtype;
TypedLogger();
TypedLogger(const log4cplus::Logger& l, int t);
};
struct DebugSwitch {
bool debug_open;
std::set<std::string> targets;
int min_level;
std::map<int, bool> type_enable;
DebugSwitch();
void open();
void close();
void set_target(const std::string& name);
void set_level(int level);
void enable_type(int type);
void disable_type(int type);
bool match(const std::string& logger_name, int level, int logtype);
};
extern std::map<std::string, TypedLogger> logger_map;
extern DebugSwitch g_debug_switch;
extern void send_reply_to_queue(const std::string& guid, const std::string& step, const std::string& result);
//std::string get_front_type_from_subdir();
// 不带 Appender 的版本
log4cplus::Logger init_logger(const std::string& full_name,
const std::string& file_dir,
const std::string& base_file);
// 带 Appender 的版本
log4cplus::Logger init_logger(const std::string& full_name,
const std::string& file_dir,
const std::string& base_file,
log4cplus::SharedAppenderPtr fileAppender);
void process_log_command(const std::string& id, const std::string& level, const std::string& grade, const std::string& logtype_str);
void update_log_entries_countdown();
extern "C" {
#endif
void remove_loggers_by_terminal_id(const std::string& terminal_id_cstr);
void init_logger_process();
void init_loggers();
void init_loggers_bydevid(const std::string& dev_id);
void log_debug(const char* key, const char* msg);
void log_info(const char* key, const char* msg);
void log_warn(const char* key, const char* msg);
void log_error(const char* key, const char* msg);
void send_reply_to_queue_c(const char* guid, const char* step, const char* result);
void format_log_msg(char* buf, size_t buf_size, const char* fmt, ...);
//宏定义
#define DIY_LOG(LEVEL_FUNC, KEY, ...) \
do { \
char buf[256]; \
format_log_msg(buf, sizeof(buf), __VA_ARGS__); \
LEVEL_FUNC(KEY, buf); \
} while (0)
#define DIY_ERRORLOG(KEY, ...) DIY_LOG(log_error, KEY, __VA_ARGS__)
#define DIY_WARNLOG(KEY, ...) DIY_LOG(log_warn, KEY, __VA_ARGS__)
#define DIY_INFOLOG(KEY, ...) DIY_LOG(log_info, KEY, __VA_ARGS__)
#define DIY_DEBUGLOG(KEY, ...) DIY_LOG(log_debug, KEY, __VA_ARGS__)
#ifdef __cplusplus
}
#endif
#endif // LOG4_H

View File

@@ -29,7 +29,7 @@
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "interface.h" //用于访问接口
#include "log4cplus/log4.h" //用于日志
#include "log4.h" //用于日志
#include "curl/curl.h" //用于访问接口
#include "nlohmann/json.hpp" //用于构造json
#include "worker.h" //shell接口
@@ -52,7 +52,7 @@ std::string FRONT_PATH;
int INITFLAG = 0;
//前置标置
std::string subdir = "cloudfrontproc"; //子目录
std::string subdir = "cfg_stat_data"; //默认稳态
uint32_t g_node_id = 0;
int g_front_seg_index = 0; //默认单进程
int g_front_seg_num = 0; //默认单进程
@@ -78,6 +78,10 @@ extern int TEST_PORT; //测试端口号
extern std::string FRONT_INST;
extern std::mutex queue_data_list_mutex;
extern std::list<queue_data_t> queue_data_list;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 功能函数
template<typename T, typename... Args>
@@ -139,7 +143,7 @@ bool parse_param(int argc, char* argv[]) {
}
//获取前置类型
/*void init_global_function_enable() {
void init_global_function_enable() {
if (subdir == "cfg_stat_data") { // 历史稳态
g_node_id = STAT_DATA_BASE_NODE_ID;
auto_register_report_enabled = 1;
@@ -151,10 +155,10 @@ bool parse_param(int argc, char* argv[]) {
} else if (subdir == "cfg_recallhis_data") { // 补招
g_node_id = RECALL_HIS_DATA_BASE_NODE_ID;
}
}*/
}
//获取功能名称
/*std::string get_front_msg_from_subdir() {
std::string get_front_msg_from_subdir() {
if (subdir.find("cfg_3s_data") != std::string::npos)
return "实时数据进程";
else if (subdir.find("cfg_soe_comtrade") != std::string::npos)
@@ -165,7 +169,7 @@ bool parse_param(int argc, char* argv[]) {
return "稳态统计进程";
else
return "unknown";
}*/
}
//获取前置路径
std::string get_parent_directory() {
@@ -199,14 +203,14 @@ std::string get_parent_directory() {
{
//初始化g_node_id
//init_global_function_enable();
init_global_function_enable();
//配置初始化
init_config();
//启动进程日志
init_logger_process();
DIY_WARNLOG("process","【WARN】前置的%d号进程 进程级日志初始化完毕", g_front_seg_index);
DIY_WARNLOG("process","【WARN】前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
//读取台账
parse_device_cfg_web();
@@ -214,11 +218,11 @@ std::string get_parent_directory() {
//初始化日志
init_loggers();
//读取模型,下载模板文件
//读取模型,下载文件
parse_model_cfg_web();
//解析模板文件
//Set_xml_nodeinfo();
//解析文件
Set_xml_nodeinfo();
StartFrontThread(); //开启主线程
@@ -318,7 +322,7 @@ void Front::FrontThread() {
try {
while (!m_bIsFrontThreadCancle) {
check_3s_config(); // 实时数据触发
//create_recall_xml(); // 生成待补招xml文件
create_recall_xml(); // 生成待补招xml文件
check_ledger_update(); // 触发台账更新
}
} catch (const std::exception& e) {
@@ -384,13 +388,13 @@ void Front::mqconsumerThread()
std::string nameServer = G_MQCONSUMER_IPPORT;
std::vector<rocketmq::Subscription> subscriptions;
//if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {
if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {
subscriptions.emplace_back(FRONT_INST + "_" + G_MQCONSUMER_TOPIC_RT, G_MQCONSUMER_TAG_RT, myMessageCallbackrtdata);
//}
}
subscriptions.emplace_back(FRONT_INST + "_" + G_MQCONSUMER_TOPIC_UD, G_MQCONSUMER_TAG_UD, myMessageCallbackupdate);
//if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {
if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {
subscriptions.emplace_back(FRONT_INST + "_" + G_MQCONSUMER_TOPIC_RC, G_MQCONSUMER_TAG_RC, myMessageCallbackrecall);
//}
}
subscriptions.emplace_back(FRONT_INST + "_" + G_MQCONSUMER_TOPIC_SET, G_MQCONSUMER_TAG_SET, myMessageCallbackset);
subscriptions.emplace_back(FRONT_INST + "_" + G_MQCONSUMER_TOPIC_LOG, G_MQCONSUMER_TAG_LOG, myMessageCallbacklog);

View File

@@ -33,7 +33,7 @@
#include "rocketmq.h"
#include "nlohmann/json.hpp"
#include "log4cplus/log4.h"
#include "log4.h"
#include "interface.h"
#include "front.h"
@@ -58,6 +58,10 @@ static rocketmq::RocketMQProducer* g_producer = nullptr; //生产者
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//台账
extern std::mutex ledgermtx;
extern std::vector<terminal_dev> terminal_devlist;
//前置进程
extern unsigned int g_node_id;
extern int g_front_seg_index;
@@ -278,7 +282,7 @@ void rocketmq_producer_send(rocketmq::RocketMQProducer* producer,
producer->sendMessage(body, topic, tags, keys);
} catch (const std::exception& e) {
std::cerr << "[rocketmq_producer_send] 发送失败: " << e.what() << std::endl;
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程 MQ发送失败", g_front_seg_index);
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程 MQ发送失败", get_front_msg_from_subdir(), g_front_seg_index);
}
}
@@ -540,7 +544,7 @@ bool parseJsonMessageSET(const std::string& json_str) {
std::cout << "msg index: " << index_value << " self index: " << g_front_seg_index << std::endl;
DIY_INFOLOG("process", "【NORMAL】前置的%d号进程处理topic:%s_%s的进程控制消息", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_SET.c_str());
DIY_INFOLOG("process", "【NORMAL】前置的%s%d号进程处理topic:%s_%s的进程控制消息",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_SET.c_str());
if (code_str == "set_process") {
if (!messageBody.contains("processNum")) {
@@ -559,14 +563,13 @@ bool parseJsonMessageSET(const std::string& json_str) {
// 校验参数并执行
if ((fun == "reset" || fun == "add") &&
(processNum >= 1 && processNum < 10) &&
(frontType == "cloudfront" || frontType == "all")) {
(frontType == "stat" || frontType == "recall" || frontType == "all")) {
//if (g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1) {
if (g_front_seg_index == 1) {
if (g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1) {
execute_bash(fun, processNum, frontType);
DIY_WARNLOG("process", "【WARN】前置的%d号进程执行指令:%s,reset表示重启所有进程,add表示添加进程", g_front_seg_index, fun.c_str());
DIY_WARNLOG("process", "【WARN】前置的%s%d号进程执行指令:%s,reset表示重启所有进程,add表示添加进程",get_front_msg_from_subdir(), g_front_seg_index, fun.c_str());
send_reply_to_queue(guid, "1", "收到重置进程指令,重启所有进程!");
std::cout << "this msg should only execute once" << std::endl;
@@ -578,7 +581,7 @@ bool parseJsonMessageSET(const std::string& json_str) {
send_reply_to_queue(guid, "1", "收到删除进程指令,这个进程将会重启 ");
DIY_WARNLOG("process", "【WARN】前置的%d号进程执行指令:%s,即将重启", g_front_seg_index, fun.c_str());
DIY_WARNLOG("process", "【WARN】前置的%s%d号进程执行指令:%s,即将重启",get_front_msg_from_subdir(), g_front_seg_index, fun.c_str());
std::this_thread::sleep_for(std::chrono::seconds(10));
::_exit(-1039); // 进程退出
@@ -659,15 +662,15 @@ bool parseJsonMessageLOG(const std::string& json_str) {
}
// 判断 frontType 是否匹配
/*if (frontType != subdir) {
if (frontType != subdir) {
std::cout << "msg frontType: " << frontType << " doesn't match self frontType: " << subdir << std::endl;
return true;
}*/
}
DIY_INFOLOG("process", "【NORMAL】前置的%d号进程处理日志上送消息", g_front_seg_index);
DIY_INFOLOG("process", "【NORMAL】前置的%s%d号进程处理日志上送消息", get_front_msg_from_subdir(), g_front_seg_index);
std::cout << "msg index: " << processNo << " self index: " << g_front_seg_index << std::endl;
/*std::cout << "msg frontType: " << frontType << " self frontType: " << subdir << std::endl;*/
std::cout << "msg frontType: " << frontType << " self frontType: " << subdir << std::endl;
// 回复消息
send_reply_to_queue(guid, "1", "收到实时日志指令");
@@ -684,7 +687,7 @@ bool parseJsonMessageLOG(const std::string& json_str) {
process_log_command(id, level, grade, logtype);
} else {
std::cout << "type doesn't match" << std::endl;
DIY_WARNLOG("process", "【WARN】前置的%d号进程处理日志上送消息,格式不正确", g_front_seg_index);
DIY_WARNLOG("process", "【WARN】前置的%s%d号进程处理日志上送消息,格式不正确", get_front_msg_from_subdir(), g_front_seg_index);
}
std::cout << "this msg should only execute once" << std::endl;
@@ -738,8 +741,8 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
std::cout << "msg index: " << process_No << " self index: " << g_front_seg_index << std::endl;
DIY_INFOLOG("process", "【NORMAL】前置的%d号进程处理topic:%s_%s的台账更新消息",
g_front_seg_index, FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_UD.c_str());
DIY_INFOLOG("process", "【NORMAL】前置的%s%d号进程处理topic:%s_%s的台账更新消息",
get_front_msg_from_subdir(), g_front_seg_index, FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_UD.c_str());
send_reply_to_queue(guid, "1", "收到台账更新指令");
@@ -751,7 +754,7 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
terminal_dev json_data;
json_data.terminal_id = item.value("id", "");
json_data.terminal_name = item.value("name", "");
json_data.terminal_code = item.value("name", "");
json_data.org_name = item.value("org_name", "");
json_data.maint_name = item.value("maint_name", "");
json_data.station_name = item.value("stationName", "");
@@ -780,7 +783,7 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
m.logical_device_seq = monitor_item.value("lineNo", "");
m.terminal_connect = monitor_item.value("ptType", "");
m.timestamp = json_data.timestamp;
m.terminal_id = json_data.terminal_id;
m.terminal_code = json_data.terminal_code;
}
}
@@ -866,7 +869,7 @@ rocketmq::ConsumeStatus myMessageCallbackrtdata(const rocketmq::MQMessageExt& ms
}
else{
std::cerr << "rtdata is NULL." << std::endl;
DIY_ERRORLOG("process","【ERROR】前置的%d号进程处理topic:%s_%s的补招触发消息失败,消息的json结构不正确", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str());
DIY_ERRORLOG("process","【ERROR】前置的%s%d号进程处理topic:%s_%s的补招触发消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str());
}
@@ -910,7 +913,7 @@ rocketmq::ConsumeStatus myMessageCallbackupdate(const rocketmq::MQMessageExt& ms
// 调用业务逻辑处理函数
std::string updatefilepath = FRONT_PATH + "/etc/ledgerupdate";
if (!parseJsonMessageUD(body, updatefilepath)) {
DIY_ERRORLOG("process","【ERROR】前置的%d号进程处理topic:%s_%s的台账更新消息失败,消息的json结构不正确", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_UD.c_str());
DIY_ERRORLOG("process","【ERROR】前置的%s%d号进程处理topic:%s_%s的台账更新消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_UD.c_str());
}
return rocketmq::CONSUME_SUCCESS;
@@ -940,7 +943,7 @@ rocketmq::ConsumeStatus myMessageCallbackset(const rocketmq::MQMessageExt& msg)
// 调用业务处理逻辑
if (!parseJsonMessageSET(body)) {
DIY_ERRORLOG("process","【ERROR】前置的%d号进程处理topic:%s_%s的进程控制消息失败,消息的json结构不正确", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_SET.c_str());
DIY_ERRORLOG("process","【ERROR】前置的%s%d号进程处理topic:%s_%s的进程控制消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_SET.c_str());
}
return rocketmq::CONSUME_SUCCESS;
@@ -970,7 +973,7 @@ rocketmq::ConsumeStatus myMessageCallbacklog(const rocketmq::MQMessageExt& msg)
// 执行日志上送处理
if (!parseJsonMessageLOG(body)) {
DIY_ERRORLOG("process", "【ERROR】前置的%d号进程处理topic:%s_%s的日志上送消息失败,消息的json结构不正确", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_LOG.c_str());
DIY_ERRORLOG("process", "【ERROR】前置的%s%d号进程处理topic:%s_%s的日志上送消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_LOG.c_str());
}
return rocketmq::CONSUME_SUCCESS;
@@ -1013,7 +1016,7 @@ rocketmq::ConsumeStatus myMessageCallbackrecall(const rocketmq::MQMessageExt& ms
} else {
std::cerr << "recall data is NULL." << std::endl;
DIY_ERRORLOG("process","【ERROR】前置的%d号进程处理topic:%s_%s的补招触发消息失败,消息的json结构不正确", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RC.c_str());
DIY_ERRORLOG("process","【ERROR】前置的%s%d号进程处理topic:%s_%s的补招触发消息失败,消息的json结构不正确",get_front_msg_from_subdir(), g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RC.c_str());
}
return rocketmq::CONSUME_SUCCESS;
@@ -1177,7 +1180,7 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
xmlStream << "<stationName>" << json_data.station_name << "</stationName>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminalCode>" << json_data.terminal_name << "</terminalCode>" << std::endl;
xmlStream << "<terminalCode>" << json_data.terminal_code << "</terminalCode>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<updateTime>" << json_data.timestamp << "</updateTime>" << std::endl; // Assuming `timestamp`
@@ -1198,9 +1201,6 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
add_indent(xmlStream, indentLevel);
xmlStream << "<devKey>" << json_data.dev_key << "</devKey>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<mac>" << json_data.mac << "</mac>" << std::endl;
// monitorData 部分
for (int i = 0; json_data.line[i].monitor_id[0] != '\0'; i++) {
const ledger_monitor& monitor = json_data.line[i];
@@ -1228,19 +1228,7 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
xmlStream << "<timestamp>" << monitor.timestamp << "</timestamp>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminal_id>" << monitor.terminal_id << "</terminal_id>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<CT1>" << monitor.CT1 << "</CT1>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<CT2>" << monitor.CT2 << "</CT2>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<PT1>" << monitor.PT1 << "</PT1>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<PT2>" << monitor.PT2 << "</PT2>" << std::endl;
xmlStream << "<terminal_code>" << monitor.terminal_code << "</terminal_code>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<status>" << monitor.status << "</status>" << std::endl;
@@ -1318,10 +1306,10 @@ void connect_status_to_queue(const std::string& id, const std::string& datetime,
data.strTopic = G_CONNECT_TOPIC;
data.strText = jsonObject.dump(); // 转换为字符串
//if (g_node_id == STAT_DATA_BASE_NODE_ID) {
if (g_node_id == STAT_DATA_BASE_NODE_ID) {
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
queue_data_list.push_back(data);
//}
}
}
catch (const std::exception& e) {
std::cerr << "connect_status_to_queue exception: " << e.what() << std::endl;
@@ -1338,7 +1326,7 @@ void send_reply_to_queue(const std::string& guid, const std::string& step, const
obj["step"] = step;
obj["result"] = result;
obj["processNo"] = g_front_seg_index;
obj["frontType"] = "cloudfront";
obj["frontType"] = get_front_type_from_subdir();
obj["nodeId"] = FRONT_INST;
// 构造 queue 消息
@@ -1361,7 +1349,7 @@ void send_heartbeat_to_queue(const std::string& status) {
try{
nlohmann::json obj;
obj["nodeId"] = FRONT_INST;
obj["frontType"] = "cloudfront";
obj["frontType"] = get_front_type_from_subdir();
obj["processNo"] = g_front_seg_index;
obj["status"] = status;
@@ -1389,6 +1377,7 @@ bool shouldSkipTerminal(const std::string& terminal_id) {
}
void rocketmq_test_300(int mpnum, int front_index, int type,Front* front) {
if(!INITFLAG){
std::cout << "前置未初始化完成\n";
return;
@@ -1433,8 +1422,8 @@ void rocketmq_test_300(int mpnum, int front_index, int type, Front* front) {
if (type == 0) {
std::cout << "use ledger send msg" << std::endl;
//根据台账模式下每个进程都会发送
for (size_t i = 0; total_messages > 0 && i < terminal_devlist.size(); ++i) {
for (size_t i = 0; (total_messages > 0 && g_front_seg_index == 1 && g_node_id == 100) && i < terminal_devlist.size(); ++i) {
const auto& dev = terminal_devlist[i];
if (shouldSkipTerminal(dev.terminal_id)) {
@@ -1447,71 +1436,85 @@ void rocketmq_test_300(int mpnum, int front_index, int type, Front* front) {
data.mp_id = dev.line[j].monitor_id;
data.monitor_no = static_cast<int>(i + j);
std::string modified_time = std::to_string(current_time_ms / 1000);
std::string modified_time = std::to_string(current_time_ms);
std::string modified_strText = base_strText;
try {
auto j = nlohmann::json::parse(modified_strText);
j["Did"] = i;
if (j.contains("Msg") && j["Msg"].is_object()) {
j["Msg"]["Cldid"] = j;
if (j["Msg"].contains("DataArray") && j["Msg"]["DataArray"].is_array()) {
for (auto& item : j["Msg"]["DataArray"]) {
if (item.is_object()) {
item["DataTimeSec"] = std::stoll(modified_time);
// 替换 Monitor
size_t monitor_pos = modified_strText.find("\"Monitor\"");
if (monitor_pos != std::string::npos) {
size_t colon_pos = modified_strText.find(":", monitor_pos);
size_t quote_pos = modified_strText.find("\"", colon_pos);
size_t end_quote_pos = modified_strText.find("\"", quote_pos + 1);
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, data.mp_id);
}
}
// 替换 TIME
size_t time_pos = modified_strText.find("\"TIME\"");
if (time_pos != std::string::npos) {
size_t colon_pos = modified_strText.find(":", time_pos);
size_t quote_pos = colon_pos;
size_t end_quote_pos = modified_strText.find(",", quote_pos + 1);
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, modified_time);
}
}
modified_strText = j.dump();
} catch (...) {
// 保持原始文本
}
data.strText = modified_strText;
//my_rocketmq_send(data,front->m_producer);
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
queue_data_list.push_back(data);
std::cout << "Sent message " << (i + 1)
<< " with Monitor " << data.monitor_no
<< " and TIME " << modified_time << std::endl;
}
}
} else {
std::cout << "use monitor + number send msg" << std::endl;
//根据虚构监测点模式下只有进程1发送
for (int i = 0; (total_messages > 0 && g_front_seg_index == 1 ) && i < total_messages; ++i) {
for (int i = 0; (total_messages > 0 && g_front_seg_index == 1 && g_node_id == 100) && i < total_messages; ++i) {
std::string monitor_id = "testmonitor" + std::to_string(i);
data.mp_id = monitor_id;
data.monitor_no = i;
std::string modified_time = std::to_string(current_time_ms / 1000);
std::string modified_time = std::to_string(current_time_ms);
std::string modified_strText = base_strText;
try {
auto j = nlohmann::json::parse(modified_strText);
j["Did"] = 0;
if (j.contains("Msg") && j["Msg"].is_object()) {
j["Msg"]["Cldid"] = data.mp_id;
if (j["Msg"].contains("DataArray") && j["Msg"]["DataArray"].is_array()) {
for (auto& item : j["Msg"]["DataArray"]) {
if (item.is_object()) {
item["DataTimeSec"] = std::stoll(modified_time);
// 替换 Monitor
size_t monitor_pos = modified_strText.find("\"Monitor\"");
if (monitor_pos != std::string::npos) {
size_t colon_pos = modified_strText.find(":", monitor_pos);
size_t quote_pos = modified_strText.find("\"", colon_pos);
size_t end_quote_pos = modified_strText.find("\"", quote_pos + 1);
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, data.mp_id);
}
}
// 替换 TIME
size_t time_pos = modified_strText.find("\"TIME\"");
if (time_pos != std::string::npos) {
size_t colon_pos = modified_strText.find(":", time_pos);
size_t quote_pos = colon_pos;
size_t end_quote_pos = modified_strText.find(",", quote_pos + 1);
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, modified_time);
}
}
modified_strText = j.dump();
} catch (...) {
// 保持原始文本
}
data.strText = modified_strText;
//my_rocketmq_send(data,front->m_producer);
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
queue_data_list.push_back(data);
std::cout << "Sent message " << (i + 1)
<< " with Monitor " << data.monitor_no
<< " and TIME " << modified_time << std::endl;
}
}

View File

@@ -35,7 +35,7 @@
#include "worker.h"
#include "interface.h"
#include "rocketmq.h"
#include "log4cplus/log4.h"
#include "log4.h"
#include "front.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -48,6 +48,11 @@ bool showinshellflag =false;
extern std::list<std::string> errorList, warnList, normalList;
extern std::mutex errorListMutex, warnListMutex, normalListMutex;
extern std::vector<terminal_dev> terminal_devlist;
extern std::mutex ledgermtx;
extern std::list<queue_data_t> queue_data_list;
extern int IED_COUNT;
extern int INITFLAG;
extern int g_front_seg_index;
@@ -276,7 +281,6 @@ extern bool normalOutputEnabled;
if (G_TEST_NUM != 0) {
std::cout << "[PeriodicTask] Executing rocketmq_test_300()\n";
rocketmq_test_300(G_TEST_NUM, g_front_seg_index, G_TEST_TYPE,m_front);
//upload_data_test();
}
}
@@ -408,7 +412,7 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
std::ostringstream os;
os << "\r\x1B[K------------------------------------\n";
os << "\r\x1B[K|-- terminal_id: " << dev.terminal_id << "\n";
os << "\r\x1B[K|-- terminal_name: " << dev.terminal_name << "\n";
os << "\r\x1B[K|-- terminal_code: " << dev.terminal_code << "\n";
os << "\r\x1B[K|-- dev_ip: " << dev.addr_str << "\n";
os << "\r\x1B[K|-- dev_port: " << dev.port << "\n";
os << "\r\x1B[K|-- dev_type: " << dev.dev_type << "\n";
@@ -423,8 +427,6 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
os << "\r\x1B[K|-- tmnl_status: " << dev.tmnl_status << "\n";
os << "\r\x1B[K|-- timestamp: " << dev.timestamp << "\n";
os << "\r\x1B[K|-- mac: " << dev.mac << "\n";
for (size_t i = 0; i < dev.line.size(); ++i) {
const auto& ld = dev.line[i];
if (ld.monitor_id.empty()) continue;
@@ -432,17 +434,11 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
os << "\r\x1B[K |-- monitor_id: " << ld.monitor_id << "\n";
os << "\r\x1B[K |-- monitor_name: " << ld.monitor_name << "\n";
os << "\r\x1B[K |-- logical_device_seq: " << ld.logical_device_seq << "\n";
os << "\r\x1B[K |-- terminal_id: " << ld.terminal_id << "\n";
os << "\r\x1B[K |-- terminal_code: " << ld.terminal_code << "\n";
os << "\r\x1B[K |-- voltage_level: " << ld.voltage_level << "\n";
os << "\r\x1B[K |-- terminal_connect: " << ld.terminal_connect << "\n";
os << "\r\x1B[K |-- status: " << ld.status << "\n";
os << "\r\x1B[K |-- timestamp: " << ld.timestamp << "\n";
os << "\r\x1B[K |-- CT1: " << ld.CT1 << "\n";
os << "\r\x1B[K |-- CT2: " << ld.CT2 << "\n";
os << "\r\x1B[K |-- PT1: " << ld.PT1 << "\n";
os << "\r\x1B[K |-- PT2: " << ld.PT2 << "\n";
}
os << "\r\x1B[K------------------------------------\n";

View File

@@ -7,296 +7,19 @@
#include <queue>
#include <vector>
#include <atomic>
#include <iostream>
#include "cloudfront/code/interface.h" //lnk20250708
#include "cloudfront/code/rocketmq.h" //lnk20250708
#include "PQSMsg.h"
#include "client2.h"
#include "dealMsg.h"
using namespace std;
SafeMessageQueue message_queue; // 全局消息队列
SafeMessageQueue message_queue; // ȫ<><C8AB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
void process_received_message(int client_index, const char* data, size_t length) {
// 实际的消息处理逻辑
// 这里可以添加您的业务处理代码
printf("Processing message from client %d, size: %zu\n", client_index, length);
//ʱ<><CAB1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
time_t ConvertToTimestamp(const tagPqData_Float& data) {
struct tm t = {};
t.tm_year = data.time.DeviceYear - 1900; // tm_year <20><> 1900 <20><>ʼ<EFBFBD><CABC>
t.tm_mon = data.time.DeviceMonth - 1; // tm_mon <20><> 0<><30>1<EFBFBD>£<EFBFBD><C2A3><EFBFBD>ʼ
t.tm_mday = data.time.DeviceDay;
t.tm_hour = data.time.DeviceHour;
t.tm_min = data.time.DeviceMinute;
t.tm_sec = data.time.DeviceSecond;
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>
return mktime(&t);
}
void process_received_message(string mac, string id,const char* data, size_t length) {
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ʵ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>߼<EFBFBD>
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>߼<EFBFBD>
if (length > 0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תΪ<D7AA>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա㴦<D4B1><E3B4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
const unsigned char* udata = reinterpret_cast<const unsigned char*>(data);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><>¼<EFBFBD><C2BC><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MessageParser parser;
bool bool_msgset = parser.SetMsg(udata, length);
//<2F>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
if (udata[0] == 0xEB && udata[1] == 0x90 && udata[2] == 0xEB && udata[3] == 0x90) {
//ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD>
if (udata[8] == 0x01) {
std::cout << "cloud login: " << mac << " state: " << static_cast<int>(udata[16]) << static_cast<int>(udata[17]) << static_cast<int>(udata[18]) << static_cast<int>(udata[19]) << std::endl;
if (udata[19] == 0x10) {
std::cout << "cloud login: " << mac << " state: success!" << std::endl;
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
}
if (udata[19] == 0x00) {
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
//װ<>õ<EFBFBD>¼ʧ<C2BC><CAA7> <20>رտͻ<D5BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>20<32><30><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>¼
ClientManager::instance().restart_device(id);
}
}
else {
std::cout << "cloud login: " << mac << " state: error!"<< std::endl;
//װ<>õ<EFBFBD>¼ʧ<C2BC><CAA7> <20>رտͻ<D5BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>20<32><30><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>¼
ClientManager::instance().restart_device(id);
}
//<2F><>¼<EFBFBD><C2BC><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
}
//<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
{
DeviceState currentState = DeviceState::IDLE;//<2F><>ȡ<EFBFBD><C8A1>ǰװ<C7B0>õ<EFBFBD>״̬
if (!ClientManager::instance().get_device_state(id, currentState)) {
std::cerr << "Failed to get device state for: " << id << std::endl;
return;
}
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch (currentState) {
case DeviceState::IDLE:
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
std::cout << "IDLE state: Received active report from " << mac << std::endl;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>߼<EFBFBD>
break;
case DeviceState::READING_STATS:
// <20><>ȡͳ<C8A1><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
std::cout << "READING_STATS state: Processing stats data from " << mac << std::endl;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>ĵ<EFBFBD><C4B5>߼<EFBFBD>
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Stat)) {
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> һ֡1K ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ǰ֡δ<D6A1><CEB4>ȫ<EFBFBD><C8AB>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>֡
std::cout << "mac: " << mac << " count" << static_cast<int>(udata[10]) << std::endl;
// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>Ϣ (<28><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
int current_packet = static_cast<int>(udata[10]); // <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>
int total_packets = Stat_PacketNum; // <20><>֡<EFBFBD><D6A1>
std::vector<unsigned char> packet_data(udata, udata + length);
bool complete = ClientManager::instance().add_stat_packet_to_device(
id, packet_data, current_packet, total_packets
);
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ
if (complete) {
// 1. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
auto packets = ClientManager::instance().get_and_clear_stat_packets(id);
// 2. <20><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::sort(packets.begin(), packets.end(),
[](const ClientContext::StatPacket& a, const ClientContext::StatPacket& b) {
return a.packet_index < b.packet_index;
});
// 3. <20><><EFBFBD><EFBFBD>ÿ֡<C3BF><D6A1><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<unsigned char> full_data;
MessageParser parser;
for (const auto& packet : packets) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
if (!parser.SetMsg(packet.data.data(), packet.data.size())) {
std::cerr << "Failed to parse packet " << packet.packet_index
<< " for device " << id << std::endl;
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
full_data.insert(full_data.end(),
parser.RecvData.begin(),
parser.RecvData.end());
}
// 4. <20><>װ tagPqData <20><><EFBFBD><EFBFBD>
tagPqData pq_data;
if (!pq_data.SetStructBuf(full_data.data(), full_data.size())) {
std::cerr << "Failed to assemble tagPqData for device " << id << std::endl;
}
else {
// <20>ɹ<EFBFBD><C9B9><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> pq_data <20><><EFBFBD><EFBFBD>
std::cout << "Successfully assembled tagPqData for device: "
<< id << std::endl;
float fPT = 1.0f;
float fCT = 1.0f;
if (ClientManager::instance().get_pt_ct_ratio(id, pq_data.name, fPT, fCT)) {
// ʹ<>û<EFBFBD>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
tagPqData_Float float_data;
float_data.SetFloatValue(pq_data, fPT, fCT);
float_data.name = pq_data.name;
float_data.Data_Type = pq_data.Data_Type;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><E6B2A2><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ
bool complete = ClientManager::instance().add_float_data_to_device(
id, pq_data.name, pq_data.Data_Type, float_data);
if (complete) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<tagPqData_Float, 4> all_data =
ClientManager::instance().get_and_clear_float_data(id, pq_data.name);
if (!all_data.empty()) {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4<><34><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>߼<EFBFBD>
tagPqData_Float max_data = all_data[0];
tagPqData_Float min_data = all_data[1];
tagPqData_Float avg_data = all_data[2];
tagPqData_Float cp95_data = all_data[3];
// ת<><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
std::string max_base64Str = max_data.ConvertToBase64();
std::string min_base64Str = min_data.ConvertToBase64();
std::string avg_base64Str = avg_data.ConvertToBase64();
std::string cp95_base64Str = cp95_data.ConvertToBase64();
//lnk20250708ʹ<38>ýӿڷ<D3BF><DAB7><EFBFBD>
time_t data_time = ConvertToTimestamp(avg_data);
std::vector<DataArrayItem> arr;
arr.push_back({1, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1-<2D>ޣ<EFBFBD> 0-<2D><>Rt<52><74>,1-<2D><>Max<61><78>,2-<2D><>Min<69><6E>,3-<2D><>Avg<76><67>,4-<2D><>Cp95<39><35>
data_time, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD>1970<37><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
-1, //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD>꣬΢<EAA3AC><CEA2><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
0, //<2F><><EFBFBD>ݱ<EFBFBD>ʶ<EFBFBD><CAB6>1-<2D><>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>
max_base64Str});
arr.push_back({2, data_time, -1, 0, min_base64Str});
arr.push_back({3, data_time, -1, 0, avg_base64Str});
arr.push_back({4, data_time, -1, 0, cp95_base64Str});
std::string js = generate_json(
-1, //<2F><>Ӧ<EFBFBD><D3A6><EFBFBD>ı<EFBFBD><C4B1>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>IDӦ<44><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>롰-1<><31>
123456, //<2F>豸Ψһ<CEA8><D2BB>ʶLdid<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>Ndid
1, //<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
0x1302, //<2F><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
max_data.name, //<2F>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>豸ID<49><44>0-<2D>߼<EFBFBD><DFBC><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
max_data.Data_Type, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>ޡ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1>1<EFBFBD><31><EFBFBD><EFBFBD>ͳ<EFBFBD>ơ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
1, //<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
);
std::cout << js << std::endl;
queue_data_t data;
data.monitor_no = 1;
data.strTopic = TOPIC_STAT;
data.strText = js;
data.mp_id = "test";
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
queue_data_list.push_back(data);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//std::cout << "Base64 Encoded Data (" << max_data.CalculateFloatCount()
// << " floats): " << base64Str << std::endl;
}
}
}
else {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֵʧ<D6B5>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
std::cerr << "Failed to get PT/CT ratio for device: "
<< mac << " lineno: " << pq_data.name << std::endl;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ϣ<EFBFBD><CFA3>޸<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4>ȴ<EFBFBD><C8B4><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
else {
//δ<><CEB4>ȫ<EFBFBD><C8AB>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
return;
}
}
else {
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
break;
case DeviceState::READING_STATS_TIME:
// <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>״̬
std::cout << "READING_STATS_TIME state: Processing stats time from " << mac << std::endl;
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_StatTime)) {
std::vector<PointInfo> points;//װ<>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (ClientManager::instance().get_device_points(mac, points)) {
// <20>ɹ<EFBFBD><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1>
tagTime t3;
t3.SetStructBuf(parser.RecvData.data(), parser.RecvData.size());
int first = 0;//<2F><>һ<EFBFBD>α<EFBFBD><CEB1><EFBFBD>
for (const auto& point : points) {
for (ushort i = 0; i < 4; i++)//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>95<39><35><EFBFBD><EFBFBD>ֵ
{
auto sendbuff = generate_statequerystat_message(t3, point.nCpuNo, i);//<2F><>װѯ<D7B0><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
if (first == 0) {
//<2F>״γ<D7B4><CEB3><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD> ֱ<>ӽ<EFBFBD><D3BD><EFBFBD>ǰ״̬<D7B4><CCAC><EFBFBD><EFBFBD> <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
first++;
ClientManager::instance().change_device_state(id, DeviceState::READING_STATS, sendbuff);
}
else {
//<2F><><EFBFBD>״ν<D7B4><CEBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еȴ<D0B5>
ClientManager::instance().add_action_to_device(id, DeviceState::READING_STATS, sendbuff);
}
}
}
}
else {
// δ<>ҵ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
}
else {
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
break;
case DeviceState::CUSTOM_ACTION:
// <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>״̬
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>߼<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
break;
default:
std::cerr << "Unknown state: " << static_cast<int>(currentState)
<< " for device " << id << std::endl;
break;
}
// <20><><EFBFBD>ۺ<EFBFBD><DBBA><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ󴥷<C9BA><F3B4A5B7><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
ClientManager::instance().post_message_processing(id);
}
}
// 示例:解析消息并处理
// 注意:根据您的协议实现具体的解析逻辑
}

View File

@@ -7,22 +7,16 @@
#include <queue>
#include <vector>
#include <atomic>
#include <string>
using namespace std;
//ǰ<><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#pragma once
class PointInfo;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define MESSAGE_QUEUE_SIZE 10000 // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>޸ĺ<DEB8><C4BA><EFBFBD> deal_message_t <20>
struct deal_message_t {
std::string device_id; // ʹ<EFBFBD><EFBFBD> std::string <20><><EFBFBD><EFBFBD> char <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string mac; // ʹ<EFBFBD><EFBFBD> std::string <20><><EFBFBD><EFBFBD> char <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* data; // <20><><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
size_t length; // <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
std::vector<PointInfo> points; // <20><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϣ
};
/* <20><>Ϣ<EFBFBD><EFBFBD><E1B9B9> */
typedef struct {
int client_index; // <EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* data; // <20><>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
size_t length; // <20><>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} deal_message_t;
/* <20>̰߳<DFB3>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> */
class SafeMessageQueue {
@@ -63,4 +57,4 @@ public:
}
};
void process_received_message(string mac, string id, const char* data, size_t length);
void process_received_message(int client_index, const char* data, size_t length);

View File

@@ -4,12 +4,13 @@
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include "PQSMsg.h"
#include "client2.h"
#include "dealMsg.h"
#include "cloudfront/code/interface.h"
#include <iostream>
using namespace std;
#if 0
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define THREAD_CONNECTIONS 10 // <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
@@ -31,83 +32,42 @@ typedef struct {
pthread_mutex_t lock; // <20>߳<EFBFBD>ר<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
} thread_info_t;
#endif
void init_daemon(void)
{
int pid;
int i;
if( pid = fork() )
exit(0); /** <20>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
else if( pid < 0 )
exit(1); /** forkʧ<6B>ܣ<EFBFBD><DCA3>˳<EFBFBD> */
/** <20>ǵ<EFBFBD>һ<EFBFBD>ӽ<EFBFBD><D3BD>̣<EFBFBD><CCA3><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> */
setsid(); /** <20><>һ<EFBFBD>ӽ<EFBFBD><D3BD>̳<EFBFBD>Ϊ<EFBFBD>µĻỰ<C4BB><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD><E9B3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն˷<D5B6><CBB7><EFBFBD> */
if( pid = fork() )
exit(0); /** <20>ǵ<EFBFBD>һ<EFBFBD>ӽ<EFBFBD><D3BD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD> */
else if( pid < 0)
exit(1); /** forkʧ<6B>ܣ<EFBFBD><DCA3>˳<EFBFBD> */
chdir("/FeProject/bin/"); //multi process running at same time
umask(0); /** <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
return;
}
/* ȫ<>ֱ<EFBFBD><D6B1><EFBFBD> */
thread_info_t thread_info[THREAD_CONNECTIONS]; // <20>߳<EFBFBD><DFB3><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER; // ȫ<>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
extern SafeMessageQueue message_queue;
// <20><><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD>װ<EFBFBD><D7B0>
std::vector<DeviceInfo> generate_test_devices(int count) {
std::vector<DeviceInfo> devices;
for (int i = 1; i <= count; ++i) {
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string dev_id = "D" + std::to_string(1000 + i).substr(1); // D001, D002, ..., D100
std::string dev_name = "Device " + std::to_string(i);
/* <20>̹߳<DFB3><CCB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳߳<DFB3>*/
void* work_thread(void* arg) {
int index = *(int*)arg; // <EFBFBD><EFBFBD>ȡ<EFBFBD>߳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
free(arg); // <20>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
// <20><><EFBFBD>ɲ<EFBFBD><EFBFBD><EFBFBD>
std::vector<PointInfo> points = {
{
"P" + dev_id.substr(1) + "01", // <20><><EFBFBD><EFBFBD>ID<49><44> P00101
"Voltage " + dev_name,
dev_id,
1,
0.0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹֵ
0.0,
100.0,
80.0
},
{
"P" + dev_id.substr(1) + "02", // <20><><EFBFBD><EFBFBD>ID<49><44> P00102
"Current " + dev_name,
dev_id,
2,
0.0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
0.0,
20.0,
15.0
// <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>״̬Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pthread_mutex_lock(&thread_info[index].lock);
printf("Thread %d started\n", index);
thread_info[index].state = THREAD_RUNNING;
pthread_mutex_unlock(&thread_info[index].lock);
// ģ<><EFBFBD><E2B9A4>ѭ<EFBFBD><D1AD>(5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
while (1) {
sleep(5);
// 10%<25><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>̹߳<DFB3><CCB9><EFBFBD>
if (rand() % 10 == 0) {
pthread_mutex_lock(&thread_info[index].lock);
printf("Thread %d simulated failure\n", index);
pthread_mutex_unlock(&thread_info[index].lock);
break;
}
};
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
devices.push_back({
dev_id,
dev_name,
(i % 2 == 0) ? "Model-X" : "Model-Y", // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD>
"00-B7-8D-A8-00-D6", // <20><><EFBFBD><EFBFBD>MAC<41><43>ַ
1, // ״̬ (1=<3D><><EFBFBD><EFBFBD>)
points
});
}
return devices;
// <20>߳<EFBFBD><DFB3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
pthread_mutex_lock(&thread_info[index].lock);
thread_info[index].state = THREAD_STOPPED;
printf("Thread %d stopped\n", index);
pthread_mutex_unlock(&thread_info[index].lock);
return NULL;
}
/* <20>̹߳<DFB3><CCB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>*/
/* <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD><EFBFBD>̺߳<DFB3><CCBA><EFBFBD>*/
void* client_manager_thread(void* arg) {
@@ -122,35 +82,7 @@ void* client_manager_thread(void* arg) {
printf("Started client connections\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<PointInfo> points1 = {
{"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1},
{"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1}
};
std::vector<PointInfo> points2 = {
{"P101", "Generator Output", "D002",1 ,1, 1, 1, 1}
};
//00-B7-8D-A8-00-D6
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
std::vector<DeviceInfo> devices = {
{
"D001", "Primary Device", "Model-X", "00-B7-8D-A8-00-D9",
1, points1
},
{
"D002", "Backup Device", "Model-Y", "00-B7-8D-01-79-06",
1, points2
}
};
// <20><><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
std::vector<DeviceInfo> test_devices = generate_test_devices(100);
//std::vector<DeviceInfo> devices = GenerateDeviceInfoFromLedger(terminal_devlist);//lnk<6E><6B><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
start_client_connect(devices);
start_client_connect();
printf("Stopped all client connections\n");
@@ -180,16 +112,14 @@ void* message_processor_thread(void* arg) {
// ʵ<><CAB5><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>msg.client_index<65><78><EFBFBD>ֿͻ<D6BF><CDBB><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
printf("Processing message from client %d, length: %zu\n",
msg.client_index, msg.length);
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
process_received_message(msg.mac, msg.device_id, msg.data, msg.length);
process_received_message(msg.client_index, msg.data, msg.length);
free(msg.data);
}
else {
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>100΢<30><CEA2> = 0.1<EFBFBD><EFBFBD><EFBFBD>
usleep(100);
}
}
// <20>߳<EFBFBD><DFB3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
@@ -237,8 +167,8 @@ void restart_thread(int index) {
}
else if (index == 2) {
// <20>ӿڣ<D3BF>mq
char* argv[] = { (char*)new_index };//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̺Ų<CCBA><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ThreadArgs* args = new ThreadArgs{1, argv};
char* argv[] = { (char*)new_index ,(char*)"-dcfg_stat_data", (char*)"-s1_1" };
ThreadArgs* args = new ThreadArgs{3, argv};
if (pthread_create(&thread_info[index].tid, NULL, cloudfrontthread, args) != 0) {
pthread_mutex_lock(&global_lock);
printf("Failed to restart message processor thread %d\n", index);
@@ -256,16 +186,12 @@ void restart_thread(int index) {
/* <20>̴߳<DFB3><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int is_thread_alive(pthread_t tid) {
return pthread_tryjoin_np(tid, NULL) == EBUSY; // EBUSY<53><59>ʾ<EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//return pthread_tryjoin_np(tid, NULL) == EBUSY; // EBUSY<53><59>ʾ<EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return pthread_kill(tid, 0) == 0; //<2F><><EFBFBD><EFBFBD>
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int main(int argc ,char** argv) {//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
if(!parse_param(argc,argv)){
std::cerr << "process param error,exit" << std::endl;
return 1;
}
//init_daemon();
int main() {
srand(time(NULL)); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʼ<EFBFBD><CABC><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
@@ -296,8 +222,8 @@ int main(int argc ,char** argv) {//
}
else if (i == 2){
//<2F>ӿں<D3BF>mq
char* argv[] = { (char*)index };//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̺Ų<CCBA><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ThreadArgs* args = new ThreadArgs{1, argv};
char* argv[] = { (char*)index,(char*)"-dcfg_stat_data", (char*)"-s1_1" };
ThreadArgs* args = new ThreadArgs{3, argv};
if (pthread_create(&thread_info[i].tid, NULL, cloudfrontthread, args) != 0) {
printf("Failed to create message processor thread %d\n", i);
delete args; // <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>ͷ<EFBFBD>
@@ -340,19 +266,9 @@ int main(int argc ,char** argv) {//
// <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>״̬
static int queue_monitor = 0;
//static int count = 3;
if (++queue_monitor >= 10) { // ÿ10<31><EFBFBD><EBB1A8>һ<EFBFBD><D2BB>
printf("Message queue size: %zu\n", message_queue.size());
queue_monitor = 0;
/*std::vector<DeviceInfo> test_devices = generate_test_devices(count);
count++;
for (const auto& device : test_devices) {
ClientManager::instance().add_device(device);
}
for (const auto& device : test_devices) {
ClientManager::instance().remove_device("D001");
}*/
}
}

View File

@@ -1,14 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by LFtid1056.rc
// <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ĭ<EFBFBD><C4AC>ֵ
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif