libushang 7 ay önce
ebeveyn
işleme
9c46e86b69

+ 44 - 12
common/AvconH5API.py

@@ -46,7 +46,7 @@ def get_redis_token():
         if token_val is not None:
             redis_set_with_time(redis_key, token_val, 300)
 
-    print('token:', token_val)
+    # print('token:', token_val)
     return token_val
 
 # 2.1获取区域
@@ -64,19 +64,22 @@ def get_redis_token():
 }
 '''
 def get_region():
-    token = get_token()
+    token = get_redis_token()
     headers = {
         'Content-Type': 'application/json;charset=UTF-8',
         "Authorization": "Bearer " + token
     }
     api_url = API_ROOT + "/region"
     response = requests.get(url=api_url, headers=headers, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['region']
+    else:
+        print(response.text)
+    
         
 # 2.2获取区域组节点
 '''
@@ -100,7 +103,7 @@ def get_region():
     }
 }
 '''
-def get_group(region_id: str):
+def get_group(region_id: str, parent_id: str = ''):
     token = get_redis_token()
     headers = {
         'Content-Type': 'application/json;charset=UTF-8',
@@ -109,14 +112,22 @@ def get_group(region_id: str):
     params = {
         "region_id": region_id
     }
+
+    if parent_id != '':
+        params = {
+            "parent_id": parent_id
+        }    
     api_url = API_ROOT + "/group"
     response = requests.get(url=api_url, headers=headers, params=params, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['group']
+    else:
+        print(response.text)
+    
         
 # 2.3根据名称搜索区域下所有的节点
 '''
