以前用过TicWatch2 NFC, 很喜欢其消息云同步功能, 跑步没带手机时候也能利用手表的eSIM获取手机消息. 奈何升级到Wear OS智能手表之后就再也没有这样的功能了, 于是只能自己实现消息云同步的功能.

主体思路是使用SmsForwarder截取安卓手机(安卓11 / Color OS 13)的通知, 转发给Gotify, 在手表端安装Gotify的APP即可.

Gotify server配置

Gotify需要自己搭建服务器并且需要公网IP来支持eSIM访问, 可以考虑买一个云服务器或者使用花生壳内网穿透. 后续配置过程以带有公网IP的Ubuntu 20.04系统为例.

使用Docker容器运行Gotify server

  • 安装Docker: sudo apt update && sudo apt install docker-ce
  • 拉取Gotify server的镜像: sudo p docker pull gotify/server
  • 写入配置文件 env.list:
    GOTIFY_SERVER_PORT=80 # Gotify server使用端口号, 可以修改
    GOTIFY_SERVER_KEEPALIVEPERIODSECONDS=0
    GOTIFY_SERVER_LISTENADDR=
    GOTIFY_SERVER_SSL_ENABLED=false # 不使用SSL(设置SSL证书比较麻烦)
    GOTIFY_SERVER_SSL_REDIRECTTOHTTPS=true
    GOTIFY_SERVER_SSL_LISTENADDR=
    GOTIFY_SERVER_SSL_PORT=443 # HTTPS端口号
    GOTIFY_SERVER_SSL_CERTFILE= # 公钥路径
    GOTIFY_SERVER_SSL_CERTKEY= # 私钥路径
    GOTIFY_SERVER_SSL_LETSENCRYPT_ENABLED=false
    GOTIFY_SERVER_SSL_LETSENCRYPT_ACCEPTTOS=false
    GOTIFY_SERVER_SSL_LETSENCRYPT_CACHE=certs
    # lists are a little weird but do-able (:
    # GOTIFY_SERVER_SSL_LETSENCRYPT_HOSTS=- mydomain.tld\n- myotherdomain.tld
    # GOTIFY_SERVER_RESPONSEHEADERS="X-Custom-Header: \"custom value\""
    # GOTIFY_SERVER_CORS_ALLOWORIGINS="- \".+.example.com\"\n- \"otherdomain.com\""
    # GOTIFY_SERVER_CORS_ALLOWMETHODS="- \"GET\"\n- \"POST\""
    # GOTIFY_SERVER_CORS_ALLOWHEADERS="- \"Authorization\"\n- \"content-type\""
    # GOTIFY_SERVER_STREAM_ALLOWEDORIGINS="- \".+.example.com\"\n- \"otherdomain.com\""
    GOTIFY_SERVER_STREAM_PINGPERIODSECONDS=45
    GOTIFY_DATABASE_DIALECT=sqlite3
    GOTIFY_DATABASE_CONNECTION=data/gotify.db
    GOTIFY_DEFAULTUSER_NAME=**** # 初始默认账户
    GOTIFY_DEFAULTUSER_PASS=****** # 初始默认密码
    GOTIFY_PASSSTRENGTH=10
    GOTIFY_UPLOADEDIMAGESDIR=data/images
    GOTIFY_PLUGINSDIR=data/plugins
    
  • 创建Gotify运行文件存储路径: mkdir -p /path/to/gotify/data
  • 试运行Gotify server: sudo docker run --env-file /path/to/env.list -p 80:80 -v /path/to/gotify/data:/app/data gotify/server &
  • 如果没有出错, 将Gotify server运行命令加入开机自启动

    • 使用Cron: sudo crontab -e, 末尾加入一行:

      @reboot docker run --env-file /path/to/env.list -p 80:80 -v /path/to/gotify/data:/app/data gotify/server &
      
    • 使用rc.local: 在 /etc/rc.localexit 0前加入

      /usr/bin/docker run --env-file /path/to/env.list -p 80:80 -v /path/to/gotify/data:/app/data gotify/server &
      

      如果系统没有Cron, 需要自行安装: sudo apt update && sudo apt install cron; rc.local在Ubuntu 20.04被默认禁用了, 需要手动创建 /etc/rc.local, 修改 /lib/systemd/system/rc-local.service并且开启rc-local服务, 操作自行百度.

  • 放行Gotify server使用端口: sudo ufw allow 80(替换成自己用的端口)
  • 重启系统

SmsForwarder配置

  • https://www.coolapk.com/apk/com.idormy.sms.forwarder下载SmsForwarder的安装包在手机上安装即可, 随后打开软件, 根据提示提供 通知使用权并禁用电池优化, 允许自启动, 同时将其加入手机应用清理白名单内.
  • 用浏览器访问上文中配置好的Gotify server, 登录, 随后在 APPS页面下 Create application, 获得Token.
  • 参照软件Wiki配置软件的 通用设置.
  • 发送通道中添加一个Gotify通道, 起个名字, WebServer处填写 http://Gotify server电脑IP:80/message?token=上述获得的Token, 标题模板建议填写 {{来源号码}} | {{卡槽信息}}, 优先级可以写大一些. 点击 测试后应该能在Gotify server的浏览器端刷新出测试消息.
  • 随后在发送规则中新建短信转发规则, 选择刚刚建好的发送通道, 保存并启用该条转发规则即可, 建议启用自定义模板, 内容是 {{短信内容}} | {{接收时间}}.
  • 针对需要的应用通知, 可以用类似短信的方法新建应用通知, 匹配字段选择 APP包名 不包含 com.android.mms, 建议启用自定义模板, 内容是 {{APP名称}} | {{通知内容}} | {{接收时间}}.

