本文主要面向 硬件、嵌入式、App、售后联调 开发者,汇总了涂鸦出行品类(电动车、电摩、滑板车)开发者与集成商在产品落地、配网联调、量产上线过程中遇到的高频问题,覆盖 DP 上报、调试工具、HID 感应解锁、车辆体检、骑行轨迹与导航、地图选型、消息推送、配网与连接故障排查 等场景。适用于涂鸦开发者平台与公版 App(涂鸦出行/Tuya Ride)的能力。
dpXX 指设备的 DP ID(功能点编号),具体功能名/标识符以平台 DP 列表实际配置为准。
建议上报规则:
配网、重连查询时全量同步:保证云端首次拉取到完整快照。
定时循环上报的 DP 组包上报:云端按 DP 数量计算设备的上报量,组包能显著降低条数与 4G 流量。
其他场景按变化上报:DP 值无变化不要重复上报。
无需云端记录的 DP 不上云:例如 骑行时间、车速 等只需本地展示的数据。
BLE+X 设备的骑行轨迹相关 DP 必须组包上报,建议上报频率 5~10 秒一次,避免单点风暴。
上报频率与组包策略直接影响日云端账单,新设计请从开始就严格遵循上述规则,避免量产后被动整改。
涂鸦提供的 模组调试助手 可以让 PC 直接以串口的方式与蓝牙/4G 模组通信,是嵌入式联调阶段排错的第一道工具。它有两种典型的 扮演 模式:
模拟模组:让 PC 充当模组,验证 MCU 代码 在收到协议帧后的行为(适合 MCU 通用对接方案)。
模拟 MCU:让 PC 充当 MCU,验证 模组固件 的串口行为与配网流程(适合模组固件/TuyaOS 联调)。
前往 涂鸦开发者平台,在开发产品 > 产品开发 > 硬件开发 > 下载资料 中下载 PC 端调试工具压缩包,工具中直接附带使用说明。


打开调试助手后,完成以下操作步骤:
首先,可以单击 切换协议 在 MCU 模拟 和 模组模拟 之间切换并完成相应配置。
在 设置 下,完成以下配置:
| 方案 | 工作模式 |
|---|---|
| 通用对接模组(MCU SDK) | MCU 与模块配合处理 |
| TuyaOS 方案(模组直接跑业务) | 模块自处理 |

在 操作 下,可以按协议字段直接发起串口指令,验证模组对 DP、配网指令的响应。

涂鸦出行品类的 App 文案、面板提示、故障告警等均从平台多语言配置读取,多语言不配置 = 上报到 App 端为空白或显示原始 Key。您可以参考以下图示完成多语言配置,也可以参考 产品多语言配置。



