Skip to content

PlanetEditorX/wakeup_pc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

235 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

利用小爱同学/Siri控制局域网电脑开关机


一、使用docker


(一)远程拉取(推荐)

1. 拉取镜像
  • x86/arm64

    docker pull yexundao/wakeup_pc:latest
    • 使用Publish Docker image手动构建或直接打上tags自动构建
    • x86和arm64都可以使用,默认推荐镜像。
  • arm64

    docker pull yexundao/wakeup_pc:latest-arm
  • 默认镜像latest为C编译好的,1.8.0即之后的版本都是C编译版本,需要python版本需要手动执行Publish Docker Image Python的Actions

  • 镜像体积缩小到十几兆,完全符合日常轻度使用。image-20250101171824717

2. 创建配置文件
  • 在任意指定位置创建config.ini文件,如:

    • x86:/vol1/1000/docker/wakeup/config.ini
    • arm64:/root/soft/wakeup/config.ini
  • 按照配置文件说明进行相应的配置,可在仓库查找模板或直接保存 https://raw.githubusercontent.com/PlanetEditorX/wakeup_pc/refs/heads/main/c/config.ini

  • 在本地调试时,可通过指令忽略配置文件,避免配置上传到仓库git update-index --assume-unchanged ~/wakeup_pc/docker/config.ini

3. 运行镜像
  • 带日志和配置命令启动

    • 在宿主机配置文件目录下提前建立日志文件,如:

      • x86:touch /vol1/1000/docker/wakeup/log.txt

      • arm64:touch /root/soft/wakeup/log.txt

      • 注意:如果带日志命令却没有创建日志文件,docker容器将会自动创建一个log.txt的目录,无法正常输出日志

      • 日志文件默认最大为100kb大小,超过该大小会在每日凌晨一点进行日志清理操作,在clear_logs.sh中可以根据需要自定义大小数值

    • 创建并启动容器

      • x86

        docker run -d \
          --name wakeup_pc \
          -v /vol1/1000/docker/wakeup/config.ini:/app/config.ini \
          -v /vol1/1000/docker/wakeup/log.txt:/app/log.txt \
          --restart always \
          --network host \
          yexundao/wakeup_pc:latest

        或在想要的位置上创建docker-compose.yml文件

        version: "3.8"
        
        services:
          wakeup_pc:
            image: yexundao/wakeup_pc:latest
            container_name: wakeup_pc
            restart: always
            network_mode: host
            volumes:
              - ./config.ini:/app/config.ini
              - ./log.txt:/app/log.txt
      • arm64

        docker run -d \
          --name wakeup_pc \
          -v /root/soft/wakeup/config.ini:/app/config.ini \
          -v /root/soft/wakeup/log.txt:/app/log.txt \
          --restart always \
          --network host \
          yexundao/wakeup_pc:latest

        或自建runner版本

        docker run -d \
          --name wakeup_pc \
          -v /root/soft/wakeup/config.ini:/app/config.ini \
          -v /root/soft/wakeup/log.txt:/app/log.txt \
          --restart always \
          --network host \
          yexundao/wakeup_pc:latest-arm
  • 仅配置命令

    docker run -d \
      --name wakeup_pc \
      -v /vol1/1000/docker/wakeup/config.ini:/app/config.ini \
      --restart always \
      --network host \
      yexundao/wakeup_pc:latest
  • 需要先根据自己的具体信息配置好config.ini文件

  • 将运行命令中/vol1/1000/docker/wakeup/config.ini修改为自己实际配置文件地址

  • 注意,这里容器里的目录位置是/app/

  • 如果需要查看输出日志,可进入容器排查

    docker exec -it wakeup_pc sh
    description
  • 如果是带日志的命令启动,可直接在docker的宿主机查看日志

    tail -f /vol1/1000/docker/wakeup/log.txt
    description
  • 如果是空日志文件,则第一行输出关机命令的参数,如cmd_shutdown: sshpass -p 密码 ssh -A -g -o StrictHostKeyChecking=no 用户名@IP 'shutdown /s /t 10',可通过对比相关数据和config.ini的参数是否匹配,如果为空则说明参数读取异常,检查config.ini配置文件的内容和位置是否正确。

  • 和巴法云建立TCP连接

    The IP address of bemfa.com is: 119.91.109.180
    Heartbeat sent
    recv: cmd=1&res=1

    会向巴法云的IP发送TCP请求,看返回的是否是recv: cmd=1&res=1,全是1才是订阅主题成功,其它情况检查是否参数异常。


