Skip to content

Instantly share code, notes, and snippets.

@caingougou
Created November 7, 2018 15:52
Show Gist options
  • Save caingougou/5761ea17594b01570a847af72892c35c to your computer and use it in GitHub Desktop.
Save caingougou/5761ea17594b01570a847af72892c35c to your computer and use it in GitHub Desktop.
yiwie.py
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