Skip to content

Latest commit

 

History

History
75 lines (48 loc) · 9.2 KB

README.md

File metadata and controls

75 lines (48 loc) · 9.2 KB

Windows 墨水屏助手

本机助手把 FastTask 的工牌预览发给 WOLINK 800×480 黑白红墨水屏。协议、AES 认证和双平面图像打包参考 myled/src/wolink_esl,本目录已包含独立协议实现,不需要依赖 myled 目录运行。

Windows 10/11 开启蓝牙,安装 Python 3.11 或更高版本后运行:

# 在克隆后的 FastTask 项目目录中运行
cd .\windows-panel
.\start.ps1 -Install

之后运行 start.ps1 即可。助手只监听 127.0.0.1:19743;页面默认来源为 http://127.0.0.1:10000。启动参数 -Origin 必须与浏览器打开的 FastTask 页面来源一致。允许有有效证书的 HTTPS 云端域名(可带端口);HTTP 仅允许 localhost、127.0.0.1 或 [::1]。来源只包含协议、主机和端口,不允许账号密码、路径、查询或片段。不要把助手端口代理到外网。

云端部署后的使用

FastTask 的 Web 页面、账号、任务、照片和配对 API 可部署在云端;本助手仍运行在用户的 Windows 笔记本上,通过本机蓝牙连接墨水屏。云服务器无需蓝牙,也不能直接连接用户身边的设备。关闭页面后,助手仍通过 HTTPS 读取配对账号的最新快照,在任务或显示内容变化时更新工牌。云端部署不需要改变其它业务模块。

假设云端页面为 https://fasttask.example.com,在 Windows 上首次安装并启动:

.\start.ps1 -Install -Origin "https://fasttask.example.com"

在 Edge 或 Chrome 中打开该云端地址,进入 工牌更新,连接本机助手并选择墨水屏。浏览器询问本地网络访问权限时,允许该可信页面访问本机助手;设备与当前云端账号完成配对后,默认在内容变化时自动同步,无需定时设置。云端仍需通过正常的 HTTPS 证书校验,快照端点必须直接响应 /api/v1/panel/snapshot,不能重定向到另一个地址。普通浏览器不支持或禁止本地网络访问时,应先使用 Windows 的 Edge/Chrome 并检查该站点权限。

确认可以使用后,安装相同云端来源的当前用户登录自启:

.\install-autostart.ps1 -Origin "https://fasttask.example.com"

安装自启不会立即重启已有助手。若本机助手已用本地地址启动,先退出对应的助手进程,再按新来源启动;同一端口只运行一个实例。云端页面的 CSP 必须允许连接 http://127.0.0.1:19743,不能由反向代理覆盖为仅 connect-src 'self'。本机端口不应暴露到公网。

当启动来源从本地地址变为云域名,或从一个域名变为另一个域名,助手会关闭自动刷新、清除旧账号配对凭据和设备选择,并要求登录新来源重新配对;旧凭据不会发送给新服务器。协议或非默认端口改变也视为新来源。等价写法会统一规范化,例如 https://FASTTASK.example.com:443/ 与 https://fasttask.example.com 相同。也可给不同环境使用不同 -StateDirectory,自启脚本支持同名参数;此目录含私密凭据,不应提交或同步到公开位置。更换来源不会修改云端任务或其它业务数据。

依赖已锁定为实机验证版本,包含 WinRT 3.2.1 全套运行库,避免安装时隐式升级 Windows 蓝牙接口。首次连接会持续等待省电设备的广播:最多查找四轮,每轮十五秒,期间显示轮次并可取消;发现设备后才连接。连接尚未开始图像写入时可安全重试;图像传输开始后的失败不会自动重发。

在 FastTask 的 工牌更新 页上传或更换照片、修正显示内容,选择自己墨水屏的广播名称与对应 MAC 地址。页面记住当前账号在此站点连接过的设备,可直接选择历史设备。工牌包含全部当前今日任务,按 FastTask 源顺序排列;不再使用旧版任务勾选或显示排序设置。完成情况从 FastTask 读取,任务操作仍在原工作台进行。每次发送都重新核验广播名、地址和 WOLINK GATT 服务。全部数据包通过 GATT 应答,并收到准确的 ff00000000000000 完成通知后,接口才报告成功。未收到确认、断连、写入超时均报告失败,不自动重发。

