Created
November 7, 2018 15:52
-
-
Save caingougou/5761ea17594b01570a847af72892c35c to your computer and use it in GitHub Desktop.
yiwie.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import socket | |
| import threading | |
| import SocketServer | |
| import time | |
| from datetime import datetime | |
| import sys | |
| import redis | |
| import logging | |
| import pymongo | |
| def strtotime(str): | |
| return int(time.mktime(time.strptime(str, "%Y%m%d%H%M%S"))) + 28800 | |
| def strtodate(str): | |
| return datetime.fromtimestamp(int(time.mktime(time.strptime(str, "%Y%m%d%H%M%S"))) + 28800).strftime("%Y-%m-%d") | |
| logging.basicConfig(filename='yiwei.log', level=logging.DEBUG, format='[%(asctime)s] %(name)s.%(levelname)s: %(message)s') | |
| r = redis.StrictRedis(host='localhost', port=6379, db=3) | |
| client = pymongo.MongoClient('kkb-mongo-1', 29020) | |
| db = client['alarm'] | |
| client_addr = [] | |
| XID = 590901000 | |
| ETY = 30 | |
| class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): | |
| def setup(self): | |
| ip = self.client_address[0].strip() | |
| port = self.client_address[1] | |
| print(ip + ":" + str(port) + " is connect!") | |
| client_addr.append(self.client_address) | |
| def handle(self): | |
| buf = '' | |
| try: | |
| while True: | |
| data = self.request.recv(1024) | |
| if data != '': | |
| data = buf + data | |
| if data[-1] == '$': | |
| logging.debug(data) | |
| datum = data.strip().split(',') | |
| if datum[0] == '+ACK:GTHBD': | |
| [cmd, _ver, imei, _dn, utime, _tail] = datum | |
| date = strtodate(utime) | |
| data = { | |
| "_id" : "{}_{}".format(imei, date), | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "ts": strtotime(utime), | |
| "ct": str(datetime.now())[0:19] | |
| } | |
| if db.heartbeat.find({"_id" : "{}_{}".format(imei, date)}).count(True) < 1: | |
| db.heartbeat.insert(data) | |
| self.request.send('+SACK:GTHBD,{},11F0$'.format(_ver)) | |
| if (int(datum[2]) == 865084030179194) and r.get('up_865084030179194'): | |
| self.request.send('AT+GTSRI=gb100,3,,1,180.169.235.202,20437,,0,,5,0,0,1,,,FFFF$') | |
| r.delele('up_865084030179194') | |
| if (int(datum[2]) == 865084030183717) and r.get('up_865084030183717'): | |
| self.request.send('AT+GTQSS=gb100,cmmtm,,,3,,2,60.174.225.171,10028,192.0.0.0,0,,10,0,0,0,FFFF$') | |
| r.delele('up_865084030183717') | |
| if (int(datum[2]) == 865084030171167) and r.get('up_865084030171167'): | |
| self.request.send('AT+GTQSS=gb100,cmmtm,,,3,,2,60.174.225.171,10028,192.0.0.0,0,,10,0,0,0,FFFF$') | |
| r.delele('up_865084030171167') | |
| # if (int(datum[2]) == 865084030177826) or (int(datum[2]) == 865084030181398): | |
| # self.request.send('AT+GTUPD=gb100,0,0,20,0,,,http://queclink.3322.org:20440/GB100/deltabin/GB100R00_051E_to_0104.bin,,0,,,0001$') | |
| elif (datum[0] == '+RESP:GTFRI') or (datum[0] == '+BUFF:GTFRI'): | |
| gps = datum[7:-11] | |
| counts = len(gps) / 12 | |
| key = r.keys('yw_{}_*'.format(datum[2])) | |
| if key == []: | |
| key = 'yw_{}_{}'.format(datum[2], str(strtotime(datum[7+6]))) | |
| last = 0 | |
| else: | |
| key = sorted(key)[-1] | |
| last = r.lindex(key, -1) | |
| if (strtotime(datum[7+6]) - int(last.split(',')[1])) > 300: | |
| key = 'yw_{}_{}'.format(datum[2], str(strtotime(datum[7+6]))) | |
| start = 7 | |
| for x in xrange(0, counts): | |
| tmptrc = ",".join([datum[2], | |
| str(strtotime(datum[start+6])), | |
| datum[start+5], | |
| datum[start+4], | |
| datum[start+1], | |
| datum[start+2], | |
| datum[start+3], | |
| key]) | |
| r.rpush(key, tmptrc) | |
| start = start + 12 | |
| elif (datum[0] == '+RESP:GTVGN'): # fire on | |
| [cmd, _ver, imei, _dn, _tmp, _type, _duration, _accu, _spd, _azi, _alt, lng, lat, utime, _mcc, _mnc, _lac, _cellid, _tmp2, _ttlhrs, _mil, ts, _tail] = datum | |
| date = strtodate(utime) | |
| if utime != '': | |
| data = { | |
| "_id" : "{}_{}".format(imei, strtotime(utime)), | |
| "data" : { | |
| "acc" : 1, | |
| "lat" : float(lat), | |
| "lng" : float(lng), | |
| "ts" : strtotime(ts) | |
| }, | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "ct" : str(datetime.now())[0:19] | |
| } | |
| db.fire.insert(data) | |
| # print('fire on', data) | |
| elif (datum[0] == '+RESP:GTVGF'): # fire off | |
| [cmd, _ver, imei, _dn, _tmp, _type, _duration, _accu, _spd, _azi, _alt, lng, lat, utime, _mcc, _mnc, _lac, _cellid, _tmp2, _ttlhrs, _mil, ts, _tail] = datum | |
| date = strtodate(utime) | |
| if utime != '': | |
| data = { | |
| "_id" : "{}_{}".format(imei, strtotime(utime)), | |
| "data" : { | |
| "acc" : 0, | |
| "lat" : float(lat), | |
| "lng" : float(lng), | |
| "ts" : strtotime(ts) | |
| }, | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "ct" : str(datetime.now())[0:19] | |
| } | |
| db.fire.insert(data) | |
| # print('fire off', data) | |
| elif (datum[0] == '+RESP:GTMPF'): # power on/off | |
| [cmd, _ver, imei, _dn, _accu, _spd, _azi, _alt, lng, lat, utime, _mcc, _mnc, _lac, _cellid, _tmp, _ts, _tail] = datum | |
| date = strtodate(utime) | |
| data = { | |
| "_id" : "{}_{}".format(imei, strtotime(utime)), | |
| "data" : { | |
| "pwr" : 0, | |
| "lat" : float(lat), | |
| "lng" : float(lng), | |
| "ts" : strtotime(utime) | |
| }, | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "ct" : str(datetime.now())[0:19] | |
| } | |
| db.power.insert(data) | |
| # print('power', data) | |
| elif (datum[0] == '+RESP:GTCRA'): # crash | |
| [cmd, _ver, imei, _dn, _crash_counter, _accu, spd, azi, alt, lng, lat, utime, _mcc, _mnc, _lac, _cellid, _tmp, _ts, _tail] = datum | |
| date = strtodate(utime) | |
| data = { | |
| "_id" : "{}_{}".format(imei, strtotime(utime)), | |
| "sensor" : [], | |
| "gps" : [], | |
| "data" : { | |
| "azi" : int(azi), | |
| "lat" : float(lat), | |
| "lng" : float(lng), | |
| "spd" : float(spd), | |
| "alt" : float(alt), | |
| "ts" : strtotime(utime) | |
| }, | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "ct" : str(datetime.now())[0:19] | |
| } | |
| db.crash.insert(data) | |
| # print('crash', data) | |
| elif (datum[0] == '+RESP:GTCRD'): # crash sensor | |
| # [cmd, _ver, imei, _dn, _crash_counter, dtype, total, number, data, _ts, _tail] = datum | |
| # print('dtype', dtype) | |
| # print('total', total) | |
| # print('number', number) | |
| # print('data', data) | |
| pass | |
| elif (datum[0] == '+RESP:GTPGR'): # crash gps | |
| # print(len(datum)) | |
| # [cmd, _ver, imei, _dn, _trigger_type, _crash_counter, dtype, total, number, _validity_number, _tmp, data, ts, _tail] = datum | |
| # print(datum) | |
| pass | |
| elif (datum[0] == '+RESP:GTEPS'): # voltage | |
| [cmd, _ver, imei, _dn, voltage, _rtype, _number, _accu, _spd, _azi, _alt, _lng, _lat, utime, _mcc, _mnc, _lac, _cellid, _tmp2, _mil, _ts, _tail] = datum | |
| if utime != '': | |
| date = strtodate(utime) | |
| data = { | |
| "_id" : "{}_{}".format(imei, date), | |
| "v" : voltage, | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "ct" : str(datetime.now())[0:19] | |
| } | |
| if db.voltage.find({"_id" : "{}_{}".format(imei, date)}).count(True) < 1: | |
| db.voltage.insert(data) | |
| # print('voltage', data) | |
| elif (datum[0] == '+RESP:GTHBM'): # events | |
| [cmd, _ver, imei, _dn, _tmp, rtype, _number, _accu, _spd, _azi, _alt, lng, lat, utime, _mcc, _mnc, _lac, _cellid, _tmp2, mil, _ts, _tail] = datum | |
| if utime != '': | |
| t = 0 | |
| if rtype == '01': | |
| t = 0 | |
| elif rtype == '00': | |
| t = 1 | |
| else: | |
| t = 2 | |
| data = { | |
| "_id": "{}_{}".format(imei, strtotime(utime)), | |
| "ids" : { | |
| "xid" : XID, | |
| "uid" : 0, | |
| "vid" : 0, | |
| "cid" : imei, | |
| "ety" : ETY, | |
| "date" : date | |
| }, | |
| "data": { | |
| "type": t, | |
| "lat": float(lat), | |
| "lng": float(lng), | |
| "ts": strtotime(utime), | |
| "val": "" | |
| } | |
| } | |
| db.event.insert(data) | |
| # print('event', data) | |
| else: | |
| pass | |
| buf = '' | |
| else: | |
| buf = data | |
| time.sleep(0.1) | |
| except Exception as e: | |
| print(e) | |
| def finish(self): | |
| print("client is disconnect!") | |
| class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): | |
| daemon_threads = True | |
| allow_reuse_address = True | |
| def __init__(self, server_address, RequestHandlerClass): | |
| SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass) | |
| if __name__ == "__main__": | |
| HOST, PORT = '0.0.0.0', 7080 | |
| server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) | |
| try: | |
| server.serve_forever() | |
| except KeyboardInterrupt: | |
| sys.exit(0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment