From 936fc127daae0db96b5a0ac039404bc98e3e5250 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Mon, 25 Mar 2024 21:28:51 +0800 Subject: [PATCH] Improve:SixFrame protocol. --- application/MissionManager/src/AppMonitor.cpp | 28 ++++-- application/MissionManager/src/AppMonitor.h | 1 + middleware/AppManager/include/IAppManager.h | 10 +++ middleware/AppManager/src/IAppManager.cpp | 1 + .../src/Protocol/SixFrame/SixFrameHandle.cpp | 30 ++++++- .../src/Protocol/SixFrame/SixFrameHandle.h | 2 + .../AppManager/src/AppManager_Test.cpp | 2 +- utils/WebServer/src/WebServer.cpp | 88 +++++++++---------- 8 files changed, 104 insertions(+), 58 deletions(-) diff --git a/application/MissionManager/src/AppMonitor.cpp b/application/MissionManager/src/AppMonitor.cpp index ad7f424..7bda4a8 100644 --- a/application/MissionManager/src/AppMonitor.cpp +++ b/application/MissionManager/src/AppMonitor.cpp @@ -88,13 +88,22 @@ StatusCode AppMonitor::GetStorageInfo(std::vector ¶m) } StatusCode AppMonitor::GetStorageFileList(const AppGetFileInfo &fileInfo, std::vector ¶m) { - AppGetFileList file; - file.mCreateTime_s = 123456789; - file.mDuration = 15; - file.mName = "/DCIM/2024/01/15/20240115135444-20240115135504.mp4"; - file.mSize = 1024; - file.mType = StorageFileType::VIDEO; - param.push_back(file); + if (StorageFileEvent::LOOP == fileInfo.mEvent) { + AppGetFileList file; + file.mCreateTime_s = 123456789; + file.mDuration = 15; + file.mName = "/DCIM/2024/01/15/20240115135521-20240115135540.mp4"; + file.mSize = 1024; + file.mType = StorageFileType::VIDEO; + param.push_back(file); + AppGetFileList file2; + file2.mCreateTime_s = 123456789; + file2.mDuration = 0; + file2.mName = "/34a396526922a33e97906920dbfef2a5.jpg"; + file2.mSize = 1024; + file2.mType = StorageFileType::PICTURE; + param.push_back(file2); + } return CreateStatusCode(STATUS_CODE_OK); } StatusCode AppMonitor::SetDateTime(const AppSetDateTime ¶m) @@ -114,4 +123,9 @@ StatusCode AppMonitor::UploadFile(AppUploadFile ¶m) { // return CreateStatusCode(STATUS_CODE_OK); +} +StatusCode AppMonitor::GetThumbnail(AppGetThumbnail ¶m) +{ + param.mThumbnail = "./34a396526922a33e97906920dbfef2a5.jpg"; + return CreateStatusCode(STATUS_CODE_OK); } \ No newline at end of file diff --git a/application/MissionManager/src/AppMonitor.h b/application/MissionManager/src/AppMonitor.h index 1c43980..8255930 100644 --- a/application/MissionManager/src/AppMonitor.h +++ b/application/MissionManager/src/AppMonitor.h @@ -36,5 +36,6 @@ public: StatusCode EnterRecorder(void) override; StatusCode AppPlayback(const PlayBackEvent &event) override; StatusCode UploadFile(AppUploadFile ¶m) override; + StatusCode GetThumbnail(AppGetThumbnail ¶m) override; }; #endif \ No newline at end of file diff --git a/middleware/AppManager/include/IAppManager.h b/middleware/AppManager/include/IAppManager.h index 2d562db..f6eb8fc 100644 --- a/middleware/AppManager/include/IAppManager.h +++ b/middleware/AppManager/include/IAppManager.h @@ -79,6 +79,9 @@ enum class StorageFileEvent LOOP = 0, PIR, CRASH, + EMR, + EVENT, + PARK, END }; enum class MicStatus @@ -301,6 +304,12 @@ typedef struct app_upload_file const UploadCommand mCommand; ResposeResult mResult; } AppUploadFile; +typedef struct app_get_thumbnail +{ + app_get_thumbnail(const std::string file) : mFile(file) {} + const std::string mFile; + std::string mThumbnail; +} AppGetThumbnail; class VAppMonitor { public: @@ -322,6 +331,7 @@ public: virtual StatusCode EnterRecorder(void); virtual StatusCode AppPlayback(const PlayBackEvent &event); virtual StatusCode UploadFile(AppUploadFile ¶m); + virtual StatusCode GetThumbnail(AppGetThumbnail ¶m); }; typedef struct app_param { diff --git a/middleware/AppManager/src/IAppManager.cpp b/middleware/AppManager/src/IAppManager.cpp index 8ad80ef..fe511ba 100644 --- a/middleware/AppManager/src/IAppManager.cpp +++ b/middleware/AppManager/src/IAppManager.cpp @@ -66,6 +66,7 @@ StatusCode VAppMonitor::AppPlayback(const PlayBackEvent &event) return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } StatusCode VAppMonitor::UploadFile(AppUploadFile ¶m) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } +StatusCode VAppMonitor::GetThumbnail(AppGetThumbnail ¶m) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } std::shared_ptr &IAppManager::GetInstance(std::shared_ptr *impl) { static auto instance = std::make_shared(); diff --git a/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.cpp b/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.cpp index 997df0b..51715fe 100644 --- a/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.cpp +++ b/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.cpp @@ -39,6 +39,7 @@ const char *APP_SET_PARAM_VALUE = "/app/setparamvalue"; const char *APP_ENTER_RECORDER = "/app/enterrecorder"; const char *APP_PLAYBACK = "/app/playback"; const char *APP_UPLOAD_FILE = "/upload"; +const char *APP_GET_THUMBNAIL = "/app/getthumbnail"; // /app/getparamvalue?param=rec // /app/exitrecorder // clang-format on @@ -63,6 +64,7 @@ SixFrameHandle::SixFrameHandle() mResquesHandleFunc[APP_ENTER_RECORDER] = std::bind(&SixFrameHandle::RequestEnterRecorder, this, _1, _2, _3); mResquesHandleFunc[APP_PLAYBACK] = std::bind(&SixFrameHandle::RequestPlayback, this, _1, _2, _3); mResquesHandleFunc[APP_UPLOAD_FILE] = std::bind(&SixFrameHandle::RequestUpload, this, _1, _2, _3); + mResquesHandleFunc[APP_GET_THUMBNAIL] = std::bind(&SixFrameHandle::RequestGetThumbnail, this, _1, _2, _3); // mResquesHandleFunc["favicon.ico"] = std::bind(&SixFrameHandle::DoNothing, this, _1, _2, _); } void SixFrameHandle::RequestHandle(const char *url, const unsigned int urlLength, ResponseHandle responseHandle, @@ -377,13 +379,13 @@ AppGetFileInfo inline SixFrameHandle::RequestGetFileListParse(const std::string parseyImpl->mData.mEvent = StorageFileEvent::LOOP; } if ("emr" == value) { - parseyImpl->mData.mEvent = StorageFileEvent::END; + parseyImpl->mData.mEvent = StorageFileEvent::EMR; } if ("event" == value) { - parseyImpl->mData.mEvent = StorageFileEvent::END; + parseyImpl->mData.mEvent = StorageFileEvent::EVENT; } if ("park" == value) { - parseyImpl->mData.mEvent = StorageFileEvent::END; + parseyImpl->mData.mEvent = StorageFileEvent::PARK; } } if ("start" == key) { @@ -636,6 +638,28 @@ void SixFrameHandle::RequestUpload(const std::string &url, ResponseHandle respon ResponseJsonString(result, responseHandle, context); cJSON_Delete(result); } +std::string inline SixFrameHandle::RequestGetThumbnailParse(const std::string &url) +{ + auto parseFunc = [](const std::string &key, const std::string &value, std::shared_ptr &parse) { + std::shared_ptr> parseyImpl = std::dynamic_pointer_cast>(parse); + if ("file" == key) { + parseyImpl->mData = value; + } + }; + std::shared_ptr parse = std::make_shared>(); + std::shared_ptr> parseyImpl = std::dynamic_pointer_cast>(parse); + ExtractParamsFromUrl(url, parseFunc, parse); + return parseyImpl->mData; +} +void SixFrameHandle::RequestGetThumbnail(const std::string &url, ResponseHandle responseHandle, void *context) +{ + LogInfo("RequestGetThumbnail.\n"); + const std::string file = RequestGetThumbnailParse(url); + AppGetThumbnail respon(file); + mAppMonitor->GetThumbnail(respon); + // respon.mThumbnail = "./34a396526922a33e97906920dbfef2a5.jpg"; + responseHandle(respon.mThumbnail.c_str(), context); +} cJSON *SixFrameHandle::MakeResponseResult(const ResposeResult result, const bool requestSet) { const char *RESPONSE_RESULT = "result"; diff --git a/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.h b/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.h index 014fa39..6e4c410 100644 --- a/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.h +++ b/middleware/AppManager/src/Protocol/SixFrame/SixFrameHandle.h @@ -89,6 +89,8 @@ private: void RequestPlayback(const std::string &url, ResponseHandle responseHandle, void *context); void RequestEnterRecorder(const std::string &url, ResponseHandle responseHandle, void *context); void RequestUpload(const std::string &url, ResponseHandle responseHandle, void *context); + std::string RequestGetThumbnailParse(const std::string &url); + void RequestGetThumbnail(const std::string &url, ResponseHandle responseHandle, void *context); private: cJSON *MakeResponseResult(const ResposeResult result, const bool requestSet = false); diff --git a/test/middleware/AppManager/src/AppManager_Test.cpp b/test/middleware/AppManager/src/AppManager_Test.cpp index 1b40eb5..78470d9 100644 --- a/test/middleware/AppManager/src/AppManager_Test.cpp +++ b/test/middleware/AppManager/src/AppManager_Test.cpp @@ -57,7 +57,7 @@ TEST_F(AppManagerTest, INTEGRATION_AppManager_EXAMPLE_Demo0) IAppManager::GetInstance()->Init(mAppParam); IAppManager::GetInstance()->SetAppMonitor(monitor); std::this_thread::sleep_for(std::chrono::milliseconds(100)); - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + std::this_thread::sleep_for(std::chrono::milliseconds(20000)); IAppManager::GetInstance()->UnInit(); } // ../output_files/test/bin/AppManagerTest --gtest_filter=AppManagerTest.INTEGRATION_AppManager_EXAMPLE_Demo diff --git a/utils/WebServer/src/WebServer.cpp b/utils/WebServer/src/WebServer.cpp index 8248a27..130950a 100644 --- a/utils/WebServer/src/WebServer.cpp +++ b/utils/WebServer/src/WebServer.cpp @@ -85,6 +85,43 @@ static void response_handle(const char *responseStr, void *context) websWrite(wp, "%s", responseStr); } } +static void get_thumbnail_handle(const char *thumbnailUrl, void *context) +{ + struct Webs *wp = (struct Webs *)context; + if (nullptr == thumbnailUrl) { + LogError("thumbnailUrl is nullptr.\n"); + return; + } + FILE *file = nullptr; + unsigned char *buffer = nullptr; + size_t bytesRead = 0; + long int fsize = 0; + file = fopen(thumbnailUrl, "rb"); + if (file == nullptr) { + LogError("Open picture failed[%s].\n", thumbnailUrl); + goto END; + } + fseek(file, 0, SEEK_END); + fsize = ftell(file); + rewind(file); + buffer = (unsigned char *)malloc(fsize); + if (!buffer) { + LogError("malloc failed.\n"); + goto END; + } + + while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) { + websWriteBlock(wp, (cchar *)buffer, bytesRead); + } + +END: + if (buffer) { + free(buffer); + } + if (file) { + fclose(file); + } +} static bool AppRequestHandle(Webs *wp) { websSetStatus(wp, 200); @@ -129,53 +166,12 @@ static bool AppUploadHandle(Webs *wp) } static bool AppGetThumbnail(Webs *wp) { - LogInfo("sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\n"); + LogInfo("AppGetThumbnail url = %s\n", wp->url); websSetStatus(wp, 200); websWriteHeaders(wp, UNKNOWN_LENGTH, 0); websWriteHeader(wp, "Content-Type", "image/jpeg"); websWriteEndHeaders(wp); - // gHttpHandle(wp->url, 0, response_handle, wp); - // websWrite(wp, "ssssssssssssssssssssssssss"); - - char imagePath[] = "./34a396526922a33e97906920dbfef2a5.jpg"; - FILE *file = nullptr; - unsigned char *buffer = nullptr; - size_t bytesRead = 0; - long int fsize = 0; - /* 打开图片文件 */ - file = fopen(imagePath, "rb"); - if (file == nullptr) { - /* 文件打开失败,返回 404 错误 */ - LogError("Open picture failed.\n"); - goto END; - } - // 获取文件大小 - fseek(file, 0, SEEK_END); - fsize = ftell(file); - rewind(file); - // 分配足够大的缓冲区来存储文件内容 - buffer = (unsigned char *)malloc(fsize + 1); - if (!buffer) { - LogError("malloc failed.\n"); - fclose(file); - goto END; - } - memset(buffer, 0, fsize + 1); - // 读取文件内容到缓冲区 - bytesRead = fread(buffer, 1, fsize, file); - if (bytesRead != fsize) { - LogError("fread picture failed.\n"); - free(buffer); - fclose(file); - goto END; - } - // websWrite(wp, "%s", buffer); - websWriteBlock(wp, (cchar *)buffer, fsize); - -END: - if (buffer) { - free(buffer); - } + gHttpHandle(wp->url, 0, get_thumbnail_handle, wp); websDone(wp); return 1; } @@ -209,13 +205,11 @@ StatusCode WebServerInit(const WebServerParam webParam) gHttpHandle = webParam.mHttpRequestHandle; websDefineHandler("appRequestHandle", 0, AppRequestHandle, 0, 0); websAddRoute("/app", "appRequestHandle", 0); - } - if (nullptr != webParam.mHttpRequestHandle) { websDefineHandler("AppUploadHandle", 0, AppUploadHandle, 0, 0); websAddRoute("/upload", "AppUploadHandle", 0); + websDefineHandler("AppGetThumbnail", 0, AppGetThumbnail, 0, 0); + websAddRoute("/app/getthumbnail", "AppGetThumbnail", 0); } - websDefineHandler("AppGetThumbnail", 0, AppGetThumbnail, 0, 0); - websAddRoute("/app/getthumbnail", "AppGetThumbnail", 0); websServiceEvents(&finished); logmsg(1, "Instructed to exit\n"); websClose();