基于蓝牙的车载OBD系统
2013-10-25 18:24
225 查看
本人做的一点小东西,自认为还有点用处,随便写点,希望做车载系统的同行有帮助,好了,废话也不多说了,直接进入主题吧。
本项目主要功能是android智能设备开启蓝牙后自动搜索OBD的蓝牙设备,并且自动匹配,自动匹配很重要,因为有的android设备并没有屏幕。至于蓝牙怎么连接就多说了,
看官方文档吧,这里主要给出主要解析ELM327模块数据的代码。
本项目主要功能是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="一共有"+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 block e.printStackTrace(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.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 time String 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 ){} } }
相关文章推荐
- 基于蓝牙模块ROK101 007/1的小区监控系统设计
- 【源代码】基于Android和蓝牙的单片机温度採集系统
- 基于蓝牙的家居网关数据采集处理系统的设计与实现
- 基于qualcomm平台的车载娱乐系统的开发
- 基于ISO7637的车载电源系统设计
- 【技术】基于GPRS无线网络的嵌入式远程车载监测系统[图]
- 基于Linux开源OS AGL (Automotive Grade Linux) 车载系统启动
- 基于ARM9的智能车载系统设计
- 基于STM8的ADC0832采集及蓝牙通信系统
- 基于Qt的车载GPS监控系统(4)系统状态
- 基于ARM9-Linux平台的车载导航系统设计
- 车载诊断系统-OBD
- 基于蓝牙的温度采集系统 android 单片机
- 基于蓝牙技术的校园导览(智能手机)系统
- 开发一个基于 Android系统车载智能APP
- 基于Qt的车载GPS监控系统(5)温度设置
- 在Symbian系统上建立基于蓝牙的Socket连接
- 基于Qt的车载GPS监控系统(3)界面设计
- 【车载】Google 与菲亚特克莱斯勒联手,推出基于 Android 的车载系统
- 基于Windows平台的开放和智能的蓝牙系统结构