Flipper BUSY Bar

Marius

Flipper BUSY Bar

一篇关于 Flipper BUSY Bar 的评测——这是一款配备 72x16 RGB LED 点阵、搭载 GPL 固件、提供 HTTP API 并兼容 Matter 的桌面设备,来自曾打造过 Lemon 的作者。

Flipper BUSY Bar

是的,它的确真实存在,我正把它拿在手里。在 Flipper 于各类线上帖子中用这款神秘设备吊足大家胃口、感觉像是过了好几年之后,我终于可以确认它是真的了。

BUSY BarFlipper Devices 推出的一款重 250 克的桌面设备,这家公司正是 Flipper Zero 以及仍在紧张开发中的 Flipper One 背后的团队。它本质上是一块小显示屏,在 72x16 的 RGB LED 点阵上显示各种内容,就本文撰写时而言,其主要卖点是可运行番茄钟风格的专注计时器,并且拥有一个完整的 HTTP API,可通过 USB、局域网和互联网对其进行控制。

BUSY Bar 顶部有一个五档拨动开关,可在两种专注模式(BUSYCUSTOM,两者功能完全相同,仅默认设置不同)、OFF 档(实际上更像是休眠模式,会关闭两块屏幕)、目前仅包含时钟的应用档,以及用于设置的设置档之间切换。中间有一颗大的机械按键用于开始和暂停计时,一个滚轮用于调节时间并兼作 OK 键,最后还有一个返回键用于返回导航。

说到背面,设备背面有一块 1.54 英寸单色 OLED,可显示计时器、电量百分比以及 Wi-Fi、蓝牙和 USB 指示图标。这样一来,即使用户将设备通过内置支架夹在显示器顶部边缘、使主点阵屏背向用户,设备对用户本身也依然可用。

规格

设备尺寸为 168.6 x 55.2 x 40.8 毫米,重 250 克/8.82 盎司。机身采用 PC/ABS 材质,正面和背面面板为 PC,显示器支架的缓冲垫为 TPE。支架适用于厚度不超过 21 毫米的显示器,我可以确认它在曲面显示器上也能正常使用。不过,如果你的显示器特别薄(比如某些便携式显示器),它就无法稳固地架在顶部了。

Flipper 官方文档中公布的完整规格如下:

规格详情
主显示屏72x16 RGB LED 点阵,有效显示区域 158.4x35.2 毫米,60 Hz;LED 尺寸 1.23x1.2 毫米,间距 2.2 毫米,共阳极;ICND2153 + ICN2012 驱动;通过光线传感器实现手动或自动亮度调节
背面显示屏1.54 英寸单色 OLED,160x80,16 级灰阶,60 Hz;通过 SPI 连接的 SSD1320 控制器
主控 MCUSTM32U595RI,Arm Cortex-M33 @ 160 MHz,带 MPU、FPU 和 DSP;2 MB 闪存,2.5 MB SRAM
无线 MCUSilicon Labs SiWG917M111MGTBA,Arm Cortex-M4F @ 180 MHz;8 MB 闪存,672 KB SRAM
无线连接Wi-Fi 6 (IEEE 802.11 b/g/n/ax),仅 2.4 GHz,WPA3;Bluetooth Low Energy 5.4
存储8 GB eMMC NAND
音频单声道;通过 I2S 以 44.1 kHz 连接的 NS4168 DAC,内置 D 类功放;6 欧,0.8 W
电池1 节 18650,3250 mAh,A2007-H04 4 针接口;具备过充、过放、过温和欠温保护
充电使用 18 W 或更高功率的 PD 充电器需 2.5 小时,否则需 7 至 8 小时
USB-CUSB 2.0 Full Speed 设备,12 Mbit/s;PD 3.0,5V⎓3A 和 9V⎓1.5A
操控机械开关、滚轮编码器、五档模式选择开关、返回键

