您的位置:首页 > 其它

基于蓝牙的车载OBD系统

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

本项目主要功能是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 ){}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: