SDDC的Windows初体验-QT篇
前言
如果熟悉爱智和看过我之前文章的朋友见到这篇文章一定会有很大疑问,SDDC 作为智能设备发现控制协议,怎么会用在 windows 上?
这一切还是源自于我巨大的脑洞,因为这段在搞 Windows 开发,突发奇想能不能把电脑也接入到爱智上,于是就把嵌入式设备使用的 SDDC 协议移植到了 Windows 上,本文就介绍下基于 QT 移植的 libsddc 库,其实我还移植到了 VS2022 上了,这个之后再介绍吧。
软硬件选择
这里使用 windows 开发,除了电脑也不需要其他额外的硬件了。
软件的话,使用的是 QT 5.9.0 版本,官网下载太慢了,推荐大家下载这个清华大学开源镜像站的资源:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.0/qt-opensource-windows-x86-5.9.0.exe

代码获取与解析
代码可以从我的 gitee 仓库直接获取:
https://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;
}
效果
点击左下角的绿色三角运行程序;

可以在爱智设备搜索中发现对应设备并添加;


SDDC的Windows初体验-QT篇的更多相关文章
- 使用Docker for Windows初体验
https://www.baidu.com/link?url=61Kwadwh6h__2Vmjf7lAKVo1RjhsULAqERcMXYnYzkLKrRVpygwBJVnjultH8zbq& ...
- (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现
转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...
- vue-cli@3.x初体验之前篇-回顾vue-cli@2.x创建项目的流程
模拟实际工作中的操作,假如新开启了一个vue项目,可以先看看上篇博文中的git操作,新建空仓库vue-demo,并拉取到本地,创建本地dev分支后 1. 全局安装vue-cli yarn global ...
- 【Go 入门学习】第一篇关于 Go 的博客--Go 爬虫初体验
一.写在前面 其实早就该写这一篇博客了,为什么一直没有写呢?还不是因为忙不过来(实际上只是因为太懒了).不过好了,现在终于要开始写这一篇博客了.在看这篇博客之前,可能需要你对 Go 这门语言有些基本的 ...
- Oracle SQL篇(一)null值之初体验
从我第一次正式的写sql语句到现在,已经超过10年的时间了.我写报表,做统计分析和财务对账,我一点点的接触oracle数据库,并尝试深入了解.这条路,一走就是10年,从充满热情,到开始厌 ...
- (一)SpringBoot基础篇- 介绍及HelloWorld初体验
1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...
- Spark系列-初体验(数据准备篇)
Spark系列-初体验(数据准备篇) Spark系列-核心概念 在Spark体验开始前需要准备环境和数据,环境的准备可以自己按照Spark官方文档安装.笔者选择使用CDH集群安装,可以参考笔者之前的文 ...
- Windows Embedded Compact 7初体验
Windows Embedded Compact 7初体验 Windows Embedded Compact 7已经出来半年多了,一直没时间搞.最近它又出了Refresh的版本,电脑也换了个1T的硬盘 ...
- (一)SpringBoot2.0基础篇- 介绍及HelloWorld初体验
1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...
随机推荐
- String 和 StringBuilder、StringBuffer 的区别?
Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它 们可以储存和操作字符串.其中 String 是只读字符串,也就意味着 String 引 ...
- 转:C++初始化成员列表
转载至:https://blog.csdn.net/zlintokyo/article/details/6524185 C++初始化成员列表和新机制初始化表达式列表有几种用法: 1.如果类存在继承关系 ...
- CAN总线系列讲座第六讲——SJA1000的滤波器设置
CAN总线的滤波器设置就像给总线上的节点设置了一层过滤网,只有符合要求的CAN信息帧才可以通过,其余的一概滤除. 在验收滤波器的帮助下,只有当接收信息中的识别位和验收滤波器预定义的值相等时,CAN 控 ...
- html5与css交互 API 《一》classList
用过jquery的朋友都知道,jquery提供的方法中(3个)可以很方便的为指定的节点添加.删除类选择器,即addClass.removeClass.toggleClass.具体的用法我这里就不谈了, ...
- 从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命
本系列文章对应游戏代码已开源 Sinuous game. 每个游戏都会包含场景和角色.要实现一个游戏角色,就要清楚角色在场景中的位置,以及它的运动规律,并能通过数学表达式表现出来. 场景坐标 canv ...
- turnjs fabricjs canvas 翻书
最近做了一个翻书效果的项目, 来总结一下实现过程和遇到的一些问题, 供自己以后快速解决问题, 希望也能帮到同样遇到此类问题的同学, 如果有更好的方法,希望你能分享给我git地址 插件: Turn.js ...
- react开发教程(三)组件的构建
什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...
- SQList基础+ListView基本使用
今日所学: SQList基础语法 SDList下载地址 SQLite Download Page SQList安装教程SQLite的安装与基本操作 - 极客开发者-博客 ListView用法 没遇到什 ...
- 小程序中引入iconfont
注释:本人喜欢 font class, 你们可以依葫芦画瓢unicode和 symbol,,下面是 font class 演示: 1.选择好图标,然后: font class 2.步骤二: 复制 ...
- uni-app中实现左侧导航栏效果
HTML: 1 <view class="list"> 2 <!-- 一级 --> 3 <scroll-view class="list-l ...