最近作個項目,須要進行試駕分析,所謂「試駕」,是指顧客在 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','北京'))