大家好,今天主要和大家分享一下,智能家居物联网的基本实现与操作方法。
第一:智能家居基本简介
使用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。