基于蓝牙的车载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 ){} } }
- 基于蓝牙的车载OBD系统
- 车载诊断系统-OBD
- 基于ARM9的智能车载系统设计
- 基于ISO7637的车载电源系统设计
- 蓝牙车载系统的组成结构和应用规范分析
- OBD系统
- 【车载】Google 与菲亚特克莱斯勒联手,推出基于 Android 的车载系统
- 基于qualcomm平台的车载娱乐系统的开发
- 基于CompactRIO的嵌入式车载电性能测试系统研发
- 基于Qt的车载GPS监控系统(3)界面设计
- 车载系统的相关功能
- 基于蓝牙的数据传输系统的设计
- 基于蓝牙的数据传输系统的设计
- 基于Qt的车载GPS监控系统(4)系统状态
- 基于android系统的蓝牙开发总结
- 【技术】基于GPRS无线网络的嵌入式远程车载监测系统[图]
- 基于Qt的车载GPS监控系统(1)项目介绍
- 基于Qt的车载GPS监控系统(2)需求分析
- XCode5 免证书真机调试,开发IOS7应用程序。
- 可以移动的恐龙--用键盘让恐龙具有生命 dino.dat文件绘制恐龙 a d w s移动恐龙 源代码
- 判断对错
- C++与vector类
- chrome 插件
- 基于蓝牙的车载OBD系统
- 第九周-1
- 大文章的分页
- main函数
- MFC中ASSERT,VERIFY,TRACE等的区别
- Java Throwable类
- ASP.NET给图片加上水印
- java.util.ConcurrentModificationException
- 线性表