libushang 2 ay önce
ebeveyn
işleme
0bdb93ee3b

+ 64 - 0
common/WRJApi.py

@@ -0,0 +1,64 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+import requests
+import time
+from utils.sg_auth import calcResponseSign, ranstr
+from extensions import logger
+import urllib3
+from exceptions import AppException
+
+# 无人机API
+# 广东省政务领域无人机管理平台开放接口文档
+
+ROOT_PATH = "https://yzh-wg.gdgov.cn/ebus"
+WRJ_PASSID = "mmyjglj_wrjdy"
+WRJ_TOKEN = "757ebd126c02470c91c3f02745bee7ed"
+
+# 2.1.获取无人机清单
+def roughTimeStatus(addressAreaId: str = '4407'):
+    url = ROOT_PATH + '/swrj/open/uavReal/roughTimeStatus'
+    logger.info('wrjapi get: {}', url)
+    payload = f"addressAreaId={addressAreaId}"
+    return __get_url(url, payload)
+
+
+# 2.2.获取飞行中无人机清单
+def flyUavInfo(addressAreaId: str = '4407'):
+    url = ROOT_PATH + '/swrj/open/uavReal/flyUavInfo'
+    logger.info('wrjapi get: {}', url)
+    payload = f"addressAreaId={addressAreaId}"
+    return __get_url(url, payload)
+
+# 5.1.获取无人机实时飞行信息
+def getRealInfo(SN: str):
+    url = ROOT_PATH + '/swrj/open/uavReal/getRealInfo'
+    logger.info('wrjapi get: {}', url)
+    payload = f"SN={SN}"
+    return __get_url(url, payload)
+
+def __get_url(url: str, payload: str):
+    print(payload)
+
+    timestamp = str(int(time.time()))
+    nonce = ranstr(20)
+    signature = calcResponseSign(timestamp, WRJ_TOKEN, nonce)
+
+    headers = {
+        "x-rio-signature": signature,
+        "x-rio-timestamp": timestamp,
+        "x-rio-nonce": nonce,
+        "x-rio-paasid": WRJ_PASSID,
+        "Content-Type": 'application/x-www-form-urlencoded',
+        "sign-uav": "2ajk3d9w8qvncp8t5ekjqq" # 粤政易用户省统id, 业主id
+    }
+
+    urllib3.disable_warnings()
+    response = requests.get(url, headers=headers, data=payload, verify=False)
+    logger.info('wrjapi return: {}', response.text)
+    if response.status_code == 200:
+        result = response.json()
+        if result['code'] == 0:
+            return result['data']
+        return AppException(result['code'], result['message'])
+    
+    raise AppException(1, '网络异常')

+ 3 - 1
routers/api/videoResource/__init__.py

@@ -4,9 +4,11 @@ from fastapi import APIRouter
 from .hkvideo import router as hkvideo_router
 from .videoinfo import router as videoinfo_router
 from .avcon import router as avcon_router
+from .wrjvideo import router as wrjvideo_router
 
 router = APIRouter()
 
 router.include_router(hkvideo_router, prefix="/hkvideo")
 router.include_router(videoinfo_router, prefix="/videoinfo")
-router.include_router(avcon_router, prefix="/avcon")
+router.include_router(avcon_router, prefix="/avcon")
+router.include_router(wrjvideo_router, prefix="/wrjvideo")

+ 221 - 0
routers/api/videoResource/wrjvideo.py

