QT学习开发笔记(项目实战之智能家居物联 UI 界面开发 )

这篇具有很好参考价值的文章主要介绍了QT学习开发笔记(项目实战之智能家居物联 UI 界面开发 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能家居物联 UI 界面开发

项目路径为 4/01_smarthome/01_smarthome/01_smarthome.pro,先看项目界面。项目界面如
下,采用暗黑主题设计,结合黄色作为亮色,让用户一目了然。界面笔者从一些智能家居界面
中找到灵感的,编写设计完成的效果不错!请自行查阅源码,掌握了本教程前面第七章的内容,
就可以理解这个界面是如何设计的。

qt ui开发,QT开发学习笔记,qt,ui,学习

原子云 API 接口

我们想要与原子云通信,那么必须先了解原子云平台的 API 接口。请参阅原子云平台 API

文档 V1.2.pdf 文档。原子云平台 API 写的非常详细了,请自行翻阅。需要我们从原子云平台了
解原子云 API 的通信流程。

下图是原子云平台 API 的使用流程图。 qt ui开发,QT开发学习笔记,qt,ui,学习
我们写 Qt 应用就应该重点放在 HTTPS 与 WebSocket 方向上。查阅原子云平台 API 可以知
道,下面是重点!一些帐号信息,与设备信息是通过 HTTPS 协议接口获取的,通信用 WebSocket

协议接口。那么我们就按原子云平台的协议流程编写应用程序。
源码路径为 4/01_smarthome/webapi/webapi.cpp。内容如下。

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName webapi 
 * @brief webapi.cpp 
 * @author Deng Zhimao 
 * @email 1252699831@qq.com 
 * @net www.openedv.com 
 * @date 2021-05-27 
 *******************************************************************/ 

1 #include "webapi.h" 

2 #include <QUuid> 

3 #include <QRegularExpression> 

4 

5 Webapi::Webapi(QObject *parent) 

6 { 

7 this->setParent(parent); 

8 /* 数组清空 */ 

9 groupID.clear(); 

10 deviceID.clear(); 

11 deviceNumber.clear(); 

12 

13 timer = new QTimer(); 
14 connect(timer, SIGNAL(timeout()), this, SLOT(onTimerTimeOut())); 

15 

16 networkAccessManager = new QNetworkAccessManager(this); 

17 

18 orgURL = "https://cloud.alientek.com/api/orgs"; 

19 /* 请填写自己的 token 信息!!! */ 

20 api_token = "bf591984c8fa417584d18f6328e0ef73"; 

21 

22 /* 获取账号机构列表 */ 

23 getOrgURL(); 

24 

25 QUuid uuid = QUuid::createUuid(); 

26 random_token = uuid.toString(); 

27 

28 webSocket = new QWebSocket(); 

29 /* 需要加一些安全配置才能访问 https */ 

30 QSslConfiguration config; 

31 config.setPeerVerifyMode(QSslSocket::VerifyNone); 

32 config.setProtocol(QSsl::TlsV1SslV3); 

33 webSocket->setSslConfiguration(config); 

34 

35 connect(webSocket, SIGNAL(connected()), 

36 this, SLOT(webSocketConnected())); 

37 connect(webSocket, SIGNAL(binaryMessageReceived(QByteArray)), 

38 this, SLOT(onBinaryMessageReceived(QByteArray))); 

39 } 

40 

41 Webapi::~Webapi() 

42 { 

43 delete timer; 

44 delete webSocket; 

45 webSocket = nullptr; 

46 } 

47 

48 void Webapi::getOrgURL() 

49 { 

50 getDataFromWeb(QUrl(orgURL)); 

51 } 

52 

53 /* 获取设备分组列表 */ 

54 void Webapi::getGroupListUrl() 

55 { 

56 getDataFromWeb(QUrl(groupListUrl)); 

57 } 

58 

59 /* 获取设备的信息 */ 

60 void Webapi::getDevOfGroupUrl() 

61 { 

62 getDataFromWeb(QUrl(devOfGroupUrl)); 

63 } 

64 

65 /* 获取设备连接状态 */ 

66 void Webapi::getConStateUrl() 

67 { 

68 getDataFromWeb(QUrl(conStateUrl)); 

69 } 

70 

71 /* 从云服务器获取数据 */ 

72 void Webapi::getDataFromWeb(QUrl url) 

73 { 

74 /* 网络请求 */ 

75 QNetworkRequest networkRequest; 

76 

77 /* 需要加一些安全配置才能访问 https */ 

78 QSslConfiguration config; 

79 config.setPeerVerifyMode(QSslSocket::VerifyNone); 

80 config.setProtocol(QSsl::TlsV1SslV3); 

81 networkRequest.setSslConfiguration(config); 

82 

83 /* 设置访问的地址 */ 

84 networkRequest.setUrl(url); 

85 

86 /* 网络响应 */ 

87 networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, 

88 "application/json;charset=UTF-8"); 

89 

90 /* 参数二为原子云帐号的 token 信息,填写自己的 */ 

91 networkRequest.setRawHeader("token", api_token.toLatin1()); 

92 

93 QNetworkReply *newReply = 

94 networkAccessManager->get(networkRequest); 

95 

96 connect(newReply, SIGNAL(finished()), 

97 this, SLOT(replyFinished())); 

98 connect(newReply, SIGNAL(readyRead()), 

99 this, SLOT(readyReadData())); 

100 

101 } 