输入对应词条各语种的描述。其中,简体中文 和 英语 为必填内容,其他语种可按需求配置。
自定义 DP/自定义故障值上线前,必须 把对应多语言条目补齐;漏配的字段在 App 端会直接显示英文 Key 或空字符串,是售后投诉的常见来源。
电池数据是出行品类最重要的呈现项,建议从 整包概要 与 单体明细 两个维度组织 DP:
| 维度 | 推荐 DP 类型 | 典型字段 | 说明 |
|---|---|---|---|
| 整包概要 | 标准 DP(Value/Enum/Bitmap) | SOC、总电压、总电流、电池温度、充电状态、循环次数、估算续航 | App 公版面板与首页直接呈现,必须按变化上报 |
| BMS 故障 | Fault/Bitmap | BMS 通信故障、过充、过放、过温、单体压差告警等 | 用于车辆体检与告警推送,请参考 车辆体检 |
| 单体明细 | Raw DP | 各串电芯电压(mV)、温度(℃)、内阻、均衡状态 | 二级页/工具页查看;BMS 协议私有字段都用 Raw 透传 |
具体 DP ID/标识符请以 产品配置 > 功能定义 中实际选用的标准 DP 为准;自定义 DP 一律配齐多语言。了解更多,可参考 多语言配置。
SOC 抖动过滤:BMS 原始 SOC 可能瞬时跳变 1~2 %,建议设备端做平滑(滑动平均/滞回)后再按变化上报。
充电状态切换必报:未充电 → 充电中/充满 → 拔电 的状态变化必须主动上报,否则 App 端不会及时切到充电动画。
单位与字节序在文档里固化:电压常见单位 0.01 V/mV,电流常见单位 0.01 A/mA;单位/字节序/是否带符号必需要在协议文档中写清楚,避免双方各自实现造成 App 端面板返工。
BMS 协议透传走 Raw:国内常见 BMS 的私有协议建议封装成 Raw DP 透传,App/云端再按 BMS 厂商协议解析。
BLE+X 设备:电量、电压、故障 这类高频 DP 在骑行场景中应一并组包上报,详细请参考 DP 上报规则。
电动车 App 端通常提供 NFC 卡片 与 开机密码 两种本地解锁方式,作为 蓝牙 LE/App 解锁之外的兜底入口(手机没电、网络异常、HID 暂不可用时仍能开机)。
| DP ID | DP 名称 | DP code | 传输类型 | 数据类型 | 说明 |
|---|---|---|---|---|---|
| 81 | NFC 卡片添加 | nfc_id_input |
可下发可上报(rw) | String | 参考 NFC 卡片添加 |
| 82 | NFC 卡片删除 | nfc_id_delete |
可下发可上报(rw) | String | 参考 NFC 卡片删除 |
| 83 | NFC 卡片同步 | nfc_id_sync |
只上报(ro) | String | 上报格式:[{"nfc_id":"ID"},{"nfc_id":"ID"}];{} 个数表示 App/设备支持的卡片槽位数 |
| 84 | NFC 卡片清空 | nfc_id_reset |
可下发可上报(rw) | String | 参考 NFC 卡片清空 |
| 87 | 密码创建 | password_creat |
可下发可上报(rw) | Raw | 参考 添加密码 |
| 88 | 密码删除 | password_delete |
可下发可上报(rw) | Raw | 参考 删除密码 |
| 89 | 密码同步 | password_sync |
只上报(ro) | Raw | 上报格式:[{"pass_id":"编号","pass":"密码"},...];{} 个数表示密码槽位数 |
nfc_id_input){"publish":"1"}{"publish":"0"}{"upload":"1"}{"upload":"2"}{"upload":"4"}{"upload":"5"}{"upload":"6"}nfc_id_delete){"nfc_id":"编号"}{"upload":"1"}{"upload":"0"}nfc_id_reset){"publish":"1"}{"upload":"1"}{"upload":"0"}password_creat){"pass_id":"编号","pass":"密码"}(每次仅一组){"upload":"1"}{"upload":"0"}{"upload":"2"}password_delete){"pass_id":"编号"}{"upload":"1"}{"upload":"0"}nfc_id_sync,例如最多 3 张卡时上报 [{"nfc_id":""},{"nfc_id":""},{"nfc_id":""}];槽位已满则 App 禁用 添加 按钮。{"publish":"1"} 并展示约 30s 倒计时;刷卡成功后设备上报 {"upload":"1"} 并刷新 nfc_id_sync(示例:[{"nfc_id":"1234"},{"nfc_id":"4321"},{"nfc_id":""}])。用户主动退出时 App 下发 {"publish":"0"},设备上报 {"upload":"2"},无需 再同步列表。{"nfc_id":"编号"};成功则上报 {"upload":"1"} 并同步列表;失败上报 {"upload":"0"} 且 不同步。{"publish":"1"};成功则上报 {"upload":"1"} 并同步为空槽位列表;失败上报 {"upload":"0"}。扩展上报值需在 App 多语言中配置字段 ty_outdoor_dp_nfc_id_input_id。
上电/联网后先同步:设备上报 password_sync,例如最多 2 组密码时 [{"pass_id":"","pass":""},{"pass_id":"","pass":""}];已满则 App 禁用添加。
App 弹窗输入 4 位 PIN 后下发 dp87(password_creat),如 {"pass_id":"001","pass":"1234"};成功上报 {"upload":"1"} 并 password_sync 全量同步。

App 下发 dp88(password_delete){"pass_id":"001"};成功上报 {"upload":"1"} 并同步;失败上报 {"upload":"0"} 且 不同步。

