Improve:SixFrame protocol.

This commit is contained in:
Fancy code 2024-03-25 21:28:51 +08:00
parent 7d706cc822
commit 936fc127da
8 changed files with 104 additions and 58 deletions

View File

@ -88,13 +88,22 @@ StatusCode AppMonitor::GetStorageInfo(std::vector<AppGetStorageInfo> &param)
}
StatusCode AppMonitor::GetStorageFileList(const AppGetFileInfo &fileInfo, std::vector<AppGetFileList> &param)
{
if (StorageFileEvent::LOOP == fileInfo.mEvent) {
AppGetFileList file;
file.mCreateTime_s = 123456789;
file.mDuration = 15;
file.mName = "/DCIM/2024/01/15/20240115135444-20240115135504.mp4";
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 &param)
@ -115,3 +124,8 @@ StatusCode AppMonitor::UploadFile(AppUploadFile &param)
//
return CreateStatusCode(STATUS_CODE_OK);
}
StatusCode AppMonitor::GetThumbnail(AppGetThumbnail &param)
{
param.mThumbnail = "./34a396526922a33e97906920dbfef2a5.jpg";
return CreateStatusCode(STATUS_CODE_OK);
}

View File

@ -36,5 +36,6 @@ public:
StatusCode EnterRecorder(void) override;
StatusCode AppPlayback(const PlayBackEvent &event) override;
StatusCode UploadFile(AppUploadFile &param) override;
StatusCode GetThumbnail(AppGetThumbnail &param) override;
};
#endif

View File

@ -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 &param);
virtual StatusCode GetThumbnail(AppGetThumbnail &param);
};
typedef struct app_param
{

View File

@ -66,6 +66,7 @@ StatusCode VAppMonitor::AppPlayback(const PlayBackEvent &event)
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
}
StatusCode VAppMonitor::UploadFile(AppUploadFile &param) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); }
StatusCode VAppMonitor::GetThumbnail(AppGetThumbnail &param) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); }
std::shared_ptr<IAppManager> &IAppManager::GetInstance(std::shared_ptr<IAppManager> *impl)
{
static auto instance = std::make_shared<IAppManager>();

View File

@ -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<VParseUrl> &parse) {
std::shared_ptr<ParseUrl<std::string>> parseyImpl = std::dynamic_pointer_cast<ParseUrl<std::string>>(parse);
if ("file" == key) {
parseyImpl->mData = value;
}
};
std::shared_ptr<VParseUrl> parse = std::make_shared<ParseUrl<std::string>>();
std::shared_ptr<ParseUrl<std::string>> parseyImpl = std::dynamic_pointer_cast<ParseUrl<std::string>>(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";

View File

@ -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);

View File

@ -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

View File

@ -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);
}
websServiceEvents(&finished);
logmsg(1, "Instructed to exit\n");
websClose();