(二)本地构建

1.环境
  • 由于是在Linux上进行的开发,所以wakeup.c文件的部分头文件会报错,如果是WIN进行编译修改可能需要转为Windows的替代头文件
2. 创建 Dockerfile
  • 创建一个Dockerfile来构建alpine 容器,并在其中设置脚本。
# 使用alpine作为基础镜像,并安装必要的编译工具和库
FROM alpine:3.18.6 as builder

# 安装musl-dev和libc-dev,它们包含了C标准库的头文件和静态库
RUN apk add --no-cache musl-dev libc-dev gcc

# 设置工作目录
WORKDIR /app

# 复制源代码和配置文件到工作目录
COPY wakeup.c config.ini /app/

# 静态编译C程序,确保使用静态链接
RUN gcc -static -o wakeup wakeup.c

# 使用alpine作为最终的基础镜像
FROM alpine:3.18.6

# 从构建阶段复制静态编译的可执行文件到最终镜像
COPY --from=builder /app/wakeup /app/
COPY start.sh config.ini crontab /app/
# 设置工作目录
WORKDIR /app
RUN apk add --no-cache sshpass openssh && \
    chmod +x ./start.sh

# 设置容器启动时执行的命令
CMD ["./start.sh"]
3. 构建 Docker 镜像
  • 使用以下命令构建 Docker 镜像,该命令将会创建一个名为wakeup_pc的本地镜像:
docker build -t wakeup_pc .
docker images

image-20250101174959871

  • 如果多次构建,会产生很多标签为none的镜像,使用命令docker rmi $(docker images -f "dangling=true" -q)删除无用镜像。
4. 创建配置文件
5. 运行 Docker 容器
docker run -d --restart=unless-stopped --name wakeup_pc --network host wakeup_pc
命令解释
  • -d:参数,表示在后台运行容器。
  • --restart=unless-stopped:参数,设置容器的重启策略。unless-stopped 意味着容器将自动重启除非它被明确停止(例如,通过 docker stop)或者 Docker 本身被停止。
  • --name wakeup_pc:参数,为容器指定一个名称,这里是 wakeup_pc。
  • --network host:参数,将容器的网络设置为 host 模式,这意味着容器将不会获得自己的网络接口,而是使用宿主机的网络接口,这样才能访问局域网的主机进行开机和关机操作。
5. 进入容器进行数据查看和排查故障
docker exec -it wakeup_pc sh

(三)利用Actions构建docker镜像

1. 按照说明逐一修改配置文件
  • 主要为两个流程Publish Docker Image CPublish Docker Image PythonPublish Docker Image main实际指向C,只是增加了tags触发。 image-20250103150452629

  • 选择哪种语言直接点击工作流后,点击Run workflow就可以创建并推送对应语言的镜像到Docker Hub,实际使用并无多大差别,直接拉取最新的latest镜像就可以,无需在意具体的版本

image-20250103150936440

image-20250110122546652


(四)修改配置文件

1. 按照说明逐一修改配置文件
2. 巴法云私钥/client_id
3. 主题值/topic
4. 设备MAC地址/mac

(1)需要唤醒的设备输入:ipconfig /all,找到支持唤醒的网卡的物理地址,注意:如果显示的物理地址为XX-XX-XX-XX-XX-XX,需要将短横杠替换为冒号,XX:XX:XX:XX:XX:XX

5. 远程电脑IP地址/ip

(1)需要唤醒的设备输入:ipconfig,根据自己的网卡找到IP地址

6. 远程SSH用户账号/user
  • 设置的用户名
7. 远程SSH用户密码/password
  • 设置的用户密码

二、使用home assistant


(一)安装home assistant

1. 使用飞牛OS的应用中心安装
2.使用docker自行安装

(二)文件配置

