#设备 #固件 #dfu #usb #更新器 #协议 #bose

bin+lib bose-dfu

适用于各种 Bose 设备的固件更新器

2 个稳定版本

1.1.0 2022 年 7 月 30 日
1.0.0 2022 年 3 月 21 日

#1689 in 命令行工具

MIT 许可证

49KB
898

对于用户

bose-dfu 是一个开源的命令行固件更新工具,适用于某些 Bose 扬声器和耳机。与 Bose 的 官方更新器 不同,bose-dfu

  • 可在 Windows、macOS、Linux 以及 Rust 和 HIDAPI 支持的任何其他操作系统上运行
  • 可以降级固件以及升级固件
  • 不依赖于网络服务来运行

使用此工具,您可以在通过 USB 连接的兼容设备上进入和退出固件更新 ("DFU") 模式。将设备置于 DFU 模式后,您可以向其写入新的固件。

请参阅下一节以获取已知兼容的设备列表,以及下一节如何查找您设备的固件映像的说明(这也可以帮助您确定兼容性)。

已测试设备

使用此工具风险自担。我不会对 bose-dfu 对您的设备造成的任何损坏负责,即使该设备在以下列表中

  • SoundLink Color II(用于初始开发)

大多数以 .dfu 格式进行更新的 Bose 设备很可能与此工具兼容,但我无法保证。如果您的设备不在上述列表中,您使用此工具,您是自愿承担可能损坏设备的风险的。bose-dfu 在对未经测试的设备进行操作之前会提醒您。如果您成功使用 bose-dfu 与此类设备一起使用,请提交一个拉取请求以将其添加到列表中。

不兼容设备