@@ -0,0 +1,221 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from fastapi import APIRouter, Request, Depends,Query,HTTPException
+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
+
+router = APIRouter()
+
+# 获取无人机清单
+@router.get('/roughTimeStatus')
+async def roughTimeStatus(
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json)
+):
+    return {
+        "code": 200,
+        "data": [{
+            "id": "1789142529854193666",
+            "thirdPartformUavId": "1581F6Q8D241H00C5JV9", # 第三方平台无人机id【sn】
+            "thirdPartformUId": "c7bc9cccbfac41cbbb0161dcdc010be3", #第三方平台唯一标识
+            "uavName": "归湖镇无人机机库",
+            "addressLongitude": 116.578580000, # 经度
+            "addressLatitude": 23.763168000, # 纬度
+            "realtimeStatus": 1,
+            "thirdPullStreamAddress":
+            "rtmp:#120.198.33.20:11935/drsUav/1581F6Q8D241H00C5JV9", # 第三方拉流地址
+            "mediaPullStreamAddress":
+            "https:#wrj.gdgov.cn:443/live/1789142529854193666.flv", # 流媒体拉流地址
+            "popStreamAddress":
+            "rtmp:#210.76.85.75:13101/live/1789142529854193666?token=4cf310ac3578",
+            "constructionModel": 2, # 建设模式 0-财政资金采购 (硬件) 1-财政资金采购 (服务) 2-社会面资源 3-示范地区补点
+            "dispatchResponseTime": 0, # 调度响应时间 0-半小时内 1-1小时内 2-2小时内 3-4小时内 4-8小时内 5-24小时内 6-24小时外
+            "orgId": "1677658408929521666",
+            "orgName": "广东泰一高新技术发展有限公司",
+            "orgTypeId": "6",
+            "uavBrand": "AIRace",
+            "uavModel": "开拓者无人机",
+            "residentAddress": "广东省潮州市潮安区归湖镇龙溪村",
+            "timestamp": 1728614706923,
+            "thirdName": "", # 第三方名称
+            "flyingTime": None, # 飞行时长
+            "height": None, # 高度
+            "flyingDistance": None, # 飞行距离
+            "horizontalSpeed": None, # 水平速度
+            "verticalSpeed": None, # 垂直速度
+            "battery": None, # 电池电量
+            "workRadius": 3, # 工作半径
+            "optName": None, # 无人机联系人
+            "phone": None, # 无人机联系方式
+            "addressAreaId": "445103115208", # 无人机所属区域编码
+            "altitude": None, # 海拔高度
+            "pitchAngle": None, # 俯仰⻆
+            "yawAngle": None, # 偏航⻆
+            "hangarStatus": None, # 机库状态,机库⽆⼈机必填 :0-离线、1-待命中、2-管制中、3-维护中
+            "nestOutMediaPullStreamAddress":
+            "https://wrj.gdgov.cn:443/live/1789142529854193666:nest.flv", # 机舱外流媒体拉流地址
+            "nestOutMediaPullType": "rtmp", # 机舱外流媒体拉流拉流方式:rtmp、rtsp、flv、gb28181
+            "nestOutMediaChangeType": "1", # 机巢外部视频流媒体网络类型/是否需要转换类型 (0 否 1 是)
+            "thirdNestOutPullStreamAddress":
+            "rtmp://120.198.33.20:11935/drsUav/7CTDM1600B5H66", # 第三方平台机巢外部视频拉流地址
+            "uavFlyRoute": None, # 无人机当前航线
+            "path": {
+                "uavBaseInfoId": None,
+                "createTime": None,
+                "updateTime": None,
+                "path": None
+            },
+            "nestStatus": 1, # 第三方机库的状态 0-离线、1-待命中、2-管制中、3-维护中、4-执行任务
+            "convertCode": 1, # 第三方机库的状态 0-离线、1-待命中、2-飞行中、3-管制中、4-维护中、5-执行任务
+            "isHangarControl": 1 # 配置机巢/机库/基站控制 0-否 1-是
+        }],
+        "message": "",
+        "timestamp": "",
+        "total": 0
+    }
+
+    try:
+        data = WRJApi.roughTimeStatus()
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": data
+        }
+    
+    except Exception as e:
+        return {
+            "code": 500,
+            "msg": "操作失败"
+        }
+    
+# 获取飞行中无人机清单
+@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,只用于平台内部传值,不用于对外
+            }],
+        "message": "",
+        "timestamp": "",
+        "total": 0
+    }
+
+    try:
+        data = WRJApi.flyUavInfo()
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": data
+        }
+    
+    except Exception as e:
+        return {
+            "code": 500,
+            "msg": "操作失败"
+        }
+    
+# 获取无人机实时飞行信息
+@router.get('/getRealInfo')
+async def getRealInfo(
+    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":"第三方平台机巢外部视频拉流地址"
+        },
+        "message": "",
+        "timestamp": "",
+        "total": 0
+    }
+
+    try:
+        SN = body['SN']
+        data = WRJApi.getRealInfo(SN)
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": data
+        }
+    
+    except Exception as e:
+        return {
+            "code": 500,
+            "msg": "操作失败"
+        }
+