Commit 885a8189 by see.liuh@gmail.com

【CHG】接口增加假授权,能够接收数据转发服务发来的消息

【ADD】增加event_to_local.py,负责将接收到的数据文件以及图片保存在本地。apps/special.properties中增加root_save_path存储根目录
1 parent 06ac6779
...@@ -10,6 +10,7 @@ import apps.gbvar.ws_serv_global as sv_global ...@@ -10,6 +10,7 @@ import apps.gbvar.ws_serv_global as sv_global
import apps.gbvar.database_global as database import apps.gbvar.database_global as database
import apps.gbvar.dict_properties as dict_p import apps.gbvar.dict_properties as dict_p
import apps.commons.editXml as editXml import apps.commons.editXml as editXml
import apps.commons.event_to_local as etl
tx1_box = Blueprint('tx1_box', __name__) tx1_box = Blueprint('tx1_box', __name__)
...@@ -18,8 +19,14 @@ tx1_box = Blueprint('tx1_box', __name__) ...@@ -18,8 +19,14 @@ tx1_box = Blueprint('tx1_box', __name__)
def dataRecv(): def dataRecv():
data = request.get_data() data = request.get_data()
print data dataDic = json.loads(data)
send_all_data(sv_global.get_value(),data) if type(dataDic) is dict:
res = etl.eventToLocal.saveEventToLocal(dataDic)
print(res)
send_all_data(sv_global.get_value(),data)
else:
print('error: data to dict failed, data:{}'.format(data))
return data return data
@tx1_box.route('/test', methods=["GET"]) @tx1_box.route('/test', methods=["GET"])
......
...@@ -4,21 +4,31 @@ from flask import Blueprint, request ...@@ -4,21 +4,31 @@ from flask import Blueprint, request
import time,json import time,json
import apps.gbvar.dict_properties as dict_p import apps.gbvar.dict_properties as dict_p
login = Blueprint('login', __name__) login = Blueprint('login', __name__)
register = Blueprint('register', __name__)
@login.route('/login',methods=['POST']) @login.route('/login',methods=['POST'])
def login1(): def login1():
data = request.get_data () data = request.get_data ()
print data print data
result = { result = {
"user_unid": time.time(), # 必填,用户unid "user_unid": "tx1_dev_unid", # 必填,用户unid
"user_type": "device", # 可选,用户类型,不出现表示"user",即普通用户。 "user_type": "device", # 可选,用户类型,不出现表示"user",即普通用户。
"atoken": time.time(), # 必填,用户的atoken "atoken": str(time.time()), # 必填,用户的atoken
"atoken_edt": time.strftime ( "%Y-%m-%d %H:%M:%S", time.localtime(time.time())), # 必填,atoken到期时间 "atoken_edt": str(time.strftime ( "%Y-%m-%d %H:%M:%S", time.localtime(time.time()))), # 必填,atoken到期时间
"rtoken": time.time(), # 可选,用户的rtoken "rtoken": str(time.time()), # 可选,用户的rtoken
"rtoken_edt": time.strftime ( "%Y-%m-%d %H:%M:%S", time.localtime(time.time())), # 可选,rtoken到期时间 "rtoken_edt": str(time.strftime ( "%Y-%m-%d %H:%M:%S", time.localtime(time.time()))), # 可选,rtoken到期时间
} }
return json.dumps ( result, ensure_ascii=False ) return json.dumps ( result, ensure_ascii=False )
@login.route('/recv_data/url',methods=['GET']) @register.route('/manage/devs/tx1_dev_unid/register',methods=['POST'])
def register1():
data = request.get_data ()
return data
@register.route('/recv_data/http_url',methods=['GET'])
def get_recv_url(): def get_recv_url():
return 'http://%s:%s/api/v1/tx1_box/events' % (dict_p.get_value()['tx1_host'],dict_p.get_value()['tx1_http_port'])
\ No newline at end of file \ No newline at end of file
url = 'http://{}:{}/api/v1/tx1_box/events'.format(dict_p.get_value()['tx1_host'],dict_p.get_value()['tx1_http_port'])
print(url)
result = {"http_url": url}
return json.dumps ( result, ensure_ascii=False )
\ No newline at end of file \ No newline at end of file
#!/usr/bin/evn python
# coding=utf-8
#存储路径规范
#卡口/任务/日期/小时/分钟
#违法/任务/日期/类型/小时
#事件/任务/日期/类型/小时
#交通参数(流量、密度类)/任务/日期/类型/小时
import time
import datetime
import os
import json
import uuid
import base64
import apps.gbvar.dict_properties as dict_p
class EventToLocalUtil(object):
"""docstring for EventToLocalUtil"""
def __init__(self):
super(EventToLocalUtil, self).__init__()
self.rootPath = ''
def setRootPath(self, rootPath):
self.rootPath = rootPath
self.__loginfo('save_root_path: {}'.format(rootPath))
# return tuple: (bool, picAbsPathList, infoAbsPathList)
# 返回元祖。元素0-是否成功。 1-图片存储绝对路径列表 2-信息存储绝对路径列表(目前一条记录只有一个信息文件)
# @todo 现在只支持base64的图片存储。如果图片是url,还需补充函数功能。
def saveEventToLocal(self, dataDict):
isok = False
outPicsPath = []
outInfoPath = []
beginTime = time.time()
if 'event_type' in dataDict and 'event_cate' in dataDict:
# if 'pics' in dataDict:
basePath = self.generatePath(dataDict)
self.__loginfo('generatePath result:{}'.format(basePath))
if not os.path.exists(basePath):
os.makedirs(basePath)
infoPath = ''
if 'pics' in dataDict:
picsArr = dataDict['pics']
index = 0
for pic in picsArr:
picPath = ''
if 'ofilename' in pic:
if index == 0:
infoPath = (pic['ofilename'].split('.'))[0]
# infoPath = pic['ofilename']
picPath = basePath + '/' + pic['ofilename']
elif 'event_refid' in dataDict:
if(len(dataDict['event_refid'])<=0):
dataDict['event_refid'] = str(uuid.uuid1())
if index == 0:
infoPath = dataDict['event_refid']
picPath = '{}-{}{}'.format(dataDict['event_refid'] , index , '.jpg')
else:
self.__logerror('saveEventToLocal cannot find ofilename or event_refid,\
picPath cannot generate, will not save pic')
if(len(picPath) >0):
if 'pic_base64' in pic:
try:
with open(picPath, 'wb') as f:
f.write(base64.b64decode(pic['pic_base64']))
outPicsPath.append(picPath)
except Exception as e:
self.__logerror('save pic failed, exception:')
self.__logerror(e)
else:
self.__logerror('saveEventToLocal cannot find pic_base64')
self.__logerror(pic)
pic['pic_base64'] = ''
index = index+1
if(len(infoPath)<=0):
if 'event_refid' in dataDict:
if(len(dataDict['event_refid'])<=0):
dataDict['event_refid'] = str(uuid.uuid1())
infoPath = basePath + '/' + dataDict['event_refid'] + '.json'
else:
self.__logerror('saveEventToLocal cannot find event_refid,\
infoPath cannot generate')
else:
infoPath = basePath + '/' + infoPath + '.json'
try:
with open(infoPath, 'w') as f:
json.dump(dataDict, f)
outInfoPath.append(infoPath)
isok = True
except Exception as e:
self.__logerror('save infoPath failed, exception:')
self.__logerror(e)
else:
__logerror("cannot find event_type and event_cate in dataDict")
isok = False
endtime = time.time();
self.__loginfo("saveEventToLocal duration time:{} ms".format( (endtime-beginTime)*1000 ))
return (isok, outPicsPath, outInfoPath)
def utc2local(self, utc_dtm ):
local_tm = datetime.datetime.fromtimestamp( 0 )
utc_tm = datetime.datetime.utcfromtimestamp( 0 )
offset = local_tm - utc_tm
return utc_dtm + offset
# 不同的种类有不同的路径结构。
#存储路径规范
#卡口/任务/日期/小时/分钟
#违法/任务/日期/类型/小时
#事件/任务/日期/类型/小时
#交通参数(流量、密度类)/任务/日期/类型/小时
#判断逻辑,生成路径均在此函数中实现
def generatePath(self, dataDict):
et = datetime.datetime.now()
if 'event_dt' in dataDict:
if 'T' in dataDict['event_dt']:
et = datetime.datetime.strptime(dataDict['event_dt'], "%Y-%m-%dT%H:%M:%S.%f")
et = self.utc2local(et)
pass
else:
et = datetime.datetime.strptime(dataDict['event_dt'], "%Y-%m-%d %H:%M:%S.%f")
et = self.utc2local(et)
pass
else:
self.__loginfo('generatePath cannot find event_dt, use current time')
vid = ''
if 'task_id' in dataDict:
vid = dataDict['task_id']
elif 'vchan_refid' in dataDict:
vid = dataDict['vchan_refid']
else:
vid = 'unkown'
genPath = ''
eventType = dataDict['event_type']
eventCate = dataDict['event_cate']
if eventType == 'vehicle' :
# 卡口
if 'illegal' not in dataDict:
genPath = '%s/kakou/%s/%04d%02d%02d/%02d/%02d'%(self.rootPath,vid,et.year, \
et.month,et.day,et.hour, et.minute)
else:
#违法
genPath = '%s/weifa/%s/%04d%02d%02d/%s/%02d'%(self.rootPath,vid,et.year, \
et.month,et.day,dataDict['event_type'], et.hour)
# 交通参数
elif eventType == 'tflow' \
or eventType == 'pflow' or eventType == 'pdensity':
genPath = '%s/jiaotongcanshu/%s/%04d%02d%02d/%s/%02d'%(self.rootPath,vid,et.year, \
et.month,et.day,dataDict['event_type'], et.hour)
# 事件
elif eventType == 'xcycle' or eventType == 'pedestrian' or eventCate == 'behavior':
genPath = '%s/shijian/%s/%04d%02d%02d/%s/%02d'%(self.rootPath,vid,et.year, \
et.month,et.day,dataDict['event_type'], et.hour)
else:
genPath = '%s/unkown/%s/%04d%02d%02d/%s/%02d'%(self.rootPath,vid,et.year, \
et.month,et.day,dataDict['event_type'], et.hour)
return genPath
def __loginfo(self, logstr):
print('[info][event_to_local]:{}'.format(logstr))
def __logerror(self, logstr):
print('[error][event_to_local]:{}'.format(logstr))
eventToLocal = EventToLocalUtil()
\ No newline at end of file \ No newline at end of file
...@@ -7,6 +7,7 @@ from api.http_serv import tx1_box ...@@ -7,6 +7,7 @@ from api.http_serv import tx1_box
from api.task import task from api.task import task
from api.ws_serv import Server from api.ws_serv import Server
from apps.api.login import login from apps.api.login import login
from apps.api.login import register
import apps.gbvar.ws_serv_global as sv_global import apps.gbvar.ws_serv_global as sv_global
import apps.gbvar.database_global as database import apps.gbvar.database_global as database
import apps.gbvar.dict_properties as dict_p import apps.gbvar.dict_properties as dict_p
...@@ -14,6 +15,7 @@ import fdb ...@@ -14,6 +15,7 @@ import fdb
import sys import sys
import os import os
from commons.util import * from commons.util import *
import apps.commons.event_to_local as etl
app = Flask(__name__, static_folder='dist') app = Flask(__name__, static_folder='dist')
# 获取本脚本所在的路径 # 获取本脚本所在的路径
pro_path = os.path.split(os.path.realpath(__file__))[0] pro_path = os.path.split(os.path.realpath(__file__))[0]
...@@ -28,7 +30,10 @@ app.register_blueprint(tx1_box, url_prefix='/api/v1/tx1_box') ...@@ -28,7 +30,10 @@ app.register_blueprint(tx1_box, url_prefix='/api/v1/tx1_box')
app.register_blueprint(task, url_prefix='/api/v1/tx1_box/task') app.register_blueprint(task, url_prefix='/api/v1/tx1_box/task')
#注册login路由 #注册login路由
app.register_blueprint(login, url_prefix='/api/v1/tx1_box') app.register_blueprint(login, url_prefix='/api/v1/auth/users')
#注册register路由
app.register_blueprint(register, url_prefix='/api/v1')
@app.route('/', methods=["GET"]) @app.route('/', methods=["GET"])
def index(): def index():
...@@ -82,6 +87,7 @@ if __name__=='__main__': ...@@ -82,6 +87,7 @@ if __name__=='__main__':
#init() #init()
_h=dictProperties['tx1_host'] _h=dictProperties['tx1_host']
_p=int(dictProperties['tx1_ws_port']) _p=int(dictProperties['tx1_ws_port'])
etl.eventToLocal.setRootPath(dictProperties['save_root_path'])
start_ws(_h,_p) start_ws(_h,_p)
print sv_global.get_value() print sv_global.get_value()
t1 = threading.Thread ( target=thread_start, name='start_ws_serv', args={sv_global.get_value (), } ) t1 = threading.Thread ( target=thread_start, name='start_ws_serv', args={sv_global.get_value (), } )
......
#系统参数 #系统参数
tx1_host=192.168.9.61 tx1_host=192.168.88.159
tx1_http_port=20090 tx1_http_port=20090
tx1_ws_port=20080 tx1_ws_port=20080
...@@ -17,4 +17,6 @@ task_4=/root/UserApp/vioncfg/Ops/ServerConfig.xml@运维服务@./start.sh ...@@ -17,4 +17,6 @@ task_4=/root/UserApp/vioncfg/Ops/ServerConfig.xml@运维服务@./start.sh
cut_pic_url=http://192.168.88.109:10088/apiv1/capture cut_pic_url=http://192.168.88.109:10088/apiv1/capture
#重启任务指令 #重启任务指令
start_task=./task_start.sh
\ No newline at end of file \ No newline at end of file
start_task=./task_start.sh
save_root_path=./datasave
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!