扩展上报值需配置多语言字段 ty_outdoor_dp_password_creat_id。
密码相关功能点(dp87–dp89)均为 Raw 类型,云端不存储;需设备联网后由设备端主动 password_sync 初始化上报,App 才能展示本地密码列表。
0000、123456)作为出厂兜底,避免被批量利用。现象:开发者把某个版本固件下架后,App 端依然提示有新版本可升级。
解决方案:先在云端把目标版本固件上架,再到固件升级页面把发布暂停/撤销,App 端缓存自然失效。直接下架会导致版本树不完整,App 端逻辑仍按缓存指引升级。


根本原因:老版本 SDK 对固件大小做了硬限制,不支持升级大于 124 KB 的固件。
解决方案:升级 TuyaOS SDK 版本,新版本已经放开此限制;或者把固件裁剪到 124 KB 以内(仅推荐紧急规避)。

技术上选择 BLE HID + SecurityManager 实现 无需打开 App,靠近设备就能触发解锁:
手机蓝牙开启时,靠近 已配对 的 HID 设备会 自动重连。
设备根据蓝牙 RSSI 信号强度判断远近,触发开锁/关锁。
传统蓝牙 LE 设备只在 App 打开时即连即释放;HID 设备在系统蓝牙列表里 保持配对,App 端通过判断设备是否已被系统连接,决定走 读取广播响应包 或 标准连接 路径。
与传统 Tuya 蓝牙 LE 设备的关键差异:
| 阶段 | 传统蓝牙 LE 设备 | HID 设备 |
|---|---|---|
| 连接/绑定 | 即连即释放(App 打开 → 连接,App 退出 → 断开) | 系统已绑定时 App 直接读取已连接设备;未绑定时 由设备主动发起配对请求 |
| 解绑(在线) | 下发 Tuya 蓝牙 LE 命令清绑定 | 下发命令清绑定 + 同时删除手机系统蓝牙配对信息 |
| 解绑(离线) | 任意手机端/网关下发异常解绑命令 | 不支持离线解绑 |
| DP ID | 标识符 | 功能 | 备注 |
|---|---|---|---|
| dp92 | auto_unlock |
自动解锁 | 由 iOS App 下发,设备收到后主动发起配对请求 |
| dp93 | auto_unlock_pair |
无感解锁 | 由 Android App 下发,由 App 发起配对请求 |
| dp94 | fortify_distance_record |
设防距离记录 | 打开 自动解锁 后,自动关锁 自动开启 |
| dp95 | disarm_distance_record |
解防距离记录 | FR8018 HID 2.0 已忽略此 DP |
| dp96 | hid_bind |
HID 绑定 | — |
当前 App 端通过判断 是否包含 dp93 来识别 HID 版本(HID 1.0 没有 dp93),后续 App 会做版本协商升级。
Android 正常、iOS 失效
检查 DP 列表是否同时包含 dp92 与 dp93。
确认设备端是否处理 dp92 —— iOS 路径下 设备端必须主动发起配对请求。
iOS 正常、Android 失效
检查 DP 列表是否同时包含 dp92 与 dp93。
确认设备端处理 dp92/dp93 的功能逻辑分支。
确认 App 端 HID 版本 —— HID 1.0 的 Android App 不会主动发起配对请求。
设备是否开启了 HID 功能?开启 HID 后,本地解绑必须同步到手机系统蓝牙里删除该设备的配对信息,否则系统层会自动重连。
本地解绑流程是否同时清掉了设备里持久化的绑定信息。
故障型 DP 与故障值可按需 修改 / 自定义;每个 App 端 UI 槽位独立,最多支持 10 个故障型 DP。

