123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #!/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": "操作失败"
- }'
- '''
|