uni-app 无法直接读取 OBD 故障码,必须通过蓝牙连接 ELM327 兼容设备,手动实现 OBD-II 协议栈:发送 AT 指令与请求帧(如 03)、解析十六进制响应、映射故障码,且需严格完成 GATT 发现与 notify 启用流程。

不能直接读取,必须走 OBD-II 协议栈 + 特定指令序列,uni-app 本身不提供协议解析能力。
uni-app 蓝牙连接 OBD 设备前必须确认硬件和协议支持
市面上能读故障码的蓝牙设备(如 ELM327 兼容模块)本质是串口转 BLE 的桥接器,它不“主动广播故障码”,而是等待你发送 AT 指令和 OBD 请求帧(如 01 0C 读转速、03 读当前故障码)。uni-app 的蓝牙 API 只负责建立链路、收发 raw data,协议层完全由你实现。
- 确认设备是 ELM327 或兼容芯片(非普通 BLE 传感器),且已配对并进入 AT 指令模式(通常上电后自动进入)
- 目标车辆需支持 OBD-II(2001 年后国产车基本都支持),诊断接口在方向盘下方或手套箱内
- uni-app 无法绕过系统限制:Android 12+ 必须动态申请
scope.bluetoothScan和scope.bluetoothConnect;iOS 需 manifest 配NSBluetoothAlwaysUsageDescription并开启后台蓝牙模式 - 真机调试必须关掉 HBuilderX 的 USB 连接调试,否则蓝牙 API 调用会被拦截
连接后必须手动发现 service/characteristic 并启用 notify
OBD 设备通常使用标准串口服务(00001101-0000-1000-8000-00805F9B34FB)和一个可通知的 characteristic(如 0000FF01-0000-1000-8000-00805F9B34FB),但不同固件 UUID 可能不同。不能跳过 GATT 流程:
- 调用
uni.createBLEConnection后,必须监听uni.onBLEConnectionStateChange确认connected: true - 接着调
uni.getBLEDeviceServices,检查返回的服务中是否有isPrimary: true且 UUID 匹配串口服务 - 再用该
serviceId调uni.getBLEDeviceCharacteristics,找properties.notify === true的 characteristic(注意大小写) - 最后用
uni.notifyBLECharacteristicValueChange({state: true, serviceId, characteristicId})启用通知——漏掉这步就收不到任何响应
发送 OBD 指令必须按字节拼接、加回车、处理换行响应
ELM327 协议要求每条指令以 \r 结尾,且响应含多行(如 SEARCHING...\r\n41 0C 00 00\r\n)。uni-app 的 writeBLECharacteristicValue 只接受 ArrayBuffer,不能传字符串:
const cmd = new Uint8Array([0x30, 0x31, 0x20, 0x30, 0x43, 0x0D]); // "01 0C\r"
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: cmd.buffer
});
- 别用
uni.readBLECharacteristicValue主动轮询——OBD 响应是异步推送的,必须靠uni.onBLECharacteristicValueChange监听 - 收到的
value是ArrayBuffer,需转成Uint8Array再过滤掉控制字符(\r、\n、>、OK等) - 读故障码用
03指令,但部分车型需先发AT SP 0设置协议,否则返回UNABLE TO CONNECT - 响应数据是十六进制 ASCII 字符(如
41 03 12 34 56),需按 OBD-II 标准解析:第 3 字节起每两个字节为一个故障码(如12→ P0012)
实际解析故障码要自己写映射表或调用工具函数
uni-app 不内置故障码语义库。你得把原始响应(如 [0x41, 0x03, 0x12, 0x34, 0x56])转成字符串 "123456",再按规则切片:"12" → P0012,然后查本地映射表或调用封装好的 dataParse() 工具函数(参考知识库中 dataParse 和 readDeviceDataParser 的用法)。
- 常见错误:收到
NO DATA不代表没故障,可能是协议未匹配、VIN 未识别或车辆未通电自检完成 - Android 厂商定制系统(华为/小米)可能静默关闭蓝牙扫描,需在搜索前弹窗提示用户“请手动开启蓝牙并允许位置权限”
- iOS 上若未开启后台蓝牙模式,App 切后台后通知立即中断,
onBLECharacteristicValueChange停止触发
真正卡住的地方从来不是「连不上」,而是「连上了却不知道该发什么、收到后看不懂」——OBD 是协议驱动的,不是即插即用的传感器。


