在 产品配置 > 功能定义 中按出行公版勾选/配置故障型 DP,典型项如下(具体 DP ID 以您的产品实际为准):
| DP 名称 | DP code | 传输类型 | 数据类型 | 功能点描述 |
|---|---|---|---|---|
| 故障检测 | fault_detection |
可下发可上报(rw) | 布尔型(Bool) | 用户主动体检入口;App 下发 1 触发检测 |
| 动力系统 | power_system |
只上报(ro) | 故障型(Fault) | 故障值:
|
| 智能系统 | smart_system |
只上报(ro) | 故障型(Fault) | 故障值:
|
| 锂电系统 | lithium_battery |
只上报(ro) | 故障型(Fault) | 故障值:
|
| 电子系统 | electronic_system |
只上报(ro) | 故障型(Fault) | 按方案自定义故障位;需在多语言中为每位配置展示文案 |
配置说明:
故障型 DP 与故障值可按需 修改/自定义;每个故障型 DP 在 App 端都做了 UI 区分,最多支持 10 个故障型 DP。
故障值的展示文案 必须在多语言里配置,否则 App 端故障弹窗会出现空白条目。
故障型 DP 数据格式:长度 1/2/4 字节,按 位(bit) 表示具体测试项有无异常;超出定义的位补 0;如果把超出范围的位置 1,会触发异常分支。
举例:动力系统(含 8 个故障值)
current_fault, voltage_fault, line_fault, power_tube_fault,
hall_sensor_fault, temp_sensor_fault, com_bus_fault, drive_fault
| 上报值 | 含义 |
|---|---|
0x00 |
8 项均无异常 |
0x03 |
bit0、bit1 异常,即 current_fault + voltage_fault 异常,其余正常 |
对应的串口数据包(动力系统 0x03):
55 AA 00 07 00 05 1C 05 00 01 03 30

进入 产品配置 > 多语言管理 > 产品功能,找到对应故障型 DP,把每个故障值的多语言文案补齐。自定义故障型、自定义故障值 必须完整配置多语言,否则 App 端会出现 Key 字符串外露。



用户主动体检
用户在 App 单击 车辆体检/重新体检,App 下发 fault_detection=1。
设备端收到后执行本地体检,完成后上报 fault_detection=1,同时上报全部故障型 DP。
App 端以收到 fault_detection=1 上报的时间作为体检时间,并统计上报的故障数量。
App 下发后会启动 60 秒 定时器,倒计时结束未收到上报会报错。所以 务必不要漏报。
设备主动上报
车辆发生故障时,设备可主动上报故障 DP;可在涂鸦开发者平台对故障信息配置 FAQ 条目与消息推送,触发时直接推到用户 App 消息中心与系统通知栏(前提是产品已开通消息推送服务)。
关于设备消息推送,请参考 推送设备消息。
| 维度 | 蓝牙车 | 4G 车 |
|---|---|---|
| 定位来源 | 手机 GPS | 设备 4G 模组定位 |
| 上报通道 | App 上报 | 设备直接上报,云端落库 |
| 进入轨迹方式 | 必须手动点 开始骑行 | 点开骑行导航即直接进入虚拟仪表盘 |
| 流程 | 地图导航 > 开始骑行 > 虚拟仪表 > 上报(云端补齐时间)> 退出 | 地图导航 > 虚拟仪表 > 上报(云端补齐时间)> 退出 |
若蜂窝未插卡/未激活,骑行轨迹按 蓝牙逻辑 生成;蜂窝成功激活后,按 蜂窝逻辑 生成。
通过监听 开始骑行/结束骑行 按钮点击生成轨迹;如果直接返回首页/杀进程,需要等一段时间才会形成轨迹。
设备上报速度 ≠ 0 时,App 才上报 GPS 位置;速度 = 0 时不上报。
本次里程 < 100 m 的不会形成轨迹(避免误触)。
GPS 在室内会漂移,速度 = 0 的 GPS 点在轨迹生成阶段会被过滤(骑行过程中不过滤)。
相关 DP 有变化即上报即可,不需要组包:
start = 1(已上报过)
速度
本次里程
电量
客户在涂鸦开发者平台 DP 列表选择 单次骑行时间/单次平均速度:优先取设备上报值。
没选这两个 DP:云端从轨迹起点开始计时,并用 本次里程/单次骑行时间 计算单次平均速度。
启动(ACC=1)、单次里程、速度、电量、GPS
云端 同时收到 start=1、本次里程、GPS 数据的点。每次启动时,第一个点的本次里程 = 0。
车辆启动:组包上报上述 5 个 DP。其中 start=1、本次里程、GPS 必报,速度、电量选报。
行驶过程:持续组包上报上述 5 个 DP,频率建议 5~10 秒 / 次,使用默认通道,优先走蜂窝。
车辆熄火:组包上报上述 5 个 DP。其中 start=0、本次里程、GPS 必报,速度 、电量选报。
单次骑行时间/单次平均速度的取数策略与蓝牙车一致。
搜索目的地后点开始骑行 才是骑行导航;直接点开始骑行 是轨迹记录。