72x16 点阵由 ICND2153 驱动,这是一款 16 通道恒流 PWM 灌电流驱动器,带有 16 位灰度移位寄存器、LED 开路检测以及用于减少重影的预充电电路,搭配 ICN2012 8 通道电源开关使用。

在 2026 年,Wi-Fi 仅支持 2.4 GHz 多少让人有些遗憾。在充满各种设备和微波炉的办公环境中,该设备处于目前最拥挤的频段上。USB 方面也只能说保持了轻量化,最高速率仅 12 Mbit/s,不过对于提供网页界面和 HTTP API 的虚拟以太网接口来说,这肯定已经足够了。

在充电方面,文档要求使用 18 W 或更高功率的 PD 充电器才能达到 2.5 小时的充电时长,而设备本身似乎仅支持 5V⎓3A(15 W)和 9V⎓1.5A(13.5 W)两种 PD 模式。

关于显示屏亮度存在一处不一致:技术规格页完全没有标注亮度数值,产品页目前标注为 400 尼特,而来自 CNX SoftwareXDA 的首发报道则均引用为 800 尼特。我没有测量设备,无法判断究竟是哪个数值,但可以保证的是,即使在光线明亮的环境中,它的亮度也完全足够。

内部结构

Flipper 在 iFixit 上发布了官方拆解指南,这非常棒。该指南的 21 个步骤展示了一款以可维修性为设计考量的设备。后盖由 8 个卡扣固定,用塑料撬片即可取下。其下方有 5 颗十字 PH1 螺丝,底部 1 颗,背面 4 颗。电池采用按压式卡扣连接器,在进行其他任何操作之前需先断开。显示屏排线使用撬棒式卡扣,主 PCB 由 3 颗螺丝固定,控制 PCB 由 5 个卡扣固定,前显示屏背盖由 6 个卡扣固定,按键稳定器由 3 颗螺丝固定。显示器支架支脚为摩擦配合。

没有任何部件使用胶水粘合,电池是采用 4 针接口的标准 18650 电芯,这意味着在大多数电子商店都能轻松且便宜地买到替换件。对于一款 2026 年的消费级设备来说,这大概会让我的 Right to Repair 拥护者同伴们感到欣喜。

固件

固件源码托管在 GitHub 上的 busy-app/busybar-firmware。大部分第一方代码采用 GPL 协议,furi 库为 MIT 协议,图形资源为 CC-BY 4.0,字体为 OFL 1.1,所有这些都在一份 REUSE 清单中声明。

构建系统为 FBT,即与 Flipper Zero 相同的基于 SCons 的 Flipper Build Tool,依赖列表是典型的嵌入式技术栈:底层为 FreeRTOS,其上是 Flipper 自家的 furi 抽象层,lwIP 负责 TCP/IP,TinyUSB 负责 USB 设备端,Mongoose 作为嵌入式 HTTP 和 WebSocket 服务器,mbedTLS 负责 TLS,LVGL 负责 UI。

该设备还包含了位于 lib/jerryscript 中的 JerryScript,通过 lib/js_appjs_runner 服务进行对接。这与 Flipper Zero 用于脚本应用的 JavaScript 引擎相同。既然固件中已经内置了该引擎,目前似乎唯一欠缺的就是将自己的脚本加载到设备上的正式文档化方法。

HTTP API

BUSY Bar 运行着一个 HTTP 服务器,并通过三种传输方式提供相同的 API,文档以 OpenAPI 3.1 形式提供。

通过 USB 将设备插入电脑后,会出现一个虚拟以太网接口,设备固定地址为 10.0.4.20,印在机身背面。http://10.0.4.20/ 是本地网页界面,http://10.0.4.20/docs 是由设备当前固件生成的 API 参考,http://10.0.4.20/api 则是该 API 的基础 URL。通过 USB 访问时无需认证,但通过 Wi-Fi 时可以使用认证,而通过 Flipper 云端访问时则必须使用认证。

