小爱同学打开电脑


想法

之前都是登陆路由器后用wake on lan唤醒电脑,最近突然想到用小爱语音控制电脑开机。网上大致有这几种方案

1.拆机TTL获取小爱root权限,在小爱上跑网络唤醒。
2.智能插座+BIOS设置来电自启。
3.ESP8266/ESP32的blinker库+网络唤醒。
4.虚拟设备(巴法云/电灯科技)+网络唤醒。
5.小米小爱开放平台(需要开发者账号),自写代码网络唤醒。
6.wifi继电器,加装到主板上。

我选择了巴法云这套方案,在openwrt上跑虚拟设备,接收到请求后用openwrt唤醒电脑。(需要电脑BIOS支持wake on lan)

实现

先去巴法云注册个账号

https://cloud.bemfa.com/

然后在MQTT设备云添加一个PC001并将昵称改为电脑,关于命名规则可以看这里

在openwrt安装相关环境

opkg update
opkg install etherwake python3 python3-paho-mqtt

分别为网络唤醒工具,python3和mqtt依赖。

连接代码参考https://www.cnblogs.com/bemfa/p/15435616.html

import paho.mqtt.client as mqtt
import os

HOST = "bemfa.com"
PORT = 9501
client_id = "xxxxxxx"
cmd1='/usr/bin/etherwake -D -i "br-lan" "xx:xx:xx:xx:xx:xx"'
cmd2='/usr/bin/curl -s "https://api.bemfa.com/api/device/v1/data/3/push/get/?uid=%s&topic=PC001&msg=off" -w "\n"'%client_id
#连接并订阅
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("PC001")         # 订阅消息

#消息接收
def on_message(client, userdata, msg):
    print("主题:"+msg.topic+" 消息:"+str(msg.payload.decode('utf-8')))
    sw = str(msg.payload.decode('utf-8'))
    if sw == "on":
        os.system(cmd1)
        os.system(cmd2)

#订阅成功
def on_subscribe(client, userdata, mid, granted_qos):
    print("On Subscribed: qos = %d" % granted_qos)

# 失去连接
def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection %s" % rc)


client = mqtt.Client(client_id)
client.username_pw_set("userName", "passwd")
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
client.loop_forever()

将xxxxxxx修改为巴法云私钥,xx:xx:xx:xx:xx:xx修改为电脑MAC,上传到openwrt上运行。

运行后会显示订阅者在线,之后在巴法云控制台发送on,查看是否成功执行网络唤醒

执行结果:

然后在米家绑定巴法云设备。

米家app–>我的–>其他平台设备–>点击添加–>找到”巴法”,输入巴法云账号绑定,绑定后即可使用小爱进行控制

测试无误,再设置为启动脚本,即可做到路由器开机自动运行虚拟设备。

/usr/bin/python3 -u /root/mi.py >/root/mi.log 2>&1 &


  目录