wrjvideo.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query,HTTPException
  4. from typing import Union
  5. from database import get_db
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import case,or_
  8. from sqlalchemy import text
  9. from utils import *
  10. from utils.ry_system_util import *
  11. from utils.video_util import *
  12. from common.security import valid_access_token
  13. from fastapi.responses import JSONResponse
  14. import traceback
  15. from datetime import datetime
  16. from common import WRJApi
  17. router = APIRouter()
  18. # 获取无人机清单
  19. @router.get('/roughTimeStatus')
  20. async def roughTimeStatus(
  21. area: str = '',
  22. keyword: str = '',
  23. time: str = '',
  24. mode: str = '',
  25. type: str = '',
  26. status: str = '',
  27. db: Session = Depends(get_db)
  28. ):
  29. try:
  30. print('area:', area)
  31. print('keyword:', keyword)
  32. print('time:', time)
  33. print('mode:', mode)
  34. print('type:', type)
  35. print('status:', status)
  36. fly_data = WRJApi.flyUavInfo()
  37. data = WRJApi.roughTimeStatus()
  38. area_code = ''
  39. status_list = status.split(',')
  40. mode_list = mode.split(',')
  41. type_list = type.split(',')
  42. if area != '':
  43. row = db.query(GovdataArea).filter(GovdataArea.id == int(area)).first()
  44. area_code = row.area_code.rstrip('0')
  45. convertDict = { "0": "离线", "1": "待命", "2": "飞行中", "3": "管制中", "4": "维护中", "5": "执行任务" }
  46. wrj_list = []
  47. for n in data:
  48. if area_code != '' and n['addressAreaId'].startswith(area_code) == False:
  49. continue
  50. if keyword != '' and n['uavName'].find(keyword) == -1:
  51. continue
  52. # 调度响应时间 0-半小时内 1-1小时内 2-2小时内 3-4小时内 4-8小时内 5-24小时内 6-24小时外
  53. if time != '' and n['dispatchResponseTime'] != int(time):
  54. continue
  55. # 建设模式 0-财政资金采购 (硬件) 1-财政资金采购 (服务) 2-社会面资源 3-示范地区补点
  56. if mode != '' and str(n['constructionModel']) not in mode_list:
  57. continue
  58. # "isHangarControl": 1 // 配置机巢/机库/基站控制 0-否 1-是
  59. if type != '' and str(n['isHangarControl']) not in type_list:
  60. continue
  61. # "convertCode": null, // // 第三方机库的状态 0-离线、1-待命中、2-飞行中、3-管制中、4-维护中、5-执行任务
  62. if str(n['convertCode']) not in status_list:
  63. continue
  64. n['status_text'] = convertDict[str(n['convertCode'])]
  65. item = {
  66. "id": n['id'],
  67. "drone_name": n['uavName'],
  68. "status": n['convertCode'],
  69. "status_text": n['status_text'],
  70. "time": n['dispatchResponseTime'],
  71. "mode": n['constructionModel'],
  72. "type": n['isHangarControl'],
  73. "fly_url": n['mediaPullStreamAddress'] if n['mediaPullStreamAddress'] is not None else "", # 飞机视频流
  74. "nest_url": n['nestOutMediaPullStreamAddress'] if n['nestOutMediaPullStreamAddress'] is not None else "", # 机巢视频流
  75. }
  76. # 飞行中的附加信息
  77. if str(n['convertCode']) == '1':
  78. fly_info = get_fly_info(n['id'], fly_data)
  79. if fly_info is not None:
  80. item['fly_info'] = fly_info
  81. wrj_list.append(item)
  82. print(wrj_list)
  83. return {
  84. "code": 200,
  85. "msg": "操作成功",
  86. "data": {
  87. "list": wrj_list
  88. }
  89. }
  90. except Exception as e:
  91. traceback.print_exc()
  92. return {
  93. "code": 500,
  94. "msg": "操作失败"
  95. }
  96. def get_fly_info(id: str, data: list):
  97. for n in data:
  98. if n['id'] == id:
  99. return {
  100. "lng": n['lng'],
  101. "lat": n['lat'],
  102. "windSpeed": n['windSpeed'],
  103. "nestSeed": n['nestSpeed'],
  104. "temperature": n['temperature'],
  105. "environmentTemperature": n['environmentTemperature'],
  106. "batteryPerce": n['batteryPerce'],
  107. "rainFall": n['rainFall']
  108. }
  109. return None
  110. # 获取飞行中无人机清单
  111. @router.get('/flyUavInfo')
  112. async def flyUavInfo(
  113. db: Session = Depends(get_db),
  114. body=Depends(remove_xss_json)
  115. ):
  116. return {
  117. "code": 200,
  118. "data": [{
  119. "id": "1721437235041120259", # ⽆⼈机ID,⽤于唯⼀标识⼀台⽆⼈机
  120. "uavId": "1720311986430930944", # 三方平台⽆⼈机ID,⽤于唯⼀标识 ⼀台⽆⼈机
  121. "thirdName": None, # 第三方平台名称
  122. "lng": 111.58967074364558, # 当前经度(WGS84)
  123. "lat": 21.5870035628497, # 当前纬度(WGS84)
  124. "flyingTime": None, # ⻜⾏时⻓(秒)
  125. "flyingDistance": 1319.85205078125, # ⻜⾏距离(⽶)
  126. "homeDistance": 1319.85205078125, # 无人机离机库直线距离(⽶)
  127. "height": 149.9, # 相对⾼度/对地⾼度(⽶)
  128. "altitude": 165.49883117675782, # 海拔⾼度(⽶)
  129. "realtimeStatus": 2, # 实时状态。 0:离线 1:待命 2:⻜⾏中
  130. "batteryPerce": 66.0, # 电池电量(%)
  131. "uavHSpeed": 14.85193590075045, # ⽔平速度(⽶/秒)
  132. "uavVSpeed": 0.0, # 垂直速度(⽶/秒)
  133. "pitchAngle": -30.0, # 俯仰⻆
  134. "yawAngle": -149.79347930213842, # 偏航⻆
  135. "hangarStatus": 1, # 机库状态,机库无⼈机必填 0:离线 1:在线
  136. "netWorkRate": 560.0, # 第三方无人机与其平台的网络通 信质量(kb/秒)
  137. "rainFall": 0, # 无人机所在地天气情况 0:无雨 1: 小雨 2: 中雨 3: 大雨
  138. "windSpeed": None, # 无人机当前接触到的风速(米/ 秒)
  139. "nestSpeed": 0.0, # 当前机库所在地风速
  140. "temperature": 34.099998474121094, # 无人机目前舱内温度(unit:℃)
  141. "environmentTemperature": 30.4, # 无人机所在地的环境温度(unit: ℃)
  142. "upQuality": 80.0, # 无人机与平台的通信质量(unit:%)
  143. "downQuality": 80.0, # 平台与无人机的通信质量(unit:%)
  144. "statusInfoTime": 1728544749103, # 实时消息对应时间
  145. "thirdPartId": "9b627ed9f7704e109fe22356d72b14ca" # 平台ID,只用于平台内部传值,不用于对外
  146. }],
  147. "msg": "操作成功"
  148. }
  149. try:
  150. data = WRJApi.flyUavInfo()
  151. return {
  152. "code": 200,
  153. "msg": "操作成功",
  154. "data": data
  155. }
  156. except Exception as e:
  157. return {
  158. "code": 500,
  159. "msg": "操作失败"
  160. }
  161. # 获取无人机实时飞行信息
  162. @router.get('/getRealInfo')
  163. async def getRealInfo(
  164. sn: str,
  165. db: Session = Depends(get_db),
  166. body = Depends(remove_xss_json)
  167. ):
  168. return {
  169. "code": 200,
  170. "data": {
  171. "id": "",
  172. "thirdPartformUavId": "第三方平台无人机id【sn】",
  173. "thirdPlartformId": "第三方平台id",
  174. "thirdName": "第三方平台名称",
  175. "flyingTime": "飞行时长",
  176. "flyingDistance":"飞行距离",
  177. "uavName": "无人机名称",
  178. "uavBrand": "无人机品牌",
  179. "realtimeStatus": "无人机实时状态",
  180. "height": "高度",
  181. "horizontalSpeed":"水平速度",
  182. "verticalSpeed":"垂直速度",
  183. "orgId":"所属单位",
  184. "orgName":"所属单位名称",
  185. "orgPath":"所属单位层级全路径",
  186. "orgTypeId":"单位类型id",
  187. "orgTypeName":"单位类型名称",
  188. "areaId":"所属行政辖区",
  189. "areaName":"所属行政辖区名称",
  190. "dataSource":"数据来源 1.本地创建 2.第三方平台",
  191. "addressLongitude":"常驻地址经度",
  192. "addressLatitude":"常驻地址维度",
  193. "latitude":"实时纬度",
  194. "longitude":"实时经度",
  195. "currentLocation":"当前位置信息",
  196. "addressLocation":"常驻地位置信息",
  197. "constructionModel":"建设模式 0-财政资金采购 (硬件) 1-财政资金采购 (服务) 2-社会资源",
  198. "dispatchResponseTime":"调度响应时间 0-15分钟内 1-2小时内 2-半天内 3-1天以上",
  199. "isHangarControl":"配置机巢/机库/基站控制 0-否 1-是",
  200. "thirdPullStreamAddress":"第三方平台流媒体拉流地址",
  201. "mediaPullStreamAddress":"流媒体拉流地址",
  202. "mediaPullType":"流媒体拉流方式 (rtmp、rtsp、flv、gb28181)",
  203. "nestOutMediaPullStreamAddress":"机舱外流媒体拉流地址",
  204. "nestOutMediaPullType": "机舱外流媒体拉流拉流方式:rtmp、rtsp、flv、gb28181",
  205. "thirdNestOutPullStreamAddress":"第三方平台机巢外部视频拉流地址"
  206. },
  207. "msg": "操作成功"
  208. }
  209. try:
  210. data = WRJApi.getRealInfo(sn)
  211. return {
  212. "code": 200,
  213. "msg": "操作成功",
  214. "data": data
  215. }
  216. except Exception as e:
  217. return {
  218. "code": 500,
  219. "msg": "操作失败"
  220. }