新闻中心

EEPW首页 > 设计应用 > 基于Android的网络车辆诊断与数据采集系统设计

基于Android的网络车辆诊断与数据采集系统设计

作者:黄赞 莫长江 黄梓华时间:2018-11-29来源:电子产品世界收藏
编者按:本文针对实现网络化的车辆诊断与数据采集系统,提出了一种基于Android线性链表的车辆信息采集并网络存储的设计方法。方案以蓝牙OBDII(2nd On Board Diagnostics)硬件与Android程序为核心,通过高效的线性链表方式读取车辆行车数据,在Android上以仪表盘等方式显示,同时使用Android移动信号上传到服务器,并搭建网站实现查询、报表输出等功能。系统程序使用DELPHI开发,通过车辆实测,方案高效,性价比高,达到了车辆数据网络化的目的。

作者 / 黄赞1 莫长江2 黄梓华1   1.岭南师范学院 机电工程学院(广东 湛江 524048)2.岭南师范学院 信息工程学院(广东 湛江 524048)

本文引用地址:http://www.eepw.com.cn/article/201811/395035.htm

  *基金项目:广东省科技计划项目(NO.2017A010102022);岭南师范学院校级科研项目(NO.LY1806);2017年大学生创新创业训练计划项目

  黄赞(1971-),男,广东湛江人,汉族,高级实验师/博士研究生,研究方向为精密测量与计算机视觉。

摘要:本文针对实现网络化的车辆诊断与数据采集系统,提出了一种基于Android的车辆信息采集并网络存储的设计方法。方案以OBDII(2nd On Board Diagnostics)硬件与Android程序为核心,通过高效的方式读取车辆行车数据,在Android上以仪表盘等方式显示,同时使用Android移动信号上传到服务器,并搭建网站实现查询、报表输出等功能。系统程序使用DELPHI开发,通过车辆实测,方案高效,性价比高,达到了车辆数据网络化的目的。

  行车安全是车辆设计与行驶的第一要素,而利用OBDII接口取得车辆的各项运行参数,可为车辆必备的ECU(Electronic Control Unit)的设计提供数据支撑,同样也可使得最终用户对于车辆的车况能有更全面的了解。车辆装配企业进行车辆测试时,需要大量的汽车数据,这种数据并不单纯是显示在仪表中,或者是单机设备文件中,更需要把诊断终端在各台车辆设备的数据通过网络保存到服务器中,进行后期的查询、分析工作。

  普通市面上与文献上的OBDII设备并不能满足其多终端车辆数据采集的功能[1,2],如参考文献1与2,有的没有实现网络化数据采集的功能;有的虽然使用了GPRS模块实现采集,但并没有使用Android且只对故障码与GPS位置进行了采集,没有本地故障码清除、行车仪表数据显示等功能,硬件成本较高,不能满足本地ECU制造企业的需求。因此根据企业实际要求,设计并开发了一种在Android智能终端上使用实现数据仪表显示、本机车辆故障码清除、行车数据采集的网络系统方案。

1 系统整体设计

  1.1 需求分析

  根据相关调查机构的数据统计[3], Android在2017年度中国智能手机市场,“安卓继续同比增长,如今占据智能手机销量的87.2%”,意味着在中国十部智能手机中,几乎有九部都搭载的是Android操作系统。本系统设计使用Android做为诊断终端介质,可达到较好的性价比与用户接受度。

  车辆数据采集在底层依赖OBDII与ECU的通讯,可以读取ECU掌握车辆的各个参数,如进气压力、节气门相对位置、发动机转速、缸壁温度、点火提前角、速度、车辆故障码等数值。而车辆数值需通过Android手机进行各数值的实时显示、网络集中上传到服务器提供查询与报表输出功能,同时Android App能对车辆故障码进行查询与清除工作。

  1.2 整体设计

  通过需求分析,可划分工程模块,实现车辆参数显示、故障诊断、网络传输的多功能的车辆数据系统设计。

  (1)设计OBDII接口的电路,使得接口电路能读取车辆参数,并由蓝牙接口与Android软件进行交互。

  (2)设计Android软件,并研究OBDII协议,蓝牙接口,实现蓝牙通讯、网络通讯、数值显示、故障诊断与清除等功能。

  (3)设计网络通讯服务器接收程序,用于接收智能终端的数据上传;设计服务器网站系统,用于查询终端上传的数据等等。

  而在开发环境上,统一使用DELPHI语言开发(2)(3)的功能程序,可提高系统的兼容性与开发效率。基本的系统框图如图1所示。

