一. 需求:
通过小爱让电脑开机(需要电脑主板支持)
二. 简单流程
语音唤醒小爱–>点灯–>esp8266–>发送udp请求电脑–>开机
三.文档
点灯文档:https://diandeng.tech/doc/home
《Arduino程序设计基础》函数参考文档:https://wiki.arduino.cn/?file=home-%E9%A6%96%E9%A1%B5
四.直接上代码吧,注释比较全
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET
#include <Blinker.h>
#include <ESP8266Ping.h>
//对应客户端的秘钥
char auth[] = "";
//WIFI SSID
char ssid[] = "";
//WIFI Password
char pswd[] = "";
#define BUTTON_1 "OPEN"
//#define BUTTON_2 "PC-Status"
bool oState[5] = { false };
WiFiUDP Udp;
//根据自己的路由器选择子网段的广播地址
#define BROADCAST_ADD "192.168.0.255"
//网卡唤醒端口(一般为9,可以在BIOS中查看)
#define REMOTEPORT 9
//PC端的IP地址(需要在路由器端进行MAC和IP绑定)
const IPAddress remote_ip(***, ***, ***, ***);
//本地UDP端口
#define LOCALPORT 9
//网卡的MAC地址 6个字节 前面0x加上
char NETCARD_MAC[6] = {0x**,0x**,0x**,0x**,0x**,0x**};
//WOL包
char WOL_Buffer[102];
//WOL包发送完成标志
int complete_flag = 0;
//ping计数
int ping_num = 0;
//WOL魔术包初始化
void WOL_packet_init()
{
int i,j;
for(i=0;i<6;i++)
{
WOL_Buffer[i] = 0xFF;
}
for(i=1;i<17;i++)
{
for(j=0;j<6;j++)
{
WOL_Buffer[i*6 + j] = NETCARD_MAC[j];
}
}
#ifdef WOL_DEBUG
Serial.printf("The WOL packet is :\n");
for(i=0;i<102;i++){
Serial.printf("%x ",WOL_Buffer[i]);
}
#endif
}
//发送wol魔术包
void WOL_packet_transfer()
{
#ifdef WOL_DEBUG
Serial.printf("NOW is send WOL packet!\n");
#endif
Udp.beginPacket(BROADCAST_ADD, REMOTEPORT);
Udp.write(WOL_Buffer);
Udp.endPacket();
}
//新建组件对象
BlinkerButton Button1(BUTTON_1);
//回调函数
void button1_callback(const String & state)
{
BLINKER_LOG("get button1 state: ", state);
if (state == BLINKER_CMD_BUTTON_TAP) {
digitalWrite(LED_BUILTIN, LOW);//点亮LED。
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);//熄灭LED。
BLINKER_LOG("Button1 tap!");
WOL_packet_transfer();
BLINKER_LOG("WOL Packet Transfer Completed!");
complete_flag = 1;
Blinker.notify("!Opening... Plase wait a moment");//开启中请稍等
} else {
BLINKER_LOG("Get user setting: ", state);
}
}
//BlinkerButton Button2(BUTTON_2);
//void button2_callback(const String & state)
//{
// BLINKER_LOG("get button2 state: ", state);
//
// if (state == BLINKER_CMD_BUTTON_TAP) {
// BLINKER_LOG("Button2 tap!");
// if(complete_flag){
// if(Ping.ping(remote_ip)){
// Blinker.notify("!PC Open Successful!");
// ping_num = 0;
// complete_flag = 0;
// }
// else{
// Blinker.notify("!Opening... Plase wait a moment");
// ping_num++;
// if(ping_num > 4){
// ping_num = 0;
// complete_flag = 0;
// Blinker.print("Open Failed,Plase tap button again!");
// Blinker.notify("!Open Failed,Plase tap button again");
// }
// }
// }
// else{
// Blinker.notify("!Plase tap button again!");
// }
// }
// else {
// BLINKER_LOG("Get user setting: ", state);
// }
//}
//小爱电源类回调
void miotPowerState(const String & state, uint8_t num)
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if (state == BLINKER_CMD_ON) {
WOL_packet_transfer();
digitalWrite(LED_BUILTIN, LOW);//点亮LED。
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);//熄灭LED。
//反馈电源状态
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
oState[num] = true;
}
// else if (state == BLINKER_CMD_OFF) {
// //digitalWrite(LED_BUILTIN, LOW);
//
// BlinkerMIOT.powerState("off", num);
// BlinkerMIOT.print();
//
// oState[num] = false;
//
// if (num == 0)
// {
// for (uint8_t o_num = 0; o_num < 5; o_num++)
// {
// oState[o_num] = false;
// }
// }
// }
}
void miotQuery(int32_t queryCode, uint8_t num)
{
BLINKER_LOG("MIOT Query outlet: ", num,", codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER : //所有属性查询
BLINKER_LOG("MIOT Query All");
BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER : //查询电源状态
BLINKER_LOG("MIOT Query Power State");
BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
}
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
//发送手机振动指令, 震动时间, 单位ms 毫秒, 数值范围0-1000, 默认为500
Blinker.vibrate();
uint32_t BlinkerTime = millis();//开机后运行时长/毫秒
Blinker.print("millis", BlinkerTime);//耗时
}
//初始化函数,板子启动或复位只执行一次
void setup()
{
//串口波特率的设置
Serial.begin(115200);
//指定DEBUG信息输出的串口号
BLINKER_DEBUG.stream(Serial);
//使用输入或输出前,此函数配置引脚的模式(引脚编号,配置模式)INPUT 输入模式、OUTPUT 输出模式INPUT_PULLUP 输入上拉模式
//初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
//输出高电平或低电平(引脚编号,输出的电平)HIGH高电平,LOW低电平
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
//注册回调函数
Button1.attach(button1_callback);
// Button2.attach(button2_callback);
//用户自定义电源类操作的回调函数: 务必在回调函数中反馈该控制状态
BlinkerMIOT.attachPowerState(miotPowerState);
//用户自定义设备查询的回调函数:
BlinkerMIOT.attachQuery(miotQuery);
//启动Udp监听服务
if(Udp.begin(LOCALPORT)){
Serial.println("监听成功");
//打印本地的ip地址,在UDP工具中会使用到
//WiFi.localIP().toString().c_str()用于将获取的本地IP地址转化为字符串
Serial.printf("现在收听IP:%s, UDP端口:%d\n", WiFi.localIP().toString().c_str(), LOCALPORT);
}else{
Serial.println("监听失败");
}
//WOL魔术包初始化
WOL_packet_init();
}
//setup()函数执行完后,会死循环执行此函数
void loop()
{
//此函数需要频繁调用以保持设备间连接及处理收到的数据
Blinker.run();
}