使用小爱同学语音控制电脑关机 - Winform C#

使用小爱同学语音控制电脑变关机

  • 前言
  • 实现原理
  • 准备
    • 注册巴法云账号
    • 接入巴法云
    • 接入米家
  • 编写程序
    • 连接TCP
    • 接收信息并运行关机指令
    • 发送指令订阅主题
    • 添加心跳机制
    • 后台运行
    • 阻止默认关闭窗口事件
  • 完整代码


前言

小爱同学应该已经是家喻户晓的了,现在一直用来控制家里的家电。于是乎突发奇想想用来操作电脑上的软件会怎么样,比如打开某个程序不用再去寻找,直接喊小爱同学打开,真的很方便,现在先来实现一个最简单的,用小爱同学来控制电脑关机。当然只是关机,开机还需要通过设置主板来实现,等后续研究成功了再记录吧。

实现原理

其实很简单,只要通过小爱同学给电脑发送一条指令,然后电脑收到此指令后就运行shutdown -s -t 10指令,其中10是关机的时间,单位为秒。要想立即关机可以使用shutdown -h.取消关机使用shutdown -a。通过以上即可指令即可自由的控制电脑什么时候关机。
现在问题是要怎样让电脑收到小爱同学的指令呢,通过百度查到可以使用巴法云,操作及其简单。

准备

注册巴法云账号

https://bemfa.com/通过以上地址进入巴法云官网,点击注册账号后登录,然后进入控制台,可以看到以下页面:
在这里插入图片描述
注意你的私匙是控制电脑的关键

接入巴法云

通过官方接入文档可以看到巴法云支持多种接入方式,再Winform中最简单的就是通过TCP方式接入。
接入前需要先点击新建一个主题,这里我们创建一个TCP创客云的主题,命名为Computer001.
这里需要注意接入米家需要注意主题的命名,官方文档介绍如下:

巴法云物联网平台默认接入米家,仅支持以下类型的设备:插座、灯泡、风扇、传感器、空调、开关、窗帘。

用户可以自主选择是否接入米家,根据主题名字判定。
当主题名字后三位是001时为插座设备。
当主题名字后三位是002时为灯泡设备。
当主题名字后三位是003时为风扇设备。
当主题名字后三位是004时为传感器设备。
当主题名字后三位是005时为空调设备。
当主题名字后三位是006时为开关设备。
当主题名字后三位是009时为窗帘设备。

我这里使用了001,小爱同学可以传送回来的指令为off或者no,代表插座的开关。

创建主题后最好更改一下昵称,点一下你主题的昵称的位置即可修改。这是昵称是接入米家后用来控制的设备名称。

在这里插入图片描述

接入米家

下载米家APP,登录后在下方找到我的,点击其他平台设备
在这里插入图片描述
点击添加,然后找到巴法
在这里插入图片描述
绑定后会显示在其他设备的列表中,并且点击进去会显示刚刚创建的主题
在这里插入图片描述
在这里插入图片描述
现在设备已经接入米家了,但是如果现在叫小爱同学控制,小爱同学会说不在线。此时我们可以使用串口工具测试一下是否可以接收到指令。
按照官方教程,先下载串口调试工具

打开工具后界面如下:
在这里插入图片描述
端口好为TCPClient,远程地址更改为·bemfa.com,端口为8344,然后点击连接。现在需要订阅你创建的那个主题,也就是让你的设备处于在线状态。
在左下角的文本框中输入

cmd=1&uid=xxxxxxxxxxxxxxxxxxxxxxx&topic=xxx1,xxx2,xxx3,xxx4\r\n

注意更改uid与topic,uid为你的私匙,topic为主题名称,多个主题使用逗号相隔。记得\r\n需要带上。
输入 指令点击发送,就会返回如下命令:
在这里插入图片描述
同时在巴法的控制台可以看到你的主题订阅数变为1
在这里插入图片描述

现在可以对着小爱同学说小爱同学 关闭电脑,在调试界面会出现如下返回

在这里插入图片描述
至此你的小爱同学已经连接到巴法云了,接下来开始写代码处理这个信息。

编写程序

连接TCP

创建一个Winform程序,窗口如下:
在这里插入图片描述
在load方法中赋值uid与topic
Form1_Load

  		 private void Form1_Load(object sender, EventArgs e){textBox1.Text = uid;textBox2.Text = "computer001";button1_Click(sender, e);                  }

button1_Click方法为点击按钮的事件。

