| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- import re
- import requests
- import time
- import ast
- from django.conf import settings
- from django.db.models import Count
- from django.core.paginator import Paginator
- from django.db import transaction
- from smartfarming.api.views.forecast.all_dict import insect_dict, attract_discern
- from smartfarming.models.sim_card import MongoMsg_Conf
- from smartfarming.models.device import MongoDevice
- from smartfarming.models.camera import MongoCameraPhoto, MongoCameraData, MongoCameraAccount
- from smartfarming.serializers.device_serializers import DeviceSerializers
- from smartfarming.utils import controlMove
- from smartfarming.utils import bindDeviceLive, getLive
- from kedong.decoration import kedong_deco, PortError
- config_dict = settings.CONFIG
- @kedong_deco(login_required=True)
- def list_camera(request):
- """
- 获取监控设备列表 :
- 参数:
-
- page 非必传(num) 页码,默认为1
- device_id 非必传 设备ID, 不传为监控列表, 传设备号为搜索
- page_size 非必传 一页条数,默认为10
- 返回值:
- {
- "data": {
- data : {
- "device_name":"", 设备名称
- "device_id":"", 设备ID
- "photo_num":"", 是否拍过照片 0未拍过 1拍过
- "status":"", 设备状态 0离线 1在线
- "camera_playback":"" 用来判断是否有录像功能 0不支持 1支持
- "sim":"" 监控SIM 卡
- }
- counts : 99 总数
- }
- "errorCode": 0,
- "message": "",
- "formError": {}
- }
- """
- _list = []
- post_info = request.POST
- device_id = post_info.get('device_id')
- page = int(post_info.get('page', 1))
- page_size = int(post_info.get('page_size', 10))
- search_dict = {
- "device_type_id": 6
- }
- if device_id:
- search_dict["device_id"] = re.compile(fr"^.*{device_id}.*$")
- queryset = MongoDevice.objects.filter(device_type_id=6).order_by("-uptime")
- total_num = queryset.count()
- paginator = Paginator(queryset, page_size)
- page_obj = paginator.get_page(page)
- serializers = DeviceSerializers(page_obj, many=True)
- data_list = serializers.data
- _list = []
- device_id_list = []
- for x in data_list:
- device_id = x.get("device_id")
- device_id_list.append(device_id)
- _list.append({
- "device_name": x.get("device_name"),
- "device_id": device_id,
- "photo_num": "",
- "status": x.get("device_status"),
- "camera_playback": "",
- "sim": x.get("simid")
- })
- photo_queryset = MongoCameraPhoto.objects.filter(device_id__in=device_id_list, photo_status=1).values('device_id').annotate(count=Count('device_id'))
- phote_dict = {p['device_id']: "1" for p in photo_queryset}
- playback_dict = {y['device_id']: y["camera_playback"] for y in MongoCameraData.objects.filter(device_id__in=device_id_list).values('device_id','camera_playback')}
- for item in _list:
- item["photo_num"] = phote_dict.get(device_id, "0")
- item["camera_playback"] = playback_dict.get(device_id,"0")
- datas = {"data": _list, "counts": total_num}
- return datas
- @kedong_deco(login_required=True)
- def addr_camera_list(request):
- """
- 获取监控设备播放地址
- 参数:
- device_id 必传 (string) 监控设备的序列号
- 返回值:
- {
- "data": {
- "hls": "http://test.ys7.com:66/openlive/b475942b03544a5aa35b651670d8712c.m3u8", HLS流畅直播地址
- "hlsHd": "http://test.ys7.com:66/openlive/b475942b03544a5aa35b651670d8712c.hd.m3u8", HLS高清直播地址
- "rtmp": "rtmp://10.82.0.190:1935/openlive/b475942b03544a5aa35b651670d8712c", RTMP流畅直播地址
- "rtmpHd": "rtmp://10.82.0.190:1935/openlive/b475942b03544a5aa35b651670d8712c.hd" RTMP高清直播地址
- }
- "errorCode": 0,
- "message": "",
- "formError": {}
- }
- """
- try:
- if 'HTTP_X_FORWARDED_FOR' in request.META:
- ip = request.META['HTTP_X_FORWARDED_FOR']
- else:
- ip = request.META['HTTP_X_REAL_IP']
- except Exception as KeyError:
- ip = request.META['REMOTE_ADDR']
- device_id = request.POST.get('device_id')
- try:
- addr = MongoCameraData.objects.get(device_id=device_id).device_info
- except:
- addr = {}
- return addr
- @kedong_deco(login_required=True)
- def ctrl_camera(request):
- """
- 控制监控设备转动 :
- 参数:
- device_id 必传 (string) 监控设备的序列号
- ctrl 必传 (string) 操作指令 move 控制球机转动 stop 停止球机转动
- movenum ctrl=move时必传(string) 0-上,1-下,2-左,3-右,8-放大,9-缩小
- 返回值:
- {
- "data": success, success成功 default失败
- "errorCode": 0,
- "message": "",
- "formError": {}
- }
- """
- device_id = request.POST.get('device_id')
- ctrl = request.POST.get('ctrl')
- account_id = MongoCameraData.objects.filter(device_id=device_id).first()
- if not account_id:
- raise PortError("","未找到此设备")
- camera_query = MongoCameraAccount.objects.filter(id=int(account_id.account_id)).first()
- if not camera_query:
- raise PortError("","未找到此账号")
- channelNo = "1"
- if device_id.find("-") != -1:
- channelNo = device_id.split("-")[1]
- device_id = device_id.split("-")[0]
- # 操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距
- if ctrl == "move":
- dire = request.POST.get('movenum')
- # 增加大华相机操作功能
- if camera_query.account_type == 1:
- if dire not in ("0","1","2","3","8","9"):
- raise PortError("movenum","暂不支持其它指令")
- appId = camera_query.app_key
- appSecret = camera_query.app_secret
- result = controlMove(appId,appSecret,device_id,dire,channelNo)
- code = result.get("result").get("code")
- if code == "0":
- return True
- else:
- return {"errorCode": 2, "msg": result.get("result").get("msg")}
- else:
- accessToken = camera_query.token
- ctrl_url = 'https://open.ys7.com/api/lapp/device/ptz/start'
- speed = '1'
- data = {'accessToken':accessToken, 'deviceSerial':device_id, 'channelNo':channelNo, 'speed':speed, 'direction':dire}
- res1 = requests.post(ctrl_url,data=data)
- elif ctrl == "stop":
- time.sleep(0.4)
- # 增加大华相机操作功能
- if camera_query.account_type == 1:
- dire = "10"
- appId = camera_query.app_key
- appSecret = camera_query.app_secret
- result = controlMove(appId,appSecret,device_id,dire,channelNo)
- code = result.get("result").get("code")
- if code == "0":
- return True
- else:
- return {"errorCode": 2, "msg": result.get("result").get("msg")}
- else:
- accessToken = camera_query.token
- ctrl_url = 'https://open.ys7.com/api/lapp/device/ptz/stop'
- data = {'accessToken':accessToken, 'deviceSerial':device_id, 'channelNo':channelNo}
- res2 = requests.post(ctrl_url,data=data)
- return True
- @kedong_deco(login_required=False)
- def see_camera_account(request):
- """
- 查看当前绑定的萤石云账号信息\按业务员名字搜索\萤石云账号搜索
-
- 参数:
- account 非必传(str) 按萤石云账号名字搜索
- salesman 非必传(str) 按业务员名字搜索
-
- 说明:两个参数都不传为所有数据,不进行筛选操作
- 返回值:
- {
- "errorCode": 0,
- "message": "",
- "formError": {},
- "data": [
- {
- "id": 1, 萤石云账号id
- "account": "hnyf" 萤石云名称
- }
- ],
- "params": {}
- }
- """
- account = request.POST.get("account")
- salesman = request.POST.get("salesman")
- camera_query = MongoCameraAccount.objects.all().order_by("-id")
- if account:
- camera_query = camera_query.filter(account__icontains=account)
- if salesman:
- camera_query = camera_query.filter(salesman__icontains=salesman)
- data = [{'id':i.id,'account':i.account} for i in camera_query]
- return data
- @kedong_deco(login_required=True)
- def add_camera_account(request):
- """
- 添加萤石云账号
- 管理员可操作
- 参数:
- account 必传(str) 萤石云账号
- salesman 必传(str) 萤石云账号所相关的业务员名称
- app_token 必传(str) 萤石云账号 token
- app_key 必传(str) 萤石云账号 appkey
- app_secret 必传(str) 萤石云账号 appsecret
-
- 2022-08-19 08:54 csx
- 增加监控账户区分,在不影响原来的功能上进行修改,增加大华乐橙云账号添加
- account_type 非必传(number) 监控设备类型 0代表海康 1代表大华,默认是0
-
-
- """
- account = request.POST.get("account")
- salesman = request.POST.get("salesman")
- token = request.POST.get("app_token")
- app_key = request.POST.get("app_key")
- app_secret = request.POST.get("app_secret")
- account_type = request.POST.get("account_type","0")
-
-
- if account_type not in ("0","1"):
- raise PortError("","无法识别此监控账号类型")
- if not all([account,salesman,token,app_key,app_secret]):
- raise PortError("","请把参数填写完整")
- now_time = int(time.time())
- camera_query = MongoCameraAccount.objects.filter(app_key=app_key,account_type=account_type).first()
- if camera_query:
- raise PortError("","此appkey已存在,请勿重复添加")
-
- try:
- MongoCameraAccount.objects.create(account=account,salesman=salesman,token=token,addtime=now_time,uptime=now_time,
- app_key=app_key,app_secret=app_secret,account_type=account_type)
- except:
- raise PortError("","添加萤石账号失败")
-
- return True
- @transaction.atomic
- @kedong_deco(login_required=True)
- def add_camera(request):
- """
- 添加监控设备接口:
- 参数:
- device_id 必传 (string) 监控设备的序列号
- camera_channel 必传 (string) 监控通道号
- camera_playback 必传 (string) 是否支持回放功能,0不支持 1支持
- 新加参数
- account_id 必传 (string) 萤石云账号id
-
-
- 2022-08-19 08:54 csx
- 增加监控账户区分,在不影响原来的功能上进行修改,增加大华乐橙云监控绑定
- 返回值:
- {
- "data": null,
- "errorCode": 0,
- "message": ,
- "formError": {}
- }
- """
- device_id = request.POST.get('device_id')
- camera_channel = request.POST.get("camera_channel","0")
- camera_playback = request.POST.get("camera_playback","0")
- account_id = request.POST.get("account_id",1)
-
- if not account_id.isdigit():
- raise PortError("account_id","无效参数")
-
- if not device_id:
- raise PortError("device_id","未传设备号")
-
- if not camera_channel.isdigit():
- raise PortError("camera_channel","无效参数")
-
-
- if camera_playback not in ("0","1"):
- raise PortError("camera_playback","参数超出范围")
-
- now_time = int(time.time())
- camera_query = MongoCameraAccount.objects.filter(id=int(account_id)).first()
- if not camera_query:
- raise PortError("","未找到此账号")
-
-
- device_ids = device_id + "-" + camera_channel
- # if MongoCameraData.objects.filter(device_id=device_id).exists() or MongoDevice.objects.filter(device_id=device_id).exists():
- # raise PortError("","设备已存在,请勿重复添加")
-
- # 使用的是大华乐橙云账号监控接入,监控通道号大华的从0开始
- if camera_query.account_type == 1:
- appId = camera_query.app_key
- appSecret = camera_query.app_secret
- device_live_data = bindDeviceLive(appId, appSecret, device_id,camera_channel)
- code = device_live_data["result"]["code"]
-
- if code == "0":
- live_path = device_live_data["result"]["data"]["streams"][0]["hls"]
-
- elif code == "LV1001":
- # 如直播地址已存在,则需要查询直播地址列表
- live_data = getLive(appId, appSecret, device_id, camera_channel)
-
- if live_data["result"]["code"] == "0":
- try:
- live_path = live_data["result"]["data"]["streams"][0]["hls"]
- except:
- raise PortError("","获取直播地址失败")
- else:
- raise PortError("",live_data)
- else:
- msg = device_live_data["result"]["msg"]
- raise PortError("", msg)
- device_info = {
- "hls": live_path,
- "hlsHd": live_path,
- "rtmp": live_path,
- "rtmpHd": live_path
- }
- else:
- accessToken = camera_query.token
- url = config_dict.get("camera").get("ys_open")
- data = {"accessToken":accessToken,"source":"%s:%s"%(device_id,str(camera_channel))}
- res = requests.post(url,data=data)
- if ast.literal_eval(res.text)["code"] == "200":
- url_1 = config_dict.get("camera").get("ys_get")
- res_1 = requests.post(url_1,data=data)
- try:
- addr = ast.literal_eval(res_1.text)["data"][0]
- device_info = {
- "hls": addr["hls"],
- "hlsHd": addr["hlsHd"],
- "rtmp": addr["rtmp"],
- "rtmpHd": addr["rtmpHd"]
- }
- except Exception as e:
- raise PortError("device_id", "解析结果异常")
- else:
- raise PortError("","Token过期,设备激活失败")
- try:
- # MongoDevice.objects.create(device_id=device_ids,device_type_id=6,addtime=now_time,device_code=1,uptime=now_time)
- MongoCameraData.objects.create(device_id=device_ids,device_info=device_info,addtime=now_time,camera_playback=camera_playback,account_id=account_id)
- except Exception as e:
- raise PortError(" ", "添加设备失败")
- return True
|