蓝牙大数据传输

功能介绍

蓝牙大数据传输模块用于实现 将面板端的图像、像素图、动画素材等大体积数据,通过蓝牙分包方式稳定下发到设备。模块支持上千字节的数据发送,并实现:

  • 分包发送

  • ACK 包确认机制

  • 超时重传

  • 发送进度回调

适用于带有像素屏、灯效屏、动画显示功能的 BLE 设备。

功能说明

  • 支持将面板侧的 base64 图像 转为 十六进制数据,再进行 BLE 分包传输。

  • 按照协议将数据切片为固定大小(默认 1006 字节)。

  • 通过 device.publishBLETransparentData 将每个分包透传给设备端。

  • 支持设备返回确认包(ACK),客户端依次确认已接收分包。

  • 支持失败分包重试(最高 5 次)。

  • 支持透传过程进度实时上报。

交互流程

sequenceDiagram
    participant P as 面板端
    participant BLE as BLE透传模块
    participant Dev as 设备端


    P->>BLE: 传入 base64 图像数据
    BLE->>BLE: 转为 Hex
    BLE->>BLE: 分片 createPackets()
    P->>Dev: 发送 DP 下发开始指令
    Dev-->>P: DP 状态确认(成功)


    loop 分包发送
    BLE->>Dev: publishBLETransparentData(分包)
    Dev-->>BLE: 返回 ACK(当前包号)
    end


    alt 存在未确认包
    BLE->>Dev: 失败包重试(最多 5 次)
    Dev-->>BLE: ACK
    end


    BLE-->>P: 全部分包发送完成
    P-->>用户: 显示发送成功

数据发送流程

完整发送由 sendPackets() 完成:

(1)检查设备在线状态

const isBleOnline = [...] // 判断 BLE 是否可用

(2)发送启动 DP

例如启动播放、提示设备进入接收状态:

sendDp(); // 发送 DP 指令

监听 dp 状态返回:

onDpDataChange(callback);

(3)监听设备 BLE 上报的 ACK

onBLETransparentDataReport(bleCallback);

解析 ACK:

parseConfirmation(res) {
  const index = parseInt(res.data.slice(12, 16), 16);
  return index;
}

(4)发送前 4 包(快速发送)

不等待确认,直接连发:

for (index < 4) publishFn(packets[index]);

(5)从第 5 包开始顺序发送并等待设备 ACK

await waitForConfirmation(index);
publishFn(packets[index]);

(6)补发失败包(最多 5 轮)

while (retries < 5) retryFailedPackets();

(7)发送完成

如果所有包都收到确认 → 返回成功

如果部分包仍未确认 → 返回失败