主要方法代码如下:

		// 连接巴法云TCP服务器private void TcpL(){IPHostEntry hostEntry = Dns.GetHostEntry("bemfa.com");IPEndPoint ipEndPoint = new IPEndPoint(hostEntry.AddressList[0], 8344);//IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.31.114"), 777);try{tcpClient.Connect(ipEndPoint);Console.WriteLine("Connected");ShowMsg("Connect Success!");Thread c_thread = new Thread(Received);c_thread.IsBackground = true;c_thread.Start();Send($"cmd=1&uid={textBox1.Text}&topic={textBox2.Text}\r\n");  }catch (Exception ex){ShowMsg(ex.ToString());}}

接收信息并运行关机指令

        /// <summary>/// 接收信息/// </summary>private void Received(){NetworkStream networkStream = tcpClient.GetStream();EndPoint remoteEndPoint = tcpClient.Client.RemoteEndPoint;byte[] datas = new byte[1024];while (true){if (networkStream.DataAvailable){int len = networkStream.Read(datas, 0, 1024);string v = Encoding.UTF8.GetString(datas);string cmd = ParseQueryString(v, "cmd");string msg = ParseQueryString(v, "msg");if (cmd.Equals("2") && msg.IndexOf("off") == 0){//ShowMsg("电脑将于3s后关闭!");Process proc = new Process();proc.StartInfo.FileName = "cmd.exe"; // 启动命令行程序proc.StartInfo.UseShellExecute = false; // 不使用Shell来执行,用程序来执行proc.StartInfo.RedirectStandardError = true; // 重定向标准输入输出proc.StartInfo.RedirectStandardInput = true;proc.StartInfo.RedirectStandardOutput = true;proc.StartInfo.CreateNoWindow = true; // 执行时不创建新窗口proc.Start();string commandLine;//if (isCancel)//    commandLine = @"shutdown /a";  // 停止关机commandLine = @"shutdown /s /t 0";  // 立即关机proc.StandardInput.WriteLine(commandLine);return;}ShowMsg(Encoding.UTF8.GetString(datas));//Console.WriteLine($"From:{remoteEndPoint}:Received ({len})");}Thread.Sleep(1);}}

发送指令订阅主题

        /// <summary>/// 发送信息/// </summary>/// <param name="msg"></param>private void Send(string msg){NetworkStream networkStream = tcpClient.GetStream();EndPoint remoteEndPoint = tcpClient.Client.RemoteEndPoint;byte[] datas = new byte[1024];datas = Encoding.ASCII.GetBytes(msg);networkStream.Write(datas, 0, datas.Length);}

添加心跳机制