102 void Webapi::replyFinished() 

103 { 

104 QNetworkReply *reply = (QNetworkReply *)sender(); 

105 

106 if (reply->url() == QUrl(orgURL)) { 

107 /* 设备分组列表 ID */ 

108 getID(dataString, reply); 

109 } 

110 

111 if (reply->url() == QUrl(groupListUrl)) { 

112 /* 列表 ID */ 

113 getID(dataString, reply); 

114 

115 /* 获取到组 ID 再开启定时器 */ 

116 if (!timer->isActive()) 

117 timer->start(2000); 

118 } 

119 

120 /* 设备的信息 */ 

121 if (reply->url() == QUrl(devOfGroupUrl)) { 

122 getID(dataString, reply); 

123 getNumber(dataString); 

124 getName(dataString); 

125 } 

126 

127 /* 设备的连接状态 */ 

128 if (reply->url() == QUrl(conStateUrl)) { 

129 getConnectState(dataString); 

130 } 

131 

132 reply->deleteLater(); 

133 reply = nullptr; 

134 } 

135 void Webapi::readyReadData() 

136 { 

137 QNetworkReply *reply = (QNetworkReply *)sender(); 

138 QByteArray data = reply->readAll(); 

139 dataString = QString(data); 

140 qDebug()<<dataString<<endl; 

141 } 

142 

143 /* 获取 ID,包括分组 id,设备 id */ 

144 void Webapi::getID(QString data, QNetworkReply *reply) 

