本人做的一点小东西,自认为还有点用处,随便写点,希望做车载系统的同行有帮助,好了,废话也不多说了,直接进入主题吧。
本项目主要功能是android智能设备开启蓝牙后自动搜索OBD的蓝牙设备,并且自动匹配,自动匹配很重要,因为有的android设备并没有屏幕。至于蓝牙怎么连接就多说了,
看官方文档吧,这里主要给出主要解析ELM327模块数据的代码。
@Override
public void run(){
while(true){
// read until '>' arrives
try {
byte b = 0;
StringBuilder res = new StringBuilder();
while((char) (b = (byte) mmInputStream.read()) !='>')
{
if ((char) b != ' ')
{
res.append((char) b);
}
}
rawData = res.toString().trim();
mybuffer.clear();
int spaceindex=rawData.indexOf('\r');//搜索"\r"字符的索引位置
rawData=rawData.substring(spaceindex+1);
String[] ress =rawData.split("\r");
rawData=null;
StringBuilder resss = new StringBuilder();
for (String r : ress) {
String k = r.replace("\r", "");//遍历所有ress里面所有的元素,去掉
resss.append(k);
}
rawData=resss.toString().trim();
if(!rawData.equals("?")){//首先检测是否能够解析发出的命令,不能解析就返回“?”
String mode = "0x"+rawData.substring(0,2);
int Mode = 0;
int PID = 0;
String isAtOrObd=rawData.substring(0, 2);
if(isAtOrObd.equals("41")||isAtOrObd.equals("42")||isAtOrObd.equals("43")||isAtOrObd.equals("44")||isAtOrObd.equals("45")||isAtOrObd.equals("46")||isAtOrObd.equals("47")||isAtOrObd.equals("48")||isAtOrObd.equals("49"))
{
Mode=Integer.decode(mode)-64;//解析出模式
switch(Mode) {
case 01:{
String pid = "0x"+rawData.substring(2,4);
PID = Integer.decode(pid);
int begin = 0;
int end = 2;
while (end <= rawData.length()) {
String temp = "0x" + rawData.substring(begin, end);
mybuffer.add(Integer.decode(temp));
begin = end;
end += 2;
}
switch(PID){
case 01:{
// read string each two chars
int mil = mybuffer.get(2);
if ((mil & 0x80) == 128){
isHaveTroubleCode = true;
}
codeCount = mil & 0x7F;//获取故障码数
Message msg2=new Message();
msg2.obj="