SDDC的Windows初體驗-QT篇
前言
如果熟悉愛智和看過我之前文章的朋友見到這篇文章一定會有很大疑問,SDDC 作為智慧裝置發現控制協議,怎麼會用在 windows 上?
這一切還是源自於我巨大的腦洞,因為這段在搞 Windows 開發,突發奇想能不能把電腦也接入到愛智上,於是就把嵌入式裝置使用的 SDDC 協議移植到了 Windows 上,本文就介紹下基於 QT 移植的 libsddc 庫,其實我還移植到了 VS2022 上了,這個之後再介紹吧。
軟硬體選擇
這裡使用 windows 開發,除了電腦也不需要其他額外的硬體了。
軟體的話,使用的是 QT 5.9.0 版本,官網下載太慢了,推薦大家下載這個清華大學開源映象站的資源: http://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.0/qt-opensource-windows-x86-5.9.0.exe
程式碼獲取與解析
程式碼可以從我的 gitee 倉庫直接獲取:
http://gitee.com/inspiration-desktop/windows-libsddc.git
開啟 libsddc 專案如下:
其中 SDDC 相關程式碼都已基於 windows環境進行相容修改,具體修改內容可以全域性搜尋 __WINDOWS__
巨集來檢視,其中主要的差異是 windows 和嵌入式系統的 socket 相關實現上,還有就是多執行緒,QT本身就支援 pthread ,這個給移植帶來了很大的便利,不像 VS 為了支援 pthread 還需要一頓折騰,對於VS的移植之後的文章再介紹吧。
main.cpp 程式碼解析,主要內容是獲取uuid作為裝置唯一標識(其實還是我沒找到合適的獲取 windows MAC 地址的介面...);
#include "mainwindow.h" #include <QApplication> #include "sddc_message_example.h" #include "sddc.h" #include "test_thread.h" #include "cJSON.h" #include <QUuid> #include <QFile> #include <iostream> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 啟動視覺化視窗,暫時用不到 //MainWindow w; //w.show(); char * uuid_str; char buffer[128]; QString uuidstr; QUuid uuid; // 獲取uuid作為裝置唯一標識 QFile file("uuid.txt"); if(file.exists()){ std::cout << "file exist\n"; if(!file.open(QIODevice::ReadWrite)){ std::cout << "open file failed\n"; }else{ //讀取檔案 //判斷檔案是否已經讀到末尾了 while(!file.atEnd()){ //讀取資料 memset(buffer,0,sizeof(buffer)); qint64 length = file.readLine(buffer,128); if(length != -1){ uuid_str = (char*)&buffer; std::cout << "read success\n"; } } file.close(); } }else{ if(!file.open(QIODevice::ReadWrite)){ std::cout << "open file failed\n"; }else{ uuid = QUuid::createUuid(); uuidstr = uuid.toString(); uuid_str = (char *)uuidstr.remove("{").remove("}").remove("-").toStdString().data(); memset(buffer,0,sizeof(buffer)); memcpy(buffer,uuid_str,strlen(uuid_str)); uuid_str = buffer; std::cout << uuid_str << std::endl; qint64 length = -1; length = file.write(uuid_str); if(length == -1){ std::cout << "write file failed\n"; }else{ std::cout << "write file success\n"; } file.close(); } } std::cout << uuid_str << std::endl; // 啟動一個新執行緒進行其他業務處理 //test_thread *thread1 = new test_thread(); //thread1->start(); // 啟動 SDDC 協議 sddc_main(uuid_str); a.exec(); return 0; }
效果
點選左下角的綠色三角執行程式;
可以在愛智裝置搜尋中發現對應裝置並新增;
- 分享自己平時使用的socket多客戶端通訊的程式碼技術點和軟體使用
- iNeuOS工業網際網路作業系統,增加2154個檢視建模(WEB組態)行業向量圖元、大屏背景及相關圖元
- 多臺雲伺服器的 Kubernetes 叢集搭建
- Elasticsearch學習系列四(聚合搜尋)
- 關於swiper外掛在vue2的使用
- 使用 Abp.Zero 搭建第三方登入模組(一):原理篇
- LVGL庫入門教程 - 顏色和影象
- 物聯網?快來看 Arduino 上雲啦
- SpringBoot JWT Redis 開源知識社群系統
- CVPR2022 | 可精簡域適應
- Spring框架系列(3) - 深入淺出Spring核心之控制反轉(IOC)
- 面試突擊59:一個表中可以有多個自增列嗎?
- CVPR2022 | 弱監督多標籤分類中的損失問題
- JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文帶你釐清箇中曲直,給你個選擇SpringDataJPA的...
- Spring Security:使用者和Spring應用之間的安全屏障
- Mybatisi和Spring整合原始碼分析
- 前端學習 linux —— 第一篇
- call apply bind的作用及區別? 應用場景?
- Bika LIMS 開源LIMS集——實驗室檢驗流程概述及主頁、面板
- 軟體專案管理 7.5.專案進度模型(SPSP)