阅读目录

  • 1.远程开机原理
  • 2.远程关机原理
  • 3.代码实现

1. 远程开机原理

1.1 简述

电脑关机之后,BIOS继续给网卡供电,网卡等待接收一个数据包(MagicPacket),收到数据包之后唤醒,进入开机流程。

1.2 WakeOnLAN

WakeOnLAN简称WOL,是一种电源管理功能。WakeOnLAN的实现,主要是向目标主机发送特定格式的数据包,而这个数据包被称作魔术包(MagicPacket),MagicPacket格式是由AMD公司开发推广的技术,受到网卡厂商的支持,现在的网卡基本都支持这个功能。

1.3 MagicPacket 数据包格式

6字节0xFF + 16次MAC地址

例如:Mac地址是:D8 CB 8A 32 4A 2B 3C,数据包如下

FF FF FF FF FF FF  D8 CB 8A 32 4A 2B 3C (此处省略14次...) D8 CB 8A 32 4A 2B 3C
1.4 BIOS设置

开机进入BIOS
1.Power Management setup ->WakeUpOnLAN 设置为Enable
2.WakeUp By PCI Card 设置为Enable
F10 保存退出 重启之后再关机会发现关机之后网卡灯依然闪烁

1.5 如何发送过去

获取Mac地址
Win + r 运行程序
cmd 打开命令行
ipconfig -all 查看网卡信息

一般使用UDP协议发送(理论上任意协议都可以),IP设置为网段广播地址,192.168.1.255,(有的用255.255.255.255好像也可以),端口是9,然后发送MagicPacket,完成网络唤醒

2. 远程关机原理

2.1 简述

Windows支持远程关机命令,需要设置好远程关机权限。
例如:让IP为192.168.1.25的计算机10s以后执行关机命令

shutdown -s -t 10 -m \\192.168.1.25
2.2 设置计算机允许远程控制关机

修改远程PC的本地安全策略,为指定用户开放权限。
Windows 默认的安全策略,只有Administrators组的用户才有权限远程关闭计算机,如果要给其他用户远程关机的权限,可修改“本地安全策略” 实现

1. Win + r   运行程序
2. gpedit.msc 打开组策略管理
3. 计算机配置->Windows设置->安全设置->本地策略->用户权限分配
4. 从远程系统强制关机->添加用户或组  输入Guest->检查名称->确定
5. 拒绝次从网络访问这台计算机->选中Guest->删除
6. 打开控制面板->用户账户->管理其他账户->启用Guest(Win7需要)来宾账户




3. 代码实现

3.1 实现远程开关机类

TRemoteCtrlPC.cpp

/******* WakeOnLAN* 注意:需要设置广播地址,例如:192.168.1.255******/#include <QHostAddress>
#include <QUdpSocket>
#include <QProcess>#include "TRemoteCtrlPC.h"TRemoteCtrlPC::TRemoteCtrlPC(QObject *parent)
{Q_UNUSED(parent)
}/* Note:* 被控计算机需要支持网络唤醒功能(Wake on LAN)* 1.组织魔法包(MgicPacket) 由6字节0xFF和重复16次的MAC地址  102字节* 2.通过UDP的方式广播 IP地址为路由的广播地址 如:网段为192.168.1.x,IP设为192.168.1.255* @strMac:  格式示例 "20:af:0a:47:aa:bb"*/
void TRemoteCtrlPC::wakeOnLAN(QString strMac)
{/*将字符串MAC转换成十六进制 存入数组*/char cstrMacAddr[6];bool isOK;for(int j = 0;j < 6; j++){if(j < 5){cstrMacAddr[j] = strMac.mid(strMac.indexOf(":",j*3) - 2,2).toInt(&isOK,16);if(false == isOK)return ;}else if(j == 5){cstrMacAddr[j] = strMac.mid(strMac.indexOf(":",j*3 - 1) + 1,2).toInt(&isOK,16);if(false == isOK)return ;}}/*构建一个魔术唤醒包  6字节0xFF 和  16次的 Mac地址*/QByteArray magicPacket;/*6个 0xFF*/for(int i = 0;i < 6; i++){magicPacket[i] = 0xFF;}/*16个 MAC*/for(int k = 0; k < 16; k++){for(int l = 0; l < 6; l++)magicPacket[(k+1)*6 + l] = cstrMacAddr[l];}QHostAddress FakeAddress;FakeAddress.setAddress ("192.168.1.255");QUdpSocket udpSocket;udpSocket.writeDatagram(magicPacket, 102, FakeAddress, 9);
}/* https://blog.csdn.net/smstong/article/details/16879347 */
/* https://www.cnblogs.com/shenjieblog/p/5455691.html
* Note:实现远程关机原理
* 1.用户管理:被控计算机启用来宾账户(Guest)
* 2.运行gpedit.msc  允许Guest强制关机  拒绝从网络访问计算机里删除  Guest
*/void TRemoteCtrlPC::remoteShutDown(QString strIp)
{m_strIp = strIp;/*命令的执行过程会阻塞 放入线程执行*/this->start();
}void TRemoteCtrlPC::run()
{QProcess cmd;QString strResult;QByteArray arrayOut;QString strCmd = "shutdown -s -t 5 -m \\\\"; //四个斜杠  转义strCmd += m_strIp;qDebug()<<"关闭电脑:"<<strCmd;cmd.start(strCmd);cmd.waitForFinished();       // !!!阻塞操作 放在主线程会导致窗口卡死  直至执行完成arrayOut = cmd.readAllStandardOutput();strResult = QString::fromLocal8Bit(arrayOut);emit signalCmdFinished(strResult); //命令执行完成   返回命令执行结果
}