示例

curl -s http://10.0.4.20/api/status/power
{
  "state": "discharging",
  "battery_charge": 99,
  "battery_voltage": 4183,
  "battery_current": -180,
  "usb_voltage": 4843
}

该请求会返回当前的电源状态。电池电流单位为 mA,电池和 USB 电压单位均为 mV,这意味着你无需任何额外硬件即可绘制设备自身的功耗曲线。

注意: 通过 Wi-Fi 的访问默认处于禁用状态,必须先通过 USB 在本地网页界面中启用。启用后,你可以为认证挑选一个令牌,如果设置了令牌,则需将其放入 X-API-Token 请求头中:

curl -s http://192.168.1.42/api/status \
  -H 'Accept: application/json' \
  -H 'X-API-Token: 12345678'

通过互联网的访问则通过 Flipper 云端进行,需使用在 cloud.busy.app 生成的 bearer token,其作用域可以是单台设备或整个账户:

curl -s https://api.busy.app/busybar/status \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer <token>'

Flipper 为 Python 维护了 busylib,同时提供同步和 asyncio 客户端。它将方法名直接映射到 API 路径,因此 /api/display/draw 变为 display_draw/api/storage/remove 变为 storage_remove。这使得 OpenAPI 文档可直接作为该库的参考文档使用:

from busylib import BusyBar, types

bb = BusyBar("10.0.4.20")

bb.display_draw(
    types.DisplayElements(
        application_name="my-app",
        elements=[
            types.TextElement(
                id="status",
                type="text",
                x=2,
                y=4,
                text="BUILDING",
                font="small",
                display=types.DisplayName.FRONT,
            ),
        ],
    )
)

该库还有一个 converter 模块,可为设备缩放和重新编码图像与音频,一个用于 _busybar._tcp 的 mDNS 发现助手,以及固件兼容性检查功能。

除此之外,还有面向所有 soydevs 的官方 TypeScript 库,以及一个社区维护的 .NET 客户端。另外还有一个 Zig 库,不过……稍后再详谈。:-)

智能家居

BUSY BarMatter 中表现为单个开/关端点,即一个可配置启动状态为 offontogglelast 的模拟开关。将其开启会启动 BUSY 计时器,关闭则会结束计时,从而使该集成成为一个触发器。将状态报告回 Matter 需要在设置 ➔ 智能家居中开启,此时专注会话可以驱动诸如调暗灯光或在计时器开启时锁定房门等自动化操作。

配对通过背面屏幕或网页界面上的二维码完成,设备可同时加入多个 fabric。

Home Assistant 集成通过 HTTP API 使用通用 REST 功能实现,双向均可工作,即设备既可作为自动化触发器,也可作为家中其他设备的输出端。

应用

BUSY Bar 为智能手机提供了配套移动应用。我测试了它的 iOS 应用,怎么说呢,还算过得去吧。我本身就不是重度智能手机应用用户,不过还是在此谈谈我的两点看法。

该应用基本上镜像了设备的当前状态,并提供对其的粗浅控制。当你启动计时器且已通过 Flipper 云端完成应用设置后,你会看到应用推送一条常驻通知,在智能手机的锁屏上显示计时器。还可以配置勿扰模式,以在计时器运行时阻止其他应用打断你的专注会话。

对我来说这些都是噱头,但对其他人来说这些功能或许有一定价值。话虽如此,这些应用的评分并不算高,虽然在测试 iOS 版本的几天里我没有遇到任何问题,但该应用在外观和功能上都给人一种有些廉价的感觉。感觉就像是大型硬件厂商中那些自以为跟上当代年轻人需求的企业老派人士会做出来的应用。

不足之处

不过仍有一些让我介意的地方,但都算不上真正的硬伤。

Wi-Fi 认证是一个单一的共享数字密钥,受 API 模式限制为 ^[0-9]{4,10}$,通过未加密的 HTTP 以明文请求头在局域网内发送。在四位数的最小长度下,其密钥空间仅有 10,000 种可能,且我未发现任何速率限制的文档说明。访问模式枚举中除了 key 之外还包含一个 enabled 值,这意味着 API 可以在局域网上以完全无密钥的方式开放。因此,最好使用十位数字的密钥,并让设备远离你无法控制的网络。

然后就是各种即将推出。用户应用的安装、JS SDK、Windows 应用程序以及更丰富的应用库,这些都还是未来的承诺。我毫不怀疑 Flipper 团队最终会实现它们,但我可以想象,对于非技术用户来说,买到一台目前几乎干不了什么的设备,尤其是还在 Windows 电脑上使用时,可能会非常令人沮丧。今天到手的这台设备就是一个专注计时器、一个时钟和一个状态显示器。

最后是价格。首发价格为等候名单成员 179 美元,前 3000 台为 199 美元,最终零售价据称将为 249 美元。以 249 美元的价格来看,尤其是在目前的软件状态下,它很难让人觉得物有所值。如果你是技术用户并且真的想折腾它,或许还值这个价,但正如我过去所展示的,你可以自己以显著更低的成本打造一台类似的设备,尤其是当你已经深陷折腾的兔子洞时。

总结

Flipper 打造了一款我预料中他们会打造的设备,这话是我由衷的赞美。硬件对于一个状态灯来说过度设计得恰到好处,一如 Flipper 硬件一贯的风格,配备了真正的机械开关、真正的编码器、可更换的 18650 电池、官方拆解指南,并且全机无任何胶水。

它是否物有所值完全取决于你的用途。作为一个告诉同事走开的设备,它太贵了而且根本没什么效果,因为那些会打断你的人并不会被一块写着勿扰的牌子所劝退。换句话说:以比 BUSY Bar 零售价低大约 50 美元的价格,你可以在桌上放上 Smith and Wesson 的多款型号中的一款,它很可能会是更有效的阻止同事搭话的方式。

然而,作为一块小巧、做工精良、完全可编程的 RGB 点阵屏,配备 8 GB 文件系统、WebSocket 以及一套精密的优先级系统,使多个程序可以共享同一块屏幕而不会相互覆盖,它是其同类中最开放、也可能是最好的产品,我期待社区能发掘出 Flipper 尚未想到的用途。

PS: 关闭 BUSY Bar 就像退出 Vim 一样,因为它没有提供显而易见的方法。是的,顶部的开关有一个 “OFF” 档。然而,那只是关闭显示屏,但 BUSY Bar 仍在运行并保持 Wi-Fi 连接。如果你想完全关闭设备以使其不再消耗电量,你必须将开关拨到 “Settings” 档,依次进入 SystemPowerShutdown,并以 Yes 确认关机。只有这样设备才会真正关闭。

Bonus: busybar.zig

如前所述,我想随这篇评测分享一个小小的额外福利,那就是一个尽可能贴近实现 BUSY Bar 当前 OpenAPI 规范的 Zig 库,以及一个可让你通过 HTTP API 控制设备的 busybar 命令行工具。

该库仅使用 Zig 的 std 库,因此支持 Zig 的所有平台目标,并且轻量易用。我一直在我的 BUSY Bar 上使用它,效果非常好。命令行工具包含一些提升使用体验的功能,比如用于启动和停止忙碌模式的简单命令,否则就需要手动编写 JSON 负载了。

长话短说,如果你也是已订购 BUSY Bar 的人之一,并且正想将其集成到 Zig 工具中,或仅仅想通过自己的脚本将其集成到桌面环境中,我邀请你查看 busybar.zig 仓库。如果你只想找个 CLI 工具来把玩你的 BUSY Bar,可以在 GitHub 上的 发布页面找到面向所有受支持平台的构建版本。

原文由 Marius 发布

本文章由 muse-spark-1.2-contributor 进行翻译