仪表上的转向箭头由方向 Code 驱动,Code 与转向类型的对应关系如下:
| 字段 | 数值 |
|---|---|
| 左转图标 | 2 |
| 右转图标 | 3 |
| 左前方图标 | 4 |
| 右前方图标 | 5 |
| 左后方图标 | 6 |
| 右后方图标 | 7 |
| 左转掉头图标 | 8 |
| 直行图标 | 9 |
| 进入环岛图标 | 11 |
| 驶出环岛图标 | 12 |
| 到达目的地图标 | 15 |
| 标准小环岛,绕环岛左转,右侧通行地区的逆时针环岛 | 21 |
| 标准小环岛,绕环岛右转,右侧通行地区的逆时针环岛 | 22 |
| 标准小环岛,绕环岛直行,右侧通行地区的逆时针环岛 | 23 |
| 标准小环岛,绕环岛调头,右侧通行地区的逆时针环岛 | 24 |
| 用途 | 区域 | 平台 | 服务商 |
|---|---|---|---|
| 地图 | 国内 | Android | 高德 |
| 地图 | 国内 | iOS | Apple 地图 |
| 地图 | 海外 | Android | 谷歌 |
| 地图 | 海外 | iOS | Apple 地图 |
| 导航 | 国内 | Android | 高德 |
| 导航 | 国内 | iOS | 高德 |
| 导航 | 海外 | Android | Mapbox |
| 导航 | 海外 | iOS | Mapbox |

Apple 地图 无需 申请地图 Key;其余地图/导航服务都需要按区域申请对应 Key 并填写到 App 控制台。
资源链接:
地图 Key 错误/过期/限流时,App 端常见的视觉表现:

