以前用过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.local中exit 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名称}} | {{通知标题}} | {{通知内容}} | {{接收时间}}.
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!