最近作个项目,须要进行试驾分析,所谓“试驾”,是指顾客在 4S 店指定人员的陪同下,沿着指定的路线驾驶车辆,从而了解这款汽车的行驶性能和操控性能。一般,不管是车厂(制造商),仍是4S店(经销商),对车辆的试驾都比较感兴趣。从车厂的角度,不只仅能够知道某辆车是否受欢迎,还能够监控4S店对车辆的使用的状况(车厂确定不肯意本来是用来卖钱的车被私用)。html
因此,试驾分析,是利用车载设备,好比 OBD、车机,或是其余能监控车辆的设备,咱们采用 OBD,发送给软件平台一系列车辆实时状态消息,如GPS定位、百千米耗油、报警等,平台根据这些消息,以及4S店设置的电子围栏,进行试驾分析,包括试驾开始时间、试驾结束时间、试驾持续时间、行驶里程、油耗、平均速度、最大速度等。python
迁移到:http://www.bdata-cap.com/newsinfo/841880.html
试驾分析算法,虽然有必定难度(核心算法1000多行),但跟测试这个算法相比,简直容易得不了。OBD 由另外一个公司生产,他们只给了咱们文档,来讲明OBD消息二进制流的格式,由咱们本身解析,再进行试驾分析。事实上,这个项目个人工做,要完成两个程序:消息解析服务和试驾分析服务,2个月完成,一共将近3.8万行代码,但前期没有任何测试手段,直到3个月后公司安排实车测试~mysql
但问题来了,若是每次想测试软件和算法,都要用实车,这成本过高了,尤为是时间成本。程序员的时间很宝贵的。惟一的办法是,另写一个程序,可以模拟 OBD发送消息,至关于把以前实车的数据“回放”一遍。不只如此,最好能自定义几个命令,来控制消息的发送以及电子围栏和相关时间的设置,好比,git
示例:程序员
send 5830
wait 1
send 5841
wait 1
echo 将发送报警...
send 5842
……
事实也是这么作的。我用 Python 写了一个程序,并利用 nestordeharo/mysql-python-class 库访问 MySQL,可意外来了,时不时地程序会报错,MySQL 拒绝个人链接请求,有时一星期没事,有时彻底没法使用。虽然我也知道,这个程序访问数据库太频繁,效率过低,但只是做为内部测试工具,不必写的太好,并且一秒内访问两个数据库,MySQL 不至于这么弱吧,我是怀疑运维那边,数据库没配置好~但实在受不了了,严重影响测试进度,就弃用上面的库,本身写个简单的 Python 库,它只访问一次数据库。github
该 Python 库只访问一次 MySQL 数据库。算法
example 目录中是模拟 OBD 发送数据,简单来讲,将历史数据回放一遍。sql
自定义领域语言,包括 send、wait、set 和其子命令。定义基类和其 excute 方法,各个命令类都继承该基类,并实现该方法,数据库
这样,如有集合,把全部命令放在其中,调用 excute 方法便可。app
假设,有个表 t1,它有四个字段:id、name、age、loc。
打开数据库。
关闭数据库。
若查找ID为1的用户:
SELECT id,name FROM t1 WHERE id='1'
能够这样调用该方法:
select('t1', 'id = %s ', 'id', 'name', id='1')
若想插入一条记录:
INSERT INTO t1(id, name, age, loc) VALUES(2,'person2', '20', '北京')
能够这样调用该方法:
insert('t1', id='2', name='person2', age='20')
若想更新一条记录:
UPDATE t1 SET name='p2' WHERE id='2'
能够这样调用该方法:
update('t1', 'id = %s ', '2', name='p2')
若想删除ID为2的记录:
DELETE FROM t1 where id='2'
能够这样调用该方法:
delete('t1', ' id = %s ', '2')
若想查找北京地区的成年人:
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','北京'))