基于蓝牙的车载OBD系统

来源:互联网 发布:java获取jar包路径 编辑:程序博客网 时间:2024/04/27 15:42

本人做的一点小东西,自认为还有点用处,随便写点,希望做车载系统的同行有帮助,好了,废话也不多说了,直接进入主题吧。

本项目主要功能是android智能设备开启蓝牙后自动搜索OBD的蓝牙设备,并且自动匹配,自动匹配很重要,因为有的android设备并没有屏幕。至于蓝牙怎么连接就多说了,

看官方文档吧,这里主要给出主要解析ELM327模块数据的代码。

 

 @Overridepublic void run(){     while(true){// read until '>' arrivestry { 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 charsint mil = mybuffer.get(2);if ((mil & 0x80) == 128){isHaveTroubleCode = true;}codeCount = mil & 0x7F;//获取故障码数Message msg2=new Message();msg2.obj="一共有"+codeCount+"个故障码";msg2.what=1;LinkDetectedHandler.sendMessage(msg2);//System.out.println("一共有"+codeCount+"个故障码");mNotifyTTS.QueueAddInfo("一共有"+codeCount+"个故障码");if(isHaveTroubleCode){ ObdCommand myObdCommand1 = new ObdCommand("03");    try {try {myObdCommand1.run();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}    }break;        case 04:{    int a = mybuffer.get(2);    float engineLoad = a/255;    Message msg1= new Message();    msg1.obj="当前引擎负载为%"+engineLoad;    msg1.what=1;    LinkDetectedHandler.sendMessage(msg1);    mNotifyTTS.QueueAddInfo(msg1.obj.toString());        }break;    case 05:{    int enginetemperature=mybuffer.get(2);    enginetemperature-=40;    Message msg =new Message();    msg.obj="当前发动机水温为"+enginetemperature+"摄氏度";    msg.what=1;    LinkDetectedHandler.sendMessage(msg);    mNotifyTTS.QueueAddInfo("当前发动机水温为"+enginetemperature+"摄氏度");    }break;    case 12:{       String mil="0x"+rawData.substring(4,8);   codeCount = Integer.decode(mil)/4;   Message msg2=new Message();   msg2.obj="当前发动机的转数为"+codeCount+"rpm";   msg2.what=1;   LinkDetectedHandler.sendMessage(msg2);   System.out.println("当前发动机的转数为"+codeCount+"rpm");   mNotifyTTS.QueueAddInfo("当前发动机的转数为"+codeCount+"rpm");   }break;    case 13:{   String mil="0x"+rawData.substring(4,6);   codeCount = Integer.decode(mil);   Message msg2=new Message();   msg2.obj="当前车速为"+codeCount+"km/h";   msg2.what=1;   LinkDetectedHandler.sendMessage(msg2);   System.out.println("当前车速为"+codeCount+"km/h");   mNotifyTTS.QueueAddInfo("当前车速为"+codeCount+"km/h");           }break;    case 15:{    int airintemperature=mybuffer.get(2)-40;    Message msg1= new Message();    msg1.obj="当前进气温度为"+airintemperature+"摄氏度";    msg1.what=1;    LinkDetectedHandler.sendMessage(msg1);    mNotifyTTS.QueueAddInfo(msg1.obj.toString());    }break;    case 16:{    int a = mybuffer.get(2);int c = mybuffer.get(3);float _maf = (a * 256 + c) / 100.0f;Message msg1 = new Message();msg1.obj = "当前空气流量为"+ _maf+"g/s";msg1.what=1;LinkDetectedHandler.sendMessage(msg1);mNotifyTTS.QueueAddInfo("当前空气流量为"+ _maf+"g/s");    }break;    case 17:{    int a  = mybuffer.get(2);    float absoluteThrottlePosition = a /255;    Message msg1 = new Message();msg1.obj = "当前绝对节气门位置"+ absoluteThrottlePosition+"%";msg1.what=1;LinkDetectedHandler.sendMessage(msg1);mNotifyTTS.QueueAddInfo(msg1.obj.toString());    }break;    case 31:{    int a = mybuffer.get(2);int c = mybuffer.get(3);int value = a * 256 + c;// determine timeString hh = String.format("%02d", value / 3600);String mm = String.format("%02d", (value % 3600) / 60);String ss = String.format("%02d", value % 60);Message msg1= new Message();    msg1.obj="自发动机启动时间为"+hh+"小时"+mm+"分钟"+ss+"秒";    msg1.what=1;    LinkDetectedHandler.sendMessage(msg1);    mNotifyTTS.QueueAddInfo(msg1.obj.toString());    }break;    case 70:{    int condtionairtemprature = mybuffer.get(2)-40;    Message msg1= new Message();    msg1.obj="当前环境温度为"+condtionairtemprature+"摄氏度";    msg1.what=1;    LinkDetectedHandler.sendMessage(msg1);    mNotifyTTS.QueueAddInfo(msg1.obj.toString());    }break;    default:{Message msg1 = new Message();msg1.obj=rawData;msg1.what=1;LinkDetectedHandler.sendMessage(msg1);mNotifyTTS.QueueAddInfo(rawData);}break;               }}break;case 02:{String pid =  "0x"+rawData.substring(2,4);    PID = Integer.decode(pid);}break;case 03:{   int begin1=0;   int end1=14;   String rawData1=null;   while(end1<=rawData.length()+1){   rawData1=rawData.substring(begin1, end1);       int begin2 =2;    int end2=6;    while (end2 <= rawData1.length()) {String temp = rawData1.substring(begin2, end2);String num =rawData1.substring(begin2,begin2+1);int first =Integer.decode(num);switch(first){case 0: case 1:case 2:case 3:{temp="P"+temp;}break;case 4:{temp="C0"+temp.substring(1);}break;case 5:{temp="C1"+temp.substring(1);}break;case 6:{temp="C2"+temp.substring(1);}break;case 7:{temp="C3"+temp.substring(1);}break;case 8:{temp="B0"+temp.substring(1);}break;case 9:{temp="B1"+temp.substring(1);}break;case 10:{temp="B2"+temp.substring(1);}break;case 11:{temp="B3"+temp.substring(1);}break;case 12:{temp="U0"+temp.substring(1);}break;case 13:{temp="U1"+temp.substring(1);}break;case 14:{temp="U2"+temp.substring(1);}break;case 15:{temp="U3"+temp.substring(1);}break;}FaultCodeRecognition act = new FaultCodeRecognition(temp);String troubleName =act.returnTroubleName();mNotifyTTS.QueueAddInfo("故障码"+temp+troubleName);Message msg = new Message();msg.obj="故障码"+temp+troubleName;msg.what=1;LinkDetectedHandler.sendMessage(msg);begin2=end2;end2+=4;    }    begin1=end1;    end1+=14;   }}break;case 05:{}break;case 07:{int begin1=0;   int end1=14;   String rawData1=null;   while(end1<=rawData.length()+1){   rawData1=rawData.substring(begin1, end1);       int begin2 =2;    int end2=6;    while (end2 <= rawData1.length()) {String temp = rawData1.substring(begin2, end2);String num =rawData1.substring(begin2,begin2+1);int first =Integer.decode(num);switch(first){case 0: case 1:case 2:case 3:{temp="P"+temp;}break;case 4:{temp="C0"+temp.substring(1);}break;case 5:{temp="C1"+temp.substring(1);}break;case 6:{temp="C2"+temp.substring(1);}break;case 7:{temp="C3"+temp.substring(1);}break;case 8:{temp="B0"+temp.substring(1);}break;case 9:{temp="B1"+temp.substring(1);}break;case 10:{temp="B2"+temp.substring(1);}break;case 11:{temp="B3"+temp.substring(1);}break;case 12:{temp="U0"+temp.substring(1);}break;case 13:{temp="U1"+temp.substring(1);}break;case 14:{temp="U2"+temp.substring(1);}break;case 15:{temp="U3"+temp.substring(1);}break;}FaultCodeRecognition act = new FaultCodeRecognition(temp);String troubleName =act.returnTroubleName();mNotifyTTS.QueueAddInfo("待定故障码"+temp+troubleName);Message msg = new Message();msg.obj="待定故障码"+temp+troubleName;msg.what=1;LinkDetectedHandler.sendMessage(msg);begin2=end2;end2+=4;    }    begin1=end1;    end1+=14;   }}break;default:{Message msg1 = new Message();msg1.obj=rawData;msg1.what=1;LinkDetectedHandler.sendMessage(msg1);mNotifyTTS.QueueAddInfo(rawData);}break;}}else {Message msg2 = new Message();msg2.obj=rawData;msg2.what=1;LinkDetectedHandler.sendMessage(msg2);mNotifyTTS.QueueAddInfo(rawData);}  }else{Message msg2 = new Message();msg2.obj=rawData;msg2.what=1;LinkDetectedHandler.sendMessage(msg2);mNotifyTTS.QueueAddInfo(rawData); }}    catch (IOException e) {//try{//mmInputStream.close();mNotifyTTS.QueueAddInfo("连接异常");//}catch(IOException e1)//{//e1.printStackTrace();//}break;}}}  public void write(byte[] bytes)  {try{mmOutputStream.write(bytes);}catch(IOException e ){}  }  public void cancle(){  try{  mmSocket.close();    }catch(IOException e ){}    }    }


 

原创粉丝点击