本页内容 先分清三种数据接入条件与板级接线能力协商和提交确认网络、存储和内存预算配合 APP 使用故障排查地图来源
HARDWARE SDK / FreeRTOS

离线地图

下载区域道路包,接入 Core 矢量窗口、位置与显示。

手机提前下载道路数据,导航时只把路线附近的一小片道路发送给仪表。仪表自己画道路、规划路线和位置箭头;地图画布不含图片、地名或 POI。HUD 仍可单独显示路名和转向文字。

本章使用 Core 入口 moto_config / moto_sdk *,道路窗口自 r25 引入,本章基于 SDK package revision 27 / FreeRTOS ABI 8 的配套头文件、静态库及矢量版参考工程。Managed 目前只有路线/位置事件,没有地图存储端口。先按版本与迁移确认交付组合。

道路缓存用于显示,不提供离线搜索或算路。目的地搜索、路线规划、偏航重算和定位仍由手机导航服务负责。

先分清三种数据

数据 放在哪里 用途
RVS1 区域道路包 手机持久存储 提前下载一个城市或区域的道路,供导航读取;不整包发送给仪表
RVP1 道路窗口,或压缩后的 RVZ1 经 TLS TCP 5003 发送到仪表 当前路线版本、精细路线及附近道路;移动时逐个窗口更新
ROUTE、POSITION 和 HUD 已认证 Wi-Fi 主业务连接 路线、实时位置和转向提示;各自检查版本与有效期

视频仍走 UDP 5001。视频停止而导航及位置仍有效时,仪表可用本地道路窗口继续显示;位置过期后冻结最后真实位置并标记暂停。

接入条件与板级接线

先完成首次添加与主业务连接和导航。板端需要网络、暂存内存、有界解压及画线显示能力,地图路径无需 JPEG 解码器。

使用公开 P4 工程中与 r25 配套的根工程。以下是该工程的接线片段,terminal_map_* 来自 main/route_map_store.h,是需要移植的板级适配函数:

#include "route_map_store.h"

cfg.map = terminal_map_port();
cfg.route_navigation = cfg.map.max_bytes != 0;
  1. 在 SDK 所属线程中,把主业务实例的地图相关事件交给 terminal_map_event(event),并周期调用 terminal_map_poll(sdk)。BLE 辅助实例的断连不应清理主业务地图。
  2. 在显示任务调用 terminal_map_draw。fresh 表示位置仍有效,complete 表示当前视口所需道路块齐全;有地图快照不等于整个视口都有道路数据。
  3. 自行移植时,实现 moto_map_port 的暂存、连续写入、重置和 commit_vector。回调不可重入 SDK;耗时校验交给有界工作任务,等待期间返回 MOTO_AGAIN,由 SDK 后续轮询取得结果。
  4. 提交前校验解压长度、原始 SHA-256、导航/路线/地图版本及几何边界,再原子替换显示快照。moto_vector_read 返回借用原字节的只读视图;所有显示读者退出前,不能释放或修改那些字节。

参考工程的 route_vector_store 管理校验、取消和快照寿命,route_vector_view 负责画线。移植时保留这两个职责,再连接自己的内存与显示驱动。

能力协商和提交确认

手机认证后读取 PROFILE key 38,取得矢量格式版本、传输与原始字节上限、道路数量限制和压缩支持。只有地图端口完整且提供 commit_vector 时才声明矢量能力;视频能力不能代替这项协商。

阶段 要确认什么
MAP_OPEN format=1,绑定 navigationId、routeRevision、mapRevision、原始长度和 SHA-256
MAP_READY 核对回显格式和地图版本;取得任务 TLS 凭据及实际接收 offset 后才开始或恢复传输
最终 MAP_ACK 完整字节已校验并提交;核对回显格式、地图版本及已接收长度
屏幕显示 再检查视口覆盖、位置新鲜度和实际呈现;ACK 本身不是 LCD 显示证明

当前 APP 发送 RVP1/RVZ1,能力缺失时不改发图片地图。RVS1 只在手机端使用,不能直接发到 TCP 5003;MTP1/MZP1 仍表示旧图片格式。旧固件须完成矢量端口移植后才能接收当前 APP 的道路窗口。

同一路线更新窗口时只递增 mapRevision,同一版本重试须保持字节和摘要一致。路线、导航或认证连接改变后,取消旧任务并重新协商,丢弃迟到结果。

网络、存储和内存预算

地图默认使用已认证设备主机的 TCP 5003,参考热点地址为 192.168.4.1;临时 TLS 凭据来自当前加密主业务会话。手机切换网络后,重新确认目标主机和会话。

下表按 1 KB = 1024 字节计算,手机文件与仪表内存分开预算:

对象 当前上限或要求
手机单个 RVS1 区域文件 65536 KB;下载并校验后持久保存,多个区域可共同覆盖路线
仪表单个传输窗口和解压后 RVP1 各不超过 1024 KB,同时遵守 PROFILE 声明的更小传输上限
单窗口几何 最多 128 块、8192 条折线、100000 个道路点、16384 个路线点
仪表运行时内存 另计接收暂存、新旧窗口共存、解压器、任务栈、TLS、显示及视频缓冲

这些限制同时生效;1024 KB 不是地图功能所需的总 RAM。参考仪表的窗口放在临时内存中,导航结束会清除;手机已下载的区域文件继续保留。

新窗口准备失败时保留仍有效的旧窗口。仅地图 TCP 中断不清除主会话和已提交地图;主业务断连、导航结束或撤权时清理对应会话的地图与位置。位置过期不推算移动,缺失道路块不算已确认的空白区域。

配合 APP 使用

  1. 手机有互联网时,在「我的 → 离线地图」搜索并下载已发布的区域。目录只展示已经准备好的道路包,不表示任意城市都已上线。
  2. 确认下载和校验完成,再连接设备 Wi-Fi、开始导航。手机在后台工作队列提取道路窗口,无需生成地图截图。
  3. 等待设备提交确认。“设备地图已就绪”对应当前窗口,不表示整条路线周边的道路都已传到仪表。
  4. 骑行中根据位置补充窗口;超出已下载区域时补充区域数据。没有道路窗口时,仍可显示有效的路线、位置和 HUD。

锁屏后的持续定位、窗口更新和 Wi-Fi 可用性受手机系统限制,须在目标 Android/iOS 手机与固件组合上验证。地图下载完成、传输成功和实际锁屏显示分别验收。

故障排查

现象 检查项
投屏正常,提示不支持设备地图 PROFILE key 38、完整 commit_vector 端口,以及 APP/SDK/固件是否配套
区域已下载,仍提示覆盖不足 路线所需块是否在下载范围内;文件是否完成校验;缺块不能按空块处理
进度停在传输或校验 TCP 5003、任务 TLS、实际 offset、内存预算和异步校验任务
ACK 已成功,但画面不完整 complete、fresh、显示任务、坐标转换和实际 LCD 呈现
移动或偏航后还是旧地图 路线/mapRevision、任务取消、主会话和新窗口覆盖
导航结束后仍显示旧位置 NAV_END/CLOSED/UNPAIR 的来源实例、清理及旧回调过滤

地图来源

道路数据来自 OpenStreetMap / Protomaps,来源信息保留在 APP 的地图来源入口及道路包元数据中。按交付数据的许可保留署名;移除地图文字图层不免除来源说明。开源道路覆盖与手机导航服务的搜索、算路覆盖须分别确认。