这一章接两条链路:把 APP 指令交给车辆控制器,再把车辆状态回传到 APP。开始前,先完成蓝牙连接,并在后台型号中开启对应功能。
收到指令后怎么处理
APP 点“解锁” → SDK 发出 VEHICLE_COMMAND 事件
→ 你的驱动操作车辆 → 控制器确认结果 → SDK 回传 APP
收到 MOTO_EVENT_VEHICLE_COMMAND 后,用下面三个字段确定动作:
| 字段 | 含义 |
|---|---|
e.message |
哪一种控制命令 |
e.target |
控制哪个对象 |
e.value |
动作或设置值 |
具体取值使用接入包头文件中的命令定义。把整个事件复制给 CAN、串口或其他车辆驱动,完成后还要用这个事件回报结果。
告诉 APP 执行结果
控制器确认动作完成后调用:
moto_result rc = moto_terminal_complete(
terminal, &saved_event, MOTO_SUCCEEDED, 0);
saved_event 是收到这条指令时保存的事件。结果按实际情况选择:
| 结果 | 例子 |
|---|---|
MOTO_SUCCEEDED |
控制器确认已经解锁 |
MOTO_FAILED |
控制器明确拒绝;最后一个参数填驱动错误码 |
MOTO_UNKNOWN |
指令发出了,但超时后无法确认是否解锁 |
返回 MOTO_OK 表示 SDK 已接收这份结果;MOTO_FULL 表示还没接收,保留结果后重试。重试的是回报结果,不是再次执行车辆动作。
如果指令在驱动队列中等待过,执行前检查 deadline_ms(有效截止时间,0 表示未设置),并确认仍属于当前连接和会话。断连时取消尚未执行的旧指令。
上报电量和里程
读取车辆后,每次提交当前完整状态。下面的两个变量需换成你的采样值:
moto_vehicle_state state = {0};
state.present = MOTO_CAP(MOTO_BATTERY) | MOTO_CAP(MOTO_MILEAGE);
state.values[MOTO_BATTERY] = actual_soc_percent; // 百分比
state.values[MOTO_MILEAGE] = actual_total_metres; // 米
moto_result rc = moto_terminal_report_state(terminal, &state);
present:本次报告包含哪些字段。values:每个字段的数值。unknown:包含但暂时读不到的字段,必须同时出现在present中。
例如电量读不到时标记 unknown,不填 0;0 代表电量已耗尽。SDK 自动生成状态版本号,无需自行维护。
上报车辆故障
使用 moto_terminal_report_fault(t, id, active, module, code, severity):
| 参数 | 填写方式 |
|---|---|
id |
非零故障编号,同一故障重试时保持不变 |
active |
true 为出现,false 为解除 |
module / code |
模块名及厂商故障码,例如电池模块的故障编号 |
severity |
严重程度,范围 0–3 |
如何确认接入成功
在 APP 逐项操作锁车、解锁和鸣笛,检查真实车辆动作与 APP 结果一致。再拔掉控制器通信,确认 APP 能收到失败或未知结果;恢复后核对电量和里程。
所有完成、状态和故障上报接口遇到 MOTO_FULL 时都要保留本次数据后重试。完整返回值见 API 速查。
