前言
做这个项目的原因是因为本人太懒,经常写完代码就没想着关电脑,然后去玩手游去了。接着洗完澡躺下准备睡觉的时候发现电脑的电源灯还亮着,已经进入温暖的被窝还要起床关电脑,这真是一种折磨。因此想能不能远程控制关机,向日葵还要打开,然后登录,接着找到关机按钮,实在繁琐。所以就在想能不能让我的小爱同学帮忙关电脑呢,因此这个项目就这样产生了。
实现原理
原理其实很简单,就是让手机给电脑发一条指令,让电脑的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上了点击链接直达
运行界面
文章来源:https://www.toymoban.com/news/detail-487180.html
控制
在手机上 直接对小爱同学说关闭电脑即可文章来源地址https://www.toymoban.com/news/detail-487180.html
到了这里,关于使用小爱同学来控制电脑关机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!