大家好,今天主要和大家分享一下,智能家居物联网的基本实现与操作方法。
目录
第一:智能家居基本简介
第二:测试WIFI模块功能
第三:智能家居物联UI界面开发
第四:核心代码的具体实现
第五:最终效果
第一:智能家居基本简介
使用QT开发智能家居中的一个物联应用,通过云服务器远程控制设备与设备进行通信。在生活中,可以使用WIFI智能插座控制电器开关,比如远程开启热水器,远程打开空调,窗帘等等。包括:WIFI联网,注册到云服务器上,编写QT UI通过网络来与云服务器通信,然后再下发指令到这个连网的设备。
硬件说明:需要有一个串口转WIFI模块,另外需要加上一个USB-TTL模块,外加一根T口USB连接线,可接入PC电脑调试。
第二:测试WIFI模块功能
请先测试个人的 ATK-ESP8266 模块是否正常使用,及正常连接云。原子云的设备需要先分 好组,各个设备命名如下。注意需要和笔者命名的名字一样,也就是至少有一个分组及一个名 字为“客厅灯”的设备,并记住编号及密码(密码由云生成,默认“12345678”)。
默认使用的 WIFI 模块串口通 信波特率为 115200。在 Ubuntu 上设试 WIFI 模块时,一般串口名称为“ttyUSB0”,默认是没有 权限访问这个/dev/ttyUSB0 设备的。所以我们需要使用下面的指令修改权限。
sudo chmod 777 /dev/ttyUSB0
第三:智能家居物联UI界面开发
项目界面如 下,采用暗黑主题设计,结合黄色作为亮色,让用户一目了然。界面笔者从一些智能家居界面 中找到灵感的,编写设计完成的效果不错!
如何想与原子云通信,必须使用云平台的API接口。下面是云平台API的使用流程图。
第四:核心代码的具体实现
写QT应用就应该重点放在HTTPS与WebSocket方向上,与设备信息是通过HTTPS协议接口获得的,通信用WebSocket协议接口。
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 }
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}
分析:第 20 行,需要填写自己的原子云平台帐号 api_token 信息,请在原子云》帐号信息中查看! 剩余的代码都按照原子云平台 API 文档编写,首先是通过网络请求 networkRequest,访问 需要访问的地址,然后通过网络回应对象 newReply 来接收网络回复的结果。结果是 JSION 格 式的文本,笔者使用正则表达式提取回复的内容,作为下一个地址的参数,如此反复,就可以 将原子云服务器的帐号下的设备信息提取出来。
第五:最终效果
利用QT Creator的应用程序窗口输出如下,连接原子云成功后就会启用 定时器,每 15s 向原子云服务器发送一次心跳包,webSocket 应用程序收到后就会显示此设备在 线。
总结:学习智能家居物联网实现,主要是它的开发流程。点击UI 界面上的开关按钮,就相当于发信息到原子云上,原子云再转发给 ESP8266 WIFI 模块,进而控制开发板上的 LED。