阀门开阀实验页

这是一个离线静态工具页,用来把当前小程序里的普通水阀链路直接跑通:`扫码 -> deviceBleId -> randomAESKey -> 81 握手响应 -> connectAESKey -> 查询/开关阀 BLE 指令`。普通水阀目标定位靠二维码里的 `12 hex` 设备号,不靠 `portNum`。

扫码与设备号

优先用浏览器摄像头直接扫码。小程序逻辑是把扫码结果按 `_` 分割,取第 3 段,要求正好 `12 hex`。

未启动摄像头

握手与会话密钥

设备随机握手响应的前缀是 `81`。去掉 `81` 后,用上面派生出的 `randomAESKey` 按原始 `AES-CBC / no padding / zero IV` 解密,得到 `connectAESKey`。

自动开阀流程

这里会自动完成:连接蓝牙、发送随机挑战、等待 `81`、推导 `connectAESKey`、查询状态、按响应自动发送开阀第 1/2/3 包,并把全过程写入日志。

未开始
浏览器安全限制无法绕过。第一次使用时,至少还需要两次用户交互:允许摄像头,以及在蓝牙设备选择框中选中目标设备。只要浏览器已经记住该设备,后续可以通过同源页面自动复用授权。

后台开阀上下文

`mainStr = str1 + str2`。普通水阀的开关阀包 1/2 用 `mainStr`,包 3 用 `recNum + mondeal*100`。查询状态包则单独使用 `accNum`。

如果你抓到了某个阀门的后台返回,先把 `str1`、`str2`、`recNum`、`mondeal` 填进去,再切到右侧生成真正的开阀/关阀 BLE 指令。

阀门指令生成

`onLine=1` 时首字节是 `e9`,`onLine=0` 时是 `ea`。开阀且 `withholdMode=2` 时控制字节变成 `03`,否则是 `02`。

如何使用

推荐流程是“扫码 + 自动开阀”。如果 API 不可用,再退回到手工填后台字段。

  1. 把这个页面部署到 Cloudflare Pages,用 `https` 打开。Pages 天然满足摄像头和 Web Bluetooth 需要的安全上下文。
  2. 先点“开始扫码”,把阀门二维码放进取景框。页面会自动填入“二维码原文”和 `deviceBleId`。
  3. 填好 `accNum`。如果你打算让页面自己去请求后台开阀上下文,就把“开阀上下文来源”保持在“优先走 Pages API”,并按需要补 `token`。
  4. 点“开始自动开阀”。页面会自动连接蓝牙、发随机数、等 `81`、推导会话密钥、请求或读取开阀上下文、查询状态,再自动发开阀分包。
  5. 整个过程会实时写进“流程日志”。如果流程中断,先看日志里最后一条失败点,再决定是补 token、改 API、还是切回手工上下文。
如果你已经抓到某个阀门的真实数据,把二维码、`81...`、`str1`、`str2`、`recNum`、`mondeal` 给我,我也可以直接替你拼出最终开阀指令。
就绪