AirFlash is a single web page that updates the firmware of Bluetooth Low Energy devices built on Telink chips, the devices whose manufacturer normally asks the user to install the Android app OTA_Telink. AirFlash speaks the same protocol as that app, but runs in the browser on Windows, macOS, Linux and Android. Nothing to install, nothing to download besides the firmware, and it works offline.
It was written for the GAODIMIC DT228 wireless microphone system and tested on the DTT228-P transmitter and the DTR228-1R rack receiver. It should work with any device that exposes the Telink OTA service.
| Browser | Chrome or Edge (or another Chromium browser: Brave, Opera, Vivaldi). Safari and Firefox have no Web Bluetooth and cannot be used. |
|---|---|
| Platform | Windows 10/11, macOS, Linux, Android (phone or tablet). iPhone and iPad are not supported: no browser on iOS has Web Bluetooth. |
| Hardware | A Bluetooth 4.0 or newer adapter. Every laptop made in the last decade has one. |
| Firmware | The .bin file for the device, from the manufacturer. |
https://.AirFlash.html and double-click it. If it opens in the wrong browser, right-click → Open with → Chrome.Bluetooth is blocked by the browser on plain http:// addresses and inside frames embedded in other pages. AirFlash detects this and shows a message instead of failing silently.
The first time, the browser asks permission to use Bluetooth. On macOS the system also asks once whether the browser may use Bluetooth; answer yes.
The page is laid out in the order of the work: firmware files on the left, one card per device on the right, a log at the bottom. Each card shows four steps, highlights the current one and explains it.
Drag the .bin file onto the box on the left, or click the box to choose it. Several files can be loaded at once (for example transmitter and receiver). Each file is checked before anything is sent: Telink signature, size field, CRC32. A file that fails is shown in red and cannot be flashed. Below the file name you see the version string and the device names embedded in it.
Each device has a key combination to enter update (OTA) mode; it is in the manufacturer's manual. With the GAODIMIC preset enabled, the card shows it for the DT228 series:
Press Connect. The browser opens its device picker; select the device and confirm. After a couple of seconds the card shows connected and the device's Bluetooth name. If the device is missing from the picker, enable Show all Bluetooth devices in Settings and try again.
AirFlash automatically selects the firmware whose embedded device name matches the connected device; the drop-down lets you change it. If the names do not match, a warning appears and Flash stays disabled, because this is exactly how a receiver image ends up on a transmitter. The check can be disabled in Settings for devices whose firmware carries no name.
Press Flash and confirm. The progress bar shows packets sent and elapsed time. A typical update takes 30 to 90 seconds. Do not touch the device and do not close the page.
Check (optional) sends the version request and shows what the device answers, without writing anything.
After the last packet AirFlash sends the end command and the device switches off or reboots by itself. This is normal: the device is verifying the received image and starting the new firmware. The card then shows:
The card then returns to a clean state, ready for the next device.
Press + Add device to add a card. Every card is an independent flow with its own Bluetooth connection, firmware choice and progress. Connect each device, then press Flash on each card or Flash all ready to confirm them all together.
Devices cannot interfere with each other: each BLE connection is a private link with its own access address and hopping sequence, and packets of one connection are discarded by the radio of every other device. The only effect of parallel updates is that each transfer is somewhat slower, because the computer alternates between connections. With many devices (five or more) work in smaller groups, because the device firmware limits the total duration of an update.
| Setting | Effect | Default |
|---|---|---|
| GAODIMIC preset | Applies the settings below for GAODIMIC systems and shows the DT228 key combinations in the cards. Everything remains editable. | off |
| Device name starts with | Filters the browser's device picker by name prefix. | empty (GAODIMIC with the preset) |
| Show all Bluetooth devices | Lists every nearby device, not only those advertising the OTA service. | off |
| Check firmware matches device | Blocks flashing when the device name is not found inside the firmware image. | on |
| Sync read every N packets | A characteristic read every N packets, used as flow control. This is the "speed" slider of the official app. | 8 |
| Pause between packets (ms) | Extra delay per packet. Keep at 0: the device limits the total update time and a slow transfer is rejected at the end. | 0 |
| Write with acknowledgement | Uses acknowledged writes if the device supports them. Slower; the DT228 does not support it. | off |
Language, preset and the numeric settings are remembered by the browser on that computer.
Wrong browser (not Chromium-based), page opened from http://, or page embedded in a frame. Open AirFlash.html directly or the https address in its own tab.
Make sure it is really in update mode (the key must be held while powering on). Enable Show all Bluetooth devices. Move closer. On macOS check System Settings → Privacy & Security → Bluetooth for the browser.
The device rejected the image at its final check. The most common cause is a transfer that took too long: set the pause to 0 and the sync read to 8 or more, and avoid updating many devices at once. Otherwise the file is for a different hardware revision.
Put the device back in update mode and run it again. Nothing has been changed: the new firmware is activated only after the complete, verified image has arrived.
Some firmware carries two names: the advertising name and the GAP "Device Name". macOS caches the latter after the first connection and shows it from then on. The device is unchanged; AirFlash recognises both names.
The device is not in update mode, or it is not a Telink-based device.
AirFlash implements the Telink BLE OTA protocol exactly as the Android app OTA_Telink (v2.0.1) does. Everything happens in the browser through the Web Bluetooth API; the firmware file never leaves the computer.
| Service | 00010203-0405-0607-0809-0a0b0c0d1912 |
|---|---|
| Characteristic | 00010203-0405-0607-0809-0a0b0c0d2b12 — properties read, write-without-response; notify on newer firmware |
FF00 prepare (version request) FF01 start packet 0 … N-1 data, written without response; a read every N packets as flow control FF02 + idx + ~idx + CRC16 end → device verifies the image, activates it and reboots (newer firmware first notifies FF06 + result code)
| Bytes | Content |
|---|---|
| 0–1 | packet index, little-endian (0-based) |
| 2–17 | 16 bytes of firmware; the last packet is padded with 0xFF |
| 18–19 | CRC-16/MODBUS (poly 0x8005 reflected = 0xA001, init 0xFFFF) over bytes 0–17, little-endian |
02 FF · last index (u16 LE) · bitwise NOT of last index (u16 LE) · CRC-16/MODBUS over the preceding 6 bytes (u16 LE).
KNLT (Telink firmware mark).0x18 must equal the file size.0xFFFFFFFF, no final XOR) over bytes [0, size-4) must equal the last 4 bytes.BRAND_MODEL… are extracted as embedded device names and compared with the connected device's name (two names stored back to back are split on the repeated brand prefix).0 success 5 incomplete data 10 firmware mark error 1 packet sequence 6 flow error 11 firmware size error 2 invalid packet 7 firmware check failed 12 packet timeout 3 data CRC error 8 version not accepted 13 OTA timeout 4 flash write error 9 packet length error 14 connection terminated
The device writes the incoming image to a spare flash area and switches to it only after its own final check on the end command. An interrupted, corrupted or too-slow transfer leaves the previous firmware untouched. The only real risk is a valid image for the wrong hardware, which is why AirFlash compares embedded names before writing.
| Device | From | To | Result | Notes |
|---|---|---|---|---|
| DTR228-1R rack receiver (kit DT228G-R) | 1.0.4 (Apr 2025) | 1.0.7 (Jun 2026) | OK | Classic protocol (no notifications). A first attempt with a 20 ms pause per packet (3 min total) was rejected by the device at the final check; with no pause (≈60 s) it succeeded. The device enforces a total time limit. |
| DTT228-P portable transmitter | – | 1.2.12 (Jun 2026) | OK | No pause, ≈45 s. |
Platform: macOS, Chrome. Firmware files as published by the manufacturer, unmodified.
AirFlash.html to any https web server; no server-side code is needed. Link it directly; do not embed it in an iframe (Bluetooth would be blocked).applyPreset() and the hintConnectG strings of the language table. Another product line is a copy of those.T table with the same keys; adding one is adding an object and a flag.MIT License, with an explicit no-liability statement for firmware damage. AirFlash is an independent project, not affiliated with GAODIMIC, infoSVC or Telink Semiconductor; product names are used only to describe compatibility.
Author: DoDo7. Questions and feedback through the project page.
AirFlash 是一个单独的网页,用于升级基于 Telink 芯片的低功耗蓝牙设备的固件,也就是厂商通常要求用户安装 Android 应用 OTA_Telink 才能升级的那类设备。AirFlash 使用与该应用完全相同的协议,但直接在 Windows、macOS、Linux 和 Android 的浏览器中运行。无需安装,除固件外无需下载任何东西,并且可以离线使用。
它最初是为 GAODIMIC DT228 无线话筒系统编写的,已在 DTT228-P 发射器和 DTR228-1R 机架接收器上测试通过。任何提供 Telink OTA 服务的设备都应当可以使用。
| 浏览器 | Chrome 或 Edge(或其他 Chromium 内核浏览器:Brave、Opera、Vivaldi)。Safari 和 Firefox 没有 Web Bluetooth,无法使用。 |
|---|---|
| 平台 | Windows 10/11、macOS、Linux、Android(手机或平板)。不支持 iPhone 和 iPad:iOS 上没有任何浏览器支持 Web Bluetooth。 |
| 硬件 | 蓝牙 4.0 或更新的适配器。近十年内的笔记本电脑都有。 |
| 固件 | 厂商提供的设备 .bin 文件。 |
https://。AirFlash.html 并双击打开。如果被其他浏览器打开,右键 → 打开方式 → Chrome。在普通的 http:// 地址下,以及嵌入在其他页面的框架中时,浏览器会禁用蓝牙。AirFlash 会检测到这种情况并给出提示,而不是无声失败。
第一次使用时,浏览器会请求蓝牙权限。在 macOS 上,系统还会询问一次是否允许浏览器使用蓝牙,请选择允许。
页面按操作顺序布局:左侧是固件文件,右侧每台设备一张卡片,底部是日志。每张卡片显示四个步骤,高亮当前步骤并给出说明。
把 .bin 文件拖到左侧的方框中,或点击方框选择文件。可以同时加载多个文件(例如发射器和接收器)。每个文件在发送任何数据之前都会被检查:Telink 标识、大小字段、CRC32。未通过检查的文件以红色显示且无法写入。文件名下方会显示版本字符串和固件内嵌的设备名称。
每种设备都有进入升级(OTA)模式的按键组合,见厂商说明书。启用 GAODIMIC 预设后,卡片会直接显示 DT228 系列的操作方法:
点击连接。浏览器会弹出设备选择框;选择设备并确认。几秒钟后卡片显示已连接及设备的蓝牙名称。如果设备没有出现在列表中,请在设置中启用显示所有蓝牙设备后重试。
AirFlash 会自动选择内嵌设备名称与所连接设备匹配的固件;也可以在下拉框中更改。如果名称不匹配,会显示警告并禁用升级按钮,因为这正是接收器固件被误刷到发射器上的典型情形。对于固件中不含名称的设备,可以在设置中关闭该检查。
点击升级并确认。进度条显示已发送的包数和耗时。通常一次升级需要 30 到 90 秒。期间请不要操作设备,也不要关闭页面。
检测(可选)会发送版本请求并显示设备的回应,不写入任何数据。
最后一个数据包发送完毕后,AirFlash 发送结束命令,设备会自动关机或重启。这是正常现象:设备正在校验收到的镜像并启动新固件。随后卡片显示:
之后卡片恢复为初始状态,可以接着处理下一台设备。
点击 + 添加设备可以新增一张卡片。每张卡片是一个独立的流程,拥有自己的蓝牙连接、固件选择和进度。逐一连接各设备后,可以分别点击各卡片的升级按钮,或点击升级所有就绪设备一起确认。
各设备之间不会相互干扰:每条 BLE 连接都是私有链路,有各自的接入地址和跳频序列,一条连接的数据包会被其他设备的射频硬件直接丢弃。并行升级的唯一影响是每台设备的传输速度会稍慢,因为电脑在多条连接间轮流发送。设备数量较多(五台以上)时请分批进行,因为设备固件对整个升级过程有总时长限制。
| 设置项 | 作用 | 默认值 |
|---|---|---|
| GAODIMIC 预设 | 为 GAODIMIC 系统应用下列设置,并在卡片中显示 DT228 的按键组合。所有项仍可手动修改。 | 关 |
| 设备名称开头为 | 按名称前缀过滤浏览器的设备选择框。 | 空(启用预设时为 GAODIMIC) |
| 显示所有蓝牙设备 | 列出附近所有设备,而不仅是广播 OTA 服务的设备。 | 关 |
| 检查固件与设备是否匹配 | 固件镜像中找不到设备名称时禁止写入。 | 开 |
| 每 N 包同步读取一次 | 每 N 个数据包读取一次特征,用作流控。对应官方应用中的"速度"滑块。 | 8 |
| 包间隔(毫秒) | 每个数据包之间的额外延时。请保持为 0:设备限制升级总时长,传输过慢会在最后被拒绝。 | 0 |
| 带确认写入 | 设备支持时使用带确认的写入。速度较慢;DT228 不支持。 | 关 |
语言、预设和数值设置会由该电脑上的浏览器记住。
浏览器不是 Chromium 内核,或页面是通过 http:// 打开的,或页面被嵌入在框架中。请直接打开 AirFlash.html,或在独立标签页中打开 https 地址。
确认设备确实处于升级模式(必须在开机的同时按住按键)。启用显示所有蓝牙设备。靠近一些。macOS 上请检查系统设置 → 隐私与安全性 → 蓝牙中浏览器的权限。
设备在最终校验时拒绝了镜像。最常见的原因是传输时间过长:把间隔设为 0、同步读取设为 8 或更大,并避免同时升级过多设备。否则就是文件对应的硬件版本不同。
让设备重新进入升级模式并再次运行。设备没有任何改变:只有在完整且校验通过的镜像到达后,新固件才会被激活。
有些固件带有两个名称:广播名称和 GAP"设备名称"。macOS 在第一次连接后会缓存后者并一直显示它。设备本身没有变化;AirFlash 能识别这两个名称。
设备未处于升级模式,或者它不是基于 Telink 的设备。
AirFlash 实现的 Telink BLE OTA 协议与 Android 应用 OTA_Telink(v2.0.1)完全一致。所有操作都通过 Web Bluetooth API 在浏览器中完成;固件文件不会离开电脑。
| 服务 | 00010203-0405-0607-0809-0a0b0c0d1912 |
|---|---|
| 特征 | 00010203-0405-0607-0809-0a0b0c0d2b12 — 属性 read、write-without-response;较新固件还有 notify |
FF00 准备(版本请求) FF01 开始 数据包 0 … N-1 无响应写入;每 N 包读取一次特征作为流控 FF02 + 索引 + ~索引 + CRC16 结束 → 设备校验镜像、激活并重启(较新固件会先通过通知发送 FF06 + 结果码)
| 字节 | 内容 |
|---|---|
| 0–1 | 包索引,小端序(从 0 开始) |
| 2–17 | 16 字节固件数据;最后一个包用 0xFF 填充 |
| 18–19 | 对字节 0–17 计算的 CRC-16/MODBUS(多项式 0x8005 反射 = 0xA001,初值 0xFFFF),小端序 |
02 FF · 最后一个包的索引(u16 LE)· 该索引按位取反(u16 LE)· 对前 6 字节计算的 CRC-16/MODBUS(u16 LE)。
KNLT(Telink 固件标识)。0x18 处的 32 位大小字段必须等于文件大小。[0, size-4) 计算的 CRC32(初值 0xFFFFFFFF,无最终异或)必须等于最后 4 个字节。品牌_型号… 的可打印字符串作为内嵌设备名称,并与所连接设备的名称比较(两个名称紧挨存放时,按重复的品牌前缀拆分)。0 成功 5 数据不完整 10 固件标识错误 1 包序号错误 6 流程错误 11 固件大小错误 2 无效的包 7 固件校验失败 12 包超时 3 数据 CRC 错误 8 版本不被接受 13 OTA 超时 4 Flash 写入错误 9 包长度错误 14 连接已终止
设备把收到的镜像写入备用 Flash 区域,只有在收到结束命令并通过自身最终校验后才切换到新镜像。中断、损坏或过慢的传输都不会影响原有固件。唯一真正的风险是把一个有效的镜像写入错误的硬件,因此 AirFlash 在写入前会比对内嵌名称。
| 设备 | 原版本 | 新版本 | 结果 | 备注 |
|---|---|---|---|---|
| DTR228-1R 机架接收器(DT228G-R 套装) | 1.0.4(2025 年 4 月) | 1.0.7(2026 年 6 月) | 成功 | 经典协议(无通知)。第一次尝试时每包间隔 20 ms(总计 3 分钟),设备在最终校验时拒绝;改为无间隔(约 60 秒)后成功。设备对总时长有限制。 |
| DTT228-P 便携发射器 | – | 1.2.12(2026 年 6 月) | 成功 | 无间隔,约 45 秒。 |
平台:macOS,Chrome。固件文件为厂商发布的原始文件,未作修改。
AirFlash.html 上传到任意 https 网站服务器即可,无需服务端代码。请直接链接该页面,不要嵌入 iframe(蓝牙会被禁用)。applyPreset() 中的几行代码和语言表中的 hintConnectG 字符串。为其他产品线添加预设只需复制这些内容。T 表中的一个对象,键名相同;新增语言只需新增一个对象和一面旗帜。MIT 许可,并附有关于固件损坏的明确免责声明。AirFlash 是独立项目,与 GAODIMIC、infoSVC 或 Telink Semiconductor 无关;产品名称仅用于说明兼容性。
作者:DoDo7。问题与反馈请通过项目页面提交。