admin管理员组

文章数量:1581990

使用小爱同学来控制电脑关机

  • 前言
  • 实现原理
  • 创建账号
  • PC端程序编写
    • 编译mqtt库
    • 代码分析
    • ***具体代码实现、二进制文件程序微信搜索订阅号(技术分享猿)回复:远程控制***
    • 运行界面
  • 控制

前言

做这个项目的原因是因为本人太懒,经常写完代码就没想着关电脑,然后去玩手游去了。接着洗完澡躺下准备睡觉的时候发现电脑的电源灯还亮着,已经进入温暖的被窝还要起床关电脑,这真是一种折磨。因此想能不能远程控制关机,向日葵还要打开,然后登录,接着找到关机按钮,实在繁琐。所以就在想能不能让我的小爱同学帮忙关电脑呢,因此这个项目就这样产生了。

实现原理

原理其实很简单,就是让手机给电脑发一条指令,让电脑的cmd执行shutdown -h这个指令就行了,含义是立即开启休眠,不会关闭电脑正在运行的程序,下次打开电脑的时候会恢复原样。
那么怎么让电脑收到手机发过来的消息,如果要使用小爱同学肯定要使用第三方物联网平台进行数据转发。综合比较了之后选择了巴法云https://cloud.bemfa/,一开始也是想着通过点灯科技,但是点灯科技在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");
    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状态,因此需要检测到断开之后开启定时器,周期重连机制。

具体代码实现、二进制文件程序微信搜索订阅号(技术分享猿)回复:远程控制

运行界面

控制

在手机上 直接对小爱同学说关闭电脑即可

本文标签: 学来小爱电脑