Github 地址

项目背景


最近做个项目,需要进行试驾分析,所谓“试驾”,是指顾客在 4S 店指定人员的陪同下,沿着指定的路线驾驶车辆,从而了解这款汽车的行驶性能和操控性能。通常,无论是车厂(制造商),还是4S店(经销商),对车辆的试驾都比较感兴趣。从车厂的角度,不仅仅可以知道某辆车是否受欢迎,还可以监控4S店对车辆的使用的情况(车厂肯定不愿意原本是用来卖钱的车被私用)。

所以,试驾分析,是利用车载设备,比如 OBD、车机,或是其他能监控车辆的设备,我们采用 OBD,发送给软件平台一系列车辆实时状态消息,如GPS定位、百公里耗油、报警等,平台根据这些消息,以及4S店设置的电子围栏,进行试驾分析,包括试驾开始时间、试驾结束时间、试驾持续时间、行驶里程、油耗、平均速度、最大速度等。

迁移到:http://www.bdata-cap.com/newsinfo/841880.html

试驾分析算法,虽然有一定难度(核心算法1000多行),但跟测试这个算法相比,简直容易得不了。OBD 由另一个公司生产,他们只给了我们文档,来说明OBD消息二进制流的格式,由我们自己解析,再进行试驾分析。事实上,这个项目我的工作,要完成两个程序:消息解析服务和试驾分析服务,2个月完成,一共将近3.8万行代码,但前期没有任何测试手段,直到3个月后公司安排实车测试~

但问题来了,如果每次想测试软件和算法,都要用实车,这成本太高了,尤其是时间成本。程序员的时间很宝贵的。唯一的办法是,另写一个程序,能够模拟 OBD发送消息,相当于把之前实车的数据“回放”一遍。不仅如此,最好能自定义几个命令,来控制消息的发送以及电子围栏和相关时间的设置,比如,

  • “send”表示发送指定消息;
  • “wait”表示等待指定时间后再发送一下一个消息;
  • “set”表示设置电子围栏,或采集时间,或报备时间,即试驾分析只在采集时间内、报备时间外进行。
  • “echo”表示显示信息。

示例:

send 5830 

wait 1 

send 5841 

wait 1 

echo 将发送报警... 

send 5842 

…… 

事实也是这么做的。我用 Python 写了一个程序,并利用 nestordeharo/mysql-python-class 库访问 MySQL,可意外来了,时不时地程序会报错,MySQL 拒绝我的连接请求,有时一星期没事,有时完全无法使用。虽然我也知道,这个程序访问数据库太频繁,效率太低,但只是作为内部测试工具,没必要写的太好,而且一秒内访问两个数据库,MySQL 不至于这么弱吧,我是怀疑运维那边,数据库没配置好~但实在受不了了,严重影响测试进度,就弃用上面的库,自己写个简单的 Python 库,它只访问一次数据库。


功能简介

该 Python 库只访问一次 MySQL 数据库。

example 目录中是模拟 OBD 发送数据,简单来说,将历史数据回放一遍。

设计

自定义领域语言,包括 send、wait、set 和其子命令。定义基类和其 excute 方法,各个命令类都继承该基类,并实现该方法,

这样,若有集合,把所有命令放在其中,调用 excute 方法即可。


API

假设,有个表 t1,它有四个字段:id、name、age、loc。

* open(self)

打开数据库。

* close(self)

关闭数据库。

* select(self, table, where=None, args, *kwargs)

若查找ID为1的用户:

SELECT id,name FROM t1 WHERE id='1'

可以这样调用该方法:

select('t1', 'id = %s ', 'id', 'name', id='1')

* insert(self, table, args, *kwargs)

若想插入一条记录:

INSERT INTO t1(id, name, age, loc) VALUES(2,'person2', '20', '北京')

可以这样调用该方法:

insert('t1', id='2', name='person2', age='20')

* update(self, table, where=None, args, *kwargs)

若想更新一条记录:

UPDATE t1 SET name='p2' WHERE id='2'

可以这样调用该方法:

update('t1', 'id = %s ', '2', name='p2')

* delete(self, table, where=None, *args)

若想删除ID为2的记录:

DELETE FROM t1 where id='2'

可以这样调用该方法:

delete('t1', ' id = %s ', '2')

* select_advanced(self, sql, *args)

若想查找北京地区的成年人:

SELECT id,name,age FROM t1 WHERE age>18 and loc='北京'

可以这样调用该方法:

select_advanced('SELECT id,name FROM t1 WHERE age > %s AND loc = %s', ('age', '18'),('loc','北京'))

最新文章

  1. Xshell5连接虚拟机出现连Could not connect to '192.168.47.128' (port 22): Connection failed,解决办法
  2. transient
  3. 关于file的上传文件
  4. [转]Sql Server 给表与字段添加描述
  5. 设计模式-原型模式(Prototype)
  6. sqoop简单import使用
  7. 让python整型计算结果为浮点型
  8. OD调试篇1—Hello
  9. Top 100 Best Blogs for iOS Developers
  10. 漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)
  11. git学习笔记——廖雪峰git教程
  12. LeetCode(28): 实现strStr()
  13. nginx负载均衡一:基础知识
  14. eclipse 出现内存溢出问题解决办法
  15. 爬虫系列2:scrapy项目入门案例分析
  16. Java序列化对象-字符串转换
  17. kali装virtualbox
  18. MAP使用方法集合
  19. 自定义yum源
  20. [转]Sqoop-1.4.4工具import和export使用详解

热门文章

  1. 数据库的char(n)
  2. Delphi初学者,向万一老师致敬
  3. C/C++字符串函数之复制函数
  4. 国内从事GIS行业的公司及其网址
  5. 第二章——建立一个HelloWorld项目,练习使用git的add/commit/push/pull/fetch/clone等基本命令。比较项目的新旧版本的差别-----答题者:徐潇瑞
  6. JBoss 系列四十八:JBoss 7/WildFly 使用TCP构建集群
  7. JS 将字符串转换成日期类型
  8. 安装SQL Server 2008 R2 Enterprise错误:'' is not a valid login or you do not have permission
  9. ASP.NET Core 1.0 中使用 Swagger 生成文档
  10. 编译生成.NET Core Framework遇到的问题