以下设备已知不与 bose-dfu 兼容,因为它们使用了一种相当不同的更新协议

  • Noise Cancelling Headphones 700 (tchebb/bose-dfu#1)

获取固件

此工具不包含固件映像,因此您必须自行获取。固件映像以 .dfu 扩展名结尾,此工具会进行一些基本的验证,以确保您尝试写入的映像是正确的设备,并且没有意外损坏。据我所知,有两种方法可以获取官方固件映像:直接从 Bose 获取,以及通过上面链接的非官方存档。

直接从 Bose 获取

BOSE为其每个设备提供最新的固件(以及可能更早的版本),并存储在https://downloads.bose.com/。尽管目录列表未启用,但https://downloads.bose.com/lookup.xml列出了所有设备。

lookup.xml中,每个<PRODUCT>元素都包含该设备在DFU模式下的USB产品ID以及一个index.xml文件的URL。该index.xml文件位于以设备代号命名的目录中,并包含一个或多个<IMAGE>元素,其中存储了最新固件镜像的文件名。固件文件与引用它们的index.xml文件位于同一目录下。

要找到您的设备的固件,您可以运行bose-dfu info,并将“设备型号”字段与BOSE服务器上的目录名称进行匹配。或者,您可以使用bose-dfu enter-dfu将您的设备置于DFU模式,使用bose-dfu list获取其USB ID,并将其USB PID(冒号后的ID部分)与lookup.xml中的<PRODUCT>元素进行匹配。

通过非官方存档

bosefirmware GitHub用户维护了存储各种BOSE设备旧固件的仓库。其中一些仓库,尤其是ced,包含.dfu文件。

我与此用户无关,并不保证其仓库中文件的真伪或准确性。

安装

Crates.io

如果您已经在计算机上安装了Rust工具链,则安装bose-dfu只需运行cargo install bose-dfu。要获取Rust工具链,您可以使用rustup或使用系统的包管理器安装rust

您还可以在releases页面找到适用于Linux、Windows和macOS的预构建二进制文件。

如果您使用Linux并遇到权限错误或看到INVALID出现在bose-dfu list的输出中,您可能需要给用户权限以访问BOSE HID设备。您可以通过将70-bose-dfu.rules复制到/etc/udev/rules.d/,然后重新连接设备(不需要重启)来做到这一点。如果您的设备未经测试,该文件中将没有条目,因此您需要自己添加一个。

用法

bose-dfu有多个子命令,其帮助文本中进行了总结

bose-dfu 1.0.0
Firmware updater for various Bose devices

USAGE:
    bose-dfu <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    list         List all connected Bose HID devices (vendor ID 0x05a7)
    info         Get information about a specific device not in DFU mode
    enter-dfu    Put a device into DFU mode
    leave-dfu    Take a device out of DFU mode
    download     Write firmware to a device in DFU mode
    file-info    Print metadata about a firmware file, no device needed
    help         Print this message or the help of the given subcommand(s)

要更新设备,您需要按照以下顺序运行至少以下命令:bose-dfu enter-dfubose-dfu downloadbose-dfu leave-dfu。其他子命令可以帮助您检查设备和固件文件当前的状态。值得注意的是info,它可以告诉您设备正在运行的当前固件版本。

对设备执行操作的子命令支持选择与哪个设备通信的参数。您可以使用-p通过USB产品ID选择,使用-s通过USB序列号选择,或同时使用这两个参数。此外,相同的子命令还支持-f/--force标志,对于测试过的设备它没有任何效果,但在对未测试设备执行操作时是必需的。

常见问题解答

更新设备固件会损坏它吗?

很有可能;网上有报道称即使是官方的Bose更新器也会损坏耳机。话虽如此,我的SoundLink Color II在固件损坏时可以回退到DFU模式,从而可以轻松恢复。在开发此工具的过程中,我还没有成功损坏它,我的尝试包括在固件下载过程中故意断开USB线。

bose-dfu可以读取固件也可以写入吗?

不是一开始就能做到的。尽管USB DFU支持上传操作,该操作应该可以读取上次下载的确切固件,但Bose的实现返回的映像并不相同,且无法成功重新下载。因此,我故意省略了upload子命令以防止混淆。不过,在src/protocol.rs中有一个名为upload()的功能:如果您想使用它,添加相应的子命令取决于您自己。

对于开发者

docs.rs

协议

在此实现的USB协议完全是根据Bose的官方固件更新器的USB捕获推导出来的。没有使用任何二进制逆向技术来确定或实现协议。

Bose的DFU协议几乎与USB DFU协议相同,但它通过USB HID报告进行通信,而不是原始USB传输。这个主要变化可能是由于与HID设备通信不需要在主流操作系统上使用自定义驱动程序,这似乎意味着所有其他显著变化(例如,为包含原本属于Setup数据包的字段而添加的头部)。

因此,我没有为Bose DFU编写正式的协议描述。USB DFU规范以及此工具的源代码和其中的注释应该足以说明协议。

先前的工作

我不了解任何其他第三方对此协议的实现。然而,Bose似乎至少有两种第一方实现:第一个是位于https://btu.bose.com/的"Bose Updater"网站和相关原生应用程序,这是我从其中获取USB捕获以开发bose-dfu的来源。我没有对其做任何进一步检查。

第二个是基于Electron的"Bose USB Link Updater",它捆绑并调用实现了此协议的修补版dfu-util(Bose似乎根据Electron代码中的字符串将其称为"USB-DFU"),还包含一个名为"dfuhid"的自定义实用程序,该实用程序将设备置于DFU模式,其作用与bose-dfu enter-dfu相同。

值得注意的是,我无法找到这个修改过的dfu-util的源代码。dfu-util是一个GPL应用程序,因此Bose有义务在请求时提供源代码。然而,根据他们的许可协议,我预计他们只有在收到您的纸质信件并支付他们通过实体介质发送源代码的费用时,才会履行这一义务。这比我想做的要多,但如果有人愿意去麻烦获取它,我会很乐意审查源代码。它可能包含可用于提高bose-dfu的可靠性或设备兼容性的有用信息。

依赖项

~6–16MB
~191K SLoC