1. Windows开启ssh服务器
2.通过页面或其它方式进入home assistant的docker终端
  • 安装sshpass:apk add sshpass

    • 不直接使用密钥免密登录的原因:密钥方式虽然较直接携带密码的ssh方式更加安全,但通用性不足。特别是要docker和home assistant都使用的情况下,docker每次重新创建不必手动添加密钥到主机上。而且本身是创建了一个专用的ssh账户来管理关机事项,对于局域网来说,安全已经足够,不至于担心密码泄露的问题,没必要。
  • 终端修改configuration.yaml文件,或打开飞牛OS的文件管理-应用文件-home-assistantan-config-configuration.yaml,在文件末尾添加

    • switch:
        - platform: wake_on_lan
          name: "PC1"                     		# 定义HA中实体的名称
          mac: "00:00:00:00:00:00"                # 主机MAC地址
          host: "192.168.3.X"                     # 主机IP地址
          broadcast_address: "255.255.255.255"    # 广播地址
          broadcast_port: 9               		# 指定wol端口
          turn_off:
            service: shell_command.shutdown
      shell_command:
        shutdown: "sshpass -p SSH密码 ssh -A -g -o StrictHostKeyChecking=no SSH用户名@192.168.3.X \"shutdown -s -t 10\""         # 运行的关机命令
  • 来到home assistant开发者工具,在配置检查与重启中点击检查配置,显示配置不会阻止 Home Assistant 启动!后点击重新启动,点击重新启动Home Assistant后等待重启

(三)配置页面

1. 查看是否配置成功
  • 设置-设置与服务-实体中查看是否有自定义的实体名称比如PC1,是一个按钮形式,点击切换查看能否开关电脑。
2.首页配置按钮
  • 概览中点击右上角的编辑(铅笔)按钮,点击添加卡片,切换到按实体页面,搜索PC1,将其添加到首页。
3.添加到iPhone家庭
  • HomeKit Bridge点击添加条目要包含的域就选择Switch,点击提交
  • 集成条目中新增加的项的右侧,点击配置包含模式选择include,要包含的域选择Switch,点击提交
  • 实体搜索PC1,选择后提交
  • 通知会显示HomeKit Pairing的二维码,iPhone家庭扫描添加
4.手机端设置
  • 为了更好的语音唤醒,可以手动修改下配件的名字
  • 长按添加的唤醒组件,点击右下角的齿轮,编辑房间名称,比如这里可以为卧室电脑
  • 设置控制中心中添加家庭控制中心

三、配置成功


1. 网页控制
  • 巴法手动发送onoff控制开关机(可远程)
  • Home Assistant点击按钮开关切换开关机
2.App控制
  • 巴法客户端控制(可远程)
  • Home Assistant手机客户端点击按钮开关切换开关机
  • iPhone家庭中或控制中心中快捷控制开关机
3.语音控制
  • 小爱同学语音控制:小爱同学,打开电脑小爱同学,关闭电脑
  • Siri语音控制:嗨,Siri,打开卧室电脑嗨,Siri,关闭卧室电脑

四、SSH服务器配置


(一)启用OpenSSH

  1. 设置—系统—可选功能—添加功能—OpenSSH服务器
  2. 不成功参考 https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell 或网上查找其它解决办法

(二)创建用户

1. 可以直接当前的本地用户,但由于密码是明文传输,为了增加一点点安全性,创建一个用于ssh登录的账户。
2. 打开编辑本地用户和组:win+r,输入lusrmgr.msc
3. 输入用户名和密码,此处的用户名和密码就是SSH的用户名和密码,添加到配置的user和password
4. 取消用户下次登录时须更改密码(M)的勾选,勾选用户不能更改密码(S)和密码永不过期(W)

(三)测试用户

  1. 打开powershell
  2. 输入ssh 用户名@IP
  3. 初次会提示输入yes
  4. 输入隐形密码
  5. 前方由文件地址转为用户名@主机名表示成功

(四)隐藏用户

1. 避免多用户时会在登录页面显示不需要的用户,参考https://www.ithome.com/0/228/192.htm
2. 确认要隐藏账户全名

(1)在开始按钮单击右键,选择“计算机管理”