排查顺序:控制台 Key 是否过期、是否限制了 SHA1 签名、是否限了 IP 或域名、是否选错环境(Debug vs Release)。
参考文档:车辆地理围栏
App 端消息中心/系统通知栏的推送消息由涂鸦云侧 设备消息服务 触发。
自查清单:
在产品配置 > 消息推送/告警服务 中确认目标 DP 已经配置了消息模板(含多语言)。
设备端确认 DP 上报到云端可见(在产品调试面板里能看到 DP 值变化)。
App 端在 我的 > 消息中心 > 消息设置 中确认对应分类的开关已开启,系统通知权限已授予。
若链路仍异常(消息已下发但 App 收不到,或缺少推送条目),请联系对接的涂鸦项目人员或 提交工单,由涂鸦支持协助查询 消息发送单/UID 推送状态。
Debug 版本 App 没有 消息推送通道,要验证推送链路 请使用 Release 包。
蜂窝模组上报蓝牙版本号有两个时机:
蜂窝开机 → 发送查询版本协议给蓝牙 → 蓝牙回复 → 蜂窝在连上服务器后上报。
通过蜂窝给其它外设升级完 → 蜂窝重新发送查询信息指令给蓝牙 → 蓝牙回复后蜂窝上报。
除以上两种场景,蜂窝默认不会主动上报蓝牙版本号;蓝牙回复的版本号也只在蜂窝模组的内存中保留。
排查路径:
TuyaOS:确认设备是否打开了广播。
nRF Connect 用法可自行上网搜索,如参考百度经验。
配网状态:
0x41(未配网):设备尚未绑定账号,可被 App 普通搜索 发现并发起配网;常见于出厂或解绑后的广播(Service Data 首字节为 0x41)。0x49(已配网):设备已绑定某一账号,必须先解绑 才能被新账号 App 搜到并连接。配网模式:
0x06(自发现 + 扫码配网):App 可通过 设备列表搜索 发现设备,也支持 扫码 配网;Manufacturer Data 首字节为 0x06 时通常表示该能力。0x08(扫码配网):App 不会 用普通搜索发现,只能 扫码 完成配网;若 nRF Connect 能扫到但 App 列表没有,优先核对是否为 0x08。
可能原因:
配网成功后,App 紧跟着发送一个查询设备型号的命令(0x00),设备在超时时间内没有响应,导致 App 主动断开连接。此时,需要检查设备端对 0x00 命令的处理逻辑。
设备 开启了强绑定功能,且 未在老账号上解除绑定。请参考下文 A 账号未解绑、B 账号无法连接。
涂鸦把 人 和 设备 的绑定关系分成 强绑定/中绑定/弱绑定 三个等级,配置在 PID 上,可随时更改、即时生效(跨区强绑定 例外,需经过移除 + 激活事件后才生效)。
| 等级 | 释义 | 典型场景 |
|---|---|---|
| 强绑定 | 当前用户必须先在 App 解绑,下一个人才能配网;设备调云端重置接口会被云端拒绝 | IPC、门锁、对安全性要求高的电动车 |
| 中绑定 | 限制弱于强绑定,常用于 卖出后通过工单解绑 场景 | — |
| 弱绑定 | 设备本地重置即可让新账号配网 | 无安全敏感的家电 |
未绑定即不受约束:调用 active 激活成功但还没绑用户的设备,可被第二次激活。
同家庭管理员豁免(2023.05.18 起):如果配网人对设备所在家庭有 管理员权限,允许直接二次激活,不必走 先解绑。
判同设备的依据是 UUID:云端按 UUID 区分设备;物理上同一台设备烧不同 UUID 会被云端当作两台,不同物理设备烧同一 UUID 会被当成一台。
强行配网会被拒:同区/跨区 App 端均会提示 设备已被别人绑定,您不能配网。
App 内自助(推荐,较快):用绑定账号登录 → 设备详情 → 移除设备/解绑并清除数据。
走涂鸦支持:如遇旧账号联系不上、测试样机不知去向、客户已离职等情况,请 提交工单 并提供 PID + UUID + MAC,由涂鸦运营在后台帮助解绑。
A 账号连接设备
└─ 断连后设备本地重置
└─ 设备广播为「未绑定」状态
└─ B 账号能发现设备但连接不上(App 主动断开)
└─ A 账号原界面无法直接连接,但可以「添加设备」并配网成功
└─ A 账号执行「解除绑定」或「解绑并清除数据」后,B 账号才能连接
A 账号连接设备
└─ 断连后设备本地重置
└─ 设备广播为「未绑定」状态
└─ B 账号能发现设备且能直接连接成功
检查设备是否开启了 强绑定(看产品配置页 PID 的绑定级别属性)。

请检查以下:
设备是否开启了 HID 功能?开启 HID 后,本地解绑 必须 同时到手机系统蓝牙里删除该设备的配对信息。
本地解绑时是否一并清掉了设备持久化的绑定信息。
根本原因:客户在代码中直接硬编码了 三元组(PID、UUID、Authkey),同时启用独立授权流程,授权失败导致代码里写入的授权三元组失效。
解决方式:更换为一组有效三元组,并重新授权;长期方案是不要硬编码三元组,并参考 烧录授权(涂鸦开发者文档) 完成标准烧录流程。
获取设备的 MAC 地址/SN。
使用平台上的 二维码生成 工具重新生成。
把 SN 镭射贴附到设备上即可。
这里的 跨区 指设备在 A 区域生产,在B 区域激活与使用。
关键规则:
共享设备跨区激活 与 蓝牙跨区同步 两个高级能力 必须打在下单 PID 上,不要打在激活后的 PID 上。
激活后的 PID 在激活之后才能确定,而上面两个标位是在 设备发现阶段(激活前) 使用,所以采用的是 下单时的 PID 进行判断。
如果两个标位被错误地打到激活后的 PID 上,自查方式:
在产品配置页 核对 PID 与授权 PID 是否一致。
联系与您对接的涂鸦项目人员核查设备 下单 PID 与授权状态(涉及内部 授权信息查询 工具)。
排查顺序:
天线/屏蔽:检查产品硬件、模组天线是否被金属件遮挡,附近是否有电感等器件干扰。
MCU 中断负载:Application 中是否有频繁中断占用(如高频 Timer 中断):高频中断会让蓝牙中断无法正常进入,导致连接不稳定。
中断回调耗时:尽量降低中断回调里的代码运行时间,避免阻塞蓝牙协议栈。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