2 硬件设计

  硬件电路包含了两大部分:

  (1)OBDII专用芯片。芯片采用ELM327芯片[4],通过它提供的各种接口(K line、CAN等)与车辆ECU连接,可获取车辆诊断信息,多用于故障码读取、清除、各参数读取等应用。

  (2)蓝牙接口模块。蓝牙模块采用HC-08[5],本模块为串口蓝牙模块,使用它的TTL串口与ELM327芯片的串口交叉相连,可把OBDII的串口转成蓝牙串口,这样,就形成了与Android系统的蓝牙进行通讯的链路。

  另外,包括了汽车电瓶12 V电源输出转5 V的电源部分电路与车辆的物理16针的诊断接口等,得到硬件电路图2。

3 软件设计

  3.1 Android端软件框架

  Android软件使用Embarcadero公司的DELPHI Seattle[6]版本开发,基于面向对象PASCAL语言,突出优势在于跨平台的编译系统,可实现一次编码,多次编译,即同一套代码可编译出在Windows、Android、IOS不同系统上运行的不同的目标程序,提高了工作效率。

  利用市场占有率高的Android系统作为开发目标系统,综合使用多窗体技术、SQLite数据库技术、内置蓝牙控件与GPS控件、TeeChart仪表与图表显示[7]第三方控件,实现系统的设置、通信、显示、本地记录、绘制数据时间-数值曲线图、数据上传与车辆信息获取等OBDII功能。

  3.2 基于线性链表的蓝牙通讯模块

  3.2.1 OBDII协议命令与故障诊断

  ELM327支持OBDII通讯协议,并分成两大类,通过串口通讯,发送ASCII码,其中一类为AT命令,包含如“AT BRT”等诸如波特率的配置命令,如果不是以“AT”开头的,ELM327芯片则认为是对车辆的OBDII命令,通常有9个模式,如表1所示。

  每个模式下面都可能有若干个子命令,则发送对应命令时,第一个字节发送模式序号字节,第2、3个字节则发送该模式下的子命令字节,这些字节值称为PID(parameter identification)。比如,发送:01 0C,表示显示引擎rpm转速,可能得到的回复是:41 0C 1A F8。回复的一个字节为对应01+40=41,第二个是对应的PID值0C,而第三、四个1A、F8则是需要的rpm值,通过协议的公式转化,转速根据公式(1)得到:

  基于Android公式1.jpg(1)

  具体每个PID的含义与回复协议,可参看SAE J1979或者ISO 15031-5标准。除了获得PID参数,根据表1,发送03命令,并解释返回,可得到车辆对应的故障码。故障码返回如果不为“P0000”,则表示存在车辆故障,可根据返回的具体代码查表获得故障信息,而Android App获得具体代码后,可自动查表,显示中文故障信息,比传统的故障诊断仪更具优势。而发送04命令,可清除车辆故障码。基于以上两条命令,可实现车辆故障诊断仪的功能。

  3.2.2 Android蓝牙的实现

  本系统的Android蓝牙[8]利用Delphi Seattle内建System.Bluetooth.pas单元的蓝牙功能,包含了若干的蓝牙类:TBluetoothManager、TBluetoothDeviceList、TBluetoothAdapter、TBluetoothDevice、TBluetoothService、TBluetoothServiceList、TBluetoothSocket。而特别对于串口蓝牙而言,TBluetoothService指远端蓝牙设备服务,包括服务名和UUID两个参数,并分别规定为 'SerialPort Service'和'{00001101-0000-1000-8000-00805F9B34FB}'。

  根据以上蓝牙类,调用对应的函数,具体实现步骤为:获得蓝牙配对设备列表、选定一个已配对蓝牙进行配对操作、获取已配对设备服务列表、判断如果含有串口服务,则可为蓝牙读写线程建立socket连接与初始化工作。

  设置Fsocket为蓝牙socket全局变量,则Android写蓝牙函数为socket.sendData(ToSend),其中ToSend为发送字节数组类型system.sysutils.Tarray,要发送的数值可放入可变长度的字节型数组统一发送;Android读蓝牙函数为Fdata:=Fsocket.readData,Fdata为返回值,与ToSend数据类型一致,读取返回值后访问该变长字节数组,根据OBDII命令通信协议,可解释每个字节的含义,得到对应的参数值。该读蓝牙函数为阻塞型函数,必须放入子线程执行。

  3.2.3 头尾插入式线性链表算法应用于蓝牙通讯

  线性链表是指有链接存储结构的线性表,它用一组地址动态分配的单元存放线性表中的数据元素,一般用结点描述:结点(表示数据元素) =数据域(数据元素的映象) + 指针域(指示后继元素存储位置)。线性链表大概可分为单向线性链表、双向线性链表,循环线性链表[9]

  鉴于OBDII协议命令的发送规律,算法上采用双向线性链表,循环线性链表都不太合适,因此采用头尾插入式单向线性链表。

  一般的单向线性链表都在头部读取元素,尾部插入元素的FIFO(Fisrt In First Out)处理算法,而系统采用头尾插入式单向线性链表算法,把优先级高的命令元素立刻插入头部,否则还是按照原算法插入链表尾部。在系统实现中,当用户界面并不急切显示其命令返回结果时,依次进行顺序发送,使用链表尾插入方式增加链表节点;反之,当其命令的执行效果需要马上在软件界面体现,则使用链表头插入方式增加链表节点,使得需要尽快执行的OBDII命令插队到第一执行,例如用户界面切换到用户查询与消除故障码时,需要马上得到系统响应,就要使用在链表头插入节点命令的方法去避免用户长时间的等待。实践证明,当出现用户车辆故障码查找与消除界面时,命令插入连表头,可马上得到响应,快速实现车辆故障码显示及清除故障码的动作。链表的插入与读取(删除)如图4所示。

  本单向线性链表数据域为myData,数据类型为字节数组,可存储OBDII命令字节,指针域为next,指向下一个元素存储位置。另外,基于面向对象的编程思维,把头尾插入式单向线性链表的操作实现封装成了TsingleQueue类,类包含头尾指针定义、初始化链表方法、增加节点方法、删除节点方法与清空链表方法等。

  其中,类方法中增加节点addQueue方法为实现头尾插入式单向线性链表的核心方法,参照图4中在链表头插入节点p与在链表尾插入节点p的原理,具体实现如下:

  function TsingleQueue.addQueue(ele:dataArr;headOrRear:boolean):boolean;

  var

  p:sQueue;

  begin

  new(p); //动态分配内存节点

  p^.myData:=ele;//节点中的数据域赋值

  if (headOrRear=true) or (head=rear) then

  //如果是在链表尾部或者空链表插入节点

  begin

  P^.next:=nil;

  rear^.next:=p;

  rear:=p;

  end

  else //如果是在链表头部插入节点

  begin

  p^.next:=head^.next;

  head^.next:=p;

  end;

  result:=true;

  isEmpty:=false; //非空链表标记

  end;

  在主程序中,使用sq:=TsingleQueue.create生成链表,sq.initQueue方法初始化链表后,为了增强用户体验,数据处理不能放在用户界面主线程,以免程序响应时间过长,照成用户界面假死,需使用多线程[10]后台操作该线性链表类,并注意多线程的临界区操作,定义cs:TcriticalSection,避免出现多线程调用时,造成因非线程安全引起的链表数据错误,线程核心代码如下:

  while not Terminated do

  begin

  cs.Enter;//进入临界区

  tmp:=sq.delQueue;

  //读取并删除线性链表的首个OBDII命令

  cs.Leave;//离开临界区

  setLength(toSend,5);//分配命令数组

  for i:= Low(tosend) to High(tosend) do

  toSend[i]:=tmp[i];//OBDII命令数组赋值

  if toSend[0]<>0 then

  begin

  mainform.FSocket.SendData(ToSend);//使用蓝牙端口发送OBDII命令

  receivedBT;//读蓝牙返回值并解释存储

  end;

  end;

  3.3 服务器模块

  为实现多终端数据网络采集功能的特殊需求,需设计服务器数据库,系统采用了MSSQLSERVER关系型数据库,设计有车辆信息表、用户表、设置表与车辆数据表以及对应的数据库存储过程、触发器程序等。

  而系统中间件DataSnap[11]中间件在服务器中实现接收终端数据,并存入数据库的功能,采用的DataSnap核心基于JSON与HTTP REST的跨平台标准。程序主要使用了FIREDAC数据库组件进行对数据库的读写控制,WebModuleUnit实现HTTP接口,ServerMethodUnit实现数据库连接、数据表读写与存储过程控制。

  而服务器的另一个功能是网站发布。使用DELPHI+uniGUI的模式进行网站开发,编程设计网站读取用户手机终端上传到数据库的各项PID数据、经纬度数据等信息并显示在浏览器上,可实现查询数据、报表输出的功能。

  4 工程实测与结论

  Android手机为小米Note电信增强版,版本4.4.4KTU84P,MIUI5,车辆选用北京现代瑞纳VERNA做为实测车辆。硬件接入车辆的OBDII接口后,打开本系统设计的Android软件,并运行服务器的DataSnap中间件服务器接收参数,IIS网站服务器发布编写好的网站。

  经测试,本系统能查询并消除车辆故障码的功能,正常读取车辆的各项核心数据,并成功上传至服务器存储,通过网页访问,可得到多终端各个车辆的数据,达到了预期的设计要求,并通过了企业的验收。终端读取车辆实时数据如图5所示。(1)为车辆怠速时的仪表显示页面;(2)为车辆正常行驶时的仪表显示页面;(3)(4)为车辆正常行驶时的部分PID数据。

  而图6为浏览器中显示是服务器网站的页面之一:网络采集的部分车辆PID信息网络页面,该网站页面由uniGUI技术编程生成,可通过数据生成日期进行查询,亦可通过车辆识别码进行联合查询(车辆识别码由企业自主生成),而查询结果可生成打印报表输出,企业用户可利用报表数据,分析ECU对车辆在各个状态时的控制效果,调整与匹配车辆的各项参数,实现了既定功能。

  通过线性链表与多线程等关键技术在蓝牙通讯中的工程应用,一方面提高了通讯可靠性,另一方面,程序运行界面无停滞死机,提升了用户体验,而利用了Android移动互联网、 OBDII协议的网络车辆数据采集系统具有性价比高、用户交互性强等特性,可直接应用于车辆的诊断、实时数据网络监测、GPS定位等项目需求。

  参考文献:

  [1]潘益斌,张海峰.基于OBD的汽车数据采集及捕获系统设计[J].杭州电子科技大学学报(自然科学版),2015:45-48.

  [2]杨彬,周建武.基于OBDII和GPRS远程汽车故障诊断系统设计和实现[J].计算机应用与软件,2012(09):209-212.

  [3]Kantar:2017年中国智能手机市场Android份额高达87%[EB/OL].(2018-9-20) [2017-5-12] http://tech.sina.com.cn/roll/2017-05-13/doc-ifyfecvz1148686.shtml

  [4]Elm Electronics.ELM327 OBD to Rs232 Interpreter[EB/OL].(2016-05-13) [2016-09-13]http://wenku.baidu.com/link?url=7QV1b8sAtvp90L82s94895SajqTE_5FYdohhlbmX0wUFxW9MetB5t27wfhyXu2YDA-6zqn983vr86p-u8nZK2ybTUii3Xm7TqB_xa_wF3I7

  [5]汇承信息科技.HC-08蓝牙串口通信模块用户手册V2.4 [EB/OL].(2016-07-26) [2016-09-28]http://www.wavesen.com/mysys/db_picture/news3/2016726165447101.pdf

  [6] 黄春香,杨奕.基于Delphi的PC机与AVR单片机的串行通讯[J].仪表技术与传感器,2012(06):112-114.

  [7] 蔡黎,代妮娜,邓明.基于OBD协议的Android平台汽车虚拟仪表设计[J].电子技术应用,2011,37(12):91-94.

  [8] Thomas Soderholm.简化低功耗蓝牙医疗设备的设计[J].电子产品世界,2018,25(05):63-64+70.

  [9]杨泽林,李先发. 基于双指针环形缓冲区的数据采集系统设计[J].仪表技术与传感器,2016,11:67-69.

  [10]许健,于鸿洋.一种Linux多线程应用下内存池的设计与实现[J].电子技术应用,2012,38(11):146-149.

  [11]刘磊.基于Datasnap技术的信贷管理系统的设计与实现[J].科学技术与工程,2006,6(17):2766-2768.

  本文来源于《电子产品世界》2018年第12期第39页,欢迎您写论文时引用,并注明出处。



评论


相关推荐

技术专区

关闭