ttarlov/kove-dash

GitHub: ttarlov/kove-dash

一款 Android 应用,通过逆向工程 Kove 450 Rally 仪表盘的通信协议,将手机 Mapbox 导航画面经 Wi-Fi/BLE 实时投屏至原装 TFT 屏幕。

Stars: 1 | Forks: 1

# KoveDash 一款 Android 应用,可将实时导航投屏至 Kove 450 Rally 原装 TFT 仪表盘上,利用仪表盘自带的 Wi-Fi 和 BLE 链接。无需 OEM 应用,无需云账号,无需激活服务器。该仓库还包含对逆向工程的连线协议的完整文档,如果你没有这辆特定的摩托车,这可能是其中最实用的部分。 状态:实验性。基于运行固件 `SV=3.0.4` 的单台 2022 款仪表盘开发并测试。它在我的车上运行正常。你的情况可能会有所不同——请参阅[兼容性](#compatibility)。 [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) ## 功能 - 一键连接:加入仪表盘的 Wi-Fi AP,执行 OEM BLE 握手,启动仪表盘所需的 TCP 监听器。无需干预即可在关钥匙/开钥匙循环中保持存活。 - 仪表盘实时导航:手机 GPS → Mapbox 路线 → 渲染至辅助 `Presentation` 显示 → H.264 → 通过 TCP 串流。包含转向提示横幅、偏航检测、自动重新规划路线。 - 带有自动补全功能的目的地搜索 (Mapbox SearchBox)。 - 根据手机设置仪表盘时间。 仪表盘还会通过 BLE 广播遥测数据(速度、里程表、胎压、油位、续航里程)。数据帧已在协议笔记中记录;在应用中对其进行解码和显示已列入[路线图](docs/ROADMAP.md)。 `proto-poc/` 中的 Python 概念验证版本早于该应用。它仍然是连线协议的参考实现,便于进行台架测试。 ## 兼容性 Kove 仪表盘生态中存在两个互不兼容的协议家族: - SiQi/ThinkerRide —— 较旧的仪表盘,包括本项目基于其开发的 2022 款 `SV=3.0.4` 设备。这是本应用所使用的协议。 - Eryanet —— 较新的仪表盘。信封格式不同,BLE UUID 不同,TCP 角色反转。目前尚不支持,但其连线格式已在 [`proto-poc/PROTOCOL.md`](proto-poc/PROTOCOL.md) 中进行了部分记录。 如果你没有旧协议家族的硬件,该应用将无法与你的仪表盘进行端到端的通信。移植到 Eryanet 是目前最大的未竟工作。 如果你拥有任何 Kove 仪表盘,无论固件版本如何,提供一份硬件报告都会有所帮助:固件字符串、BLE 扫描结果(服务为 `0000e0ff-...` 代表 SiQi,`0000aaa0-...` 代表 Eryanet),以及仪表盘 AP 地址。我们为此提供了一个[issue 模板](.github/ISSUE_TEMPLATE/)。 ## 工作原理 ``` Phone (this app) Kove dash (Wi-Fi AP @ 192.168.10.1) ┌───────────────────────────┐ ┌──────────────────────────────┐ │ Mapbox nav Composable │ │ │ │ → Presentation display │ │ │ │ → VirtualDisplay │ │ H.264 decoder → TFT panel │ │ → MediaCodec (H.264) │ ── TCP 15456 ────► │ │ │ │ ── TCP 15457 ◄───► │ heartbeat │ │ TCP servers (phone=server)│ ◄── 17818 ─────── │ device control / telemetry │ │ BLE client (ffe1/ffe2) │ ◄── BLE ─────────► │ telemetry + time sync │ └───────────────────────────┘ └──────────────────────────────┘ ``` 手机作为 TCP 服务器;仪表盘作为客户端拨号连接。从协议中无法直接看出的一步是:骑手必须在仪表盘上长按“向上”键使其进入投影模式,这样才能让它连接到手机的视频 socket。这在 Kove 用户手册中有说明,但在任何配套应用中都没有提及。详情见 [`proto-poc/PROTOCOL.md`](proto-poc/PROTOCOL.md)。 ## 构建 你需要 JDK 17、Android Studio 或命令行工具,以及 Mapbox token(对于个人使用来说,免费额度绰绰有余)。 ``` # 1. 在 https://account.mapbox.com/ 创建 token: # 一个 public token (pk.*) 和一个带有 DOWNLOADS:READ scope 的 downloads token (sk.*)。 # 2. 配置: cp app/local.properties.template app/local.properties # 编辑 app/local.properties:两个 token + 你的 SDK path。 # 3. 构建并安装: cd app ./gradlew :app:installDebug # 4. 单元测试(无需硬件): ./gradlew :app:testDebugUnitTest ``` 无需摩托车即可开发和测试应用的大部分功能——UI、地理编码、路线规划、协议编码/解码以及编码器流水线均可在模拟器上运行。只有在进行最终的仪表盘往返测试时才需要硬件。请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)。 ## 仓库布局 | 路径 | 内容 | |---|---| | `app/` | Android 应用 (Kotlin, Jetpack Compose) | | `proto-poc/` | Python 概念验证及台架工具;协议参考实现 | | `proto-poc/PROTOCOL.md` | 完整的逆向工程连线协议 | | `docs/ARCHITECTURE.md` | 应用结构说明 | | `docs/ROADMAP.md` | 计划工作与待解决问题 | | `docs/re/` | 逆向工程报告 (ThinkerRide, GreenTrip, Eryanet, 投影编码器) | ## 安全与法律 本软件驱动的屏幕安装在行驶中的摩托车上。冻结、错误或令人分心的显示可能导致车祸。使用风险自负,不要将其作为唯一的导航工具,并请目视路况。无任何保证——请参阅 [LICENSE](LICENSE) 第 7-8 条。 这是一个独立的互操作性项目,不隶属于 Kove、SiQi、BlueStar 或 Eryanet,也未获得其认可。该协议是通过观察流量和分析公开发布的配套应用来记录的,旨在与我拥有的硬件实现互操作。不包含或重新分发任何专有或反编译的 OEM 代码——请参阅 [NOTICE](NOTICE)。 我在进行这些操作时没有损坏过仪表盘,但向嵌入式固件发送意外输入总是存在一定风险。该风险由你自行承担。 ## 贡献 请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md) 和[路线图](docs/ROADMAP.md)。目前最有用的工作包括:Eryanet 协议支持、来自其他固件版本的硬件报告,以及一些可在台架上完成的 issue(遥测 UI、摄像头边界适配、语音提示)。 ## 许可证 Apache License 2.0 —— 请参阅 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
标签:Android 应用, Wi-Fi通信, 实时导航, 物联网协议, 蓝牙通信, 车载屏幕互联, 逆向工具, 逆向工程文档