使用小爱同学来控制电脑关机
- 前言
- 实现原理
- 创建账号
- PC端程序编写
- 编译mqtt库
- 代码分析
- 运行界面
- 控制
前言
做这个项目的原因是因为本人太懒,经常写完代码就没想着关电脑,然后去玩手游去了。接着洗完澡躺下准备睡觉的时候发现电脑的电源灯还亮着,已经进入温暖的被窝还要起床关电脑,这真是一种折磨。因此想能不能远程控制关机,向日葵还要打开,然后登录,接着找到关机按钮,实在繁琐。所以就在想能不能让我的小爱同学帮忙关电脑呢,因此这个项目就这样产生了。
实现原理
原理其实很简单,就是让手机给电脑发一条指令,让电脑的cmd执行shutdown -h这个指令就行了,含义是立即开启休眠,不会关闭电脑正在运行的程序,下次打开电脑的时候会恢复原样。
那么怎么让电脑收到手机发过来的消息,如果要使用小爱同学肯定要使用第三方物联网平台进行数据转发。综合比较了之后选择了巴法云https://cloud.bemfa.com/,一开始也是想着通过点灯科技,但是点灯科技在windows、linux上只提供js库,所以不使用。
创建账号
点开巴法云主页注册账号,进入控制台,点击mqtt设备云。
然后新建主题。
主题名称比如computer001,前面字母随意,但是一定要001结尾,001结尾是插座设备,有打开,或者关闭指令的设备。按照巴法云的教程支持以下设备:
创建完主题后,点击昵称,修改为电脑,或者笔记本。
然后打开米家app,我的->其他平台设备,找到巴法云,有点多,仔细找找。找到之后刷新设备,绑定巴法云账号,点击同步设备,接下来就会出现如下的画面:
这样就绑定成功了。
PC端程序编写
PC上的程序使用qt,qt简单方便,新建qt桌面工程
编译mqtt库
qt上的mqtt库需要自己编译,官方提供了库,但是没有集成。打开教程,按照文章编译库。
代码分析
void MainWindow::InitMqtt()
{if(mqttclient == nullptr)return;ClientId = ui->clientID->text();topic = ui->topic->text();if(ClientId.isEmpty() || topic.isEmpty()){QMessageBox::information(this, "Error","输入错误!");return;}mqttclient->setClientId(ClientId);mqttclient->setHostname("bemfa.com");mqttclient->setPort(9501);mqttclient->connectToHost();connect(mqttclient, &QMqttClient::connected, this, &MainWindow::qt_connected);connect(mqttclient, &QMqttClient::disconnected, this, &MainWindow::connect_lost);}
添加两个QLineEdit的控件,分别命名为clientID、topic,用于填写id和主题,id就是巴法云上的秘钥。将connected信号与qt_connected进行连接,这样连接成功之后会调用qt_connected
void MainWindow::qt_connected()
{timeoutcount = 0;mqttclient->subscribe(QMqttTopicFilter(topic),0);disconnect(mqttclient, &QMqttClient::messageReceived, this, &MainWindow::messageReceived); //先取消连接,不然会有多次消息接收connect(mqttclient, &QMqttClient::messageReceived, this, &MainWindow::messageReceived);ui->connect2server->setDisabled(true);save_state();
}
连接消息messageReceived
void MainWindow::messageReceived(const QByteArray &message, const QMqttTopicName &topic)
{QString rec = topic.name()+":"+message;ui->Log_Text->append(rec);if(topic.name().compare(this->topic.toStdString().c_str())==0){data_analyze(message.toStdString().c_str(),message.length());}
}
void MainWindow::data_analyze(const char *data, int len)
{if(len > 2){if(stricmp(data,"off")==0){ui->Log_Text->append("system(\"shutdown -h\")");system("shutdown -h");}}
}
还有断开重连的机制要实现,每次休眠起来的时候网络都是断开的,mqtt自然也是disconnected状态,因此需要检测到断开之后开启定时器,周期重连机制。具体代码实现已经上传到github上了点击链接直达
运行界面
控制
在手机上 直接对小爱同学说关闭电脑即可