TRemoteCtrlPC.h

#ifndef TREMOTECTRLPC_H
#define TREMOTECTRLPC_H#include <QObject>
#include <QThread>class TRemoteCtrlPC : public QThread
{Q_OBJECT
public:explicit TRemoteCtrlPC(QObject *parent = 0);void wakeOnLAN(QString strMac);void remoteShutDown(QString strIp);
protected:void run();
signals:void signalCmdFinished(QString result);
public slots:
private:QString m_strIp;
};#endif // TREMOTECTRLPC_H
3.1 测试类

TTestForRemoteCtrlPC.cpp

#include "TTestForRemoteCtrlPC.h"TTestForRemoteCtrlPC::TTestForRemoteCtrlPC(QWidget *parent): QWidget(parent)
{initUI();
}void TTestForRemoteCtrlPC::initUI()
{resize(200,200);m_pRemoteCtrlPC = new TRemoteCtrlPC(this);m_pComboxWake = new QComboBox(this);m_pComboxWake->addItem("90:FB:A6:7E:E5:DF");m_pComboxWake->setEditable(true);m_pComboxWake->setFixedHeight(30);QPushButton *buttonWake = new QPushButton("Wake",this);buttonWake->setFixedHeight(30);connect(buttonWake,SIGNAL(clicked()),this,SLOT(slotWake()));m_pComboxShutdown  = new QComboBox(this);m_pComboxShutdown->addItem("10.1.81.69");m_pComboxShutdown->setEditable(true);m_pComboxShutdown->setFixedHeight(30);QPushButton *buttonShutdown = new QPushButton("ShutDown",this);buttonShutdown->setFixedHeight(30);connect(buttonShutdown,SIGNAL(clicked()),this,SLOT(slotShutdown()));QVBoxLayout *layout = new QVBoxLayout;layout->addSpacing(20);layout->addWidget(m_pComboxWake);layout->addSpacing(20);layout->addWidget(buttonWake);layout->addSpacing(20);layout->addWidget(m_pComboxShutdown);layout->addSpacing(20);layout->addWidget(buttonShutdown);this->setLayout(layout);
}
void TTestForRemoteCtrlPC::slotWake()
{qDebug("唤醒电脑 ");m_pRemoteCtrlPC->wakeOnLAN(m_pComboxWake->currentText());
}void TTestForRemoteCtrlPC::slotShutdown()
{qDebug("关闭电脑 ");m_pRemoteCtrlPC->remoteShutDown(m_pComboxShutdown->currentText());
}

TTestForRemoteCtrlPC.h

#ifndef TTESTFORREMOTECTRLPC_H
#define TTESTFORREMOTECTRLPC_H#include <QWidget>
#include <QComboBox>
#include <QPushButton>
#include <QVBoxLayout>#include "TRemoteCtrlPC.h"
class TTestForRemoteCtrlPC : public QWidget
{Q_OBJECT
public:explicit TTestForRemoteCtrlPC(QWidget *parent = 0);signals:public slots:void slotWake();void slotShutdown();
private:void initUI(void);QComboBox *m_pComboxWake;QComboBox *m_pComboxShutdown;TRemoteCtrlPC *m_pRemoteCtrlPC;
};#endif // TTESTFORREMOTECTRLPC_H

Qt 远程开关机 WakeOnLAN 编辑MagicPacket相关推荐

  1. 计算机控制系统开关,电脑远程开关机控制器

    原标题:电脑远程开关机控制器 SPD-M05电脑远程开机/关机/复位远程控制器 斯必得SPD-M05电脑远程开机/关机/复位控制器是专为各种服务器及无人值守机房电脑远程遥控开机/关机/复位所开发.该控 ...

  2. ubuntu 实现远程开关机

    1. 需求 家里厅里有三台linux主机在跑虚拟机, 一台windows主机在跑wsl2 - ubuntu 20.04 分别是 硬件 网络连接方式 OS ip 虚拟机s EUC i5 7250U 16 ...

  3. 向日葵Android受控端老版本,向日葵Android端版本更新:支持远程开关机

    近日,向日葵远程控制Android控制端更新了10.9版本,本次更新优化了使用相关智能硬件设备进行远程控制时的体验:支持通过向日葵开机插座C2实现远程开关机. 本次更新之后,我们可以使用向日葵远程控制 ...

  4. 如何实现电脑远程开关机?

    要实现电脑远程开关机,您可以使用远程桌面软件或命令行工具.如果您使用的是 Windows 操作系统,您可以使用 Windows 远程桌面协议 (RDP) 或使用命令行工具 "shutdown ...

  5. 电脑服务器 定时开关机 远程开关机(windows+linux)

    定时开关机.远程开关机在实际使用上总是有需求 以下总结了我个人常用的方法 一.定时开机 定时开机主要依赖主板和电源的支持,电源通常是支持的,只有少部分不支持,如果设置了主板不成功,通常就是电源的问题了 ...

  6. 利用esp01s模块和光耦817实现天猫精灵、小爱同学实现电脑远程开关机

    利用esp01s模块和光耦817实现天猫精灵.小爱同学实现电脑远程开关机(由于电脑电源开机线是5V,需要另外加两个5V转3.3V模块对esp01s提供电源和反馈开关机状态). /** 利用esp01s ...

  7. 通过手机远程开/关机

    之前看到一篇名为<通过手机远程关机>的文章,写的不错,很有创意. 作为开发人员中的一员,我想我们都有这样的一个想法,就是让我们写的代码去实现我们生活中的一些日常事务,如远程开/关机. 要说 ...

  8. java实现远程开关机

    1. java远程开机 java实现远程开机需要先获取到pc的mac(物理地址),通过mac地址唤醒网络数据包 参考代码: /*** 远程开机* @return*/@RequestMapping(&q ...

  9. 《远程开关机工具 1.0》软件使用手册

    /* * 最新版请访问以下链接 * https://blog.csdn.net/boomworks/article/details/113486307 * * 软件使用手册更新记录 * 2021-2- ...

  10. 利用 HomeAssistant 实现电脑远程开关机

    利用 HomeAssistant 实现电脑远程开关机 配置 Airytec Switch Off 下载并安装 Airytec Switch Off,如果下载的是便携版,解压即可 配置 Airytec ...

最新文章

  1. MySQL面试题 | 附答案解析(四)
  2. python3调用腾讯AI开放平台
  3. ul ol li的序号编号样式
  4. iOS开发UI篇—Modal简单介绍
  5. 从会议、医患沟通和客服对话三大场景看对话文本摘要技术
  6. 2020蓝桥杯省赛---java---B---1(指数计算)
  7. Python读取文本文档转化成列表
  8. 如何将ListT转换相应的Html(xsl动态转换)(一)
  9. 从科大讯飞跳槽到腾讯被判赔 1200 万;华为多款机型将取消充电器;苹果春季发布会定档4月21日|极客头条...
  10. Java 创建xml文件和操作xml数据
  11. 让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑.
  12. SQLServer2008安装教程
  13. 风尚云网学习-input属性总结
  14. ArcGIS裁剪时警告 warning001003:Datum conflict between input and output
  15. 论文笔记——CPN(Corner-Proposal-Network)Det
  16. Linux学习笔记-exec族函数,system函数,popen函数的用法
  17. java计算机毕业设计家教平台系统源码+mysql数据库+系统+lw文档+部署
  18. RS485通信学习笔记
  19. 强烈分享两个功能强大,可以极大提高工作效率的软件
  20. 开题报告写作攻略--概述及国内外研究现状

热门文章

  1. 英雄联盟服务器状态在线怎么解决,LOL服务器状态查询
  2. dart语言命名规范
  3. Vue 面试常见知识点总结
  4. 1.49万件区块链专利全景:BATJP占26%,游戏类迎突破
  5. webservice的接口测试工具
  6. python文件去重软件_python去重工具
  7. Python随机生成6位数密码
  8. 清华2019最新AI发展报告出炉!400页干货,13大领域一文看懂
  9. 利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数
  10. 动作捕捉系统FOHEART·MAGIC