惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
量子位
GbyAI
GbyAI
腾讯CDC
T
Tailwind CSS Blog
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
D
Docker
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
Jina AI
Jina AI
IT之家
IT之家
Y
Y Combinator Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
嘿 Siri,唤醒电脑 - 少数派
2021-06-18 · via 少数派

Matrix 首页推荐

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


没有 Siri 的 iOS 不是一个好 OS。

之前提到关于 网络唤醒WoL 这块的内容,也列举了很多唤醒工具,目的是更好地对远端计算机进行有效管控。

这次更进一步,解放双手,尝试让「语音助手」执行唤醒操作。

关联阅读:不用开机键,你的 Windows 也能随时就绪

实现思路

原理亦不复杂,我手头有台 iPad Air,Siri 充当语音助手,调用「捷径」来发送开机指令。

「捷径」本身不支持 WoL 协议,但能发起 HTTP 请求,因此我们需要一个能让不同协议进行沟通/转换的装置/程序,我们简称「协议转换器」,处理 HTTP 请求并发送 WoL 唤醒信号。

我们知道有 Home Assistant 这类平台专门用于构建智能家居交互核心,但对于单一简单需求来说,未免显得过于笨重,所以我决定自己实现一个。如果你已经部署某些类似的物联网核心,可以尝试对其进行扩展或集成。

因此我的总实现流程如下:

  • 本地局域网已有一台树莓派 2,作为程序运行的载体
  • HTTP 与 WoL 同属网络协议,在此我们使用 Golang 来构建上图的两大功能模块
  • HTTP 请求先不设计得非常复杂,够用就行1http://192.168.1.4:40080/wakeup
  • 得益于 HTTP 协议的泛用性,亦可以通过各种浏览器方便地调用,唤醒远程计算机

配置过程

iOS

在「新建捷径 > 获取 URL 内容」中选择 HTTP GET 方法:

接下来开启「互联网、麦克风及语音识别」:

嘿 Siri,「快捷指令名称」:

捷径名称可任意发挥,喊得顺就行。

协议转换器

程序入口 main.go 的具体配置如下:

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

func handler_status(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "0")
}

func handler_wakeup(w http.ResponseWriter, r *http.Request) {
	sendwol()
	fmt.Fprintf(w, "0")
}

func main() {
	http.HandleFunc("/", handler)

	// Service Status Check
	http.HandleFunc("/status", handler_status)

	// WOL
	http.HandleFunc("/wakeup", handler_wakeup)

	// HTTP
	err := http.ListenAndServe(":8000", nil)
	log.Fatal(err)
}

GitHub 扒拉两个函数实现 WoL 协议包 wol.go:

package main

import (
	"bytes"
	"encoding/hex"
	"errors"
	"fmt"
	"net"
)

func sendwol() {
  // 目标MAC地址与指定网卡接口
	const hw  = "e0db55a893e6"
	const nic = "eth0"

	macHex, err := hex.DecodeString(hw)
	if err != nil {
		fmt.Printf("MAC: [%s] decode fail.\n", hw)
		return
	}

	// 广播MAC地址 FF:FF:FF:FF:FF:FF
	var bcast = []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
	var buff bytes.Buffer
	buff.Write(bcast)
	for i := 0; i < 16; i++ {
		buff.Write(macHex)
	}

	// 获得唤醒魔包
	mp := buff.Bytes()
	if len(mp) != 102 {
		fmt.Printf("MAC: [%s] length too short.\n", hw)
		return
	}

	sendMagicPacket(mp, nic)
}

// 向指定网卡发送唤醒魔包
func sendMagicPacket(mp []byte, nic string) {
	sender := net.UDPAddr{}
	if len(nic) != 0 {
		ip, err := interfaceIPv4ByName(nic)
		if err != nil {
			fmt.Printf("网卡[%s]错误: %s", nic, err)
			return
		}

		sender.IP = ip
	}

	target := net.UDPAddr{
		IP: net.IPv4bcast,
	}
	conn, err := net.DialUDP("udp", &sender, &target)
	if err != nil {
		fmt.Printf("创建UDP错误:%v", err)
		return
	}
	defer func() {
		_ = conn.Close()
	}()

	_, err = conn.Write(mp)
	if err != nil {
		fmt.Printf("魔包发送失败[%s]", err)
	} else {
		fmt.Printf("魔包发送成功\n")
	}
}

// 通过网卡名称获取该网卡绑定的IPv4
func interfaceIPv4ByName(nic string) (net.IP, error) {
	inter, err := net.InterfaceByName(nic)
	if err != nil {
		return nil, err
	}

	// 检查网卡是否正在工作
	if (inter.Flags & net.FlagUp) == 0 {
		return nil, errors.New("网卡未工作")
	}

	addrs, err := inter.Addrs()
	if err != nil {
		return nil, err
	}

	for _, addr := range addrs {
		if ip, ok := addr.(*net.IPNet); ok {
			if ipv4 := ip.IP.To4(); ipv4 != nil {
				return ipv4, nil
			}
		}
	}

	return nil, errors.New("该网卡没有IPv4地址")
}

安装 Golang & 编译 & 试运行

apt-get install golang && go run main.go wol.go

正式运行

程序托管

为了保证程序长时间稳定运行,请个「保姆」,由 Systemd 对「协议转换器」进行托管

vim /etc/systemd/system/assist.service

[Unit]
Description = Assistant Service
[Service]
ExecStart = /usr/local/bin/assist
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

生成二进制文件 & 存放于合适位置

go build main.go wol.go & cp main /usr/local/bin/assist

启动

systemctl daemon-reload & systemctl start assist

后续还可在此基础上进行扩展,集成「miIO」协议,自由操控物联网设备。

最后来看看效果:

参考链接:

> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃

> 想申请成为少数派作者?冲!