145 { 

146 /* 多个匹配,因为可能有多个合适的字段 */ 

147 QRegularExpression pattern("\"id\":(\\d+)"); 

148 

149 QRegularExpressionMatchIterator i = pattern.globalMatch(data); 

150 while (i.hasNext()) { 

151 QRegularExpressionMatch match = i.next(); 

152 if (match.hasMatch()) { 

153 if (reply->url() == QUrl(orgURL)) { 

154 org_id = match.captured(1); 

155 groupListUrl = "https://cloud.alientek.com/api/orgs/" 

156 + org_id + "/grouplist"; 

157 getGroupListUrl(); 

158 /* Socket 连接 */ 

159 
webSocket->open(QUrl(QString("wss://cloud.alientek.com/connection/%1/or
g/%2?token=%3") 

160 .arg(api_token).arg(org_id).arg(rando
m_token))); 

161 } 

162 

163 if (reply->url() == QUrl(groupListUrl)) { 

164 group_id = match.captured(1); 

165 /* 存储组 ID,再由定时器根据组的 ID 获取设备信息 */ 

166 groupID.append(group_id); 

167 qDebug()<<"组 ID:"<<group_id<<endl; 

168 

169 } 

170 

171 if (reply->url() == QUrl(devOfGroupUrl)) { 

172 device_id = match.captured(1); 

173 /* 存储设备 ID,再由定时器根据设备的 ID 获取连接状态 */ 

174 deviceID.append(device_id); 

175 qDebug()<<"设备 ID:"<<device_id<<endl; 

176 } 

177 } 

178 } 

179 } 

180 

181 void Webapi::getNumber(QString data) 

182 { 

183 QRegularExpression pattern("\"number\":\"(\\d+)\""); 

184 

185 QRegularExpressionMatchIterator i = pattern.globalMatch(data); 

186 while (i.hasNext()) { 

187 QRegularExpressionMatch match = i.next(); 

188 if (match.hasMatch()) { 

189 device_number = match.captured(1); 

190 deviceNumber.append(device_number); 

191 qDebug()<<"设备编号:"<<device_number<<endl; 

192 } 

193 } 

194 } 

195 

196 void Webapi::getName(QString data) 

197 { 

198 /* 匹配中文字符,设备起名需要为中文 */ 

199 QRegularExpression pattern("\"name\":\"([\u4e00-\u9fa5]*)"); 

200 

201 QRegularExpressionMatchIterator i = pattern.globalMatch(data); 

202 while (i.hasNext()) { 

203 QRegularExpressionMatch match = i.next(); 

204 if (match.hasMatch()) { 

205 device_name = match.captured(1); 

206 deviceName.append(device_name); 

207 qDebug()<<"设备名称:"<<device_name<<endl; 

208 } 

209 } 

210 } 

211 

212 /* 获取设备的连接状态 */ 

213 void Webapi::getConnectState(QString data) 

214 { 

215 QString pattern = "\"data\":\"(\\S*)\""; 

216 QRegularExpression regularExpression(pattern); 

217 QRegularExpressionMatch match = regularExpression.match(data, 0); 

218 if(match.hasMatch()) { 

219 qDebug()<<"设备连接状态"<<match.captured(1); 

220 deviceConnectState.append(match.captured(1)); 

221 } 

222 } 

223 

224 void Webapi::webSocketConnected() 

225 { 

226 qDebug()<<"webSocket 连接原子云成功"<<endl; 

227 } 

228 

229 void Webapi::onBinaryMessageReceived(QByteArray str) 

230 { 

231 

232 QString temp(str); 

233 if (temp.contains("online")) { 

234 for (int i = 0; i < deviceNumber.count() ; i++) { 

235 if (temp.contains(deviceNumber[i])) { 

236 /* 发送如客厅灯在线信号*/ 

237 emit deviceStateChanged(deviceName[i] + "|在线"); 

238 qDebug()<<deviceName[i] + "|在线"<<endl; 

239 break; 

240 } 

241 } 

242 } 

243 } 

244 

245 /* 延时函数 */ 

246 void Webapi::sleep(double second) 

247 { 

248 usleep(second * 1000000); 

249 } 

250 

251 void Webapi::onTimerTimeOut() 

252 { 

253 static int i = 0; 

254 if (i < groupID.count()) { 

255 /* 获取分组下的设备列表 */ 

256 devOfGroupUrl = "https://cloud.alientek.com/api/orgs/" 

257 + org_id + "/groups/" 

258 + groupID[i] + "/devices"; 

259 dataString.clear(); 

260 getDevOfGroupUrl(); 

261 } else if (i >= groupID.count() 

262 && i < groupID.count() + deviceID.count() ) { 

263 timer->start(1000); 

264 conStateUrl = "https://cloud.alientek.com/api/orgs/" 

265 + org_id + "/devicestate/" 

266 + deviceID[i - groupID.count()]; 

267 getConStateUrl(); 

268 

269 } else { 

270 /* 订阅设备的消息 */ 

271 for (int j = 0; j < deviceNumber.count(); j++) { 

272 QByteArray cmd; 

273 cmd[0] = 0x01; 

274 sendCmd(deviceNumber[j], cmd); 

275 } 

276 

277 timer->stop(); 

278 } 

279 

280 i++; 

281 } 

282 

283 /* 订阅指定设备的消息,cmd = 0x01 */ 

284 void Webapi::sendCmd(QString number, QByteArray cmd) 

285 { 

286 QStringList list = number.split(""); 

287 for (int i = 0; i < list.count(); i++) { 

288 if (!list[i].isEmpty()) { 

289 cmd.append(list[i]); 

290 } 

291 } 

292 

293 webSocket->sendBinaryMessage(cmd); 

294 } 

295 

296 /* 发送消息到指定设备,cmd = 0x03 */ 

297 void Webapi::sendCmdMessage(QString number, 

298 QByteArray cmd, QString message) 

299 { 

300 QStringList list = number.split(""); 

301 for (int i = 0; i < list.count(); i++) { 

302 if (!list[i].isEmpty()) { 

303 cmd.append(list[i]); 

304 } 

305 } 

306 

307 cmd.append(message); 

308 

309 webSocket->sendBinaryMessage(cmd); 

310 } 

311 

312 void Webapi::whichDeviceNameSendCmd(QString name, 

313 QString message) { 

314 

315 for (int i = 0; i < deviceName.count(); i++) { 

316 if (name == deviceName[i]) { 

317 QByteArray cmd; 

318 cmd[0] = 0x03; 

319 sendCmdMessage(deviceNumber[i], cmd, message); 

320 break; 

321 } 

322 } 

323 } 

第 20 行,需要填写自己的原子云平台帐号 api_token 信息,请在原子云》帐号信息中查看!
剩余的代码都按照原子云平台 API 文档编写,首先是通过网络请求 networkRequest,访问
需要访问的地址,然后通过网络回应对象 newReply 来接收网络回复的结果。结果是 JSION 格
式的文本,笔者使用正则表达式提取回复的内容,作为下一个地址的参数,如此反复,就可以
将原子云服务器的帐号下的设备信息提取出来。
第 159 行,提取出来的信息转交 webSocket 对象,让 webSocket 获取原子云平台的鉴权,
就可以实现通信了。
流程都是按照原子云平台 API 文档的走,剩下的就是 webSocket 通信了,与 TCP,UDP 的

socket 通信相似,这里就不多解释了,和第十一章的 TCP/UDP Socket 通信内容相似。重点是流
程,再参考代码看。文章来源地址https://www.toymoban.com/news/detail-595104.html

到了这里,关于QT学习开发笔记(项目实战之智能家居物联 UI 界面开发 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别、安卓APP和PC端QT客户端远程操控)有视频功能展示

    目录 一、功能需求 二、开发环境 1、硬件: 2、软件: 3、引脚分配: 三、关键点 1、设计模式之工厂模式 2、线程 3、wiringPi库下的相关硬件操作函数调用 4、语音模块的串口通信 5、摄像头的实时监控和拍照功能 6、人脸识别 7、qt程序跨平台运行(编译成安卓APP) 四、编译和

    2024年02月15日
    浏览(44)
  • 合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)

    我们上一篇,我们实现在Linux系统下编译程序,我们首先通过两个小练习来熟悉一下如何去编译。今天,我们来介绍一下LCD屏幕基本使用。 如何使用LCD屏幕?     1、打开开发板LCD设备驱动文件。  (/dev/fb0)     2、准备颜色数据。     3、写入颜色像素点数据。     4、关闭

    2024年02月04日
    浏览(34)
  • 合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)

    目录 基于ARM语音识别的智能家居系统 练习一 一、程序编译 练习二: 二、文件IO 三、文件IO常用API接口函数 1、打开文件 open() 2、将数据内容写入文件 write() 3、关闭(保存)文件 四、编程示例 总结 我们上一篇讲了,关于Linux系统的一些质量,今天,我们实现在Linux系统

    2024年02月04日
    浏览(31)
  • 智能家居系统 QT

    (1)界面添加新控件 在mainwindow.ui 添加控件: 控件的类型 文本内容 对象名(唯一) 是否有槽函数 QLabel 温度 lable_随意 否 QLabel 湿度 lable_随意 否 QLabel 光照度 lable_随意 否 QPushButton 更新范围 PushButton_range 是 clicked() 控件的类型 当前值 最大值 最小值 对象名(唯一) 是否有槽

    2023年04月08日
    浏览(23)
  • qt实现智能家居系统

    一、项目介绍           通过TCP/IP协议实现客户端和和服务端的链接,服务端和下位机通过串口通信的方式链接,传递信息,客户端通过账号登录进入进入智能家居服务系统,账号登录和QQ登录类似,我采用的是数据库的方式实现数据的存储和调用,界面使用qt-ui的方式进

    2024年02月11日
    浏览(31)
  • 计算机毕业设计 基于大数据的智能家居销量数据分析系统的设计与实现 Java实战项目 附源码+文档+视频讲解

    博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 ——————————

    2024年02月04日
    浏览(30)
  • 【qt】仿写一个智能家居页面

    B站大学 示例图片: 后面的保持默认,点击完成。成功后可以看到: 再将图片拖入工程文件夹下面。 向页面添加图片 前缀名可以是自己设定,注意添加完毕后一定要先保存(ctrl+s),看文件后面的小星号*消失就保存成功,否则后面无法添加文件。 回到ui文件,将一个label拖到

    2024年04月27日
    浏览(26)
  • Linux MQTT智能家居项目(智能家居界面布局)

    1.选择工程名称和项目保存路径 2.选择QWidget 3.添加保存图片的资源文件: 在工程目录下添加Icon文件夹保存图片: 将文件放入目录中: 将图片添加进入资源文件中: 这里我们一共显示4个界面:LED控制界面,温度湿度显示界面,光照强度显示界面,摄像头监测界面。 所以这里

    2024年02月13日
    浏览(39)
  • 基于QT的智能家居中控系统的简明设计

      系统采用 “ 主从式架构 ” ,即一主多从式,该智能居家控制系统的主要功能包括 登录功能 、 注册功能 、 音乐播放功能 、 时间显示 、 日历显示 、 温度湿度光照气压海拔数据等环境指标数据 显示等。   该智能居家控制系统的软硬件环境如下:   硬件环境:

    2024年02月09日
    浏览(27)
  • 【基于stm32f103C8T6-小程序智能家居项目实战-自绘PCB到实现功能一条龙+30分钟解决-各种bug已修复】

    阿熊智能家居演示 核心板 STM32F103C8T6 WIFI模块 ESP8266-01s 传感器 DHT11温湿度传感器 BH1750光照传感器 其他 LED OLED 4脚按键开关 CP2102(USB转TTL模块) 有源蜂鸣器(低电平触发) 金属膜电阻器 面包板(或PCB) 电源和导线 项目 数量 已购 价格 STM32F103C8T6 1 ESP8266-01s 1 DHT11温湿度传感器

    2024年04月28日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包