【qt】通過TCP傳輸json,json里包含圖像

主要是使用協議頭
發送方

        connect(m_pDetectWorker, &DetectionWorker::sig_detectImg, this, [=](const QJsonObject &json){// 轉換為JSON數據QJsonDocument doc(json);QByteArray jsonData = doc.toJson(QJsonDocument::Compact);// 構建增強協議頭struct EnhancedHeader {quint32 magic = 0x4A534F4E; // "JSON"quint32 version = 1;        // 協議版本quint32 dataSize;quint32 checksum;quint8 dataType;           // 0=JSON, 1=Image, 2=Text等char timestamp[20];        // 時間戳char reserved[15];};EnhancedHeader header;header.dataSize = jsonData.size();header.dataType = 0; // JSON數據類型// 計算校驗和quint32 checksum = 0;for (int i = 0; i < jsonData.size(); ++i) {checksum += static_cast<quint8>(jsonData[i]);}header.checksum = checksum;// 添加時間戳QByteArray timestamp = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8();memcpy(header.timestamp, timestamp.constData(), qMin(timestamp.size(), 19));header.timestamp[19] = '\0';memset(header.reserved, 0, sizeof(header.reserved));// 發送給所有客戶端foreach(QTcpSocket* client, clients) {if(client->state() == QAbstractSocket::ConnectedState) {client->setSocketOption(QAbstractSocket::LowDelayOption, 1);// 發送協議頭client->write(reinterpret_cast<const char*>(&header), sizeof(header));// 發送JSON數據client->write(jsonData);}}});

接收方

void OnlineFrameViewModel::receiveImageData()
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if(!socket) return;// 定義協議頭結構(與發送端一致)struct EnhancedHeader {quint32 magic;          // 魔數 "JSON"quint32 version;        // 協議版本quint32 dataSize;       // 數據大小quint32 checksum;       // 校驗和quint8 dataType;        // 數據類型char timestamp[20];     // 時間戳char reserved[15];      // 保留字段};static QByteArray receivedDataBuffer;receivedDataBuffer.append(socket->readAll());// 處理可能存在的多個數據包(粘包處理)while (!receivedDataBuffer.isEmpty()) {// 如果緩沖區大小不足以包含協議頭,等待更多數據if (receivedDataBuffer.size() < sizeof(EnhancedHeader)) {return;}// 提取協議頭EnhancedHeader header;memcpy(&header, receivedDataBuffer.constData(), sizeof(EnhancedHeader));// 驗證魔數if (header.magic != 0x4A534F4E) { // "JSON"qDebug() << u8"無效的數據包魔數,清空緩沖區";receivedDataBuffer.clear();return;}// 檢查是否收到完整的數據包(協議頭 + 數據)if (receivedDataBuffer.size() < sizeof(EnhancedHeader) + header.dataSize) {// 數據不完整,等待更多數據return;}// 提取JSON數據QByteArray jsonData = receivedDataBuffer.mid(sizeof(EnhancedHeader), header.dataSize);// 驗證校驗和quint32 calculatedChecksum = 0;for (int i = 0; i < jsonData.size(); ++i) {calculatedChecksum += static_cast<quint8>(jsonData[i]);}if (calculatedChecksum != header.checksum) {qDebug() << u8"數據校驗失敗,丟棄數據包";// 移除損壞的數據包receivedDataBuffer.remove(0, sizeof(EnhancedHeader) + header.dataSize);continue;}// 移除已處理的數據包receivedDataBuffer.remove(0, sizeof(EnhancedHeader) + header.dataSize);// 解析JSON數據QJsonParseError jsonError;QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &jsonError);if(jsonError.error != QJsonParseError::NoError) {qDebug() << u8"JSON解析錯誤:" << jsonError.errorString();continue;}if(jsonDoc.isObject()) {QJsonObject jsonObj = jsonDoc.object();// 處理圖像數據(原有邏輯保持不變)if(jsonObj.contains("image_path")) {QString jsonOriPath = jsonObj["image_path"].toString();//原始路徑,pc1的路徑QString imgPath;// 指定檢測 E 盤QStorageInfo volume("Y:/");if (volume.isValid()) {// 雙工控機測試是肯定存在imgPath = jsonOriPath.replace(u8"E:/raw圖/","Y:/");emit sig_sendMsg(u8"檢測路徑:"+ imgPath);QFileInfo fileInfo(imgPath);if (!fileInfo.exists()) {qCritical() << "Error: Path does not exist:" << imgPath;continue; // 繼續處理下一個數據包}} else {emit sig_sendMsg("Y:/ is not a valid volume.");imgPath = jsonOriPath;emit sig_sendMsg(u8"Y盤讀取失敗,檢查PLC網口的網絡情況");emit sig_sendMsg(u8"檢測路徑:"+ imgPath);QFileInfo fileInfo(imgPath);if (!fileInfo.exists()) {qCritical() << "Error: Path does not exist:" << imgPath;continue; // 繼續處理下一個數據包}}QImage enhanceImg(imgPath);//=============================👇=============================if(jsonObj.contains("image_data")) {QString base64String = jsonObj["image_data"].toString();QByteArray byteArray = QByteArray::fromBase64(base64String.toUtf8());QImage img;if (img.loadFromData(byteArray)) {qDebug() << u8"圖片加載成功,尺寸為:" << img.size();enhanceImg = img;} else {qDebug() << u8"圖片加載失敗";}}//=============================👆=============================QSharedPointer<ImageDataInfo> imgInfo(new ImageDataInfo);imgInfo->imageFilePath = imgPath;imgInfo->enhanceImg = enhanceImg;imgInfo->barcode = jsonObj["barcode"].toString();imgInfo->device = jsonObj["device"].toInt();imgInfo->pointIndex = jsonObj["pointIndex"].toInt();imgInfo->skipframe = jsonObj["skipframe"].toInt();imgInfo->overlayframe = jsonObj["overlayframe"].toInt();imgInfo->kv = jsonObj["kv"].toInt();imgInfo->ua = jsonObj["ua"].toInt();imgInfo->grayMean = jsonObj["grayMean"].toInt();emit sig_sendMsg(u8"檢測開始"+imgInfo->barcode);int device = imgInfo->pointIndex;int pointIndex = imgInfo->pointIndex;QtConcurrent::run([=]() {saveBarcodeLog(imgInfo->barcode,device,pointIndex);});if(m_pDetectWorker!=nullptr)m_pDetectWorker->enqueueImage(*imgInfo);emit sig_didDisplayLiveImg(enhanceImg,imgInfo->device);}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921978.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

四,基礎開發工具(下)

4.5自動構建make/Makefile4.5.1基本使用1示例2進一步解釋3實踐4最佳實踐4.6練習&#xff1a;進度條4.6.1倒計時4.6.2進度條version14.6.2進度條version24.7版本控制器Git4.7.1git操作1操作一次&#xff0c;以后不愁2經典"三件套"3常用4版本回退4.7.2小結4.5自動構建m…

C++基本數據類型的范圍

文章目錄不同位數的系統下各個類型所占字節數如何存儲的我發現我能搜到的相關文章都只講了這些數據類型的范圍是這樣的&#xff0c;不說實際的存儲情況&#xff0c;當你了解了類型實際是如何存儲的&#xff0c;再去記憶這些范圍就簡單了&#xff0c;所以就有了這篇文章不同位數…

基于社交媒體數據的公眾情緒指數構建與重大事件影響分析

一、引言在信息爆炸的時代&#xff0c;社交媒體&#xff08;如微博、Twitter&#xff09;已成為公眾表達情緒、討論熱點事件的主要平臺。通過分析社交媒體數據&#xff0c;可以構建公眾情緒指數&#xff0c;并進一步研究其與股市波動、政策發布等重大事件的關聯性。本文將介紹如…

OpenLayers數據源集成 -- 章節七:高德地圖集成詳解

前言在前面的文章中&#xff0c;我們學習了OpenLayers的瓦片調試&#xff08;VectorTileDebug&#xff09;技術。本文將深入探討OpenLayers中高德地圖的集成方法&#xff0c;這是WebGIS開發中接入商業地圖服務的重要技術。高德地圖作為國內領先的地圖服務提供商&#xff0c;提供…

海外代理IP平臺Top3評測:LoongProxy、神龍動態IP、IPIPGO哪家更適合你?

在當今互聯網環境中&#xff0c;代理IP服務已成為許多企業和個人用戶的剛需。無論是數據采集、市場調研還是賬號管理&#xff0c;優質的代理IP都能大幅提升工作效率。本文將針對LoongProxy、神龍海外動態IP和IPIPGO這三家主流代理IP服務商進行橫向評測&#xff0c;幫助你根據自…

對瀏覽器事件機制的理解

瀏覽器事件是什么&#xff1a; 事件是用戶操作網頁時發生的交互動作&#xff0c;比如 click/move&#xff0c; 事件除了用戶觸發的動作外&#xff0c;還可以是文檔加載&#xff0c;窗口滾動和大小調整。事件被封裝成一個 event 對象&#xff0c;包含了該事件發生時的所有相關信…

XCVP1902-2MSEVSVA6865 AMD 賽靈思 XilinxVersal Premium FPGA

XCVP1902-2MSEVSVA6865 是 AMD 賽靈思&#xff08;Xilinx&#xff09;Versal Premium FPGA 系列中的高端自適應系統級芯片&#xff08;Adaptive SoC&#xff09;變體&#xff0c;面向需要極高邏輯密度、海量 I/O 與超高速收發能力的數據中心互聯、原型驗證與高性能網絡加速等應…

kotlin - 2個Fragment實現左右顯示,左邊列表,右邊詳情,平板橫、豎屏切換(一)

kotlin - 2個Fragment實現左右顯示&#xff0c;左邊列表&#xff0c;右邊詳情&#xff0c;平板橫、豎屏切換(要使用平板測試)平板橫屏&#xff1a;左右fragment實現分屏效果&#xff0c;平板豎屏&#xff1a;只顯示左邊的fragment&#xff0c;點擊才顯示右邊fragment屏幕旋轉&a…

推薦系統中的AB測試:從設計到分析全流程

推薦系統中的AB測試:從設計到分析全流程 關鍵詞:推薦系統、AB測試、實驗設計、數據分析、效果評估、統計顯著性、用戶體驗 摘要:本文將深入探討推薦系統中AB測試的全流程,從實驗設計到結果分析。我們將用通俗易懂的方式解釋AB測試的核心概念,展示如何科學地評估推薦算法改…

【go語言 | 第1篇】Go環境安裝+go語言特性

文章目錄go開發環境1. 下載安裝包2. 配置環境變量3. GOPROXYgo語言特性1. go的優勢2. go適合做什么3. go缺點編寫一個go程序注&#xff1a;在VSCode中補全go代碼go開發環境 我這里是windows操作系統的環境安裝&#xff0c;其他系統可以查看菜鳥教程&#xff1a;Go 語言環境安裝…

【Pywinauto庫】0. Pywinauto Windows GUI 自動化指南

概述 Pywinauto 是一個用于自動化 Windows GUI 應用程序的 Python 庫&#xff0c;適用于自動化測試、數據錄入和其他重復性桌面操作。 快速參考表方面方法/屬性示例說明安裝pip install pywinauto安裝庫后端選擇Application(backend"uia") 或 Application(backend&qu…

CStringArray 和 CStringList

CStringArray 和 CStringList 都是 MFC 中用于管理字符串集合的類&#xff0c;但它們的內部數據結構和適用場景有顯著差異&#xff0c;選擇時需根據具體操作需求決定。以下從核心區別、功能對比和適用場景三個方面詳細說明&#xff1a;一、核心區別&#xff1a;數據結構決定特性…

2025版基于springboot的企業考勤管理系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的設計程序開發&#xff0c;開發過上千套設計程序&#xff0c;沒有什么華麗的語言&#xff0c;只有實…

設計模式(C++)詳解—單例模式(1)

<摘要> 單例模式是創建型設計模式中最經典且應用最廣泛的設計模式之一&#xff0c;它確保一個類只有一個實例并提供全局訪問點。本文從歷史背景和核心概念出發&#xff0c;詳細闡述了單例模式的產生背景和演進歷程&#xff0c;深入剖析了其在資源管理、狀態一致性和訪問控…

將GitHub遠程倉庫修改為ssh

8 將GitHub遠程倉庫修改為ssh 文章目錄8 將GitHub遠程倉庫修改為ssh1 創建本地的ssh密鑰2 設置GitHub密鑰3 將本地庫鏈接到遠程倉庫很多時候在使用GitHub的遠程鏈接使用的是http的格式&#xff0c;但是這個格式并不好&#xff0c;尤其是在代碼上傳的時候&#xff0c;因此需要采…

【OEC-Turbo】網心云 OEC-Turbo 刷機 Armbian 系統教程

前言 大量網心云 OEC 及 OEC-Turbo 設備流入二手市場&#xff08;如海鮮市場&#xff09;&#xff0c;價格低至 70-100 元。相比同配置的拾光塢 N3&#xff08;約 380 元&#xff09;&#xff0c;OEC-Turbo 僅需一個零頭&#xff0c;性價比極高。這些“礦渣”設備外觀與玩客云…

25.線程概念和控制(二)

一、線程周邊問題1.線程的優點創建一個新線程的代價要比創建一個新進程小得多。線程占用的資源要比進程少很多。能充分利用多處理器的可并行數量。在等待慢速I/O操作結束的同時&#xff0c;程序可執行其他的計算任務。計算密集型應用&#xff0c;為了能在多處理器系統上運行&am…

【CVPR2023】奔跑而非行走:追求更高FLOPS以實現更快神經網絡

文章目錄一、論文信息二、論文概要三、實驗動機四、創新之處五、實驗分析六、核心代碼注釋版本七、實驗總結一、論文信息 論文題目&#xff1a;Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks中文題目&#xff1a;奔跑而非行走&#xff1a;追求更高FLOPS…

JVM(二)--- 類加載子系統

目錄 前言 一、類加載過程 1. loading階段 2. Linking階段 2.1 驗證 2.2 準備 2.3 解析 3. Initialization階段 二、類加載器 1. 類加載器的分類 2. 用戶自定義類加載器 三、雙親委派機制 四、其他知識點 前言 JVM的內存結構如圖所示&#xff1a; 一、類加載過程…

Docker 容器的使用

1.容器的基本信息[roothost1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ac8245b5b08 img-layers-test "python /app/app.py" 45 hours ago Exited (0) 45 hour…