(2)进入系统工具→本地用户和组→用户,在中间找到目标用户账户名

(3)记录好账户全名(本地账户没有“全名”,记录好“名称”即可)

3. 新建注册表特殊账户

(1)win+r输入regedit后回车进入注册表编辑器

(2)定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

(3)在Winlogon单击右键新建“项”,命名为SpecialAccounts

(4)在SpecialAccounts单击右键新建“项”,命名为UserList

(5)在UserList单击右键新建DWORD(32位)值(如上图),命名为第一步中记录的账户全名(或本地账户名称),数值数据保持默认的0,此时进入锁屏,隐藏用户不可见。


(五)权限限制(可选)

1. 适当的限制权限,避免别人获取这个账号后用这个账号使用电脑,参考https://www.ithome.com/0/228/192.htm
2. 按教程走,主要就是 限制此用户登录到系统上:“拒绝本地登录”和“拒绝通过远程桌面服务登录”,避免有意或无意中登录电脑,在电脑中留下无用的用户文件,其它安全配置看情况,一般局域网用户也用不着过于严密

五、巴法云


(一)注册巴法云账号


(二)创建主题

  1. 主题名字必须为XX001,以001结尾的代表是一个插座设备,后续连接小爱音箱后,对它说打开关闭,巴法云上就会收到on/off的数据,才能进行后续操作。
  2. 点击昵称就可以修改该主题的名字,这里直接改为电脑。

(三)添加到小爱同学

1. 在米家app的“我的”菜单项中选择连接其它平台

2. 找到并添加巴法

3. 可以看到有在网页上命名的电脑设备,点击同步设备


六、iStoreOS

(一)创建文件夹

  • 在任意位置创建文件夹,如: mkdir /etc/wakeup

(二)上传配置文件

  • 从仓库中下载并上传config.ini和wakeup.py

(三)修改配置文件

1. 按照说明逐一修改配置文件
2. 巴法云私钥/client_id
3. 主题值/topic
4. 设备MAC地址/mac

(1)需要唤醒的设备输入:ipconfig /all,找到支持唤醒的网卡的物理地址,注意:如果显示的物理地址为XX-XX-XX-XX-XX-XX,需要将短横杠替换为冒号,XX:XX:XX:XX:XX:XX

5. 远程电脑IP地址/ip

(1)需要唤醒的设备输入:ipconfig,根据自己的网卡找到IP地址

6. 远程SSH用户账号/user
  • 设置的用户名
7. 远程SSH用户密码/password
  • 设置的用户密码

(四)安装依赖

opkg update
opkg install wakeonlan python3 sshpass

(五)开机启动

  • 在系统-启动项-本地启动脚本中添加代码,让其开机启动
nohup /usr/bin/python3 -u /etc/wakeup/wakeup.py 1 > /etc/wakeup/log.txt 2>&1 &


(六)计划任务

  • 在系统-计划任务中添加任务,作用是每个小时,会kill掉wakeup.py的后台进程,并重新启动一个新的进程,防止长时间掉线。
0 */1 * * * ps | grep wakeup.py | grep -v grep | awk '{print $1}' | xargs kill -9; nohup /usr/bin/python3 -u /etc/wakeup/wakeup.py 1 > /etc/wakeup/log.txt 2>&1 &


(七)生效操作

  • 重启或来到系统-启动项-启动脚本,ctrl+f 搜索 cron,并点击重启,使计划任务生效

七、home assistant


(一)修改configuration.yaml文件

  • switch:
    - platform: wake_on_lan
      name: "PC1"                     # 定义HA中实体的名称,可任意命名
      mac: "XX:XX:XX:XX:XX:XX"        # 主机(电脑)的MAC地址
      host: "192.168.3.XX"            # 主机(电脑)地址,可省略
      broadcast_address: "255.255.255.255"      # 广播地址.不可省略.此处假设路由器地址为192.168.3.1,如为其他网段需要修改
      broadcast_port: 9               # 指定wol端口,可省略
      turn_off:
        service: shell_command.shutdown
    
    shell_command:
      shutdown: "sshpass -p 密码 ssh -A -g -o StrictHostKeyChecking=no 用户名@192.168.3.XX \"shutdown -s -t 10\""  # 替换为你的Linux命令

    (二)添加按钮到页面

    image