因为手表与手机是一号双终端, 所以通话的转发就不必要了.

智能手表的配置

https://github.com/gotify/android/releases下载Gotify安卓客户端, 使用adb安装到手表上去即可. 以Ubuntu 20.04为例:

  • 下载Gotify.apk
  • 电脑安装adb: sudo apt update && sudo apt install adb android-tools-adb android-tools-fastboot
  • 手表打开设置中的开发者选项(狂点 关于手表 > 版本号来启用开发者模式)中的USB调试, 随后用USB充电线连入电脑
  • 查找手表序列号: adb devices 如果没有反应, 看看手表上是否出现连接提示, 选择 传输文件
  • 尝试连接手表: adb -s 刚刚查找到的序列号 shell 此时手表上会跳出调试许可申请, 将 一律允许此电脑进行调试勾上. 连接成功后电脑端进入手表的shell(命令行), 输入 exit来退出
  • 安装Gotify: adb -s 手表的序列号 install /path/to/Gotify.apk
  • 在手表上启动Gotify, 输入Gotify server的地址, 随后按照提示输入用户名密码登录.

对与Wear OS (比如TicWatch Pro), Gotify启动后会常驻通知栏, 手机上有任何消息转发来是会及时提示.

但是对于跑厂商魔改安卓系统的其它智能手表(比如跑Color OS的OPPO Watch), Gotify没有通知权限, 并且一旦离开Gotify的页面, 程序也立即被系统停止运行, 所以用户只能主动点进去查看转发来的消息, 而没有通知.

OPPO Watch的解法

我原本以为这个问题无解, 但是后来发现, OPPO Watch支持微信儿童版, 在脱离手机的情况下微信儿童版能够接收到微信的消息推送. 可以搞活了!

微信儿童版安装

可以使用Wear OS 工具箱给OPPO Watch安装微信儿童版:

  • 在手机上下载安装Wear OS工具箱
  • 手机开2.4GHz WiFi热点给手表连接
  • 用电脑按照上述方法adb连接手表, 运行: adb -s 手表序列号 tcpip 5555
  • 查看手表IP: adb -s 手表序列号 shell ifconfig, 查找 wlan0或者类似字段后面的IP地址
  • 在Wear OS工具箱中以 查找到的IP:5555作为设备地址连接手表, 随后在Wear OS工具箱里的洋葱商店中找到微信儿童版并且按照提示安装即可.
  • 在设置中找到 微信通知管理, 打开 微信云通知
  • 打开微信儿童版, 手机扫码登录

也可以使用OPPO Watch的”官方途径”安装微信儿童版:

  • 重置手表, 并且选择给家人使用的方式登入手表, 随后即可在软件商店找到儿童版微信并安装
  • 用电脑按照上述方法adb连接手表, 查找微信儿童版包名: adb -s 手表序列号 shell pm list packages | grep wechat
  • 查找微信儿童版安装路径: adb -s 手表序列号 shell pm path 刚刚查找到的包名
  • 取出微信儿童版安装包: adb -s 手表序列号 pull 刚刚查找到的安装路径 ./wechatkid.apk(电脑上安装包的保存路径)
  • 重置手表, 选择给自己使用的方式登入手表, 随后用电脑安装前述方法adb连接手表
  • adb安装微信儿童版: adb -s 手表序列号 install ./wechatkid.apk(电脑上安装包的保存路径)
  • 在设置中找到 微信通知管理, 打开 微信云通知
  • 打开微信儿童版, 手机扫码登录

使用企业微信创建转发机器人

下载企业微信, 使用微信登录并且实名后创建一个只有自己一个人的企业, 随后可以在企业全员群中新建群机器人, 获得机器人的WebHook地址(妥善保管, 后面要用, 不要外泄).

在电脑端浏览器访问企业微信后台, 登录后在 我的企业 > 微信插件找到”邀请关注”二维码, 用微信扫码进入企业群聊. 从此不仅手机端微信/企业微信能够收到机器人发出的消息, 手表端的儿童版微信也能收到消息提示.

SmsForwarder配置

  • 发送通道中新建一个类型为 企微群机器人的通道, 将前面获取的WebHook地址填入
  • 在发送规则中新建短信转发规则, 选择企业微信的发送通道, 保存并启用该条转发规则即可, 建议启用自定义模板, 内容是 {{来源号码}} | {{短信内容}} | {{接收时间}}.
  • 对于应用通知, 要避免微信以及企业微信的通知被转发, 否则微信的消息要被刷爆, 匹配字段选择 多重匹配, 匹配的值 为:
    并且 不是 APP包名 包含 com.tencent.mm
    并且 不是 APP包名 包含 com.tencent.wework
    并且 不是 APP包名 包含 com.android.mms
    
  • 建议启用自定义模板, 内容是 {{APP名称}} | {{通知标题}} | {{通知内容}} | {{接收时间}}.


server software

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!