通过多次测试发现,如果一分钟没有向服务器发送指定,那么就会自动断开连接。这里添加一段代码每隔30s向服务器请求一段数据。

        public void StartCommIdle(){//定时器配置Thread c_thread = new Thread(Heartbeat);c_thread.IsBackground = true;c_thread.Start();}public void Heartbeat(){try{while (true){Send($"ping\r\n");Thread.Sleep(30000);}}catch (Exception){TcpL();}}

要将StartCommIdle方法加载Tcp方法后面

后台运行

要想随时接收小爱同学的指令就需要一直打开此程序,如果电脑窗口多了这个界面还不能关掉就很烦,所以再添加一段代码用于将程序后台运行并将图标显示在任务栏中。

在这里插入图片描述
在winform的组件中添加notifyIcon
找到Icon属性设置图标在这里插入图片描述
如果想再显示主界面可以添加菜单栏选项在这里插入图片描述
添加contextMenuStrip组件,并设置他们的方法。

阻止默认关闭窗口事件

找到Form_Closing属性,在这里插入图片描述

绑定如下方法,这样点击关闭按钮后程序不会退出,而是再后台运行。

        private void Form1_FormClosing(object sender, FormClosingEventArgs e){try{e.Cancel = true;this.Visible = false;}catch (Exception ex){MessageBox.Show(ex.Message);}}

如果想要关闭则在菜单栏中添加关闭方法:

        private void smi_exit_Click(object sender, EventArgs e){DialogResult result = MessageBox.Show("你确定要关闭吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);if (result == DialogResult.OK){// 关闭所有的线程this.Dispose();this.Close();}}

显示主界面方法:

        private void Form1_FormShow(object sender, EventArgs e){this.Visible = true;}

至此,只要对着小爱同学说关闭电脑,电脑会马上关机。

完整代码

以下为完整代码,供参考,注意uid需要设置为自己的私钥。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Diagnostics;namespace TCPShutdown
{public partial class Form1 : Form{private TcpClient tcpClient = new TcpClient();private string uid = "";public Form1(){InitializeComponent();this.Hide();}private void TcpL(){IPHostEntry hostEntry = Dns.GetHostEntry("bemfa.com");IPEndPoint ipEndPoint = new IPEndPoint(hostEntry.AddressList[0], 8344);//IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.31.114"), 777);try{tcpClient.Connect(ipEndPoint);Console.WriteLine("Connected");ShowMsg("Connect Success!");Thread c_thread = new Thread(Received);c_thread.IsBackground = true;c_thread.Start();Send($"cmd=1&uid={textBox1.Text}&topic={textBox2.Text}\r\n");StartCommIdle();}catch (Exception ex){ShowMsg(ex.ToString());}}public void StartCommIdle(){//定时器配置Thread c_thread = new Thread(Heartbeat);c_thread.IsBackground = true;c_thread.Start();}public void Heartbeat(){try{while (true){Send($"ping\r\n");Thread.Sleep(30000);}}catch (Exception){TcpL();}}/// <summary>/// 接收信息/// </summary>private void Received(){NetworkStream networkStream = tcpClient.GetStream();EndPoint remoteEndPoint = tcpClient.Client.RemoteEndPoint;byte[] datas = new byte[1024];while (true){if (networkStream.DataAvailable){int len = networkStream.Read(datas, 0, 1024);string v = Encoding.UTF8.GetString(datas);string cmd = ParseQueryString(v, "cmd");string msg = ParseQueryString(v, "msg");if (cmd.Equals("2") && msg.IndexOf("off") == 0){ShowMsg("电脑将于3s后关闭!");Process proc = new Process();proc.StartInfo.FileName = "cmd.exe"; // 启动命令行程序proc.StartInfo.UseShellExecute = false; // 不使用Shell来执行,用程序来执行proc.StartInfo.RedirectStandardError = true; // 重定向标准输入输出proc.StartInfo.RedirectStandardInput = true;proc.StartInfo.RedirectStandardOutput = true;proc.StartInfo.CreateNoWindow = true; // 执行时不创建新窗口proc.Start();string commandLine;//if (isCancel)//    commandLine = @"shutdown /a";commandLine = @"shutdown /s /t 0";proc.StandardInput.WriteLine(commandLine);return;}ShowMsg(Encoding.UTF8.GetString(datas));//Console.WriteLine($"From:{remoteEndPoint}:Received ({len})");}Thread.Sleep(1);}}/// <summary>/// 发送信息/// </summary>/// <param name="msg"></param>private void Send(string msg){NetworkStream networkStream = tcpClient.GetStream();EndPoint remoteEndPoint = tcpClient.Client.RemoteEndPoint;byte[] datas = new byte[1024];datas = Encoding.ASCII.GetBytes(msg);networkStream.Write(datas, 0, datas.Length);}void ShowMsg(string str){this.Invoke(new Action(() =>{richTextBox1.AppendText(str + "\r\n");}));}void ShowNotice(string str){this.Invoke(new Action(() =>{textBox3.AppendText(str + "\r\n");}));}private void button1_Click(object sender, EventArgs e){TcpL();}private void Form1_Load(object sender, EventArgs e){textBox1.Text = uid;textBox2.Text = "computer001";button1_Click(sender, e);            }private void smi_exit_Click(object sender, EventArgs e){DialogResult result = MessageBox.Show("你确定要关闭吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);if (result == DialogResult.OK){// 关闭所有的线程this.Dispose();this.Close();}}private void Form1_FormClosing(object sender, FormClosingEventArgs e){try{e.Cancel = true;this.Visible = false;}catch (Exception ex){MessageBox.Show(ex.Message);}}private void button2_Click(object sender, EventArgs e){this.Visible = false;//Send($"cmd=7&uid={uid}&type=1\r\n");}public static string ParseQueryString(string url, string key){if (string.IsNullOrWhiteSpace(url)){throw new ArgumentNullException("url");}//1.去除第一个前导?字符//var dic = string value = null;Dictionary<string, string> dictionary = url//2.通过&划分各个参数.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries)//3.通过=划分参数key和value,且保证只分割第一个=字符.Select(param => param.Split(new char[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries))//4.通过相同的参数key进行分组.GroupBy(part => part[0], part => part.Length > 1 ? part[1] : string.Empty)//5.将相同key的value以,拼接.ToDictionary(group => group.Key, group => string.Join(",", group));dictionary.TryGetValue(key, out value);return value;}private void Form1_FormShow(object sender, EventArgs e){this.Visible = true;}}
}

仅供学习使用,如转发请标明出处,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17558.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Kotlin开发智能语音助手,打造一款“懂你”的对话精灵

简介 Hi&#xff0c;各位同学大家好&#xff0c;我有新课上线啦&#xff0c;距离上一门课程已经过去九个月了&#xff0c;这门课的知识点是以Kotlin为主的&#xff0c;自Kotlin被Google转正之后&#xff0c;这门语言就备受我们Android开发者的关注&#xff0c;经过几年的发展下…

用Python程序实现语音识别就是这么简单!​

前言 Python程序提供了其他技术无法比拟的交互性和可访问性&#xff0c;重要的是&#xff0c;在 Python 程序中实现语音识别非常简单。我们一起来了解python程序的&#xff1a;语音识别的工作原理、PyPI 支持哪些软件包以及如何安装和使用 SpeechRecognition 软件包&#xff0…

树莓派小爱同学、天猫精灵、智能音箱、百度语音极速版、百度语音标准版、语音识别、语音合成终极方案

第一句话&#xff0c;python2版本的代码&#xff0c;python3你改改就完事了 流程图如下&#xff1a; 全套教程下载地址点击下载 首先需要调用这个方法安装百度的语音识别 https://ai.baidu.com/ai-doc/SPEECH/Bk4o0bmt3 安装使用Python SDK有如下方式&#xff1a; 如果已安…

uniapp开发微信小程序实现语音识别,使用微信同声传译插件,

第一步&#xff1a;在微信小程序管理后台&#xff1a;“设置”-》“第三方设置”-》“插件管理”中添加插件。 但是这个地方&#xff0c;没有搜索到插件&#xff0c;就到微信服务市场 搜索到以后添加到需要的小程序里面&#xff0c;然后返回管理中心查看&#xff0c;就可以看…

小白也可以学会小爱同学语言控制灯

教程 软件准备 电脑端安装Arduino软件&#xff0c;手机端安装点灯科技APP&#xff0c;以及米家APP和小爱音响。 电脑端所需以及点灯科技APP都在在网盘资料文件夹中&#xff0c;需要网盘资源的评论区找我要。 硬件准备 小爱音响一个 ESP8266模块一个 舵机一个 硬件连接 …

基于Blinker的小爱同学语音控制【脱坑指南】

基于Blinker的小爱同学语音控制ESP8266 前些天在使用esp8266时遇到很多小爱不能控制设备问题&#xff0c;现在来叙述我控制过程中所遇到的问题&#xff0c;以及到完整的小爱能成功控制Esp8266的过程。 1.需要先安装8266_package_2.7.4.exe,不然不能够正确使用&#xff0c;相关…

国产开源版「ChatGPT插件系统」来了!豆瓣、搜索一应俱全,清华、面壁智能等联合发布...

视学算法报道 编辑&#xff1a;好困 【导读】近期&#xff0c;面壁智能联合来自清华、人大、腾讯的研究人员共同发布了中文领域首个基于交互式网页搜索的问答开源模型WebCPM&#xff0c;这一创举填补了国产大模型该领域的空白。面壁智能自研工具学习引擎BMTools也因此被成功实…

多快好省的多样算力,让下一代互联网如你所愿

从前段时间让所有人刮目相看的AI绘画&#xff0c;到最近火爆全网的CharGPT&#xff0c;2022年的互联网行业为我们贡献了无数新鲜点子和妙哉的应用&#xff0c;始终令人回味无穷。回首这一年&#xff0c;我们好像并没有见证新的“杀手级”应用诞生&#xff1b;但仔细回味&#x…

泰坦号内爆5位富豪遇难!AI复原最后恐怖瞬间,设计缺陷真相公开

转自&#xff1a;新智元 30美元游戏手柄可操控潜水器&#xff1f;一系列巨大设计缺陷&#xff0c;注定了5位富人「泰坦尼克号」残骸之旅是一场生命的豪赌。 失踪4天&#xff0c;深海「泰坦号」潜水器竟灾难性内爆。 5位乘员全部遇难&#xff01; 与爆炸不同&#xff0c;内爆是一…

独家 | 100位特邀用户亲测GPT-4,带来超预期体验!

GPT-4.0作为近年来自然语言处理领域的一项重要突破&#xff0c;备受人们关注和期待。为了助力用户全面理解和高效使用该技术&#xff0c;Beezy团队迅速实现GPT-4.0 API对接&#xff0c;并推出GPT-4.0免费体验官计划。 近期&#xff0c;首期体验官活动完美结束&#xff0c;Beez…

【大模型】创新工场AI工程院执行院长:后GPT时代,多模态是最大的机会

目录 核心观点 大语言模型的“垄断”与“白菜化” 多模态AI的广阔天地

后GPT时代,多模态是最大的机会

作者 | 王咏刚&#xff0c;SeedV实验室创始人/CEO&#xff0c;创新工场AI工程院执行院长 我既是软件工程师&#xff0c;也是投资人和创业者。我曾参与多个成功 AI 项目的创建、孵化或投资。今天&#xff0c;ChatGPT 开启了崭新的 AI 2.0 时代&#xff0c;我个人也全力投入到一…

chatGPT智能AI,就是一次未来新革命!

hatGPT一经面世&#xff0c;立刻就火爆全世界&#xff0c;国内还无法直接使用&#xff0c;居然成为全球热度第一名&#xff1b;如果说不是一次全新的革命科技&#xff0c;又怎么能会那么高的热度&#xff1f;毕竟这个不是平常的八卦新闻。 很多人还不以为然&#xff0c;这完全…

【金猿人物展】数睿数据创始人兼CEO穆鸿:大数据价值创造关键在于应用普惠...

‍ 穆鸿 本文由数睿数据创始人兼CEO穆鸿撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 事情还得从我2022年这一年经历的一些事情谈起&#xff0c;由于工作的原因&#xff0c;我要经…

Protobuf-net3.2.8中的protogen.exe之使用

目录 protobuf是个好东西 遇到问题 顺便研究一下命令行程序如何调试 protobuf是个好东西 protobuf是一个轻量级的数据格式&#xff0c;相比json&#xff0c;它的数据量为json的1/3&#xff0c;且存储方式为2进制&#xff0c;并进行了压缩&#xff0c;序列化和反序列化更快&…

科技资讯|下一代Bing搜索,使用比ChatGPT更强大的语言模型

微软bing&#xff0c;经常被人遗忘的搜索引擎即将重获新生。正如预期的那样&#xff0c;这家科技巨头周二宣布&#xff0c;它正在与 OpenAI 合作&#xff0c;利用该公司的 AI 技术增强 Bing。然而&#xff0c;微软也有一个惊喜&#xff1a;下一个版本的 Bing 将采用一种新的下一…

BFT 最前线|OpenAI暂时下线ChatGPT”浏览“功能;Stability AI CEO:5年内,人类程序员将不复存在

原创 | 文 BFT机器人 AI视界 TECHNOLOGY NEWS 01 Open AI暂时下线ChatGPT“浏览”功能 日前OpenAI方面宣布&#xff0c;面向ChatGPT Plus用户的"浏览"功能会在某些情况下出现故障&#xff0c;因此已于7月3日暂时禁用了这一功能。该功能是为了提高ChatGPT的搜索体验…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

【导读】Meta的LLaMA模型开源&#xff0c;让文本大模型迎来了Stable Diffustion时刻。谁都没想到&#xff0c;LLaMA的一场「史诗级」泄漏&#xff0c;产生了一系列表现惊艳的ChatGPT「平替」。 谁能想到&#xff0c;一次意外的LLaMA泄漏&#xff0c;竟点燃了开源LLM领域最大的…

巴比特 | 元宇宙每日必读:ChatGPT推出新功能「自定义指令」,可秒变「高级个人AI助理」,用户可设定各种角色...

摘要&#xff1a;据新智元报道&#xff0c;继Code Interpreter后&#xff0c;ChatGPT又迎来重磅升级。今天&#xff0c;OpenAI官宣了「自定义指令」&#xff08;Custom instructions&#xff09;新功能&#xff0c;该功能可让你的ChatGPT秒变个人助理&#xff0c;教练、营养师、…

浪潮信息刘军:智算力就是创新力 | MEET2023

Pine 整理自 MEET2023量子位 | 公众号 QbitAI 在人工智能的三驾马车中&#xff0c;算力作为算法和数据的支撑&#xff0c;它的作用一直都不容小觑。 目前&#xff0c;人工智能在和各个行业不断融合发展&#xff0c;这对算力也提出了更高的要求。 无论是AI大模型训练&#xff0c…