小米小爱,ESP8266,点灯,WOL唤醒电脑

一. 需求:

通过小爱让电脑开机(需要电脑主板支持)

二. 简单流程

语音唤醒小爱–>点灯–>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();
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值