1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588 |
- # 主業務邏輯中的視圖和路由的定義
- import os
- import datetime
- from flask import render_template, request, session, Response
- # 導入藍圖程序,用於構建路由
- from werkzeug.utils import redirect
- from . import main
- from manage import mqtt
- # 導入db,用於操作數據庫
- from manage import db
- # 導入實體類,用於操作數據庫
- from ..models import *
- import json
- from datetime import datetime as dt, date
- from sqlalchemy import text
- import socket
- import pickle
- import cv2
- import numpy as np
- import math
- import threading
- import time
- from flask_mqtt import Mqtt
- import requests
- import re
- from time import sleep as sl
- from concurrent.futures import ThreadPoolExecutor
- pool = ThreadPoolExecutor(25)
- s_sock = 0
- lock = threading.Lock()
- # 主頁的訪問路徑
- @main.route('/')
- def main_index():
- # 獲取登入信息
- if 'id' in session and 'uname' in session:
- return render_template('allindex.html')
- else:
- return render_template('sign_in.html')
- # 登入頁面的訪問路徑
- @main.route('/login', methods=['GET', 'POST'])
- def login_views():
- if request.method == 'GET':
- if 'id' in session and 'uname' in session:
- return redirect('/')
- else:
- return render_template('sign_in.html')
- else:
- # 接收前端傳過來的資料
- username = request.form['username']
- password = request.form['password']
- # 使用接收的用戶和密碼到資料庫中查詢
- user = User.query.filter_by(username=username, password=password).first()
- # 如果用戶存在,將信息保存置session並重定向回首頁,否則重定向回登入頁
- # if user and user.check_hash_password(password):
- if user:
- resp = redirect('/')
- # 判斷是否有記住密碼
- if 'rem' in request.form:
- sn = str(user.sn)
- max_age = 60 * 60 * 24 * 365
- resp.set_cookie("username", username, max_age=max_age)
- resp.set_cookie("sn", sn, max_age=max_age)
- session['uname'] = user.username
- session['id'] = user.sn
- return resp
- else:
- errMsg = "Wrong username or password"
- return render_template('sign_in.html', errMsg=errMsg)
- # 註冊頁面的訪問路徑
- @main.route('/register', methods=['POST', "GET"])
- def register_views():
- if request.method == 'GET':
- return render_template('registration.html')
- else:
- # 獲取文本框的值並賦值給user實體對象
- # username = request.form['username']
- # password = request.form['password']
- # user = User(username=username, password=password)
- user = User()
- user.username = request.form['username']
- user.password = request.form['password']
- # 將數據保存進資料庫 - 註冊
- db.session.add(user)
- # 手動提交,目的是為了獲取提交後的user的id
- db.session.commit()
- # 當user成功插入進資料庫之後,程序會自動將所有信息取出來在賦值給user
- # 完成登入的操作
- user = User.query.filter_by(username=user.username).first()
- session['id'] = user.sn
- session['uname'] = user.username
- return redirect('/')
- # 毛豆田的主頁面
- @main.route('/aindex', methods=['POST', 'GET'])
- def aindex_views():
- if 'id' not in session and 'uname' not in session:
- return redirect('/')
- return render_template('aindex.html')
- # 毛豆車的主頁面
- @main.route('/cindex/<tid>', methods=['POST', 'GET'])
- def cindex_views(tid):
- if request.method == 'GET':
- if 'id' not in session and 'uname' not in session:
- return redirect('/')
- return render_template('cindex.html', params=locals())
- else:
- dict = request.form.to_dict()
- queryDate = dict['date']
- year = int(queryDate.split('-')[0])
- month = int(queryDate.split('-')[1])
- day = int(queryDate.split('-')[2])
- #判斷月份,找出查詢日期的前一天與後一天
- if month == 1 or month == 3 or month == 5 or month == 7 or month == 10 or month == 12:
- start_year = year
- end_year = year
- if day == 1:
- start_month = month - 1
- start_day = 30
- end_month = month
- end_day = day + 1
- if month == 1:
- start_year = year - 1
- start_month = 12
- start_day = 31
- if month == 3:
- if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
- start_day = 29
- else:
- start_day = 28
- elif day == 31:
- start_year = year
- start_month = month
- start_day = day - 1
- end_year = year
- end_month = month + 1
- if month == 12:
- end_year = year + 1
- end_month = 1
- end_day = 1
- else:
- start_month = month
- start_day = day - 1
- end_month = month
- end_day = day + 1
- elif month == 2 or month == 4 or month == 6 or month == 8 or month == 9 or month == 11:
- start_year = year
- end_year = year
- if day == 1:
- start_month = month - 1
- start_day = 31
- end_month = month
- end_day = day + 1
- elif day == 31:
- start_month = month
- start_day = day - 1
- end_month = month + 1
- end_day = 1
- elif day == (28 or 29):
- if month == 2:
- start_month = month
- start_day = day - 1
- end_month = month + 1
- end_day = 1
- else:
- start_month = month
- start_day = day - 1
- end_month = month
- end_day = day + 1
- #print(start_year, start_month, start_day, sep='-')
- #print(year, month, day, sep='-')
- #print(end_year, end_month, end_day, sep='-')
- start = date(year=start_year, month=start_month, day=start_day)
- end = date(year=end_year, month=end_month, day=end_day)
- if tid == '1':
- gps = Skyeye5GpsNr1.query.filter(Skyeye5GpsNr1.datetime < end).filter(Skyeye5GpsNr1.datetime > start).all()
- elif tid == '2':
- gps = Skyeye5GpsNr2.query.filter(Skyeye5GpsNr2.datetime < end).filter(Skyeye5GpsNr2.datetime > start).all()
- elif tid == '3':
- gps = Skyeye5GpsNr3.query.filter(Skyeye5GpsNr3.datetime < end).filter(Skyeye5GpsNr3.datetime > start).all()
- return render_template('cindex.html', params=locals())
- # 毛豆田拍攝設定的主頁面
- @main.route('/ashoot_setting/<tid>', methods=['POST', 'GET'])
- def ashoot_setting_views(tid):
- if request.method == 'GET':
- if 'id' not in session and 'uname' not in session:
- return redirect('/')
- if tid == '1':
- nr = 'GTW009002001'
- dic = '1'
- elif tid == '2':
- nr = 'GTW009002002'
- dic = '2'
- elif tid == '3':
- nr = 'GTW009002003'
- dic = '3'
- elif tid == '4':
- nr = 'GTW009002004'
- dic = '4'
- elif tid == '5':
- nr = 'GTW009002005'
- dic = '5'
- elif tid == '6':
- nr = 'GTW009002006'
- dic = '6'
- elif tid == '7':
- nr = 'GTW009002007'
- dic = '7'
- elif tid == '8':
- nr = 'GTW009002008'
- dic = '8'
- elif tid == '9':
- nr = 'GTW009002009'
- dic = '9'
- elif tid == '10':
- nr = 'GTW009002010'
- dic = '10'
- elif tid == '11':
- nr = 'GTW009002011'
- dic = '11'
- elif tid == '12':
- nr = 'GTW009002012'
- dic = '12'
- elif tid == '13':
- nr = 'GTW009002013'
- dic = '13'
- elif tid == '14':
- nr = 'GTW009002014'
- dic = '14'
- elif tid == '15':
- nr = 'GTW009002015'
- dic = '15'
- elif tid == '16':
- nr = 'GTW009002016'
- dic = '16'
- elif tid == '17':
- nr = 'GTW009002017'
- dic = '17'
- elif tid == '18':
- nr = 'GTW009002018'
- dic = '18'
- elif tid == '19':
- nr = 'GTW009002019'
- dic = '19'
- #讓前端頁面顯示小兵現在的位置以及最新照片
- try:
- orientation = Orientation.query.filter_by(nr=nr).order_by(text('datetime desc')).first()
- mode = orientation.mode
- begin_tilt_angle = orientation.tilt_angle
- begin_pan_angle = orientation.pan_angle
- begin_zoom = orientation.zoom
- except Exception as e:
- pass
- try:
- # 可見光(自動拍照)路徑
- path = 'http://60.250.156.234/cust/' + dic + '/nj' + str(mode)
- res = requests.get(path).text
- p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.jpg)"', re.S)
- img = p.findall(res)[-1]
- begin_imgPath = path + '/' + img
- except Exception as e:
- begin_imgPath = '../static/img/PV.jpg'
- #讓前端頁面顯示小兵已設定好哪些方位
- if int(tid) < 10:
- nr = "GTW00900200" + tid
- else:
- nr = "GTW0090020" + tid
- jvtotime = JvtOTime.query.filter_by(nr=nr).group_by('mode')
- mode = []
- for jvt in jvtotime:
- mode.append(jvt.mode)
- dict = request.args.to_dict()
- #刪除小兵設定的方位
- try:
- if dict['delete']:
- if int(dict['nr']) < 10:
- nr = "GTW00900200" + dict['nr']
- else:
- nr = "GTW0090020" + dict['nr']
- mode = int(dict['mode'])
- jvtotime = JvtOTime.query.filter_by(nr=nr, mode=mode).first()
- db.session.delete(jvtotime)
- db.session.commit()
- return {"delete":"ok"}
- except Exception:
- pass
- # 讓前端頁面顯示小兵已設定好的方位資訊
- if dict:
- try:
- if int(dict['nr']) < 10:
- nr = "GTW00900200" + dict['nr']
- else:
- nr = "GTW0090020" + dict['nr']
- mode = int(dict['mode'])
- jvtotime = JvtOTime.query.filter_by(nr=nr, mode=mode).first()
- name = jvtotime.name
- tilt_angle = jvtotime.tilt_angle
- pan_angle = jvtotime.pan_angle
- zoom = str(jvtotime.zoom)
- time1 = jvtotime.time1
- time2 = jvtotime.time2
- time3 = jvtotime.time3
- time4 = jvtotime.time4
- time5 = jvtotime.time5
- time6 = jvtotime.time6
- time7 = jvtotime.time7
- time8 = jvtotime.time8
- dict = {"name": name, "tilt_angle": tilt_angle, "pan_angle": pan_angle, "zoom": zoom, "time1": time1,
- "time2": time2, "time3": time3, "time4": time4, "time5": time5, "time6": time6,
- "time7": time7, "time8": time8}
- return json.dumps(dict)
- except Exception:
- dict = {"name": "", "tilt_angle": "0", "pan_angle": "0", "zoom": "0", "time1": "00000000",
- "time2": "00000000", "time3": "00000000", "time4": "00000000", "time5": "00000000",
- "time6": "00000000", "time7": "00000000", "time8": "00000000"}
- return json.dumps(dict)
- return render_template('aim.html', params=locals())
- else:
- dict = request.form.to_dict()
- if int(dict['nr']) < 10:
- nr = "GTW00900200" + dict['nr']
- else:
- nr = "GTW0090020" + dict['nr']
- mode = int(dict['mode'])
- jvtotime = JvtOTime.query.filter_by(nr=nr, mode=mode).first()
- #判斷是否已存在舊的方位設定,如不存在就創建新對象
- if not jvtotime:
- jvtotime = JvtOTime()
- jvtotimehistory = JvtOTimeHistory()
- orientation = Orientation()
- if dict['nr'] == '1':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:95:00:53'
- elif dict['nr'] == '2':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:e7:51:44'
- elif dict['nr'] == '3':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:ce:a5:35'
- elif dict['nr'] == '4':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:fc:9d:34'
- elif dict['nr'] == '5':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:86:00:c9'
- elif dict['nr'] == '6':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:df:4b:0f'
- elif dict['nr'] == '7':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:6a:5d:17'
- elif dict['nr'] == '8':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:d2:d0:8f'
- elif dict['nr'] == '9':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:57:3c:da'
- elif dict['nr'] == '10':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:bd:29:b1'
- elif dict['nr'] == '11':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:7c:f6:06'
- elif dict['nr'] == '12':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:59:9d:bd'
- elif dict['nr'] == '13':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:e7:21:e5'
- elif dict['nr'] == '14':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:34:9e:39'
- elif dict['nr'] == '15':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:e3:f1:f4'
- elif dict['nr'] == '16':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:f8:24:92'
- elif dict['nr'] == '17':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:9d:68:05'
- elif dict['nr'] == '18':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:4d:e4:34'
- elif dict['nr'] == '19':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:e7:16:28'
- if int(dict['nr']) < 10:
- jvtotime.nr = jvtotimehistory.nr = orientation.nr = 'GTW00900200' + dict['nr']
- else:
- jvtotime.nr = jvtotimehistory.nr = orientation.nr = 'GTW0090020' + dict['nr']
- jvtotime.name = jvtotimehistory.name = dict['ori_name']
- jvtotime.mode = jvtotimehistory.mode = orientation.mode = int(dict['mode'])
- jvtotime.tilt_angle = jvtotimehistory.tilt_angle = orientation.tilt_angle = dict['tilt_angle']
- jvtotime.pan_angle = jvtotimehistory.pan_angle = orientation.pan_angle = dict['pan_angle']
- jvtotime.zoom = jvtotimehistory.zoom = orientation.zoom = int(dict['zoom'])
- jvtotime.time1 = jvtotimehistory.time1 = dict['time1']
- jvtotime.time2 = jvtotimehistory.time2 = dict['time2']
- jvtotime.time3 = jvtotimehistory.time3 = dict['time3']
- jvtotime.time4 = jvtotimehistory.time4 = dict['time4']
- jvtotime.time5 = jvtotimehistory.time5 = dict['time5']
- jvtotime.time6 = jvtotimehistory.time6 = dict['time6']
- jvtotime.time7 = jvtotimehistory.time7 = dict['time7']
- jvtotime.time8 = jvtotimehistory.time8 = dict['time8']
- jvtotime.datetime = jvtotimehistory.datetime = orientation.datetime = dt.now()
- db.session.add(jvtotime)
- db.session.add(jvtotimehistory)
- db.session.add(orientation)
- db.session.commit()
- return {"status": "OK"}
- # #毛豆田車小兵現在所在位置的訪問路徑
- # @main.route('/orientation/<tid>', methods=['POST', 'GET'])
- # def orientation_views(tid):
- # if request.method == 'GET':
- # dict = request.args.to_dict()
- # nr = dict['nr']
- #
- # if nr == 'GTW009001001':
- # dic = '1m'
- # elif nr == 'GTW009001002':
- # dic = '2m'
- # elif nr == 'GTW009001003':
- # dic = '3m'
- # elif nr == 'GTW009002001':
- # dic = '1'
- # elif nr == 'GTW009002002':
- # dic = '2'
- # elif nr == 'GTW009002003':
- # dic = '3'
- # elif nr == 'GTW009002004':
- # dic = '4'
- # elif nr == 'GTW009002005':
- # dic = '5'
- # elif nr == 'GTW009002006':
- # dic = '6'
- # elif nr == 'GTW009002007':
- # dic = '7'
- # elif nr == 'GTW009002008':
- # dic = '8'
- # elif nr == 'GTW009002009':
- # dic = '9'
- # elif nr == 'GTW009002010':
- # dic = '10'
- # elif nr == 'GTW009002011':
- # dic = '11'
- # elif nr == 'GTW009002012':
- # dic = '12'
- # elif nr == 'GTW009002013':
- # dic = '13'
- # elif nr == 'GTW009002014':
- # dic = '14'
- # elif nr == 'GTW009002015':
- # dic = '15'
- # elif nr == 'GTW009002016':
- # dic = '16'
- # elif nr == 'GTW009002017':
- # dic = '17'
- # elif nr == 'GTW009002018':
- # dic = '18'
- #
- #
- #
- # try:
- # orientation = Orientation.query.filter_by(nr=nr).order_by(text('datetime desc')).first()
- # mode = orientation.mode
- # tilt_angle = orientation.tilt_angle
- # pan_angle = orientation.pan_angle
- # zoom = orientation.zoom
- #
- #
- # dict = {"tilt_angle":tilt_angle, "pan_angle":pan_angle, "zoom":zoom, "status":True}
- #
- # except Exception as e:
- # dict = {"status": False}
- # return json.dumps(dict)
- # try:
- # # 可見光(自動拍照)路徑
- # path = 'http://60.250.156.234/cust/' + dic + '/nj' + str(mode)
- # res = requests.get(path).text
- # p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.jpg)"', re.S)
- # img = p.findall(res)[-1]
- # imgPath = path + '/' + img
- # except Exception as e:
- # imgPath = '../static/img/PV.jpg'
- #
- # dict['img'] = imgPath
- # return json.dumps(dict)
- # else:
- # pass
- # 毛豆田歷史資料的主頁面
- @main.route('/aimg_history/<tid>', methods=['POST', 'GET'])
- def aimg_history_views(tid):
- if request.method == 'GET':
- if 'id' not in session and 'uname' not in session:
- return redirect('/')
- #手動拍攝訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '.txt')
- data = res.text
- #判斷是否沒有此文件且為空頁面
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly = list(set(py.findall(data)))
- Ly.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm = list(set(pm.findall(data)))
- Lm.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly[0] + "-" + Lm[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld = list(set(pd.findall(data)))
- Ld.sort(reverse=True)
- #匹配出時間
- pt = re.compile(Ly[0] + "-" + Lm[0] + "-" + Ld[0] + r'\_(\d+\.\d+)n', re.S)
- Lt = list(set(pt.findall(data)))
- Lt.sort(reverse = True)
- except Exception as e:
- pass
- #1號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_1.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- #如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln1 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln1.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly1 = list(set(py.findall(data)))
- Ly1.sort(reverse=True)
- #匹配出月份
- pm = re.compile(Ly1[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm1 = list(set(pm.findall(data)))
- Lm1.sort(reverse=True)
- #匹配出天數
- pd = re.compile(Ly1[0] + "-" + Lm1[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld1 = list(set(pd.findall(data)))
- Ld1.sort(reverse=True)
- #匹配出時間
- pt = re.compile(Ly1[0] + "-" + Lm1[0] + "-" + Ld1[0] + r'\_(\d+\.\d+)n', re.S)
- Lt1 = list(set(pt.findall(data)))
- Lt1.sort(reverse = True)
- except Exception as e:
- pass
- #2號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_2.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln2 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln2.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly2 = list(set(py.findall(data)))
- Ly2.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly2[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm2 = list(set(pm.findall(data)))
- Lm2.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly2[0] + "-" + Lm2[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld2 = list(set(pd.findall(data)))
- Ld2.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly2[0] + "-" + Lm2[0] + "-" + Ld2[0] + r'\_(\d+\.\d+)n', re.S)
- Lt2 = list(set(pt.findall(data)))
- Lt2.sort(reverse = True)
- except Exception as e:
- pass
- #3號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_3.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln3 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln3.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly3 = list(set(py.findall(data)))
- Ly3.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly3[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm3 = list(set(pm.findall(data)))
- Lm3.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly3[0] + "-" + Lm3[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld3 = list(set(pd.findall(data)))
- Ld3.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly3[0] + "-" + Lm3[0] + "-" + Ld3[0] + r'\_(\d+\.\d+)n', re.S)
- Lt3 = list(set(pt.findall(data)))
- Lt3.sort(reverse = True)
- except Exception as e:
- pass
- #4號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_4.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln4 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln4.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly4 = list(set(py.findall(data)))
- Ly4.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly4[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm4 = list(set(pm.findall(data)))
- Lm4.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly4[0] + "-" + Lm4[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld4 = list(set(pd.findall(data)))
- Ld4.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly4[0] + "-" + Lm4[0] + "-" + Ld4[0] + r'\_(\d+\.\d+)n', re.S)
- Lt4 = list(set(pt.findall(data)))
- Lt4.sort(reverse = True)
- except Exception as e:
- pass
- #5號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_5.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln5 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln5.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly5 = list(set(py.findall(data)))
- Ly5.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly5[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm5 = list(set(pm.findall(data)))
- Lm5.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly5[0] + "-" + Lm5[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld5 = list(set(pd.findall(data)))
- Ld5.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly5[0] + "-" + Lm5[0] + "-" + Ld5[0] + r'\_(\d+\.\d+)n', re.S)
- Lt5 = list(set(pt.findall(data)))
- Lt5.sort(reverse = True)
- except Exception as e:
- pass
- #6號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_6.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln6 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln6.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly6 = list(set(py.findall(data)))
- Ly6.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly6[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm6 = list(set(pm.findall(data)))
- Lm6.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly6[0] + "-" + Lm6[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld6 = list(set(pd.findall(data)))
- Ld6.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly6[0] + "-" + Lm6[0] + "-" + Ld6[0] + r'\_(\d+\.\d+)n', re.S)
- Lt6 = list(set(pt.findall(data)))
- Lt6.sort(reverse = True)
- except Exception as e:
- pass
- #7號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_7.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln7 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln7.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly7 = list(set(py.findall(data)))
- Ly7.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly7[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm7 = list(set(pm.findall(data)))
- Lm7.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly7[0] + "-" + Lm7[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld7 = list(set(pd.findall(data)))
- Ld7.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly7[0] + "-" + Lm7[0] + "-" + Ld7[0] + r'\_(\d+\.\d+)n', re.S)
- Lt7 = list(set(pt.findall(data)))
- Lt7.sort(reverse = True)
- except Exception as e:
- pass
- #8號方位訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + '_8.txt')
- res.encoding = 'utf-8'
- data = res.text
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- #匹配出方位名稱
- pn = re.compile(r'\d+\-\d+\-\d+\_\d+\.\d+n\_([a-zA-Z\u4e00-\u9fa5]+)', re.S)
- L = pn.findall(data)[::-1]
- # 先轉成集合去重,在轉成列表做排序
- Ln8 = list(set(L))
- #讓排序不受到中文編碼影響,加入index
- Ln8.sort(key=L.index)
- #匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly8 = list(set(py.findall(data)))
- Ly8.sort(reverse = True)
- #匹配出月份
- pm = re.compile(Ly8[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm8 = list(set(pm.findall(data)))
- Lm8.sort(reverse = True)
- #匹配出天數
- pd = re.compile(Ly8[0] + "-" + Lm8[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld8 = list(set(pd.findall(data)))
- Ld8.sort(reverse = True)
- #匹配出時間
- pt = re.compile(Ly8[0] + "-" + Lm8[0] + "-" + Ld8[0] + r'\_(\d+\.\d+)n', re.S)
- Lt8 = list(set(pt.findall(data)))
- Lt8.sort(reverse = True)
- except Exception as e:
- pass
- if tid == '1':
- nr = 'GTW009002001'
- elif tid == '2':
- nr = 'GTW009002002'
- elif tid == '3':
- nr = 'GTW009002003'
- elif tid == '4':
- nr = 'GTW009002004'
- elif tid == '5':
- nr = 'GTW009002005'
- elif tid == '6':
- nr = 'GTW009002006'
- elif tid == '7':
- nr = 'GTW009002007'
- elif tid == '8':
- nr = 'GTW009002008'
- elif tid == '9':
- nr = 'GTW009002009'
- elif tid == '10':
- nr = 'GTW009002010'
- elif tid == "11":
- nr = 'GTW009002011'
- elif tid == '12':
- nr = 'GTW009002012'
- elif tid == '13':
- nr = 'GTW009002013'
- elif tid == '14':
- nr = 'GTW009002014'
- elif tid == '15':
- nr = 'GTW009002015'
- elif tid == '16':
- nr = 'GTW009002016'
- elif tid == '17':
- nr = 'GTW009002017'
- elif tid == '18':
- nr = 'GTW009002018'
- elif tid == '19':
- nr = 'GTW009002019'
- try:
- orientation = Orientation.query.filter_by(nr=nr).order_by(text('datetime desc')).first()
- mode = orientation.mode
- except Exception as e:
- pass
- try:
- # 可見光(自動拍照)路徑
- path = 'http://60.250.156.234/cust/' + tid + '/nj' + str(mode)
- res = requests.get(path).text
- p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.jpg)"', re.S)
- img = p.findall(res)[-1]
- imgPath = path + '/' + img
- # ndvi路徑
- path = 'http://60.250.156.234/cust/' + tid + '/ndvia' + str(mode)
- res = requests.get(path).text
- p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.png)"', re.S)
- img = p.findall(res)[-1]
- ndviImgPath = path + '/' + img
- timeList = img.split('_')
- year = timeList[0].split('-')[0]
- month = timeList[0].split('-')[1]
- day = timeList[0].split('-')[2]
- time = timeList[1].split('.')[0] + '.' + timeList[1].split('.')[1]
- except Exception as e:
- ndviImgPath = '../static/img/ndvi.jpg'
- imgPath = '../static/img/PV.jpg'
- return render_template('ahistory_ndvi1.html', params=locals())
- else:
- dict = request.form.to_dict()
- #小兵編號
- nr = dict['nr']
- #手動~方位8
- ori = dict['ori']
- #方位名稱
- name = dict['n']
- #年
- year = dict['y']
- #月
- month = dict['m']
- #日
- day = dict['d']
- #表單名稱
- evt = dict['evt']
- #判斷方位的值
- if ori == '0':
- res = requests.get('http://60.250.156.234/cust/c' + nr + '.txt')
- else:
- res = requests.get('http://60.250.156.234/cust/c' + nr + '_' + ori +'.txt')
- res.encoding = 'utf-8'
- data = res.text
- y = []
- m = []
- d = []
- t = []
- if evt[-1] == 'n':
- # 匹配出年
- if name == 'all':
- p = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- else:
- p = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n\_' + name, re.S)
- y = list(set(p.findall(data)))
- y.sort(reverse=True)
- # 匹配出月
- if name == 'all':
- p = re.compile(y[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- else:
- p = re.compile(y[0] + r'\-(\d+)\-\d+\_\d+\.\d+n\_' + name, re.S)
- # 先轉成集合去重,在轉成列表做排序
- m = list(set(p.findall(data)))
- m.sort(reverse=True)
- # 匹配出日
- if name == 'all':
- p = re.compile(y[0] + "-" + m[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- else:
- p = re.compile(y[0] + "-" + m[0] + r'\-(\d+)\_\d+\.\d+n\_' + name, re.S)
- # 先轉成集合去重,在轉成列表做排序
- d = list(set(p.findall(data)))
- d.sort(reverse=True)
- # 匹配出時間
- if name == 'all':
- p = re.compile(y[0] + "-" + m[0] + "-" + d[0] + r'\_(\d+\.\d+)n', re.S)
- else:
- p = re.compile(y[0] + "-" + m[0] + "-" + d[0] + r'\_(\d+\.\d+)n\_' + name, re.S)
- # 先轉成集合去重,在轉成列表做排序
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"y": y, "m": m, "d": d, "t": t}
- return json.dumps(D)
- elif evt[-1] == 'y':
- #匹配出月
- p = re.compile(year + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- m = list(set(p.findall(data)))
- m.sort(reverse=True)
- # 匹配出日
- p = re.compile(year + "-" + m[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- d = list(set(p.findall(data)))
- d.sort(reverse=True)
- # 匹配出時間
- p = re.compile(year + "-" + m[0] + "-" + d[0] + r'\_(\d+\.\d+)n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"m":m, "d":d, "t":t}
- return json.dumps(D)
- elif evt[-1] == 'm':
- #匹配出日
- p = re.compile(year + "-" + month + r'\-(\d+)\_\d+\.\d+n', re.S)
- d = list(set(p.findall(data)))
- d.sort(reverse=True)
- #匹配出時間
- p = re.compile(year + "-" + month + "-" + d[0] + r'\_(\d+\.\d+)n', re.S)
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"d":d, "t":t}
- return json.dumps(D)
- elif evt[-1] == 'd':
- #匹配出時間
- p = re.compile(year + "-" + month + "-" + day + r'\_(\d+\.\d+)n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"t":t}
- return json.dumps(D)
- # 毛豆車拍攝設定的主頁面
- @main.route('/cshoot_setting/<tid>', methods=['POST', 'GET'])
- def cshoot_setting_views(tid):
- if request.method == 'GET':
- if 'id' not in session and 'uname' not in session:
- return redirect('/')
- if tid == '1':
- nr = 'GTW009001001'
- dic = '1m'
- elif tid == '2':
- nr = 'GTW009001002'
- dic = '2m'
- elif tid == '3':
- nr = 'GTW009001003'
- dic = '3m'
- #讓前端頁面顯示小兵現在的位置以及最新照片
- try:
- orientation = Orientation.query.filter_by(nr=nr).order_by(text('datetime desc')).first()
- mode = orientation.mode
- begin_tilt_angle = orientation.tilt_angle
- begin_pan_angle = orientation.pan_angle
- begin_zoom = orientation.zoom
- except Exception as e:
- pass
- try:
- # 可見光(自動拍照)路徑
- path = 'http://60.250.156.234/cust/' + dic + '/nj' + str(mode)
- res = requests.get(path).text
- p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.jpg)"', re.S)
- img = p.findall(res)[-1]
- begin_imgPath = path + '/' + img
- except Exception as e:
- begin_imgPath = '../static/img/PV.jpg'
- #讓前端頁面顯示小兵已設定好哪些方位
- nr = "GTW00900100" + tid
- jvtotime = JvtOTime.query.filter_by(nr=nr).group_by('mode')
- mode = []
- for jvt in jvtotime:
- mode.append(jvt.mode)
- dict = request.args.to_dict()
- #刪除小兵設定的方位
- try:
- if dict['delete']:
- nr = "GTW00900100" + dict['nr']
- mode = int(dict['mode'])
- jvtotime = JvtOTime.query.filter_by(nr=nr, mode=mode).first()
- db.session.delete(jvtotime)
- db.session.commit()
- return {"delete":"ok"}
- except Exception:
- pass
- # 讓前端頁面顯示小兵已設定好的方位資訊
- if dict:
- try:
- nr = "GTW00900100" + dict['nr']
- mode = int(dict['mode'])
- jvtotime = JvtOTime.query.filter_by(nr=nr, mode=mode).first()
- name = jvtotime.name
- tilt_angle = jvtotime.tilt_angle
- pan_angle = jvtotime.pan_angle
- zoom = str(jvtotime.zoom)
- time1 = jvtotime.time1
- time2 = jvtotime.time2
- time3 = jvtotime.time3
- time4 = jvtotime.time4
- time5 = jvtotime.time5
- time6 = jvtotime.time6
- time7 = jvtotime.time7
- time8 = jvtotime.time8
- dict = {"name": name, "tilt_angle": tilt_angle, "pan_angle": pan_angle, "zoom": zoom, "time1": time1,
- "time2": time2, "time3": time3, "time4": time4, "time5": time5, "time6": time6,
- "time7": time7, "time8": time8}
- return json.dumps(dict)
- except Exception:
- dict = {"name": "", "tilt_angle": "0", "pan_angle": "0", "zoom": "0", "time1": "00000000",
- "time2": "00000000", "time3": "00000000", "time4": "00000000", "time5": "00000000",
- "time6": "00000000", "time7": "00000000", "time8": "00000000"}
- return json.dumps(dict)
- return render_template('cim.html', params=locals())
- else:
- dict = request.form.to_dict()
- nr = "GTW00900100" + dict['nr']
- mode = int(dict['mode'])
- jvtotime = JvtOTime.query.filter_by(nr=nr, mode=mode).first()
- if not jvtotime:
- jvtotime = JvtOTime()
- jvtotimehistory = JvtOTimeHistory()
- orientation = Orientation()
- if dict['nr'] == '1':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:b7:52:9c'
- elif dict['nr'] == '2':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:c1:72:0c'
- elif dict['nr'] == '3':
- jvtotime.mac = jvtotimehistory.mac = 'b8:27:eb:84:e9:3f'
- jvtotime.nr = jvtotimehistory.nr = orientation.nr = 'GTW00900100' + dict['nr']
- jvtotime.name = jvtotimehistory.name = dict['ori_name']
- jvtotime.mode = jvtotimehistory.mode = orientation.mode = int(dict['mode'])
- jvtotime.tilt_angle = jvtotimehistory.tilt_angle = orientation.tilt_angle = dict['tilt_angle']
- jvtotime.pan_angle = jvtotimehistory.pan_angle = orientation.pan_angle = dict['pan_angle']
- jvtotime.zoom = jvtotimehistory.zoom = orientation.zoom = int(dict['zoom'])
- jvtotime.time1 = jvtotimehistory.time1 = dict['time1']
- jvtotime.time2 = jvtotimehistory.time2 = dict['time2']
- jvtotime.time3 = jvtotimehistory.time3 = dict['time3']
- jvtotime.time4 = jvtotimehistory.time4 = dict['time4']
- jvtotime.time5 = jvtotimehistory.time5 = dict['time5']
- jvtotime.time6 = jvtotimehistory.time6 = dict['time6']
- jvtotime.time7 = jvtotimehistory.time7 = dict['time7']
- jvtotime.time8 = jvtotimehistory.time8 = dict['time8']
- jvtotime.datetime = jvtotimehistory.datetime = orientation.datetime = dt.now()
- db.session.add(jvtotime)
- db.session.add(jvtotimehistory)
- db.session.add(orientation)
- db.session.commit()
- return {"status": "OK"}
- # 毛豆車歷史資料的主頁面
- @main.route('/cimg_history/<tid>', methods=['POST', 'GET'])
- def cimg_history_views(tid):
- if request.method == 'GET':
- if 'id' not in session and 'uname' not in session:
- return redirect('/')
- # 手動拍攝訊息
- res = requests.get('http://60.250.156.234/cust/c' + tid + 'm.txt')
- data = res.text
- # 判斷是否沒有此文件且為空頁面
- if "404 Not Found" not in data and data:
- # 如果頁面是空的,在正則匹配就會報錯,所以加上try捕捉異常
- try:
- # 匹配出年份
- py = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- Ly = list(set(py.findall(data)))
- Ly.sort(reverse=True)
- # 匹配出月份
- pm = re.compile(Ly[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- Lm = list(set(pm.findall(data)))
- Lm.sort(reverse=True)
- # 匹配出天數
- pd = re.compile(Ly[0] + "-" + Lm[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- Ld = list(set(pd.findall(data)))
- Ld.sort(reverse=True)
- # 匹配出時間
- pt = re.compile(Ly[0] + "-" + Lm[0] + "-" + Ld[0] + r'\_(\d+\.\d+)n', re.S)
- Lt = list(set(pt.findall(data)))
- Lt.sort(reverse=True)
- except Exception as e:
- pass
- if tid == '1':
- nr = 'GTW009001001'
- dic = '1m'
- elif tid == '2':
- nr = 'GTW009001002'
- dic = '2m'
- elif tid == '3':
- nr = 'GTW009001003'
- dic = '3m'
- try:
- orientation = Orientation.query.filter_by(nr=nr).order_by(text('datetime desc')).first()
- mode = orientation.mode
- except Exception:
- pass
- try:
- # 可見光(自動拍照)路徑
- path = 'http://60.250.156.234/cust/' + dic + '/nj' + str(mode)
- res = requests.get(path).text
- p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.jpg)"', re.S)
- img = p.findall(res)[-1]
- imgPath = path + '/' + img
- # ndvi路徑
- path = 'http://60.250.156.234/cust/' + tid + '/ndvia' + str(mode)
- res = requests.get(path).text
- p = re.compile(r'<a href="(\d+\-\d+\-\d+\_\d+\.\d+\.png)"', re.S)
- img = p.findall(res)[-1]
- ndviImgPath = path + '/' + img
- timeList = img.split('_')
- year = timeList[0].split('-')[0]
- month = timeList[0].split('-')[1]
- day = timeList[0].split('-')[2]
- time = timeList[1].split('.')[0] + '.' + timeList[1].split('.')[1]
- except Exception as e:
- ndviImgPath = '../static/img/ndvi.jpg'
- imgPath = '../static/img/PV.jpg'
- return render_template('chistory_ndvi1.html', params=locals())
- else:
- dict = request.form.to_dict()
- # 小兵編號
- nr = dict['nr']
- # 手動~方位8
- ori = dict['ori']
- #方位名稱
- name = dict['n']
- # 年
- year = dict['y']
- # 月
- month = dict['m']
- # 日
- day = dict['d']
- # 表單名稱
- evt = dict['evt']
- # 判斷方位的值
- if ori == '0':
- res = requests.get('http://60.250.156.234/cust/c' + nr + 'm.txt')
- else:
- res = requests.get('http://60.250.156.234/cust/c' + nr + '_' + ori + '.txt')
- data = res.text
- y = []
- m = []
- d = []
- t = []
- if evt[-1] == 'n':
- # 匹配出年
- if name == 'all':
- p = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n', re.S)
- else:
- p = re.compile(r'(\d+)\-\d+\-\d+\_\d+\.\d+n\_' + name, re.S)
- y = list(set(p.findall(data)))
- y.sort(reverse=True)
- # 匹配出月
- if name == 'all':
- p = re.compile(y[0] + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- else:
- p = re.compile(y[0] + r'\-(\d+)\-\d+\_\d+\.\d+n\_' + name, re.S)
- # 先轉成集合去重,在轉成列表做排序
- m = list(set(p.findall(data)))
- m.sort(reverse=True)
- # 匹配出日
- if name == 'all':
- p = re.compile(y[0] + "-" + m[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- else:
- p = re.compile(y[0] + "-" + m[0] + r'\-(\d+)\_\d+\.\d+n\_' + name, re.S)
- # 先轉成集合去重,在轉成列表做排序
- d = list(set(p.findall(data)))
- d.sort(reverse=True)
- # 匹配出時間
- if name == 'all':
- p = re.compile(y[0] + "-" + m[0] + "-" + d[0] + r'\_(\d+\.\d+)n', re.S)
- else:
- p = re.compile(y[0] + "-" + m[0] + "-" + d[0] + r'\_(\d+\.\d+)n\_' + name, re.S)
- # 先轉成集合去重,在轉成列表做排序
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"y": y, "m": m, "d": d, "t": t}
- return json.dumps(D)
- elif evt[-1] == 'y':
- # 匹配出月
- p = re.compile(year + r'\-(\d+)\-\d+\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- m = list(set(p.findall(data)))
- m.sort(reverse=True)
- # 匹配出日
- p = re.compile(year + "-" + m[0] + r'\-(\d+)\_\d+\.\d+n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- d = list(set(p.findall(data)))
- d.sort(reverse=True)
- # 匹配出時間
- p = re.compile(year + "-" + m[0] + "-" + d[0] + r'\_(\d+\.\d+)n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"m": m, "d": d, "t": t}
- return json.dumps(D)
- elif evt[-1] == 'm':
- # 匹配出日
- p = re.compile(year + "-" + month + r'\-(\d+)\_\d+\.\d+n', re.S)
- d = list(set(p.findall(data)))
- d.sort(reverse=True)
- # 匹配出時間
- p = re.compile(year + "-" + month + "-" + d[0] + r'\_(\d+\.\d+)n', re.S)
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"d": d, "t": t}
- return json.dumps(D)
- elif evt[-1] == 'd':
- # 匹配出時間
- p = re.compile(year + "-" + month + "-" + day + r'\_(\d+\.\d+)n', re.S)
- # 先轉成集合去重,在轉成列表做排序
- t = list(set(p.findall(data)))
- t.sort(reverse=True)
- D = {"t": t}
- return json.dumps(D)
- # 退出的訪問路徑
- @main.route('/logout')
- def logout_views():
- if 'id' in session and 'uname' in session:
- del session['id']
- del session['uname']
- return redirect('/')
- # 影像串流的路徑
- @main.route("/video_feed", methods=['POST', 'GET'])
- def video_feed_views():
- global s_sock
- if request.method == 'GET':
- #於10分鐘之後,自動關閉socket server
- if s_sock == 0:
- def socket_server_views():
- global s_sock
- # print("test")
- # print(s_sock)
- sl(600)
- if s_sock != 0:
- s_sock.close()
- s_sock = 0
- # print('s_sock is closed')
- pool.submit(socket_server_views)
- host = "60.250.156.230"
- port = 8000
- max_length = 65540
- # max_length = 95540
- s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s_sock.bind((host, port))
- frame_info = None
- buffer = None
- frame = None
- encodedImage = None
- print("-> waiting for connection")
- # 影像生成器函數,將影像以jpg格式傳給前端
- def generate():
- while True:
- with lock:
- global s_sock, frame_info, buffer, frame, encodedImage
- if s_sock == 0:
- break
- data, address = s_sock.recvfrom(max_length)
- if len(data) < 100:
- frame_info = pickle.loads(data)
- if frame_info:
- nums_of_packs = frame_info["packs"]
- for i in range(nums_of_packs):
- if s_sock == 0:
- break
- data, address = s_sock.recvfrom(max_length)
- if i == 0:
- buffer = data
- else:
- buffer += data
- frame = np.frombuffer(buffer, dtype=np.uint8)
- frame = frame.reshape(frame.shape[0], 1)
- frame = cv2.imdecode(frame, cv2.IMREAD_UNCHANGED)
- #如果frame為None就跳過
- if frame is None:
- continue
- frame = cv2.resize(frame, (640, 360), interpolation=cv2.INTER_AREA)
- # encode the frame in JPEG format
- (flag, encodedImage) = cv2.imencode(".jpg", frame)
- # ensure the frame was successfully encoded
- if not flag:
- continue
- # yield the output frame in the byte format
- yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' +
- bytearray(encodedImage) + b'\r\n')
- # return the response generated along with the specific media
- # type (mime type)
- return Response(generate(), mimetype="multipart/x-mixed-replace; boundary=frame")
- else:
- if s_sock != 0:
- s_sock.close()
- s_sock = 0
- # print('s_sock is closed')
- return "s_sock is closed"
- # print("test")
- return "s_sock is closed"
- #控制循環退出的開關
- D = {'GTW009001001':0, 'GTW009001002':0, 'GTW009001003':0, 'GTW009002001':0, 'GTW009002002':0, 'GTW009002003':0, 'GTW009002004':0,
- 'GTW009002005':0, 'GTW009002006':0, 'GTW009002007':0, 'GTW009002008':0, 'GTW009002009':0, 'GTW009002010':0, 'GTW009002011':0,
- 'GTW009002012':0, 'GTW009002013':0, 'GTW009002014':0, 'GTW009002015':0, 'GTW009002016':0, 'GTW009002017':0, 'GTW009002018':0, 'GTW009002019':0}
- #判斷小兵接收回傳訊息是否為這隻程式,還是另一個edamame_brake.py排程程式
- d = {'GTW009001001_n':0, 'GTW009001002_n':0, 'GTW009001003_n':0, 'GTW009002001_n':0, 'GTW009002002_n':0, 'GTW009002003_n':0, 'GTW009002004_n':0,
- 'GTW009002005_n':0, 'GTW009002006_n':0, 'GTW009002007_n':0, 'GTW009002008_n':0, 'GTW009002009_n':0, 'GTW009002010_n':0, 'GTW009002011_n':0,
- 'GTW009002012_n':0, 'GTW009002013_n':0, 'GTW009002014_n':0, 'GTW009002015_n':0, 'GTW009002016_n':0, 'GTW009002017_n':0, 'GTW009002018_n':0, 'GTW009002019_n':0}
- #mqtt發布
- @main.route('/mqtt/<node_id>', methods=['GET','POST'])
- def mqtt_views(node_id):
- import json
- dict = request.args.to_dict()
- json = json.dumps(dict)
- #判斷毛豆車和毛豆田的node_id
- if node_id == 'GTW009001001':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:b7:52:9c'
- elif node_id == 'GTW009001002':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:c1:72:0c'
- elif node_id == 'GTW009001003':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:84:e9:3f'
- elif node_id == 'GTW009002001':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:95:00:53'
- elif node_id == 'GTW009002002':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:e7:51:44'
- elif node_id == 'GTW009002003':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:ce:a5:35'
- elif node_id == 'GTW009002004':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:fc:9d:34'
- elif node_id == 'GTW009002005':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:86:00:c9'
- elif node_id == 'GTW009002006':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:df:4b:0f'
- elif node_id == 'GTW009002007':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:6a:5d:17'
- elif node_id == 'GTW009002008':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:d2:d0:8f'
- elif node_id == 'GTW009002009':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:57:3c:da'
- elif node_id == 'GTW009002010':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:bd:29:b1'
- elif node_id == 'GTW009002011':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:7c:f6:06'
- elif node_id == 'GTW009002012':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:59:9d:bd'
- elif node_id == 'GTW009002013':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:e7:21:e5'
- elif node_id == 'GTW009002014':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:34:9e:39'
- elif node_id == 'GTW009002015':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:e3:f1:f4'
- elif node_id == 'GTW009002016':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:f8:24:92'
- elif node_id == 'GTW009002017':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:9d:68:05'
- elif node_id == 'GTW009002018':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:4d:e4:34'
- elif node_id == 'GTW009002019':
- topic = 'AISKY/AppleFarm/MK-G/b8:27:eb:e7:16:28'
- #假設MQTT命令為開啟影像串流,在3分鐘後自動發布關閉該影像串流
- # if dict['command'] == 'a053':
- # def close_video_views():
- # import json
- # sl(180)
- # dict['command'] = 'a054'
- # json = json.dumps(dict)
- # print(json)
- # mqtt.publish(topic, json)
- # print('close video test')
- #
- # pool.submit(close_video_views)
- num = node_id +'_n'
- mqtt.publish(topic, json)
- d[num] = 1
- if dict['command'] != 'a053':
- if node_id != "GTW009002019":
- if dict['command'] == 'a051':
- sl(600)
- elif dict['command'] == 'a018' or dict['command'] == 'a016' or dict['command'] == 'a052':
- sl(40)
- else:
- sl(10)
- if D[node_id] == 0:
- mqtt.publish(topic, json)
- if dict['command'] == 'a051':
- sl(600)
- elif dict['command'] == 'a018' or dict['command'] == 'a016' or dict['command'] == 'a052':
- sl(40)
- else:
- sl(10)
- if D[node_id] == 0:
- mqtt.publish(topic, json)
- if dict['command'] == 'a051':
- sl(600)
- elif dict['command'] == 'a018' or dict['command'] == 'a016' or dict['command'] == 'a052':
- sl(40)
- else:
- sl(10)
- if D[node_id] == 0:
- status = Status()
- status.nr = node_id
- status.status = 'fail'
- status.datetime = dt.now()
- db.session.add(status)
- db.session.commit()
- d[num] = 0
- D[node_id] = 0
- return "Publish done"
- #處理mqtt訂閱的信息
- @mqtt.on_message()
- def handle_mqtt_message(client, userdata, message):
- payload = message.payload.decode()
- print(payload)
- if payload:
- p = json.loads(payload)
- if d[p['node_id'] +'_n'] == 1:
- if 'filename' in p:
- img = ImageSignalLog()
- img.nr = p['node_id']
- img.command = p['command']
- img.datetime = dt.now()
- img.response = p['rqnn']
- img.position = p['position']
- img.time = p['time']
- img.size_a = p['a']
- img.size_b = p['b']
- img.filename = p['filename']
- db.session.add(img)
- else:
- sig = SignalLog()
- sig.nr = p['node_id']
- sig.command = p['command']
- sig.datetime = dt.now()
- sig.response = p['rqnn']
- if 'tilt' in p:
- sig.tilt_angle = p['tilt']
- if 'pan' in p:
- sig.pan_angle = p['pan']
- if 'zoom' in p:
- sig.zoom = p['zoom']
- if 'position' in p:
- sig.position = p['position']
- db.session.add(sig)
- db.session.commit()
- D[p['node_id']] = 1
- d[p['node_id'] +'_n'] = 0
- # print("-------msg-------")
- # print('name :', p['name'])
- # print('email :', p['email'])
|