#!/usr/bin/env python3 # -*- coding: utf-8 -*- from fastapi import APIRouter, Request, Depends,Query,HTTPException from typing import Union from database import get_db from sqlalchemy.orm import Session from sqlalchemy import case,or_ from sqlalchemy import text from utils import * from utils.ry_system_util import * from utils.video_util import * from common.security import valid_access_token from fastapi.responses import JSONResponse import traceback from datetime import datetime from common import WRJApi from config import settings router = APIRouter() # 获取无人机清单 @router.get('/roughTimeStatus') async def roughTimeStatus( area: str = '', keyword: str = '', time: str = '', mode: str = '', type: str = '', status: str = '', db: Session = Depends(get_db) ): try: print('area:', area) print('keyword:', keyword) print('time:', time) print('mode:', mode) print('type:', type) print('status:', status) fly_data = WRJApi.flyUavInfo() data = WRJApi.roughTimeStatus() area_code = '' status_list = status.split(',') mode_list = mode.split(',') type_list = type.split(',') if area != '': row = db.query(GovdataArea).filter(GovdataArea.id == int(area)).first() area_code = row.area_code.rstrip('0') convertDict = { "0": "离线", "1": "待命", "2": "飞行中", "3": "管制中", "4": "维护中", "5": "执行任务" } wrj_list = [] for n in data: if area_code != '' and n['addressAreaId'].startswith(area_code) == False: continue if keyword != '' and n['uavName'].find(keyword) == -1: continue # 调度响应时间 0-半小时内 1-1小时内 2-2小时内 3-4小时内 4-8小时内 5-24小时内 6-24小时外 if time != '' and n['dispatchResponseTime'] != int(time): continue # 建设模式 0-财政资金采购 (硬件) 1-财政资金采购 (服务) 2-社会面资源 3-示范地区补点 if mode != '' and str(n['constructionModel']) not in mode_list: continue # "isHangarControl": 1 // 配置机巢/机库/基站控制 0-否 1-是 if type != '' and str(n['isHangarControl']) not in type_list: continue # "convertCode": null, // // 第三方机库的状态 0-离线、1-待命中、2-飞行中、3-管制中、4-维护中、5-执行任务 if status != '' and str(n['convertCode']) not in status_list: continue n['status_text'] = convertDict[str(n['convertCode'])] item = { "id": n['id'], "drone_name": n['uavName'], "status": n['convertCode'], "status_text": n['status_text'], "time": n['dispatchResponseTime'], "mode": n['constructionModel'], "type": n['isHangarControl'], "fly_url": n['mediaPullStreamAddress'] if n['mediaPullStreamAddress'] is not None else "", # 飞机视频流 "nest_url": n['nestOutMediaPullStreamAddress'] if n['nestOutMediaPullStreamAddress'] is not None else "", # 机巢视频流 } # 测试数据 if n['id'] == '1725080256731168770' and settings.IS_PROD == False: item['status'] = 2 item['status_text'] = '飞行中' item['fly_info'] = { "lng": '111.58967074364558', # 当前经度(WGS84) "lat": '21.5870035628497', # 当前纬度(WGS84) "windSpeed": '3.0', # 无人机当前接触到的风速(米/ 秒) "nestSeed": '1.1', # 当前机库所在地风速 "temperature": '34.099998474121094', # 无人机目前舱内温度 "environmentTemperature": '30.4', # 无人机所在地的环境温度 "batteryPerce": '66.0', # 电池电量(%) "rainFall": '0' # 无人机所在地天气情况 0:无雨 1: 小雨 2: 中雨 3: 大雨 } # 飞行中的附加信息 if str(n['convertCode']) == '2': fly_info = get_fly_info(n['id'], fly_data) print('fly_info:', fly_info) if fly_info is not None: item['fly_info'] = fly_info wrj_list.append(item) return { "code": 200, "msg": "操作成功", "data": { "list": wrj_list } } except Exception as e: traceback.print_exc() return { "code": 500, "msg": "操作失败" } def get_fly_info(id: str, data: list): for n in data: if n['id'] == id: return { "lng": str(n['lng']), "lat": str(n['lat']), "windSpeed": str(n['windSpeed']), "nestSeed": str(n['nestSpeed']), "temperature": str(n['temperature']), "environmentTemperature": str(n['environmentTemperature']), "batteryPerce": str(n['batteryPerce']), "rainFall": str(n['rainFall']) } return None ''' # 获取飞行中无人机清单 @router.get('/flyUavInfo') async def flyUavInfo( db: Session = Depends(get_db), body=Depends(remove_xss_json) ): return { "code": 200, "data": [{ "id": "1721437235041120259", # ⽆⼈机ID,⽤于唯⼀标识⼀台⽆⼈机 "uavId": "1720311986430930944", # 三方平台⽆⼈机ID,⽤于唯⼀标识 ⼀台⽆⼈机 "thirdName": None, # 第三方平台名称 "lng": 111.58967074364558, # 当前经度(WGS84) "lat": 21.5870035628497, # 当前纬度(WGS84) "flyingTime": None, # ⻜⾏时⻓(秒) "flyingDistance": 1319.85205078125, # ⻜⾏距离(⽶) "homeDistance": 1319.85205078125, # 无人机离机库直线距离(⽶) "height": 149.9, # 相对⾼度/对地⾼度(⽶) "altitude": 165.49883117675782, # 海拔⾼度(⽶) "realtimeStatus": 2, # 实时状态。 0:离线 1:待命 2:⻜⾏中 "batteryPerce": 66.0, # 电池电量(%) "uavHSpeed": 14.85193590075045, # ⽔平速度(⽶/秒) "uavVSpeed": 0.0, # 垂直速度(⽶/秒) "pitchAngle": -30.0, # 俯仰⻆ "yawAngle": -149.79347930213842, # 偏航⻆ "hangarStatus": 1, # 机库状态,机库无⼈机必填 0:离线 1:在线 "netWorkRate": 560.0, # 第三方无人机与其平台的网络通 信质量(kb/秒) "rainFall": 0, # 无人机所在地天气情况 0:无雨 1: 小雨 2: 中雨 3: 大雨 "windSpeed": None, # 无人机当前接触到的风速(米/ 秒) "nestSpeed": 0.0, # 当前机库所在地风速 "temperature": 34.099998474121094, # 无人机目前舱内温度(unit:℃) "environmentTemperature": 30.4, # 无人机所在地的环境温度(unit: ℃) "upQuality": 80.0, # 无人机与平台的通信质量(unit:%) "downQuality": 80.0, # 平台与无人机的通信质量(unit:%) "statusInfoTime": 1728544749103, # 实时消息对应时间 "thirdPartId": "9b627ed9f7704e109fe22356d72b14ca" # 平台ID,只用于平台内部传值,不用于对外 }], "msg": "操作成功" } try: data = WRJApi.flyUavInfo() return { "code": 200, "msg": "操作成功", "data": data } except Exception as e: return { "code": 500, "msg": "操作失败" } # 获取无人机实时飞行信息 @router.get('/getRealInfo') async def getRealInfo( sn: str, db: Session = Depends(get_db), body = Depends(remove_xss_json) ): return { "code": 200, "data": { "id": "", "thirdPartformUavId": "第三方平台无人机id【sn】", "thirdPlartformId": "第三方平台id", "thirdName": "第三方平台名称", "flyingTime": "飞行时长", "flyingDistance":"飞行距离", "uavName": "无人机名称", "uavBrand": "无人机品牌", "realtimeStatus": "无人机实时状态", "height": "高度", "horizontalSpeed":"水平速度", "verticalSpeed":"垂直速度", "orgId":"所属单位", "orgName":"所属单位名称", "orgPath":"所属单位层级全路径", "orgTypeId":"单位类型id", "orgTypeName":"单位类型名称", "areaId":"所属行政辖区", "areaName":"所属行政辖区名称", "dataSource":"数据来源 1.本地创建 2.第三方平台", "addressLongitude":"常驻地址经度", "addressLatitude":"常驻地址维度", "latitude":"实时纬度", "longitude":"实时经度", "currentLocation":"当前位置信息", "addressLocation":"常驻地位置信息", "constructionModel":"建设模式 0-财政资金采购 (硬件) 1-财政资金采购 (服务) 2-社会资源", "dispatchResponseTime":"调度响应时间 0-15分钟内 1-2小时内 2-半天内 3-1天以上", "isHangarControl":"配置机巢/机库/基站控制 0-否 1-是", "thirdPullStreamAddress":"第三方平台流媒体拉流地址", "mediaPullStreamAddress":"流媒体拉流地址", "mediaPullType":"流媒体拉流方式 (rtmp、rtsp、flv、gb28181)", "nestOutMediaPullStreamAddress":"机舱外流媒体拉流地址", "nestOutMediaPullType": "机舱外流媒体拉流拉流方式:rtmp、rtsp、flv、gb28181", "thirdNestOutPullStreamAddress":"第三方平台机巢外部视频拉流地址" }, "msg": "操作成功" } try: data = WRJApi.getRealInfo(sn) return { "code": 200, "msg": "操作成功", "data": data } except Exception as e: return { "code": 500, "msg": "操作失败" }' '''