八、更新docker镜像


(一)创建工作流

触发
on:
  push:
    tags:
      - "v*"
  workflow_dispatch:
    inputs:
      version:
        description: '输入版本号,格式为X.Y.Z'
        required: true
        default: ''
  • 打上V*标签并推送自动触发操作

    git tag -a v2.0.0 -m "Release version 2.0.0"
    git push --tags
    • 根据需要修改v2.0.0va.b.c和之后的描述
    • v2.0.0/va.b.c在工作流中将会提取v2.0.0/a.b.c作为标签打在镜像上,镜像上将会同时有两个tags:v2.0.0/a.b.clatest
  • workflow_dispatch是页面的Run workflow操作,输入的值保存在参数github.event.inputs.version中。

多平台镜像的action
- name: Set up QEMU
  uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v3
版本的获取
- name: Use tags or version
  id: final_tags
  run: |
    if [ -z "${{ github.event.inputs.version }}" ]; then
      echo "tags=${{ steps.get_version.outputs.VERSION }}" >> $GITHUB_OUTPUT
    else
      echo "tags=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
    fi
  • 从页面输入或tags中获取版本信息
- name: Extract metadata (tags, labels) for Docker
  id: meta
  uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
  with:
    images: yexundao/wakeup_pc
    tags: |
          type=raw,value=${{ steps.final_tags.outputs.tags }}
          type=raw,value=latest
  • 根据实际参数修改对应的名字,可直接在Docker Hub的镜像发布页查看对应的版本号
Docker Hub的登录
- name: Log in to Docker Hub
  uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}
  • 账号配置
    • Settings→Security→Secrets and variables→Actions→Repository secrets→New repository secret
    • Name为参数名,Secret为具体的值
    • 用户名参数为:NameDOCKER_USERNAMESecretDocker Hub的用户名
    • 密码参数为:NameDOCKER_PASSWORDSecretDocker Hub的密码
运行目录的配置
- name: Build and push
  uses: docker/build-push-action@v5
  with:
    context: ./docker
    file: ./docker/Dockerfile
    platforms: linux/amd64,linux/arm64
    push: true
    tags: ${{ steps.meta.outputs.tags }}
    labels: ${{ steps.meta.outputs.labels }}
  • 修改运行目录,由于Dockerfile文件是存在于仓库的/docker/Dockerfile位置,需要同时修改contextfile为对应的路径。
  • platforms: linux/amd64,linux/arm64中指定了构造平台。

九、故障排除(更新...)


(一)iStoreOS的启动项无法启动

  • 排查故障
    • 将启动项和计划任务的命令单独放在终端中,查看是否正常启动,是否有报错,再重启尝试。

(二)iStoreOS可以唤醒电脑无法关闭电脑

  • 排查故障
    • 查看wakeup.py同级目录下是否有log.txt日志生成,查看日志内容排除故障
  • 可能原因
    • 如果日志显示:Host '主机IP' is not in the trusted hosts file. 则需要进入iStoreOS终端,在目标PC开机的状态下进行一次ssh连接,连接后自动添加为可信。
      • 如果还是不行,查看是否是类似于(ssh-ed25519 fingerprint SHA256:XbhC....)的提示,去网页,卸载掉ssh相关的软件包,重新安装openssh-client sshpass

(三)docker无法唤醒电脑

  • 可能原因
    • 进入容器内部,手动执行唤醒代码,如失败则说明可能是docker的网络环境出问题,无法访问到局域网设备,检查并重新设置docker网络配置。

(四)docker无法关闭电脑

  • 可能原因
    • 可查看日志的第一行,如cmd_shutdown: sshpass -p 密码 ssh -A -g -o StrictHostKeyChecking=no 用户名@IP 'shutdown /s /t 10'在容器内手动执行 sshpass -p 密码 ssh -A -g -o StrictHostKeyChecking=no 用户名@IP 'shutdown /s /t 10'查看是否能够执行成功关闭电脑,可能是网络环境的问题,也可能是Windows的SSH配置问题。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors