实现远程唤醒局域网设备的方式升级了

go4wol_txet

Github https://github.com/Kaiyuan/go4wol⁠

好几年前我用 Nodejs 弄的,配置起来很麻烦,现在我喊 Claude 用 Go 写一个,并且直接 Docker 部署就可以用了。

2.0

增加一个网页,可以直接在网页上实现唤醒设备,网页有设备记录功能,支持 PWA。
go4wol_screenshot

Docker Compose 部署

version: '3.8'

services:
  go4wol:
    build: .
    container_name: go4wol
    restart: unless-stopped
    network_mode: host  # 使用host网络模式,确保能够发送广播包
    # 注意:使用host网络模式时,ports映射会被忽略
    ports:
      - "52133:52133"  # 在host网络模式下这行会被忽略,但保留以备切换到bridge模式
    environment:
      - PORT=52133
      - ADMIN_PASSWORD=your_secure_password  # 请修改为安全的密码
      - TZ=Asia/Shanghai
    volumes:
      - ./data:/data:rw  # 挂载数据目录到宿主机,确保读写权限
    user: "1000:1000"  # 使用与容器内相同的用户ID
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.go4wol.rule=Host(`go4wol.local`)"
      - "traefik.http.services.go4wol.loadbalancer.server.port=52133"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

    image: kaiyuan/go4wol:latest

# 如果不能使用host网络模式,请使用以下配置
# services:
#   go4wol:
#     build: .
#     container_name: go4wol
#     restart: unless-stopped
#     ports:
#       - "52133:52133"
#     environment:
#       - PORT=52133
#       - ADMIN_PASSWORD=your_secure_password
#       - TZ=Asia/Shanghai
#     volumes:
#       - ./data:/data
#     networks:
#       - go4wol-network
#     privileged: true  # 可能需要特权模式来发送广播包
# 
# networks:
#   go4wol-network:
#     driver: bridge

1.0

运行

version: '3.8'

services:
  go4wol:
    build: .
    container_name: go4wol
    restart: unless-stopped
    ports:
      - "52133:52133"
    environment:
      - PORT=52133
      - TZ=Asia/Shanghai
    network_mode: host
    # 给容器特权以发送网络广播包(仅在必要时使用)
    # privileged: true
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wol.rule=Host(`wol.local`)"
      - "traefik.http.services.wol.loadbalancer.server.port=52133"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

    image: kaiyuan/go4wol:1.0


API 接口

发送WOL包

端点: POST /wol

请求体:

{
    "mac": "AA:BB:CC:DD:EE:FF",        // 必需:目标设备的MAC地址
    "broadcast": "192.168.1.255",      // 可选:广播地址,默认255.255.255.255
    "port": 9                          // 可选:端口号,默认9
}

响应:

{
    "success": true,
    "message": "WOL packet sent successfully",
    "mac": "AA:BB:CC:DD:EE:FF"
}

健康检查

端点: GET /health

响应:

{
    "status": "healthy",
    "timestamp": "2024-01-15T10:30:00Z",
    "service": "WOL Service"
}

使用示例

cURL 命令
# 发送WOL包
curl -X POST http://localhost:52133/wol \
  -H 'Content-Type: application/json' \
  -d '{"mac":"AA:BB:CC:DD:EE:FF"}'

# 指定广播地址和端口
curl -X POST http://localhost:52133/wol \
  -H 'Content-Type: application/json' \
  -d '{"mac":"AA:BB:CC:DD:EE:FF","broadcast":"192.168.1.255","port":9}'

JavaScript 示例
async function wakeDevice(mac, broadcast = null, port = null) {
    const payload = { mac };
    if (broadcast) payload.broadcast = broadcast;
    if (port) payload.port = port;
    
    const response = await fetch('/wol', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(payload)
    });
    
    const result = await response.json();
    return result;
}

// 使用示例
wakeDevice('AA:BB:CC:DD:EE:FF')
    .then(result => console.log('WOL发送结果:', result))
    .catch(error => console.error('错误:', error));

网络配置注意事项
  • 推荐使用host网络模式:这样可以确保WOL广播包能够正确发送

  • 如果必须使用bridge模式,确保Docker网络配置允许广播

  • 确保目标设备的网卡支持Wake-on-LAN功能

故障排除

常见问题
  1. WOL包发送失败

    • 检查目标设备是否支持Wake-on-LAN

    • 确认网络配置和广播地址正确

    • 验证MAC地址格式是否正确

  2. 服务无法访问

    • 检查端口是否被占用

    • 确认防火墙设置

    • 验证Docker容器是否正常运行

  3. 权限问题

    • 确保部署脚本有执行权限

    • 检查Docker是否正常运行

调试方法
# 检查容器状态
docker ps -a | grep go4wol

# 查看详细日志
docker logs go4wol

# 进入容器调试
docker exec -it go4wol sh

# 测试网络连接
curl http://localhost:52133/health

非Windows平台这么麻烦的?Windows网卡属性设置一下就好了。

1 个赞

这个是让你在外面唤醒家里设备用的。

1 个赞

没留意权限,现在设为公开了。

这个好啊,还支持api,配合httpshortcut,手机一键唤醒了属于是。

2.0 增加了 Web ,直接网页就能一键唤醒。

Web 长啥样?加一个 tg 机器人开机啊

加上截图了,TG机器人,这个我自己没需求就没有考虑,我一直都是 iOS 捷径 post MAC的,后来想起安卓没什么好用的工具就弄个 PWA。

还要唤醒

我都是一直开着机

我都是先开zerotier,再进路由器后台,然后wol :joy: 用zerotier中转这样(路由器IP是192.168.1.x,zt的IP是 10.147.20.x)能用吗

我买了小爱同学兼容的开机卡, 15 块钱。
连到 power sw 上面 ,真物理开机。
感觉是我用过最好用了。 之前 wol 总是不好使不知道为啥。

我这个是在家有机器是一直开着做服务器中转,然后让你可以Post 设备到服务器,然后服务器再发送 wol 数据包到设备。

两个条件,
1.家里有能运行 Docket 并一直开机
2.在外面能访问这台一直开着的机器

能满足两个条件就能打开网页点一下就能发 wol了。

把你这个拿出来看看,很酷的样子

为了远程唤醒起个docker太奢侈了,直接丢个程序到bin文件夹下,要开机的时候开vpn回家,然后快捷指令ssh到nas执行wol命令就好了

我也写了一个类似工具。比楼主多一个关机功能。看来大家都喜欢写开关机的轮子。:rofl:

远程关机如何实现的?我现在还需要登录才行

我局域网主要是linux服务器。我的项目接收到关机指令和正确token后,会执行:
```ssh agent@ip 'poweroff'```
因为有安全隐患,所有除非必要,我个人不推荐启用这个功能。

哦Linux啊,我以为远程给Windows关机

我用这个openwrt插件:GitHub - animegasan/luci-app-wolplus: LuCI support for WolPlus