@@ -222,12 +233,15 @@ def get_search_region(region_name: str):
     }
     api_url = API_ROOT + "/search/region"
     response = requests.get(url=api_url, headers=headers, params=params, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data
+    else:
+        print(response.text)
+    
 
 # 2.4搜索范围内的通道信息及直播流地址
 '''
@@ -276,12 +290,15 @@ def get_search_live_location(center_lat: float, center_lng: float, point_lat: fl
     }
     api_url = API_ROOT + "/search/live-location"
     response = requests.get(url=api_url, headers=headers, params=params, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['channel']
+    else:
+        print(response.text)
+    
         
 
 # 3.1获取设备
@@ -330,12 +347,15 @@ def get_group_device(group_id: str, dev_type: dict = None, status: int = -1):
     api_url = API_ROOT + "/group/" + group_id + "/device"
     print('get_group_device:', api_url)
     response = requests.get(url=api_url, headers=headers, params=params, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['device']
+    else:
+        print(response.text)
+    
         
 # 4.1 获取通道
 '''
@@ -370,12 +390,15 @@ def get_device_channel(device_id: str, status: int = -1):
     
     api_url = API_ROOT + "/device/" + device_id + "/channel"
     response = requests.get(url=api_url, headers=headers, params=params, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['channel']
+    else:
+        print(response.text)
+    
         
 
 # 4.2 获取所有通道
@@ -423,12 +446,15 @@ def get_channel_all(status: int = -1, gpsonly: int = -1):
     
     api_url = API_ROOT + "/channel/all"
     response = requests.get(url=api_url, headers=headers, params=params, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['channel']
+    else:
+        print(response.text)
+    
         
 # 5.1 获取直播流
 '''
@@ -448,12 +474,15 @@ def get_live_streaming(channel_id: str):
     }
     api_url = API_ROOT + "/live/streaming/" + channel_id
     response = requests.get(url=api_url, headers=headers, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['live_url']
+    else:
+        print(response.text)
+    
         
 # 5.2云台控制
 # 没用
@@ -476,12 +505,15 @@ def get_live_playing(channel_id: str):
     }
     api_url = API_ROOT + "/live/playing/" + channel_id
     response = requests.get(url=api_url, headers=headers, timeout=15)
-    print(response.text)
+    
     if response.status_code == 200:
         result = response.json()
         if result['code'] == 0:
             data = result['data']
             return data['play_url']
+    else:
+        print(response.text)
+    
 
 if __name__ == '__main__':
     get_region()

+ 4 - 0
jobs/__init__.py

@@ -8,6 +8,7 @@ from utils import *
 from models import *
 from .yzy_job import proc as yzy_proc, yzy_msg_queue_proc
 from .rainfall_conditions_job import proc as rainfall_proc
+from .avcon_job import proc as avcon_proc
 
 def register_jobs(scheduler: BaseScheduler):
     scheduler.add_job(yzy_proc, next_run_time=(datetime.now() + timedelta(seconds=3)))
@@ -21,5 +22,8 @@ def register_jobs(scheduler: BaseScheduler):
     # scheduler.add_job(wdgh_proc, next_run_time=(datetime.now() + timedelta(seconds=13)))
     # scheduler.add_job(wdyy_proc, CronTrigger.from_crontab('0 * * * *'))
 
+    scheduler.add_job(avcon_proc, next_run_time=(datetime.now() + timedelta(seconds=15)))
+    scheduler.add_job(avcon_proc, CronTrigger.from_crontab('0 * * * *'))
+
 def tick():
     print(datetime.now())

+ 99 - 0
jobs/avcon_job.py

@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from datetime import datetime
+from sqlalchemy.orm import Session
+from utils import *
+from utils.redis_util import *
+from models import *
+from exceptions import *
+from database import get_db_local
+from extensions import logger
+from common import YzyApi
+from config import settings
+import traceback
+from common import AvconH5API
+
+def proc():
+    lock_key = "avcon_job_proc"
+    if redis_lock(lock_key):
+        logger.info(datetime.now())
+
+        db = get_db_local()
+
+        refresh_device(db)
+        refresh_device_channel(db)
+
+        db.close()
+
+        redis_unlock(lock_key)
+
+def refresh_device(db: Session):
+    dev_list = []
+    region_list = AvconH5API.get_region()
+    if region_list is not None:
+        for region_item in region_list:
+
+            region_id = region_item['region_id']
+            region_name = region_item['region_name']
+            region_group_list = AvconH5API.get_group(region_id)
+            
+            if region_group_list is not None:                
+                for region_group_item in region_group_list:
+
+                    group_id = region_group_item['group_id']
+                    group_name = region_group_item['group_name']
+
+                    # 子节点下面才有设备
+                    child_count = region_group_item['child_count']
+                    if child_count > 0:
+                        child_region_group_list = AvconH5API.get_group(region_id, group_id)
+                        if child_region_group_list is not None:                
+                            for child_region_group_item in child_region_group_list:
+                                child_group_id = child_region_group_item['group_id']
+                                child_group_name = child_region_group_item['group_name']
+
+                                device_list = AvconH5API.get_group_device(child_group_id)
+                                if device_list is not None:
+                                    for device_item in device_list:
+                                        dev_id = device_item['dev_id']
+                                        dev_name = device_item['dev_name']
+                                        device_item['parent_group_id'] = group_id
+                                        dev_list.append(device_item)
+
+    if len(dev_list) > 0:
+        db.query(AvconDevice).delete()
+        db.commit()
+
+        for n in dev_list:
+            new_dev = AvconDevice(**n)
+            db.add(new_dev)
+        db.commit()
+
+
+def refresh_device_channel(db: Session):
+    channel_list = AvconH5API.get_channel_all()
+
+    if len(channel_list) > 0:
+        db.query(AvconDeviceChannel).delete()
+        db.commit()
+
+        for n in channel_list:
+            new_dev = AvconDeviceChannel(**n)
+            db.add(new_dev)
+        db.commit()
+
+        for n in channel_list:
+            channel_id = n['channel_id']
+            
+            if 'status' in n and n['status'] == 1:
+                live_url = AvconH5API.get_live_streaming(channel_id)
+                if live_url is not None:
+                    db.query(AvconDeviceChannel).filter(AvconDeviceChannel.channel_id == channel_id).update({"live_url": live_url, "create_time": datetime.now()})
+                    db.commit()
+
+                play_url = AvconH5API.get_live_playing(channel_id)
+                if play_url is not None:
+                    db.query(AvconDeviceChannel).filter(AvconDeviceChannel.channel_id == channel_id).update({"play_url": play_url, "create_time": datetime.now()})
+                    db.commit()
+
+

+ 42 - 0
models/video_base.py

@@ -86,5 +86,47 @@ class TpVideoTag(Base):
     create_dept = Column(BigInteger, default=None, comment='创建部门')
     create_by = Column(BigInteger, default=None, comment='创建者')
     update_by = Column(BigInteger, default=None, comment='更新者')
+    class Config:
+        orm_mode = True
+
+
+class AvconDevice(Base):
+    '''
+    融合通信设备
+    '''
+    __tablename__ = 'avcon_device'
+
+    dev_id = Column(String, primary_key=True, comment='设备ID')
+    dev_name = Column(String, nullable=True, comment='设备名称')
+    dev_type = Column(String, nullable=True, comment='设备类型')
+    domain = Column(String, nullable=True, comment='区域')
+    group_id = Column(String, nullable=True, comment='分组')
+    parent_group_id = Column(String, nullable=True, comment='父分组')
+    status = Column(Integer, default=None, comment='状态')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    channel_num = Column(Integer, default=None, comment='通道数')
+
+    class Config:
+        orm_mode = True
+
+
+class AvconDeviceChannel(Base):
+    '''
+    融合通信设备
+    '''
+    __tablename__ = 'avcon_device_channel'
+
+    
+    channel_id = Column(String, primary_key=True, comment='通道ID')
+    channel_name = Column(String, default='', nullable=True, comment='通道名称')
+    channel_no = Column(String, default='', nullable=True, comment='通道名称')
+    dev_id = Column(String, default='', nullable=True, comment='设备ID')
+    status = Column(Integer, nullable=True, comment='设备类型')
+    lat = Column(String, default='', nullable=True, comment='纬度')
+    lng = Column(String, default='', nullable=True, comment='经度')
+    live_url = Column(String, default='', nullable=True, comment='直播流')
+    play_url = Column(String, default='', nullable=True, comment='通道直播页面完整地址')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+
     class Config:
         orm_mode = True

+ 44 - 7
routers/api/videoResource/avcon.py

@@ -13,6 +13,7 @@ from fastapi.responses import JSONResponse
 import traceback
 from datetime import datetime
 from common import AvconH5API
+from models import *
 
 '''
 融合通信相关接口
@@ -24,6 +25,18 @@ router = APIRouter()
 async def get_video_list(
     db: Session = Depends(get_db)
 ):
+    '''
+    rows = db.query(AvconDevice).all()
+    dev_list = []
+    for row in rows:
+        dev_list.append(get_model_dict(row))
+    return dev_list
+    '''
+    return AvconH5API.get_channel_all()
+
+    '''
+    以下代码已迁移到job里面,每1个小时刷新一次,仅供API接口调用参考,可以删除
+    dev_list = []
     region_list = AvconH5API.get_region()
     if region_list is not None:
         for region_item in region_list:
@@ -37,11 +50,35 @@ async def get_video_list(
 
                     group_id = region_group_item['group_id']
                     group_name = region_group_item['group_name']
-                    
-                    device_list = AvconH5API.get_group_device(group_id)
-                    if device_list is not None:
-                        for device_item in device_list:
-                            dev_id = device_item['dev_id']
-                            dev_name = device_item['dev_name']
-                            logger.info("device info: {}", device_item)
+
+                    # 子节点下面才有事业部
+                    child_count = region_group_item['child_count']
+                    if child_count > 0:
+                        child_region_group_list = AvconH5API.get_group(region_id, group_id)
+                        if child_region_group_list is not None:                
+                            for child_region_group_item in child_region_group_list:
+                                child_group_id = child_region_group_item['group_id']
+                                child_group_name = child_region_group_item['group_name']
+
+                                device_list = AvconH5API.get_group_device(child_group_id)
+                                if device_list is not None:
+                                    for device_item in device_list:
+                                        dev_id = device_item['dev_id']
+                                        dev_name = device_item['dev_name']
+                                        device_item['parent_group_id'] = group_id
+                                        dev_list.append(device_item)
+
+    
+    if len(dev_list) > 0:
+        db.query(AvconDevice).delete()
+        db.commit()
+
+        for n in dev_list:
+            new_dev = AvconDevice(**n)
+            db.add(new_dev)
+        db.commit()
+
+    return dev_list
+    '''
+