设备与账号完成配对后,助手默认每十秒只读检查一次 FastTask 新快照;任务内容、完成状态、任务删除、日期、照片、姓名或实际天气显示变化时,合并两秒内的变化,再自动更新上次配对的设备。首次配对也会同步一次。获取快照的时间戳或数据库修订号变化不会触发重复写屏。等待设备广播期间内容再次变化时,建立连接后会重读最新快照,避免发送排队的旧内容。页面关闭不影响此进程工作;电脑必须开机、未休眠、FastTask 服务及助手运行、蓝牙开启且设备在附近。已完成、未完成、已跳过均保留真实状态;已删除和被新版替代的任务项不显示。不会推断或修改任务状态。

关机/休眠恢复后只同步最新内容,不补发历史画面。内容签名和最近一次设备准确确认的签名保存在私有状态,助手重启不会重复写入同一画面。查找耗尽或写入失败后,同一画面不无限自动重试;可在页面查看原因并点击重新更新,或等待新的内容变化。网络暂时不可用采用退避重试,不把读取失败视为已同步。超过 3 行的任务完整连续分页,屏幕页脚仅显示页码;后台默认发第 1 页,可在配置中指定固定页码,若该页已不存在则回到第 1 页。

头像等比缩放完整保留、白底填充,再转换黑白红抖动;不会裁切证件照。天气请求失败会显示不可用/缓存标记,手动天气修正带手动标记。画面不显示座位或额外的状态解释。

可选安装当前 Windows 用户登录自启(无管理员权限):

.\install-autostart.ps1
# 移除登录自启:
.\install-autostart.ps1 -Remove

助手第一次启动尚未配对,不执行刷新;页面选择设备并配对当前账号后默认启用内容变化同步,无需另行勾选。首次或变更配对会先只读查询一次当日快照,验证成功后原子保存;凭据失效或网络失败时保留原配置,不发屏。配对凭据仅可读取该账号的工牌快照,保存到本目录被 Git 忽略的 .state/config.json;目录 ACL 限制当前用户,不打印凭据,不向网页返回凭据。内部管理仍兼容显式 enabled:false,重启保留停用状态。凭据过期/撤销后显示重新配对提示。status.json 记录画面摘要、最近操作及真实结果,不含凭据或头像。

备用“浏览器蓝牙”只在当前页面运行。已授权的历史设备可通过浏览器 getDevices() 恢复;支持 watchAdvertisements() 的浏览器会等待设备广播,其余浏览器在所选设备上有限次重试 GATT 连接,不会重复弹出设备选择器。浏览器授权撤销后必须再次明确选择设备。浏览器关闭后继续检测和更新需要运行上述 Windows 助手。

API 固定只接受配置的 FastTask Origin,校验 Host,写操作只接受 JSON,限制请求/图像大小,不允许网页指定任意上游地址。CORS/Private Network 预检仅对允许的页面来源返回授权头;无 Origin 请求只可读取脱敏健康状态与配置。FastTask 快照请求关闭系统代理及重定向,始终校验 HTTPS 证书和主机名,避免凭据泄露。配置接口不能更换上游地址,切换来源必须重新启动并重新配对。

接口 请求与结果
GET /health 版本、蓝牙支持、busy、脱敏配置、查找轮次和变化同步状态 monitor
GET /config 不含凭据的配置,has_token 仅表示已保存
POST /scan {device_name?: string} → devices:[{name,address,rssi}]
POST /send {device_name,address,image_base64} → 准确通知、应答包数
PUT /config {device_name,address,panel_token,pairing_id,fasttask_url,page,enabled?};完整配对省略 enabled 时默认启用;page 从 0 开始
POST /refresh {expected_pairing_id,expected_device_name,expected_address,page?} → 同锁核验调用页预期账号/设备、保存页码、读取最新快照并发送;页码从 0 开始
POST /cancel {} → 取消当前扫描、连接或传输;已开始传输时不能据此确认屏幕结果

本机服务地址由启动参数固定,配置不能把配对凭据转发到其他地址。image_base64 接受 PNG/JPEG base64 或 data URL,要求 800×480、解码后不大于 1 MB。

手动更新必须同时携带当前页面账号拥有的 expected_pairing_id、预期设备名 expected_device_name 和地址 expected_address。助手在保存页码、网络查询或蓝牙操作之前持锁核验,缺少任一字段或账号/设备已变化均返回 409 pairing_changed,不改动新账号配置或画面。GET /health 的 capabilities.guarded_refresh 表示支持此保护;旧助手需要重启更新后再使用。

测试(不发送真实蓝牙):python -m unittest discover -s tests -v。在已有依赖的开发机器,也可 start.ps1 -DependencyPath <依赖目录>,正式独立部署推荐 -Install。